@10x-media/form-builder 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/LICENSE +21 -0
- package/README.md +1434 -0
- package/dist/constants-B-BUfetP.d.ts +288 -0
- package/dist/exports/client.d.ts +21 -0
- package/dist/exports/client.js +320 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/i18n.d.ts +138 -0
- package/dist/exports/i18n.js +3 -0
- package/dist/exports/react.d.ts +550 -0
- package/dist/exports/react.js +1564 -0
- package/dist/exports/react.js.map +1 -0
- package/dist/exports/rsc.d.ts +16 -0
- package/dist/exports/rsc.js +55 -0
- package/dist/exports/rsc.js.map +1 -0
- package/dist/exports/types.d.ts +5 -0
- package/dist/exports/types.js +1 -0
- package/dist/fieldTypes-B8jkNRob.d.ts +188 -0
- package/dist/fieldTypes-CzhhJXjg.js +88 -0
- package/dist/fieldTypes-CzhhJXjg.js.map +1 -0
- package/dist/index-DfFYGbVF.d.ts +481 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1921 -0
- package/dist/index.js.map +1 -0
- package/dist/keys-N5xGiUsh.js +132 -0
- package/dist/keys-N5xGiUsh.js.map +1 -0
- package/dist/registry-CoCyhtvB.js +282 -0
- package/dist/registry-CoCyhtvB.js.map +1 -0
- package/dist/resolver-OeQyVH2N.js +665 -0
- package/dist/resolver-OeQyVH2N.js.map +1 -0
- package/dist/translations-edMqq_2e.js +152 -0
- package/dist/translations-edMqq_2e.js.map +1 -0
- package/dist/types-DsJ_6kGJ.d.ts +23 -0
- package/package.json +125 -0
- package/styles/form-builder.css +108 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":["useTranslation","usePayloadTranslation","useTranslation","useTranslation"],"sources":["../../src/translations/useTranslation.ts","../../src/client/synthesizeClientField.ts","../../src/client/ConditionRow.tsx","../../src/client/ConditionBuilder.tsx","../../src/client/FormConditionField.tsx"],"sourcesContent":["'use client'\n\nimport { useTranslation as usePayloadTranslation } from '@payloadcms/ui'\n\nimport type { TranslationKey } from './keys'\n\n/**\n * `useTranslation` bound to this plugin's keys, so `t(keys.X)` typechecks without\n * a per-call `@ts-expect-error`. Returns Payload's `{ t, i18n }` unchanged.\n */\nexport const useTranslation = () => usePayloadTranslation<Record<string, never>, TranslationKey>()\n","import type {\n\tDateFieldClient,\n\tNumberFieldClient,\n\tOption,\n\tSelectFieldClient,\n\tTextFieldClient,\n} from 'payload'\nimport type { ConditionFieldType } from '../conditions/fieldTypes'\n\n/** A field row as stored in the form's `fields` blocks array (only the keys the builder reads). */\nexport type FieldRow = {\n\tblockType: string\n\tname?: string\n\tlabel?: string\n\toptions?: Option[]\n\t[key: string]: unknown\n}\n\n/** A condition operand: a selectable form field the builder can compare against. */\nexport type ConditionOperand = {\n\tname: string\n\tlabel: string\n\tconditionType: ConditionFieldType\n\toptions?: Option[]\n}\n\n/** Project a stored field row into a condition operand, or `null` when the row has no usable name. */\nexport const operandFromRow = (\n\trow: FieldRow,\n\tconditionTypes: Record<string, ConditionFieldType>\n): ConditionOperand | null => {\n\tconst name = typeof row.name === 'string' ? row.name.trim() : ''\n\tif (name.length === 0) {\n\t\treturn null\n\t}\n\tconst conditionType = conditionTypes[row.blockType] ?? 'text'\n\treturn {\n\t\tname,\n\t\tlabel: typeof row.label === 'string' && row.label.length > 0 ? row.label : name,\n\t\tconditionType,\n\t\toptions: Array.isArray(row.options) ? row.options : undefined,\n\t}\n}\n\n/**\n * Build the minimal `*FieldClient` a Payload leaf condition input requires for a given operand. Casts\n * are localized to these four synths and nowhere else: `FieldBaseClient` requires only `name`, and each\n * leaf is `FieldBaseClient & Pick<…, 'type' | …>` where every picked member but `type` (and `select`'s\n * required `options`) is optional, so the literals are structurally complete. `dateClientField` omits\n * `admin.date`, so `DateCondition` falls back to its default date format. Each synth returns a single\n * concrete client type so leaf `field` props need no narrowing.\n */\nexport const textClientField = (operand: ConditionOperand): TextFieldClient =>\n\t({ name: operand.name, label: operand.label, type: 'text' }) as TextFieldClient\n\nexport const numberClientField = (operand: ConditionOperand): NumberFieldClient =>\n\t({ name: operand.name, label: operand.label, type: 'number' }) as NumberFieldClient\n\nexport const dateClientField = (operand: ConditionOperand): DateFieldClient =>\n\t({ name: operand.name, label: operand.label, type: 'date' }) as DateFieldClient\n\nexport const selectClientField = (operand: ConditionOperand): SelectFieldClient =>\n\t({\n\t\tname: operand.name,\n\t\tlabel: operand.label,\n\t\ttype: 'select',\n\t\toptions: operand.options ?? [],\n\t}) as SelectFieldClient\n","'use client'\n\nimport {\n\tDateCondition,\n\tNumberCondition,\n\tReactSelect,\n\ttype ReactSelectOption,\n\tSelectCondition,\n\tTextCondition,\n} from '@payloadcms/ui'\nimport type { Operator } from 'payload'\nimport {\n\tconditionOperators,\n\tfirstOperatorFor,\n\toperatorLabelKey,\n\toperatorValueShape,\n} from '../conditions/fieldTypes'\nimport { keys } from '../translations/keys'\nimport { useTranslation } from '../translations/useTranslation'\nimport {\n\ttype ConditionOperand,\n\tdateClientField,\n\tnumberClientField,\n\tselectClientField,\n\ttextClientField,\n} from './synthesizeClientField'\n\nexport type RowCondition = { field: string; operator: Operator; value: unknown }\n\nexport type ConditionRowProps = {\n\tcondition: RowCondition\n\toperands: ConditionOperand[]\n\tonChange: (next: RowCondition) => void\n\tonRemove: () => void\n}\n\n/** ReactSelect's `onChange` hands back `Option | Option[]`; narrow it to the single chosen option. */\nconst singleOption = (\n\tselected: ReactSelectOption | ReactSelectOption[]\n): ReactSelectOption | undefined => (Array.isArray(selected) ? selected[0] : selected)\n\nexport const ConditionRow = ({ condition, operands, onChange, onRemove }: ConditionRowProps) => {\n\tconst { t, i18n } = useTranslation()\n\tconst operand = operands.find((entry) => entry.name === condition.field)\n\tconst conditionType = operand?.conditionType ?? 'text'\n\tconst operators = conditionOperators[conditionType]\n\n\tconst fieldOptions: ReactSelectOption[] = operands.map((entry) => ({\n\t\tlabel: entry.label,\n\t\tvalue: entry.name,\n\t}))\n\tconst operatorOptions: ReactSelectOption[] = operators.map((operator) => ({\n\t\tlabel: i18n.t(operatorLabelKey(operator)),\n\t\tvalue: operator,\n\t}))\n\n\tconst handleFieldChange = (selected: ReactSelectOption | ReactSelectOption[]) => {\n\t\tconst chosen = singleOption(selected)\n\t\tconst next = operands.find((entry) => entry.name === chosen?.value)\n\t\tif (!next) {\n\t\t\treturn\n\t\t}\n\t\tonChange({\n\t\t\tfield: next.name,\n\t\t\toperator: firstOperatorFor(next.conditionType),\n\t\t\tvalue: undefined,\n\t\t})\n\t}\n\n\tconst handleOperatorChange = (selected: ReactSelectOption | ReactSelectOption[]) => {\n\t\tconst chosen = singleOption(selected)\n\t\tif (!chosen) {\n\t\t\treturn\n\t\t}\n\t\tconst operator = chosen.value as Operator\n\t\tconst keepValue = operatorValueShape(condition.operator) === operatorValueShape(operator)\n\t\tonChange({ ...condition, operator, value: keepValue ? condition.value : undefined })\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"form-builder-condition-row\"\n\t\t\tstyle={{ display: 'flex', gap: 8, alignItems: 'flex-start' }}\n\t\t>\n\t\t\t<div style={{ minWidth: 160 }}>\n\t\t\t\t<ReactSelect\n\t\t\t\t\toptions={fieldOptions}\n\t\t\t\t\tvalue={fieldOptions.find((option) => option.value === condition.field)}\n\t\t\t\t\tplaceholder={t(keys.conditionSelectField)}\n\t\t\t\t\tisClearable={false}\n\t\t\t\t\tonChange={handleFieldChange}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div style={{ minWidth: 140 }}>\n\t\t\t\t<ReactSelect\n\t\t\t\t\toptions={operatorOptions}\n\t\t\t\t\tvalue={operatorOptions.find((option) => option.value === condition.operator)}\n\t\t\t\t\tdisabled={!operand}\n\t\t\t\t\tisClearable={false}\n\t\t\t\t\tonChange={handleOperatorChange}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t<ConditionValue\n\t\t\t\t\tconditionType={conditionType}\n\t\t\t\t\toperand={operand}\n\t\t\t\t\toperator={condition.operator}\n\t\t\t\t\tvalue={condition.value}\n\t\t\t\t\tonChange={(value) => onChange({ ...condition, value })}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<button type=\"button\" onClick={onRemove} aria-label={t(keys.conditionRemove)}>\n\t\t\t\t{t(keys.conditionRemove)}\n\t\t\t</button>\n\t\t</div>\n\t)\n}\n\ntype ConditionValueProps = {\n\tconditionType: ConditionOperand['conditionType']\n\toperand?: ConditionOperand\n\toperator: Operator\n\tvalue: unknown\n\tonChange: (value: unknown) => void\n}\n\nconst ConditionValue = ({\n\tconditionType,\n\toperand,\n\toperator,\n\tvalue,\n\tonChange,\n}: ConditionValueProps) => {\n\tconst { t } = useTranslation()\n\tif (conditionType === 'checkbox' || operatorValueShape(operator) === 'boolean') {\n\t\tconst options: ReactSelectOption[] = [\n\t\t\t{ label: t(keys.conditionTrue), value: 'true' },\n\t\t\t{ label: t(keys.conditionFalse), value: 'false' },\n\t\t]\n\t\tconst handleBooleanChange = (selected: ReactSelectOption | ReactSelectOption[]) => {\n\t\t\tconst chosen = singleOption(selected)\n\t\t\tonChange(chosen?.value === 'true')\n\t\t}\n\t\treturn (\n\t\t\t<ReactSelect\n\t\t\t\toptions={options}\n\t\t\t\tvalue={options.find((option) => String(option.value) === String(value)) ?? options[0]}\n\t\t\t\tisClearable={false}\n\t\t\t\tonChange={handleBooleanChange}\n\t\t\t/>\n\t\t)\n\t}\n\tif (!operand) {\n\t\treturn null\n\t}\n\tswitch (conditionType) {\n\t\tcase 'number':\n\t\t\treturn (\n\t\t\t\t<NumberCondition\n\t\t\t\t\tdisabled={false}\n\t\t\t\t\tfield={numberClientField(operand)}\n\t\t\t\t\toperator={operator}\n\t\t\t\t\tvalue={value as number | number[]}\n\t\t\t\t\tonChange={(next: string) => onChange(next)}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase 'date':\n\t\t\treturn (\n\t\t\t\t<DateCondition\n\t\t\t\t\tdisabled={false}\n\t\t\t\t\tfield={dateClientField(operand)}\n\t\t\t\t\toperator={operator}\n\t\t\t\t\tvalue={value as Date | string}\n\t\t\t\t\tonChange={(next: Date | string) => onChange(next)}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase 'select':\n\t\t\treturn (\n\t\t\t\t<SelectCondition\n\t\t\t\t\tdisabled={false}\n\t\t\t\t\tfield={selectClientField(operand)}\n\t\t\t\t\toperator={operator}\n\t\t\t\t\toptions={operand.options ?? []}\n\t\t\t\t\tvalue={value as string}\n\t\t\t\t\tonChange={(next: string) => onChange(next)}\n\t\t\t\t/>\n\t\t\t)\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<TextCondition\n\t\t\t\t\tdisabled={false}\n\t\t\t\t\tfield={textClientField(operand)}\n\t\t\t\t\toperator={operator}\n\t\t\t\t\tvalue={value as string | string[]}\n\t\t\t\t\tonChange={(next: string) => onChange(next)}\n\t\t\t\t/>\n\t\t\t)\n\t}\n}\n","'use client'\n\nimport { useFormFields } from '@payloadcms/ui'\nimport type { Operator, Where } from 'payload'\nimport { reduceFieldsToValues, transformWhereQuery } from 'payload/shared'\nimport { useMemo } from 'react'\nimport { type ConditionFieldType, firstOperatorFor } from '../conditions/fieldTypes'\nimport { keys } from '../translations/keys'\nimport { useTranslation } from '../translations/useTranslation'\nimport { ConditionRow, type RowCondition } from './ConditionRow'\nimport { type ConditionOperand, type FieldRow, operandFromRow } from './synthesizeClientField'\n\nexport type ConditionBuilderProps = {\n\tvalue?: Where\n\tonChange: (next: Where) => void\n\tconditionTypes: Record<string, ConditionFieldType>\n\t/** This field's own machine name, excluded from the operand list (a field cannot condition on itself). */\n\tselfName?: string\n}\n\nconst toRow = (constraint: Record<string, unknown>): RowCondition | null => {\n\tconst field = Object.keys(constraint)[0]\n\tif (!field) {\n\t\treturn null\n\t}\n\tconst ops = constraint[field] as Record<string, unknown>\n\tconst operator = Object.keys(ops)[0] as Operator | undefined\n\tif (!operator) {\n\t\treturn null\n\t}\n\treturn { field, operator, value: ops[operator] }\n}\n\nconst fromRow = (row: RowCondition): Where => ({ [row.field]: { [row.operator]: row.value } })\n\nconst readGroups = (value: Where | undefined): RowCondition[][] => {\n\tif (!value || Object.keys(value).length === 0) {\n\t\treturn []\n\t}\n\tconst canonical = transformWhereQuery(value)\n\tconst or = Array.isArray(canonical.or) ? canonical.or : []\n\treturn or.map((group) => {\n\t\tconst and = Array.isArray((group as Where).and) ? ((group as Where).and as Where[]) : []\n\t\treturn and\n\t\t\t.map((constraint) => toRow(constraint as Record<string, unknown>))\n\t\t\t.filter((row): row is RowCondition => row !== null)\n\t})\n}\n\nconst writeGroups = (groups: RowCondition[][]): Where => ({\n\tor: groups.filter((group) => group.length > 0).map((group) => ({ and: group.map(fromRow) })),\n})\n\nconst operandsFromData = (\n\tdata: Record<string, unknown>,\n\tconditionTypes: Record<string, ConditionFieldType>,\n\tselfName: string | undefined\n): ConditionOperand[] => {\n\tconst rows = Array.isArray(data.fields) ? (data.fields as FieldRow[]) : []\n\treturn rows\n\t\t.map((row) => operandFromRow(row, conditionTypes))\n\t\t.filter((operand): operand is ConditionOperand => operand !== null && operand.name !== selfName)\n}\n\nexport const ConditionBuilder = ({\n\tvalue,\n\tonChange,\n\tconditionTypes,\n\tselfName,\n}: ConditionBuilderProps) => {\n\tconst { t } = useTranslation()\n\t// Serialize the operand list so the builder re-renders only when operands actually change (a field\n\t// added, renamed, retyped, or its options edited), not on every unrelated form-state update.\n\tconst operandsJson = useFormFields(([fields]) =>\n\t\tJSON.stringify(operandsFromData(reduceFieldsToValues(fields, true), conditionTypes, selfName))\n\t)\n\tconst operands = useMemo(() => JSON.parse(operandsJson) as ConditionOperand[], [operandsJson])\n\n\tconst groups = readGroups(value)\n\tconst emit = (next: RowCondition[][]) => onChange(writeGroups(next))\n\n\tconst addCondition = (groupIndex: number) => {\n\t\tconst first = operands[0]\n\t\tif (!first) {\n\t\t\treturn\n\t\t}\n\t\tconst row: RowCondition = {\n\t\t\tfield: first.name,\n\t\t\toperator: firstOperatorFor(first.conditionType),\n\t\t\tvalue: undefined,\n\t\t}\n\t\temit(\n\t\t\tgroups.length === 0\n\t\t\t\t? [[row]]\n\t\t\t\t: groups.map((group, index) => (index === groupIndex ? [...group, row] : group))\n\t\t)\n\t}\n\n\tconst addOrGroup = () => {\n\t\tconst first = operands[0]\n\t\tif (!first) {\n\t\t\treturn\n\t\t}\n\t\temit([\n\t\t\t...groups,\n\t\t\t[{ field: first.name, operator: firstOperatorFor(first.conditionType), value: undefined }],\n\t\t])\n\t}\n\n\tconst updateRow = (groupIndex: number, rowIndex: number, row: RowCondition) =>\n\t\temit(\n\t\t\tgroups.map((group, index) =>\n\t\t\t\tindex === groupIndex\n\t\t\t\t\t? group.map((existing, position) => (position === rowIndex ? row : existing))\n\t\t\t\t\t: group\n\t\t\t)\n\t\t)\n\n\tconst removeRow = (groupIndex: number, rowIndex: number) =>\n\t\temit(\n\t\t\tgroups\n\t\t\t\t.map((group, index) =>\n\t\t\t\t\tindex === groupIndex ? group.filter((_, position) => position !== rowIndex) : group\n\t\t\t\t)\n\t\t\t\t.filter((group) => group.length > 0)\n\t\t)\n\n\tif (operands.length === 0) {\n\t\treturn <p className=\"form-builder-condition__hint\">{t(keys.conditionNoFields)}</p>\n\t}\n\n\treturn (\n\t\t<div className=\"form-builder-condition\">\n\t\t\t{groups.length === 0 ? (\n\t\t\t\t<p className=\"form-builder-condition__hint\">{t(keys.conditionEmpty)}</p>\n\t\t\t) : (\n\t\t\t\tgroups.map((group, groupIndex) => (\n\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: groups are positional and never reordered\n\t\t\t\t\t<div key={groupIndex} className=\"form-builder-condition__group\">\n\t\t\t\t\t\t{groupIndex > 0 ? (\n\t\t\t\t\t\t\t<div className=\"form-builder-condition__or\">{t(keys.conditionOr)}</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{group.map((row, rowIndex) => (\n\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: rows are positional and never reordered\n\t\t\t\t\t\t\t<div key={rowIndex} className=\"form-builder-condition__and\">\n\t\t\t\t\t\t\t\t{rowIndex > 0 ? <span>{t(keys.conditionAnd)}</span> : null}\n\t\t\t\t\t\t\t\t<ConditionRow\n\t\t\t\t\t\t\t\t\tcondition={row}\n\t\t\t\t\t\t\t\t\toperands={operands}\n\t\t\t\t\t\t\t\t\tonChange={(next) => updateRow(groupIndex, rowIndex, next)}\n\t\t\t\t\t\t\t\t\tonRemove={() => removeRow(groupIndex, rowIndex)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<button type=\"button\" onClick={() => addCondition(groupIndex)}>\n\t\t\t\t\t\t\t{t(keys.conditionAddCondition)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t))\n\t\t\t)}\n\t\t\t<div className=\"form-builder-condition__actions\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => (groups.length === 0 ? addCondition(0) : addOrGroup())}\n\t\t\t\t>\n\t\t\t\t\t{groups.length === 0 ? t(keys.conditionAddCondition) : t(keys.conditionAddOr)}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","'use client'\n\nimport { FieldLabel, useField } from '@payloadcms/ui'\nimport type { StaticLabel, Where } from 'payload'\nimport type { ConditionFieldType } from '../conditions/fieldTypes'\nimport { ConditionBuilder } from './ConditionBuilder'\n\n/** Props: standard JSON field client props plus the `conditionTypes` map we pass via clientProps. */\nexport type FormConditionFieldProps = {\n\tpath?: string\n\tfield?: { label?: unknown; name?: string }\n\tlabel?: unknown\n\tconditionTypes: Record<string, ConditionFieldType>\n}\n\nconst toStaticLabel = (label: unknown): StaticLabel | undefined => {\n\tif (typeof label === 'string') {\n\t\treturn label\n\t}\n\tif (label && typeof label === 'object') {\n\t\treturn label as Record<string, string>\n\t}\n\treturn undefined\n}\n\n/**\n * The `Field` mounted on a form field's `visibleWhen`/`validateWhen` json column. Binds the field's own\n * path with `useField<Where>()` (the QueryPresetsWhereField precedent) and renders the native builder.\n */\nexport const FormConditionField = (props: FormConditionFieldProps) => {\n\tconst { path, setValue, value } = useField<Where>()\n\tconst label = toStaticLabel(props.field?.label ?? props.label)\n\treturn (\n\t\t<div className=\"field-type form-builder-condition-field\">\n\t\t\t<FieldLabel label={label} path={path} />\n\t\t\t<ConditionBuilder\n\t\t\t\tvalue={value ?? undefined}\n\t\t\t\tonChange={setValue}\n\t\t\t\tconditionTypes={props.conditionTypes}\n\t\t\t\tselfName={props.field?.name}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
//#region src/translations/keys.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Typed translation keys. Lookups must go through these constants, not string
|
|
4
|
+
* literals (enforced by requireI18nKeysTyped.grit). Every key here must have a
|
|
5
|
+
* value in every locale (`en.ts`), or it is a type error.
|
|
6
|
+
*/
|
|
7
|
+
declare const keys: {
|
|
8
|
+
readonly pluginName: "formBuilder:pluginName";
|
|
9
|
+
readonly fieldTitle: "formBuilder:fieldTitle";
|
|
10
|
+
readonly fieldTypeText: "formBuilder:fieldType.text";
|
|
11
|
+
readonly fieldTypeTextarea: "formBuilder:fieldType.textarea";
|
|
12
|
+
readonly fieldTypeEmail: "formBuilder:fieldType.email";
|
|
13
|
+
readonly fieldTypeNumber: "formBuilder:fieldType.number";
|
|
14
|
+
readonly fieldTypeSelect: "formBuilder:fieldType.select";
|
|
15
|
+
readonly fieldTypeCheckbox: "formBuilder:fieldType.checkbox";
|
|
16
|
+
readonly configOptions: "formBuilder:config.options";
|
|
17
|
+
readonly configOption: "formBuilder:config.option";
|
|
18
|
+
readonly configOptionLabel: "formBuilder:config.optionLabel";
|
|
19
|
+
readonly configOptionValue: "formBuilder:config.optionValue";
|
|
20
|
+
readonly validationRequired: "formBuilder:validation.required";
|
|
21
|
+
readonly validationEmail: "formBuilder:validation.email";
|
|
22
|
+
readonly validationNumber: "formBuilder:validation.number";
|
|
23
|
+
readonly validationSelect: "formBuilder:validation.select";
|
|
24
|
+
readonly formatYes: "formBuilder:format.yes";
|
|
25
|
+
readonly formatNo: "formBuilder:format.no";
|
|
26
|
+
readonly configName: "formBuilder:config.name";
|
|
27
|
+
readonly configLabel: "formBuilder:config.label";
|
|
28
|
+
readonly configRequired: "formBuilder:config.required";
|
|
29
|
+
readonly configWidth: "formBuilder:config.width";
|
|
30
|
+
readonly configPlaceholder: "formBuilder:config.placeholder";
|
|
31
|
+
readonly configDescription: "formBuilder:config.description";
|
|
32
|
+
readonly configVisibleWhen: "formBuilder:config.visibleWhen";
|
|
33
|
+
readonly configValidateWhen: "formBuilder:config.validateWhen";
|
|
34
|
+
readonly submissionAnswers: "formBuilder:submission.answers";
|
|
35
|
+
readonly submissionNoAnswers: "formBuilder:submission.noAnswers";
|
|
36
|
+
readonly ruleMinLength: "formBuilder:rule.minLength.label";
|
|
37
|
+
readonly ruleMaxLength: "formBuilder:rule.maxLength.label";
|
|
38
|
+
readonly ruleMin: "formBuilder:rule.min.label";
|
|
39
|
+
readonly ruleMax: "formBuilder:rule.max.label";
|
|
40
|
+
readonly rulePattern: "formBuilder:rule.pattern.label";
|
|
41
|
+
readonly ruleEmail: "formBuilder:rule.email.label";
|
|
42
|
+
readonly ruleUrl: "formBuilder:rule.url.label";
|
|
43
|
+
readonly ruleOneOf: "formBuilder:rule.oneOf.label";
|
|
44
|
+
readonly ruleMatchesField: "formBuilder:rule.matchesField.label";
|
|
45
|
+
readonly ruleNotAlreadySubmitted: "formBuilder:rule.notAlreadySubmitted.label";
|
|
46
|
+
readonly ruleMinLengthMessage: "formBuilder:rule.minLength.message";
|
|
47
|
+
readonly ruleMaxLengthMessage: "formBuilder:rule.maxLength.message";
|
|
48
|
+
readonly ruleMinMessage: "formBuilder:rule.min.message";
|
|
49
|
+
readonly ruleMaxMessage: "formBuilder:rule.max.message";
|
|
50
|
+
readonly rulePatternMessage: "formBuilder:rule.pattern.message";
|
|
51
|
+
readonly ruleEmailMessage: "formBuilder:rule.email.message";
|
|
52
|
+
readonly ruleUrlMessage: "formBuilder:rule.url.message";
|
|
53
|
+
readonly ruleOneOfMessage: "formBuilder:rule.oneOf.message";
|
|
54
|
+
readonly ruleMatchesFieldMessage: "formBuilder:rule.matchesField.message";
|
|
55
|
+
readonly ruleNotAlreadySubmittedMessage: "formBuilder:rule.notAlreadySubmitted.message";
|
|
56
|
+
readonly ruleParamMin: "formBuilder:rule.param.min";
|
|
57
|
+
readonly ruleParamMax: "formBuilder:rule.param.max";
|
|
58
|
+
readonly ruleParamPattern: "formBuilder:rule.param.pattern";
|
|
59
|
+
readonly ruleParamFlags: "formBuilder:rule.param.flags";
|
|
60
|
+
readonly ruleParamValues: "formBuilder:rule.param.values";
|
|
61
|
+
readonly ruleParamField: "formBuilder:rule.param.field";
|
|
62
|
+
readonly validationsLabel: "formBuilder:validations.label";
|
|
63
|
+
readonly validationMessageLabel: "formBuilder:validations.message";
|
|
64
|
+
readonly validationSeverityLabel: "formBuilder:validations.severity";
|
|
65
|
+
readonly validationSeverityError: "formBuilder:validations.severity.error";
|
|
66
|
+
readonly validationSeverityWarning: "formBuilder:validations.severity.warning";
|
|
67
|
+
readonly conditionAddCondition: "formBuilder:condition.addCondition";
|
|
68
|
+
readonly conditionAddOr: "formBuilder:condition.addOr";
|
|
69
|
+
readonly conditionAnd: "formBuilder:condition.and";
|
|
70
|
+
readonly conditionOr: "formBuilder:condition.or";
|
|
71
|
+
readonly conditionRemove: "formBuilder:condition.remove";
|
|
72
|
+
readonly conditionNoFields: "formBuilder:condition.noFields";
|
|
73
|
+
readonly conditionEmpty: "formBuilder:condition.empty";
|
|
74
|
+
readonly conditionSelectField: "formBuilder:condition.selectField";
|
|
75
|
+
readonly conditionValuePlaceholder: "formBuilder:condition.value";
|
|
76
|
+
readonly conditionTrue: "formBuilder:condition.true";
|
|
77
|
+
readonly conditionFalse: "formBuilder:condition.false";
|
|
78
|
+
readonly configAdvanced: "formBuilder:config.advanced";
|
|
79
|
+
readonly configHidden: "formBuilder:config.hidden";
|
|
80
|
+
readonly fieldTypeCalculation: "formBuilder:fieldType.calculation";
|
|
81
|
+
readonly configExpression: "formBuilder:config.expression";
|
|
82
|
+
readonly configCalcDisplay: "formBuilder:config.calcDisplay";
|
|
83
|
+
readonly configDefaultPresentation: "formBuilder:config.defaultPresentation";
|
|
84
|
+
readonly presentationPage: "formBuilder:presentation.page";
|
|
85
|
+
readonly presentationModal: "formBuilder:presentation.modal";
|
|
86
|
+
readonly presentationDrawer: "formBuilder:presentation.drawer";
|
|
87
|
+
readonly presentationInline: "formBuilder:presentation.inline";
|
|
88
|
+
readonly actionEmailTeam: "formBuilder:action.emailTeam";
|
|
89
|
+
readonly actionConfirmation: "formBuilder:action.confirmation";
|
|
90
|
+
readonly actionSignedWebhook: "formBuilder:action.signedWebhook";
|
|
91
|
+
readonly actionConfigTo: "formBuilder:action.config.to";
|
|
92
|
+
readonly actionConfigSubject: "formBuilder:action.config.subject";
|
|
93
|
+
readonly actionConfigBody: "formBuilder:action.config.body";
|
|
94
|
+
readonly actionConfigToField: "formBuilder:action.config.toField";
|
|
95
|
+
readonly actionConfigUrl: "formBuilder:action.config.url";
|
|
96
|
+
readonly actionConfigSecret: "formBuilder:action.config.secret";
|
|
97
|
+
readonly configActions: "formBuilder:config.actions";
|
|
98
|
+
readonly consentSourceStatic: "formBuilder:consentSource.static";
|
|
99
|
+
readonly consentSourcePageReference: "formBuilder:consentSource.pageReference";
|
|
100
|
+
readonly consentConfigLabel: "formBuilder:consent.config.label";
|
|
101
|
+
readonly consentConfigUrl: "formBuilder:consent.config.url";
|
|
102
|
+
readonly consentConfigVersion: "formBuilder:consent.config.version";
|
|
103
|
+
readonly consentConfigRelationTo: "formBuilder:consent.config.relationTo";
|
|
104
|
+
readonly consentConfigDocId: "formBuilder:consent.config.docId";
|
|
105
|
+
readonly consentConfigUrlField: "formBuilder:consent.config.urlField";
|
|
106
|
+
readonly consentConfigCaptureVersion: "formBuilder:consent.config.captureVersion";
|
|
107
|
+
readonly fieldTypeConsent: "formBuilder:fieldType.consent";
|
|
108
|
+
readonly consentConfigStatement: "formBuilder:consent.config.statement";
|
|
109
|
+
readonly consentConfigSource: "formBuilder:consent.config.source";
|
|
110
|
+
readonly consentConfigSourceConfig: "formBuilder:consent.config.sourceConfig";
|
|
111
|
+
readonly consentConfigOptional: "formBuilder:consent.config.optional";
|
|
112
|
+
readonly resultsTitle: "formBuilder:results.title";
|
|
113
|
+
readonly resultsResponses: "formBuilder:results.responses";
|
|
114
|
+
readonly resultsNoResponses: "formBuilder:results.noResponses";
|
|
115
|
+
readonly resultsTruncated: "formBuilder:results.truncated";
|
|
116
|
+
readonly configShowResults: "formBuilder:config.showResults";
|
|
117
|
+
readonly configResultsField: "formBuilder:config.resultsField";
|
|
118
|
+
readonly validationFileMissing: "formBuilder:validation.file.missing";
|
|
119
|
+
readonly validationFileMimeType: "formBuilder:validation.file.mimeType";
|
|
120
|
+
readonly validationFileTooLarge: "formBuilder:validation.file.tooLarge";
|
|
121
|
+
readonly fieldTypeFile: "formBuilder:fieldType.file";
|
|
122
|
+
readonly fileConfigRelationTo: "formBuilder:file.config.relationTo";
|
|
123
|
+
readonly fileConfigMimeTypes: "formBuilder:file.config.mimeTypes";
|
|
124
|
+
readonly fileConfigMaxSize: "formBuilder:file.config.maxSize";
|
|
125
|
+
readonly spamRateLimited: "formBuilder:spam.rateLimited";
|
|
126
|
+
readonly spamRejected: "formBuilder:spam.rejected";
|
|
127
|
+
readonly spamCaptchaFailed: "formBuilder:spam.captchaFailed";
|
|
128
|
+
};
|
|
129
|
+
type TranslationKey = (typeof keys)[keyof typeof keys];
|
|
130
|
+
//#endregion
|
|
131
|
+
//#region src/translations/index.d.ts
|
|
132
|
+
/** Per-locale messages merged into `config.i18n.translations`. English only for now. */
|
|
133
|
+
declare const translations: {
|
|
134
|
+
en: Record<string, Record<string, string>>;
|
|
135
|
+
};
|
|
136
|
+
//#endregion
|
|
137
|
+
export { type TranslationKey as FormBuilderTranslationKeys, keys, translations };
|
|
138
|
+
//# sourceMappingURL=i18n.d.ts.map
|