Files
pocketbase/ui/src/fields/password/settings.js
T
2026-04-18 16:50:39 +03:00

167 lines
6.6 KiB
JavaScript

// {
// originalCollection: undefined,
// collection: undefined,
// field
// get fieldIndex: int/-1,
// get originalField: undefined
// }
export function settings(data) {
const uniqueId = "f_" + app.utils.randomString();
return app.components.fieldSettings(data, {
showHidden: false,
showPresentable: false,
showDuplicate: false,
content: t.div(
{ className: "grid sm" },
t.div(
{ className: "col-sm-6" },
t.div(
{ className: "field" },
t.label(
{ htmlFor: uniqueId + ".min" },
t.span({ className: "txt" }, "Min length"),
t.i({
className: "ri-information-line link-hint",
ariaDescription: app.attrs.tooltip("Clear the field or set it to 0 for no limit."),
}),
),
t.input({
type: "number",
id: uniqueId + ".min",
name: () => `fields.${data.fieldIndex}.min`,
step: 1,
min: 0,
max: 71,
placeholder: "No min limit",
value: () => data.field.min || "",
oninput: (e) => {
data.field.min = parseInt(e.target.value, 10);
},
}),
),
),
t.div(
{ className: "col-sm-6" },
t.div(
{ className: "field" },
t.label(
{ htmlFor: uniqueId + ".max" },
t.span({ className: "txt" }, "Max length"),
t.i({
className: "ri-information-line link-hint",
ariaDescription: app.attrs.tooltip(
"Clear the field or set it to 0 to fallback to the default limit (71).",
),
}),
),
t.input({
type: "number",
id: uniqueId + ".max",
name: () => `fields.${data.fieldIndex}.max`,
step: 1,
min: () => data.field.min || 0,
max: 71,
placeholder: "Up to 71 chars",
value: () => data.field.max || "",
oninput: (e) => {
data.field.max = parseInt(e.target.value, 10);
},
}),
),
),
t.div(
{ className: "col-sm-6" },
t.div(
{ className: "field" },
t.label(
{ htmlFor: uniqueId + ".max" },
t.span({ className: "txt" }, "Bcrypt cost"),
t.i({
className: "ri-information-line link-hint",
ariaDescription: app.attrs.tooltip(
"Clear the field or set it to 0 to fallback to the default (10).",
),
}),
),
t.input({
type: "number",
id: uniqueId + ".cost",
name: () => `fields.${data.fieldIndex}.cost`,
step: 1,
// https://pkg.go.dev/golang.org/x/crypto/bcrypt#pkg-constants
min: 4,
max: 31,
placeholder: "Default to 10",
value: () => data.field.cost || "",
oninput: (e) => {
data.field.cost = parseInt(e.target.value, 10);
},
}),
),
),
t.div(
{ className: "col-sm-6" },
t.div(
{ className: "field" },
t.label(
{ htmlFor: uniqueId + ".pattern" },
t.span({ className: "txt" }, "Validation pattern"),
),
t.input({
type: "text",
id: uniqueId + ".pattern",
placeholder: "ex. ^\\w+$",
name: () => `fields.${data.fieldIndex}.pattern`,
value: () => data.field.pattern || "",
oninput: (e) => (data.field.pattern = e.target.value),
}),
),
),
t.div(
{ className: "col-sm-12" },
t.div(
{ className: "field" },
t.label({ htmlFor: uniqueId + ".help" }, "Help text"),
t.input({
type: "text",
id: uniqueId + ".help",
name: () => `fields.${data.fieldIndex}.help`,
value: () => data.field.help || "",
oninput: (e) => (data.field.help = e.target.value),
}),
),
),
),
footer: () => {
// the system password auth field is always required
if (data.collection?.type == "auth" && data.field.name == "password") {
return;
}
return [
t.div(
{ className: "field" },
t.input({
className: "sm",
type: "checkbox",
id: uniqueId + ".required",
name: () => `fields.${data.fieldIndex}.required`,
checked: () => !!data.field.required,
onchange: (e) => (data.field.required = e.target.checked),
}),
t.label(
{ htmlFor: uniqueId + ".required" },
t.span({ className: "txt" }, "Required"),
t.small({ className: "txt-hint" }, "(!='')"),
t.i({
className: "ri-information-line link-hint",
ariaDescription: app.attrs.tooltip("Requires the field value to be nonempty string"),
}),
),
),
];
},
});
}