Files
pocketbase/ui/src/fields/text/input.js
T

95 lines
3.7 KiB
JavaScript

// {
// collection: undefined,
// originalRecord: undefined,
// record: undefined,
// field: undefined,
// }
export function input(props) {
const uniqueId = "text_" + app.utils.randomString();
const local = store({
get hasAutogenerate() {
return !app.utils.isEmpty(props.field.autogeneratePattern) && app.utils.isEmpty(props.originalRecord?.id);
},
get isDisabled() {
return !app.utils.isEmpty(props.originalRecord?.id) && props.field.primaryKey;
},
get isRequired() {
return props.field.required && !local.hasAutogenerate && !local.isDisabled;
},
});
return t.div(
{ className: "record-field-input field-type-text" },
t.div(
{ className: "fields" },
t.div(
{ className: "field" },
t.label(
{ htmlFor: uniqueId },
t.i({
ariaHidden: true,
className: () => (props.field.primaryKey ? "ri-key-line" : app.fieldTypes.text.icon),
}),
t.span({ className: "txt" }, () => props.field.name),
),
// @todo remove after Firefox add support for "field-sizing:content"
//
// note1: not using contenteditable because it requires keeping
// track of the cursor offset when replacing the content in oninput
//
// note2: based on https://chriscoyier.net/2023/09/29/css-solves-auto-expanding-textareas-probably-eventually/
t.div(
{ className: "autoexpand-wrapper" },
t.textarea({
id: uniqueId,
// className: "autoexpand",
rows: 1,
name: () => props.field.name,
required: () => local.isRequired,
disabled: () => local.isDisabled,
placeholder: () => (local.hasAutogenerate ? "Leave empty to autogenerate..." : ""),
value: () => props.record[props.field.name] || "",
oninput: (e) => (props.record[props.field.name] = e.target.value || ""),
}),
t.div(
{ className: "input" },
() => props.record[props.field.name],
// the empty space is necessary to prevent jumpy behavior
" ",
),
),
),
// list the autodate field values in a tooltip next to the primary key
() => {
if (!props.field.primaryKey || !props.originalRecord?.id) {
return;
}
const autodateFields = props.collection?.fields?.filter((f) => f.type == "autodate") || [];
if (!autodateFields.length) {
return;
}
const autodateValues = [];
for (let f of autodateFields) {
autodateValues.push(`${f.name}: ${app.utils.displayValue(props.record[f.name])}`);
}
return t.div(
{ className: "field addon" },
t.i({
className: "ri-information-line txt-hint link-faded",
ariaDescription: app.attrs.tooltip(autodateValues.join("\n"), "left"),
}),
);
},
),
() => {
if (props.field.help) {
return t.div({ className: "field-help" }, props.field.help);
}
},
);
}