@sorlo/forms 0.1.0 → 0.1.1
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/dist/index.d.mts +317 -27
- package/dist/index.d.ts +317 -27
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/FormProvider/index.tsx","../src/utils/validation.ts","../src/utils/conditions.ts","../src/utils/inputs.ts","../src/components/Field/index.tsx","../src/translations/index.ts","../src/translations/en.ts","../src/i18n.ts","../src/components/Fieldset/index.tsx","../src/inputs/index.tsx","../src/inputs/Boolean/index.tsx","../src/utils/messages.ts","../src/inputs/Checkbox/index.tsx","../src/inputs/Identifier/index.tsx","../src/utils/typescript.ts","../src/inputs/Color/index.tsx","../src/inputs/Conditions/index.tsx","../src/inputs/Content/index.tsx","../src/inputs/Date/index.tsx","../src/inputs/Datetime/index.tsx","../src/inputs/Email/index.tsx","../src/inputs/Flexible/index.tsx","../src/inputs/Group/index.tsx","../src/inputs/Hidden/index.tsx","../src/inputs/Matrix/index.tsx","../src/inputs/Number/index.tsx","../src/inputs/Password/index.tsx","../src/inputs/Radio/index.tsx","../src/inputs/Range/index.tsx","../src/inputs/Repeater/index.tsx","../src/inputs/SchemaBuilder/index.tsx","../src/components/Modal/index.tsx","../src/inputs/Select/index.tsx","../src/inputs/Tel/index.tsx","../src/inputs/Text/index.tsx","../src/inputs/Textarea/index.tsx","../src/inputs/Time/index.tsx","../src/inputs/Url/index.tsx","../src/components/Form/index.tsx","../src/index.tsx"],"sourcesContent":["import { FieldMessages, FieldSchema } from '@/types/fields'\nimport { Input } from '@/types/inputs'\nimport { ConditionScopes } from '@/utils/conditions'\nimport { Dispatch, SetStateAction, createContext, useContext, useMemo } from 'react'\n\n// Data that changes as the form is used\nexport interface DataContext {\n schema: Array<FieldSchema>\n values: Record<string, any>\n messages: Record<string, any>\n validity: Record<string, boolean | undefined>\n}\n\n// Values with stable identities, so consumers that only need these are not\n// re-rendered by every value change\nexport interface StaticContext {\n inputs: Record<string, Input>\n validationCounter: number\n\n setSchema: Dispatch<SetStateAction<DataContext['schema']>>\n setValues: Dispatch<SetStateAction<DataContext['values']>>\n setMessages: Dispatch<SetStateAction<DataContext['messages']>>\n setValidity: Dispatch<SetStateAction<DataContext['validity']>>\n}\n\nexport type Context = DataContext & StaticContext\n\n// The path of a field relative to the form's root, e.g. ['pets', 0, 'petname']\nexport type FieldPath = Array<string | number>\n\n// A partial update of a field's state, where an undefined patch removes the\n// field's entries entirely\nexport type FieldStatePatch = undefined | { messages?: FieldMessages; valid?: boolean | undefined }\n\n// Report a field's messages and validity to the form's path keyed maps\nexport type FieldStateReport = (path: FieldPath, patch: FieldStatePatch) => void\n\n// Carries reporting upwards and path resolution downwards; both compose the\n// same way at every level, so a field can learn its absolute path\nexport interface FieldReportContextValue {\n report: FieldStateReport\n resolve: (path: FieldPath) => FieldPath\n}\n\n// State injected from outside the form, e.g. a server validation report,\n// shown for a field until that field next reports its own state\nexport interface FieldInjectionContextValue {\n messages: Record<string, FieldMessages>\n validity: Record<string, boolean | undefined>\n clear: (key: string) => void\n}\n\n// Create form Context\nexport const FormContext = createContext<undefined | DataContext>(undefined)\nexport const FormStaticContext = createContext<undefined | StaticContext>(undefined)\nexport const FieldReportContext = createContext<undefined | FieldReportContextValue>(undefined)\nexport const FieldInjectionContext = createContext<undefined | FieldInjectionContextValue>(undefined)\n\n// The stack of value scopes conditions are evaluated against, extended by\n// every container (group, repeater item, matrix cell)\nexport const FieldScopeContext = createContext<undefined | ConditionScopes>(undefined)\n\n// Hook for consuming form context\nexport const useFormContext = (): Context => {\n const context = useContext(FormContext)\n const staticContext = useContext(FormStaticContext)\n\n const merged = useMemo(() => {\n if (!context || !staticContext) return undefined\n return { ...context, ...staticContext }\n }, [context, staticContext])\n\n if (!merged) {\n throw new Error('useFormContext must be used within a <FormProvider>')\n }\n\n return merged\n}\n\n// Hook for consuming static form context\nexport const useFormStaticContext = () => {\n const context = useContext(FormStaticContext)\n if (!context) {\n throw new Error('useFormStaticContext must be used within a <FormProvider>')\n }\n return context\n}\n","export interface ValidationResponse {\n isValid: boolean | undefined\n messages: Array<string>\n value: any\n}\n\nexport interface ValidationResponseReset extends ValidationResponse {\n isValid: undefined\n}\n\nexport interface ValidationResponseError extends ValidationResponse {\n isValid: false\n}\n\nexport interface ValidationResponseSuccess extends ValidationResponse {\n isValid: true\n}\n\nexport function validationReset(value: any, message: string | Array<string>): ValidationResponseReset {\n return {\n isValid: undefined,\n messages: Array.isArray(message) ? message : message ? [message] : [],\n value: value,\n }\n}\n\nexport function validationError(value: any, message: string | Array<string>): ValidationResponseError {\n return {\n isValid: false,\n messages: Array.isArray(message) ? message : message ? [message] : [],\n value: value,\n }\n}\n\nexport function validationSuccess(value: any, message?: string | Array<string>): ValidationResponseSuccess {\n return {\n isValid: true,\n messages: Array.isArray(message) ? message : message ? [message] : [],\n value: value,\n }\n}\n\n// Check whether a value is considered empty, note that 0 and false are not empty\nexport function isEmptyValue(value: any) {\n if (Array.isArray(value)) return value.length === 0\n return value === '' || value === null || value === undefined\n}\n\n// Check whether a value is a valid http(s) URL\nexport function isUrl(url: string) {\n try {\n const parsed = new URL(url)\n return parsed.protocol === 'http:' || parsed.protocol === 'https:'\n } catch {\n return false\n }\n}\n\n// Check whether a value looks like a phone number, allowing common formatting\nexport function isTel(tel: string) {\n const digits = tel.replace(/[\\s().-]/g, '')\n return /^\\+?\\d{5,15}$/.test(digits)\n}\n\nexport function isEmail(email: string) {\n const pattern =\n /^[-!#$%&'*+\\/0-9=?A-Z^_a-z`{|}~](\\.?[-!#$%&'*+\\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\\.?[a-zA-Z0-9])*\\.[a-zA-Z](-?[a-zA-Z0-9])+$/\n\n const emailParts = email.split('@')\n\n if (emailParts.length !== 2) return false\n\n const [account, address] = emailParts\n\n if (account.length > 64) {\n return false\n } else if (address.length > 255) {\n return false\n }\n\n const domainParts = address.split('.')\n\n if (domainParts.some((part) => part.length > 63)) {\n return false\n }\n\n return pattern.test(email)\n}\n","import { FieldCondition, FieldSchema } from '@/types/fields'\nimport { isEmptyValue } from '@/utils/validation'\nimport isEqual from 'lodash/isEqual.js'\n\n// The stack of value scopes a condition can see, from the form's root values\n// down to the nearest group, repeater item or matrix cell\nexport type ConditionScopes = Array<Record<string, any>>\n\n// Compare loosely so values built in the schema builder, which are always\n// strings, still match numbers and booleans\nconst looseEquals = (a: any, b: any): boolean => {\n if (isEqual(a, b)) return true\n if (a == null || b == null) return false\n if (typeof a === 'object' || typeof b === 'object') return false\n return String(a) === String(b)\n}\n\n// ISO dates and date-times, e.g. 2026-01-15 and 2026-01-15T13:30, or times of day, e.g. 13:30\nconst isoDate = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$/\nconst isoTime = /^\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?$/\n\n// Two dates, or two times, which order as text, so a date-time falls after the start of its day\n// shortcut: compares as text, so times in different time zones misorder, parse them if sites mix zones\nconst bothIso = (a: any, b: any) => {\n if (typeof a !== 'string' || typeof b !== 'string') return false\n return (isoDate.test(a) && isoDate.test(b)) || (isoTime.test(a) && isoTime.test(b))\n}\n\n// Resolve a dotted path against the nearest scope containing its first\n// segment, falling outwards to the form's root values\nexport function resolveConditionValue(path: string, scopes: ConditionScopes): any {\n const segments = path.split('.')\n\n for (let index = scopes.length - 1; index >= 0; index--) {\n const scope = scopes[index]\n\n if (scope && typeof scope === 'object' && segments[0] in scope) {\n return segments.reduce((value, segment) => (value == null ? undefined : value[segment]), scope)\n }\n }\n\n return undefined\n}\n\nexport function evaluateCondition(condition: FieldCondition, scopes: ConditionScopes): boolean {\n const value = resolveConditionValue(condition.field, scopes)\n\n switch (condition.operator) {\n case 'equals':\n return looseEquals(value, condition.value)\n case 'notEquals':\n return !looseEquals(value, condition.value)\n case 'contains':\n if (Array.isArray(value)) return value.includes(condition.value)\n return typeof value === 'string' && value.includes(String(condition.value))\n case 'notContains':\n if (Array.isArray(value)) return !value.includes(condition.value)\n return !(typeof value === 'string' && value.includes(String(condition.value)))\n case 'startsWith':\n return typeof value === 'string' && value.startsWith(String(condition.value))\n case 'greaterThan':\n return bothIso(value, condition.value) ? value > condition.value : Number(value) > Number(condition.value)\n case 'lessThan':\n return bothIso(value, condition.value) ? value < condition.value : Number(value) < Number(condition.value)\n case 'empty':\n return isEmptyValue(value)\n case 'notEmpty':\n return !isEmptyValue(value)\n default:\n return true\n }\n}\n\nconst isRule = (item: any): item is FieldCondition => {\n return item !== null && typeof item === 'object' && !Array.isArray(item) && 'operator' in item\n}\n\n// Normalise any accepted conditions shape into groups of rules, where the\n// field shows when any group has all of its rules matching\nexport function normaliseConditions(schema: FieldSchema): Array<Array<FieldCondition>> {\n const conditions = schema.conditions\n\n if (!conditions || conditions.length === 0) return []\n\n // A flat list of rules keeps its original meaning: one group that must all\n // match, or one group per rule when conditionsMode is 'any'\n if (conditions.every(isRule)) {\n const rules = conditions as Array<FieldCondition>\n return schema.conditionsMode === 'any' ? rules.map((rule) => [rule]) : [rules]\n }\n\n // Otherwise every item is a group: an array of rules, a { rules } object,\n // or a bare rule acting as a group of one\n return conditions.map((group) => {\n if (Array.isArray(group)) return group\n if (isRule(group)) return [group]\n return group?.rules || []\n })\n}\n\n// Check whether a field should be shown for the given value scopes\nexport function evaluateConditions(schema: FieldSchema, scopes: ConditionScopes): boolean {\n const groups = normaliseConditions(schema)\n\n if (groups.length === 0) return true\n\n return groups.some((rules) => rules.every((rule) => evaluateCondition(rule, scopes)))\n}\n","import { FieldSchema } from '@/types/fields'\nimport {\n FieldValidationReport,\n Input,\n InputPickFields,\n InputSchema,\n InputValidateFields,\n InputValidateServerValue,\n InputValidateValue,\n ValidationEnvironment,\n ValidationReport,\n ValidationReportChildren,\n} from '@/types/inputs'\nimport { ConditionScopes, evaluateConditions } from '@/utils/conditions'\nimport { validationSuccess } from '@/utils/validation'\n\nexport interface ValidateValuesOptions {\n environment?: ValidationEnvironment\n scopes?: ConditionScopes\n // Leave out the checks a value fails only because it isn't finished, e.g. to save a draft or a step of a form\n allowIncomplete?: boolean\n}\n\n// A field's schema without the checks an unfinished value fails: required, and the minimum length and count options.\n// Formats, maximums and ranges such as a number's min still apply\nconst incompleteSchema = (field: FieldSchema): FieldSchema => {\n const { minLength, minimum, minimumRows, minimumColumns, ...options } = field.options || {}\n return { ...field, required: false, options }\n}\n\n// Resolve the validator for an environment, falling back to the shared validateValue\nexport function resolveValidateValue(input: undefined | Input, environment?: 'client'): InputValidateValue | undefined\nexport function resolveValidateValue(\n input: undefined | Input,\n environment: 'server',\n): InputValidateServerValue | undefined\nexport function resolveValidateValue(\n input: undefined | Input,\n environment?: ValidationEnvironment,\n): InputValidateValue | InputValidateServerValue | undefined\nexport function resolveValidateValue(input: undefined | Input, environment?: ValidationEnvironment) {\n if (environment === 'client') return input?.validateClientValue || input?.validateValue\n if (environment === 'server') return input?.validateServerValue || input?.validateValue\n return input?.validateValue\n}\n\n// Check whether every report in a tree of child reports is valid\nconst childrenAreValid = (children: ValidationReportChildren): boolean => {\n if (children instanceof Promise) {\n throw new Error('validateChildren returned a promise, use validateServerValues instead')\n }\n if (Array.isArray(children)) return children.every(childrenAreValid)\n return children.isValid\n}\n\n// Resolve any promises inside a tree of child reports\nconst resolveReportChildren = async (children: ValidationReportChildren): Promise<ValidationReportChildren> => {\n const resolved = await children\n if (Array.isArray(resolved)) {\n return Promise.all(resolved.map((child) => resolveReportChildren(child)))\n }\n return resolved\n}\n\n// A field's value as pickValues keeps it, letting the input pick its own nested values\nconst pickFieldValue = (\n field: FieldSchema,\n values: Record<string, any>,\n inputs: Record<string, Input>,\n pickFields: InputPickFields,\n): any => {\n const input = inputs?.[field.type]\n\n // Fall back to the schema default when no value is set\n let value = values?.[field.name]\n if (value === undefined) value = field.defaultValue\n\n // Keep the value the input's validator returns, as a form does, so a posted '5' for a number becomes 5\n if (input?.validateValue) value = input.validateValue(value, field).value\n\n return input?.pickValue ? input.pickValue(value, field, pickFields) : value\n}\n\n// Conditions see each field's value as pickValues keeps it, shown or not, so a posted 'on' meets a condition on true\nexport const conditionScope = (\n schema: Array<FieldSchema>,\n values: Record<string, any>,\n inputs: Record<string, Input>,\n): Record<string, any> => {\n const scope: Record<string, any> = { ...values }\n const scopeFields: InputPickFields = (childSchema, childValues) => conditionScope(childSchema, childValues, inputs)\n\n for (const field of schema) {\n const value = pickFieldValue(field, values, inputs, scopeFields)\n\n // An unset field stays out, so a condition still falls through to an outer field of the same name\n if (value !== undefined) scope[field.name] = value\n }\n\n return scope\n}\n\n// Validate a set of values against a schema, letting each input walk its own nested fields\nexport function validateValues<Values extends Record<string, any> = Record<string, any>>(\n schema: Array<FieldSchema>,\n values: Values,\n inputs: Record<string, Input>,\n options: ValidateValuesOptions = {},\n): ValidationReport {\n const fields: Record<string, FieldValidationReport> = {}\n const scopes = options.scopes || [conditionScope(schema, values, inputs)]\n\n const validateFields: InputValidateFields = (childSchema, childValues) => {\n const childScopes = [...scopes, conditionScope(childSchema, childValues, inputs)]\n return validateValues(childSchema, childValues, inputs, { ...options, scopes: childScopes })\n }\n\n for (const field of schema) {\n const input = inputs?.[field.type]\n\n // Skip fields hidden by their conditions\n if (!evaluateConditions(field, scopes)) continue\n\n // Fall back to the schema default when no value is set\n let value = values?.[field.name]\n if (value === undefined) value = field.defaultValue\n\n const fieldSchema = options.allowIncomplete ? incompleteSchema(field) : field\n\n const validate = resolveValidateValue(input, options.environment)\n const validation = validate ? validate(value, fieldSchema) : validationSuccess(value)\n\n if (validation instanceof Promise) {\n throw new Error('The validator returned a promise, use validateServerValues instead')\n }\n\n const report: FieldValidationReport = {\n isValid: validation.isValid !== false,\n messages: validation.messages,\n }\n\n // Let the input validate its nested fields, once the field passes its own check, so a list over its maximum\n // reports that alone rather than every item too\n if (input?.validateChildren && report.isValid) {\n const children = input.validateChildren(value, fieldSchema, validateFields)\n report.children = children\n if (!childrenAreValid(children)) report.isValid = false\n }\n\n fields[field.name] = report\n }\n\n return {\n isValid: Object.values(fields).every((field) => field.isValid),\n fields,\n }\n}\n\n// Validate a set of values on the server, where validators may be asynchronous\nexport async function validateServerValues<Values extends Record<string, any> = Record<string, any>>(\n schema: Array<FieldSchema>,\n values: Values,\n inputs: Record<string, Input>,\n options: ValidateValuesOptions = {},\n): Promise<ValidationReport> {\n const fields: Record<string, FieldValidationReport> = {}\n const scopes = options.scopes || [conditionScope(schema, values, inputs)]\n\n const validateFields: InputValidateFields = (childSchema, childValues) => {\n const childScopes = [...scopes, conditionScope(childSchema, childValues, inputs)]\n return validateServerValues(childSchema, childValues, inputs, { ...options, scopes: childScopes })\n }\n\n for (const field of schema) {\n const input = inputs?.[field.type]\n\n // Skip fields hidden by their conditions\n if (!evaluateConditions(field, scopes)) continue\n\n // Fall back to the schema default when no value is set\n let value = values?.[field.name]\n if (value === undefined) value = field.defaultValue\n\n const fieldSchema = options.allowIncomplete ? incompleteSchema(field) : field\n\n const validate = resolveValidateValue(input, 'server')\n const validation = validate ? await validate(value, fieldSchema) : validationSuccess(value)\n\n const report: FieldValidationReport = {\n isValid: validation.isValid !== false,\n messages: validation.messages,\n }\n\n // Let the input validate its nested fields, once the field passes its own check\n if (input?.validateChildren && report.isValid) {\n const children = await resolveReportChildren(input.validateChildren(value, fieldSchema, validateFields))\n report.children = children\n if (!childrenAreValid(children)) report.isValid = false\n }\n\n fields[field.name] = report\n }\n\n return {\n isValid: Object.values(fields).every((field) => field.isValid),\n fields,\n }\n}\n\nexport interface FlatValidationReport {\n messages: Record<string, Array<string>>\n validity: Record<string, boolean | undefined>\n}\n\n// Flatten a nested validation report into path keyed maps matching the form's\n// own messages and validity maps, e.g. 'pets.0.petname'\nexport function flattenValidationReport(report: ValidationReport): FlatValidationReport {\n const flat: FlatValidationReport = { messages: {}, validity: {} }\n\n const walkReport = (report: ValidationReport, prefix: Array<string | number>) => {\n for (const [name, fieldReport] of Object.entries(report.fields)) {\n const path = [...prefix, name]\n const key = path.join('.')\n\n if (fieldReport.messages.length >= 1) flat.messages[key] = fieldReport.messages\n flat.validity[key] = fieldReport.isValid\n\n if (fieldReport.children !== undefined) walkChildren(fieldReport.children, path)\n }\n }\n\n const walkChildren = (children: ValidationReportChildren, prefix: Array<string | number>) => {\n if (children instanceof Promise) {\n throw new Error('The report contains unresolved children')\n }\n\n if (Array.isArray(children)) {\n children.forEach((child, index) => walkChildren(child, [...prefix, index]))\n return\n }\n\n walkReport(children, prefix)\n }\n\n walkReport(report, [])\n\n return flat\n}\n\n// Reduce a set of values to only the fields defined by a schema, letting each\n// input pick its own nested values\nexport function pickValues<Values extends Record<string, any> = Record<string, any>>(\n schema: Array<FieldSchema>,\n values: Record<string, any>,\n inputs: Record<string, Input>,\n options: { scopes?: ConditionScopes } = {},\n): Partial<Values> {\n const picked: Record<string, any> = {}\n const scopes = options.scopes || [conditionScope(schema, values, inputs)]\n\n const pickFields: InputPickFields = (childSchema, childValues) => {\n const childScopes = [...scopes, conditionScope(childSchema, childValues, inputs)]\n return pickValues(childSchema, childValues, inputs, { scopes: childScopes })\n }\n\n for (const field of schema) {\n // Skip fields hidden by their conditions\n if (!evaluateConditions(field, scopes)) continue\n\n const pickedValue = pickFieldValue(field, values, inputs, pickFields)\n if (pickedValue === undefined) continue\n\n picked[field.name] = pickedValue\n }\n\n return picked as Partial<Values>\n}\n\n// A short random ID for something the schema builder creates, e.g. fld_k3x9q2mz for a field\nexport const createId = (prefix: string) => {\n const characters = Array.from(crypto.getRandomValues(new Uint8Array(8)), (byte) => (byte % 36).toString(36))\n return `${prefix}_${characters.join('')}`\n}\n\n// Strip unknown properties from a field schema\nexport function validateSchema({\n id,\n name,\n label,\n required,\n instructions,\n defaultValue,\n readonly,\n disabled,\n width,\n options,\n}: InputSchema) {\n return {\n id,\n name,\n label,\n required,\n instructions,\n defaultValue,\n readonly,\n disabled,\n width,\n options,\n }\n}\n\nexport function validateInputSchemaFields(input: Input) {\n const baseFields = baseInputSchemaFields()\n const schema = [...(input?.coreFields ? input.coreFields(baseFields) : baseFields)]\n\n const optionFields = input?.optionFields ? input?.optionFields([]) : []\n\n if (optionFields.length >= 1) {\n schema.push({\n name: 'options',\n label: 'Options',\n type: 'group',\n options: {\n fields: optionFields,\n },\n })\n }\n\n return schema\n}\n\nexport const baseInputSchemaFields = (): Array<FieldSchema> => {\n return [\n {\n name: 'name',\n label: 'Field Name',\n type: 'identifier',\n required: true,\n width: 50,\n // Names are path segments, e.g. address.town, so they can't hold dots or spaces\n options: {\n source: 'label',\n format: 'mixed',\n },\n },\n {\n name: 'label',\n label: 'Field Label',\n type: 'text',\n required: false,\n width: 50,\n },\n {\n name: 'required',\n label: 'Required',\n type: 'boolean',\n required: false,\n options: {\n message: 'Yes',\n },\n },\n {\n name: 'instructions',\n label: 'Instructions',\n type: 'textarea',\n required: false,\n },\n {\n name: 'width',\n label: 'Width',\n type: 'number',\n required: false,\n options: {\n min: 1,\n max: 100,\n },\n },\n {\n // The schema builder lists the fields its rules can test as the input's fieldChoices\n name: 'conditions',\n label: 'Conditional logic',\n type: 'conditions',\n required: false,\n instructions: 'Show this field when any group below has all of its rules matching.',\n },\n ]\n}\n","import {\n FieldInjectionContext,\n FieldReportContext,\n FieldReportContextValue,\n FormStaticContext,\n} from '@/context/FormProvider'\nimport { FieldMessages } from '@/types/fields'\nimport { InputSchema, InputValidateValue, InputValidationResponse } from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport isEqual from 'lodash/isEqual.js'\nimport { SetStateAction, createContext, useCallback, useContext, useEffect, useId, useMemo, useRef } from 'react'\n\ninterface Context {\n id: string\n labelId: string\n aria: {\n 'aria-describedby'?: string\n 'aria-invalid'?: boolean\n }\n schema: InputSchema\n name: InputSchema['name']\n label: InputSchema['label']\n required: InputSchema['required']\n instructions: InputSchema['instructions']\n defaultValue: InputSchema['defaultValue']\n readonly: InputSchema['readonly']\n disabled: InputSchema['disabled']\n width: InputSchema['width']\n options: InputSchema['options']\n\n value: any\n messages: FieldMessages\n valid: boolean | undefined\n\n setValue: (value: SetStateAction<Context['value']>) => void\n setMessages: (messages: SetStateAction<Context['messages']>) => void\n setValid: (valid: SetStateAction<Context['valid']>) => void\n\n handleValidation: (response: InputValidationResponse) => void\n}\n\n// Create Field Context\nconst FieldContext = createContext<undefined | Context>(undefined)\n\n// Hook for consuming field context\nexport const useFieldContext = () => {\n const context = useContext(FieldContext)\n if (!context) {\n throw new Error('useFieldContext must be used within a <Field>')\n }\n return context\n}\n\nexport type OnValueChangeCallback = (value: Context['value']) => void\nexport type OnMessagesChangeCallback = (messages: Context['messages']) => void\nexport type OnValidityChangeCallback = (validity: Context['valid']) => void\n\nexport interface FieldProps extends InputSchema {\n children: React.ReactNode\n value?: any\n messages?: FieldMessages\n valid?: boolean\n validate?: InputValidateValue\n onValueChange: OnValueChangeCallback\n onMessagesChange: OnMessagesChangeCallback\n onValidityChange: OnValidityChangeCallback\n}\n\nconst defaultMessages: FieldMessages = []\n\n// Field Provider Component\nexport default function Field({\n value,\n messages = defaultMessages,\n valid,\n validate,\n onValueChange,\n onMessagesChange,\n onValidityChange,\n children,\n ...rawSchema\n}: FieldProps) {\n const { name, label, required, instructions, defaultValue, width, options } = rawSchema\n\n // A read-only or disabled container passes its state to every field inside it\n const parent = useContext(FieldContext)\n const readonly = parent?.readonly || rawSchema.readonly\n const disabled = parent?.disabled || rawSchema.disabled\n\n // Strip unknown properties from the schema\n const schema = useMemo(() => {\n return validateSchema({ ...rawSchema, readonly, disabled })\n }, [rawSchema.id, name, label, required, instructions, defaultValue, readonly, disabled, width, options])\n\n // Fall back to the schema default when no value is set\n if (value === undefined) value = defaultValue\n\n const id = useId()\n\n // Report state changes to the form's path keyed maps\n const parentReport = useContext(FieldReportContext)\n\n // State injected from outside, e.g. a server validation report, shown for\n // this field until it next reports its own state\n const injection = useContext(FieldInjectionContext)\n const injectionKey = useMemo(() => {\n return (parentReport ? parentReport.resolve([name]) : [name]).join('.')\n }, [parentReport, name])\n\n const setValue = useCallback(\n (newValue: SetStateAction<Context['value']>) => {\n if (typeof newValue === 'function') newValue = newValue(value)\n if (onValueChange && !isEqual(value, newValue)) {\n onValueChange(newValue)\n }\n },\n [value, onValueChange],\n )\n\n const setMessages = useCallback(\n (newMessages: SetStateAction<Context['messages']>) => {\n if (typeof newMessages === 'function') newMessages = newMessages(messages)\n if (!isEqual(messages, newMessages)) {\n if (onMessagesChange) onMessagesChange(newMessages)\n if (parentReport) parentReport.report([name], { messages: newMessages })\n if (injection) injection.clear(injectionKey)\n }\n },\n [messages, onMessagesChange, parentReport, name, injection, injectionKey],\n )\n\n const setValid = useCallback(\n (newValid: SetStateAction<Context['valid']>) => {\n if (typeof newValid === 'function') newValid = newValid(valid)\n if (!isEqual(valid, newValid)) {\n if (onValidityChange) onValidityChange(newValid)\n if (parentReport) parentReport.report([name], { valid: newValid })\n if (injection) injection.clear(injectionKey)\n }\n },\n [valid, onValidityChange, parentReport, name, injection, injectionKey],\n )\n\n const handleValidation = useCallback(\n ({ isValid, value, messages }: InputValidationResponse) => {\n setValid(isValid)\n setMessages(messages)\n setValue(value)\n },\n [setValue, setMessages, setValid],\n )\n\n // Re-validate exactly once per form wide validation pass, reading the\n // latest state from a ref so container inputs that aggregate their own\n // validity afterwards are not overwritten\n const staticContext = useContext(FormStaticContext)\n const validationCounter = staticContext?.validationCounter || 0\n\n const latest = useRef({ value, schema, validate, handleValidation })\n latest.current = { value, schema, validate, handleValidation }\n\n useEffect(() => {\n const { value, schema, validate, handleValidation } = latest.current\n if (validationCounter >= 1 && validate) {\n handleValidation(validate(value, schema))\n }\n }, [validationCounter])\n\n // Remove the field's entries from the form's path keyed maps when it\n // unmounts or its path changes\n useEffect(() => {\n if (!parentReport) return\n return () => parentReport.report([name], undefined)\n }, [parentReport, name])\n\n // Nest children's reports and path resolution under this field's name\n const childReport = useMemo<FieldReportContextValue | undefined>(() => {\n if (!parentReport) return undefined\n return {\n report: (path, patch) => parentReport.report([name, ...path], patch),\n resolve: (path) => parentReport.resolve([name, ...path]),\n }\n }, [parentReport, name])\n\n // Injected state wins until the field reports for itself\n const displayMessages = injection && injectionKey in injection.messages ? injection.messages[injectionKey] : messages\n const displayValid = injection && injectionKey in injection.validity ? injection.validity[injectionKey] : valid\n\n // Accessibility wiring for the input itself\n const labelId = `${id}-label`\n const messagesId = `${id}-messages`\n const instructionsId = `${id}-instructions`\n\n const aria = useMemo(() => {\n const describedBy = [displayMessages.length > 0 ? messagesId : null, instructions ? instructionsId : null]\n .filter(Boolean)\n .join(' ')\n\n return {\n 'aria-describedby': describedBy || undefined,\n 'aria-invalid': displayValid === false || undefined,\n }\n }, [displayMessages, messagesId, instructions, instructionsId, displayValid])\n\n const contextValue = useMemo(() => {\n return {\n id,\n labelId,\n aria,\n schema,\n name,\n label,\n required,\n instructions,\n defaultValue,\n readonly,\n disabled,\n width,\n options: options || {},\n\n value,\n messages,\n valid,\n\n setValue,\n setMessages,\n setValid,\n\n handleValidation,\n }\n }, [id, labelId, aria, schema, value, messages, valid, setValue, setMessages, setValid, handleValidation])\n\n const isValid = displayValid === true\n const isInvalid = displayValid === false\n\n return (\n <FieldContext.Provider value={contextValue}>\n <FieldReportContext.Provider value={childReport}>\n <div style={{ width: width ? `${width}%` : '100%' }}>\n <div className={`sorlo-field${isValid ? ' sorlo-valid' : ''}${isInvalid ? ' sorlo-invalid' : ''}`}>\n <div className='sorlo-meta'>\n {label && (\n <label className='sorlo-label' id={labelId} htmlFor={id}>\n {label}\n {required && <span aria-hidden='true'>*</span>}\n </label>\n )}\n {instructions && (\n <div className='sorlo-instructions' id={instructionsId}>\n {instructions}\n </div>\n )}\n </div>\n {displayMessages.length > 0 && (\n <ul className='sorlo-messages' id={messagesId} role='alert'>\n {displayMessages.map((message, messageIndex) => {\n return <li key={messageIndex}>{message}</li>\n })}\n </ul>\n )}\n {children}\n </div>\n </div>\n </FieldReportContext.Provider>\n </FieldContext.Provider>\n )\n}\n","import en from './en'\n\nexport { en }\n","export default {\n translation: {\n validation: {\n invalid: 'Invalid value.',\n required: 'This field is required.',\n minLength: 'This field requires a minimum of {{min}} character(s).',\n maxLength: 'This field requires a maximum of {{max}} character(s).',\n min: 'This field requires a minimum value of {{min}}.',\n max: 'This field requires a maximum value of {{max}}.',\n email: 'A valid email address required.',\n emailMultiple: 'One or more email address(es) is invalid.',\n url: 'A valid URL required.',\n tel: 'A valid phone number required.',\n identifier: 'A valid identifier required, e.g. {{example}}.',\n identifierStart: 'This field must start with a letter.',\n color: 'A valid color required.',\n date: 'A valid date required.',\n time: 'A valid time required.',\n datetime: 'A valid date and time required.',\n selection: 'At least one selection is required.',\n choice: 'A valid choice required.',\n minItems: 'This field requires a minimum of {{min}} item(s).',\n maxItems: 'This field requires a maximum of {{max}} item(s).',\n minRows: 'This field requires a minimum of {{min}} row(s).',\n maxRows: 'This field requires a maximum of {{max}} row(s).',\n minColumns: 'This field requires a minimum of {{min}} column(s).',\n maxColumns: 'This field requires a maximum of {{max}} column(s).',\n },\n ui: {\n cancel: 'Cancel',\n save: 'Save',\n close: 'Close',\n delete: 'Delete',\n moveUp: 'Move up',\n moveDown: 'Move down',\n addRow: 'Add row',\n removeRow: 'Remove row',\n addColumn: 'Add column',\n removeColumn: 'Remove column',\n addBlock: 'Add {{layout}}',\n invalidFieldType: 'Invalid field type.',\n conditions: {\n field: 'Field',\n operator: 'Operator',\n value: 'Value',\n // Read after a column's name, e.g. \"Operator for rule 2 of group 1\"\n ofRule: 'for rule {{rule}} of group {{group}}',\n group: 'Group {{group}}',\n and: 'And',\n or: 'Or',\n addRule: 'Add a rule',\n addRuleAfter: 'And: add a rule after rule {{rule}} of group {{group}}',\n addGroup: 'Or: add a group',\n removeRule: 'Remove rule {{rule}} of group {{group}}',\n select: 'Select…',\n yes: 'Yes',\n no: 'No',\n example: 'e.g. {{example}}',\n // How formatted conditions join rules and groups, e.g. \"Category equals News and Spam equals No, or …\"\n joinRules: ' and ',\n joinGroups: ', or ',\n },\n operators: {\n equals: 'equals',\n notEquals: 'does not equal',\n contains: 'contains',\n notContains: 'does not contain',\n startsWith: 'starts with',\n greaterThan: 'is greater than',\n lessThan: 'is less than',\n empty: 'is empty',\n notEmpty: 'is not empty',\n // greaterThan and lessThan on dates\n after: 'is after',\n before: 'is before',\n },\n },\n },\n}\n","import * as resources from '@/translations'\nimport i18next from 'i18next'\n\n// Its own instance, without react-i18next, whose default instance and defaults belong to a host sharing its copy\nconst i18n = i18next.createInstance()\n\ni18n.init({\n resources: resources,\n lng: 'en',\n fallbackLng: 'en',\n interpolation: { escapeValue: false },\n})\n\nexport const { t } = i18n\nexport default i18n\n","import Field, {\n OnMessagesChangeCallback as OnFieldMessagesChangeCallback,\n OnValidityChangeCallback as OnFieldValidityChangeCallback,\n OnValueChangeCallback as OnFieldValueChangeCallback,\n} from '@/components/Field'\nimport { FieldScopeContext, useFormStaticContext } from '@/context/FormProvider'\nimport { t } from '@/i18n'\nimport { FieldMessages, FieldSchema } from '@/types/fields'\nimport { InputComponent, InputValidateValue } from '@/types/inputs'\nimport { evaluateConditions } from '@/utils/conditions'\nimport { conditionScope, resolveValidateValue } from '@/utils/inputs'\nimport { memo, useCallback, useContext } from 'react'\n\nexport type OnValuesChangeCallback = (field: string, value: any) => void\nexport type OnMessagesChangeCallback = (field: string, messages: FieldMessages) => void\nexport type OnValidityChangeCallback = (field: string, valid: boolean | undefined) => void\n\nexport interface FieldsetProps {\n schema: Array<FieldSchema>\n values?: Record<string, any>\n messages?: Record<string, FieldMessages>\n validity?: Record<string, boolean | undefined>\n onValuesChange?: OnValuesChangeCallback\n onMessagesChange?: OnMessagesChangeCallback\n onValidityChange?: OnValidityChangeCallback\n}\n\nexport default function Fieldset({\n schema,\n values = {},\n messages = {},\n validity = {},\n onValuesChange = () => {},\n onMessagesChange = () => {},\n onValidityChange = () => {},\n}: FieldsetProps) {\n const { inputs } = useFormStaticContext()\n\n // Hide fields whose conditions do not match the surrounding values\n const scopes = useContext(FieldScopeContext) || [conditionScope(schema, values, inputs)]\n\n return (\n <div className='sorlo-fieldset'>\n {schema.map((fieldSchema, fieldIndex) => {\n if (!evaluateConditions(fieldSchema, scopes)) return null\n\n return (\n <FieldsetItem\n key={fieldSchema.name ?? fieldIndex}\n schema={fieldSchema}\n component={inputs?.[fieldSchema.type]?.default}\n validate={resolveValidateValue(inputs?.[fieldSchema.type], 'client')}\n value={values[fieldSchema.name]}\n messages={messages[fieldSchema.name]}\n valid={validity[fieldSchema.name]}\n onValuesChange={onValuesChange}\n onMessagesChange={onMessagesChange}\n onValidityChange={onValidityChange}\n />\n )\n })}\n </div>\n )\n}\n\n// Memoised so a field only re-renders when its own schema or state changes\nconst FieldsetItem = memo(function FieldsetItem({\n schema,\n component: Component,\n validate,\n value,\n messages,\n valid,\n onValuesChange = () => {},\n onMessagesChange = () => {},\n onValidityChange = () => {},\n}: {\n schema: FieldSchema\n component?: InputComponent\n validate?: InputValidateValue\n value?: any\n messages?: FieldMessages\n valid?: boolean\n onValuesChange?: OnValuesChangeCallback\n onMessagesChange?: OnMessagesChangeCallback\n onValidityChange?: OnValidityChangeCallback\n}) {\n const { type, ...fieldProps } = schema\n\n const onValueChangeHandler: OnFieldValueChangeCallback = useCallback(\n (value) => {\n onValuesChange(schema.name, value)\n },\n [onValuesChange, schema.name],\n )\n\n const onMessagesChangeHandler: OnFieldMessagesChangeCallback = useCallback(\n (messages) => {\n onMessagesChange(schema.name, messages)\n },\n [onMessagesChange, schema.name],\n )\n\n const onValidityChangeHandler: OnFieldValidityChangeCallback = useCallback(\n (validity) => {\n onValidityChange(schema.name, validity)\n },\n [onValidityChange, schema.name],\n )\n\n return (\n <Field\n {...fieldProps}\n value={value}\n messages={messages}\n valid={valid}\n validate={validate}\n onValueChange={onValueChangeHandler}\n onMessagesChange={onMessagesChangeHandler}\n onValidityChange={onValidityChangeHandler}\n >\n {Component && <Component />}\n {!Component && t('ui.invalidFieldType')}\n </Field>\n )\n})\n","import * as boolean from './Boolean'\nimport * as checkbox from './Checkbox'\nimport * as color from './Color'\nimport * as conditions from './Conditions'\nimport * as content from './Content'\nimport * as date from './Date'\nimport * as datetime from './Datetime'\nimport * as email from './Email'\nimport * as flexible from './Flexible'\nimport * as group from './Group'\nimport * as hidden from './Hidden'\nimport * as identifier from './Identifier'\nimport * as matrix from './Matrix'\nimport * as number from './Number'\nimport * as password from './Password'\nimport * as radio from './Radio'\nimport * as range from './Range'\nimport * as repeater from './Repeater'\nimport * as schemabuilder from './SchemaBuilder'\nimport * as select from './Select'\nimport * as tel from './Tel'\nimport * as text from './Text'\nimport * as textarea from './Textarea'\nimport * as time from './Time'\nimport * as url from './Url'\n\nexport {\n boolean,\n checkbox,\n color,\n conditions,\n content,\n date,\n datetime,\n email,\n flexible,\n group,\n hidden,\n identifier,\n matrix,\n number,\n password,\n radio,\n range,\n repeater,\n schemabuilder,\n select,\n tel,\n text,\n textarea,\n time,\n url,\n}\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Boolean (True / False)'\n\nexport const description: InputDescription = () => 'A toggle that allows you to pick a value of true or false.'\n\nexport const category: InputCategory = () => 'Choice'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'message',\n label: 'Message',\n type: 'text',\n required: true,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // 'on' is what a browser posts for a checked box without a value attribute\n value = [true, 1, 'yes', '1', 'true', 'on'].includes(typeof value === 'string' ? value.trim().toLowerCase() : value)\n\n // A required boolean must be checked\n if (schema.required && !value) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'boolean'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? (validation.value ? 'TRUE' : 'FALSE') : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = false, handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__boolean'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='checkbox'\n checked={!!value}\n onChange={(event) => doValidation(event.target.checked)}\n required={required}\n disabled={disabled || readonly}\n />\n <label htmlFor={id}>{options?.message}</label>\n </div>\n )\n}\n\nexport default Component\n","import i18n from '@/i18n'\nimport { InputSchema } from '@/types/inputs'\n\n// Resolve a validation message, preferring a per field override from the\n// schema's options.messages over the built in translations, e.g.\n// options: { messages: { required: 'Please enter your work email' } }\nexport function validationMessage(schema: InputSchema, key: string, params?: Record<string, any>): string {\n const override = schema.options?.messages?.[key]\n\n if (typeof override === 'string') {\n return Object.entries(params || {}).reduce((message, [name, value]) => {\n return message.replaceAll(`{{${name}}}`, String(value))\n }, override)\n }\n\n return i18n.t(`validation.${key}`, params)\n}\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { literalUnion } from '@/utils/typescript'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Checkbox (Multiple choice)'\n\nexport const description: InputDescription = () => 'A list of checkboxes with a selection of choices that you specify.'\n\nexport const category: InputCategory = () => 'Choice'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'choices',\n label: 'Choices',\n type: 'repeater',\n required: true,\n options: {\n minimum: 1,\n fields: [\n {\n name: 'value',\n label: 'Value',\n type: 'text',\n required: true,\n width: 50,\n },\n {\n name: 'label',\n label: 'Label',\n type: 'text',\n required: false,\n width: 50,\n },\n ],\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty selection\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'selection'))\n }\n\n if (!Array.isArray(value)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Checkboxes keep the choices' own values\n const choices: Array<any> = schema.options?.choices || []\n if (!value.every((item) => choices.some((choice) => choice.value === item))) {\n return validationError(value, validationMessage(schema, 'choice'))\n }\n\n return validationSuccess(value)\n}\n\n// Checkboxes keep the choices' own values\nexport const typeValue: InputTypeValue = (schema) => {\n const choices: Array<any> = schema.options?.choices || []\n return `Array<${literalUnion(choices.map((choice) => choice.value))}>`\n}\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, labelId, aria, schema, readonly, disabled, options, value, handleValidation } = useFieldContext()\n\n const selected: Array<any> = Array.isArray(value) ? value : []\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n const handleOnChange = useCallback(\n (choiceValue: any, checked: boolean) => {\n doValidation(checked ? [...selected, choiceValue] : selected.filter((item) => item !== choiceValue))\n },\n [doValidation, selected],\n )\n\n const choices: Array<any> = options?.choices || []\n\n return (\n <div className='sorlo-input__checkbox' role='group' aria-labelledby={labelId} {...aria}>\n {choices.map((choice, choiceIndex) => {\n return (\n <div key={choiceIndex}>\n <input\n className='sorlo-input'\n id={`${id}-${choiceIndex}`}\n type='checkbox'\n value={choice.value}\n checked={selected.includes(choice.value)}\n onChange={(event) => handleOnChange(choice.value, event.target.checked)}\n disabled={disabled || readonly}\n />\n <label htmlFor={`${id}-${choiceIndex}`}>{choice.label ?? choice.value.toString()}</label>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport { FieldScopeContext } from '@/context/FormProvider'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { resolveConditionValue } from '@/utils/conditions'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport deburr from 'lodash/deburr.js'\nimport upperFirst from 'lodash/upperFirst.js'\nimport { useCallback, useContext, useEffect, useRef } from 'react'\n\nexport const name: InputName = () => 'Identifier'\n\nexport const description: InputDescription = () =>\n 'A URL or code friendly name, such as a slug or API key, optionally generated from another field until it is edited.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'source',\n label: 'Generate from field',\n type: 'text',\n required: false,\n options: {\n placeholder: 'e.g. title',\n },\n },\n {\n name: 'format',\n label: 'Format',\n type: 'select',\n required: false,\n width: 50,\n options: {\n choices: [\n {\n value: 'kebab',\n label: 'Kebab case (my-page)',\n },\n {\n value: 'snake',\n label: 'Snake case (my_page)',\n },\n {\n value: 'camel',\n label: 'Camel case (myPage)',\n },\n {\n value: 'pascal',\n label: 'Pascal case (MyPage)',\n },\n {\n value: 'mixed',\n label: 'Mixed case (FirstName, utm_source)',\n },\n ],\n },\n },\n {\n name: 'unicode',\n label: 'Non-Latin letters',\n type: 'boolean',\n required: false,\n width: 50,\n options: {\n message: 'Keep letters from other scripts, e.g. 東京',\n },\n },\n ]\n}\n\nconst formats = ['kebab', 'snake', 'camel', 'pascal', 'mixed'] as const\n\ntype Format = (typeof formats)[number]\n\n// Mixed accepts any of the code styles but generates snake case\nconst separators: Record<Format, string> = { kebab: '-', snake: '_', camel: '', pascal: '', mixed: '_' }\n\nconst formatOf = (options?: Record<string, any>): Format =>\n formats.includes(options?.format) ? options?.format : 'kebab'\n\n// Words of letters and numbers, cased and joined for the format, e.g. 'Crème brûlée!' becomes 'creme-brulee'\n// shortcut: other scripts are kept or dropped but never romanised, add a transliteration option when a site needs romanised identifiers\nexport function formatIdentifier(text: string, format: Format = 'kebab', unicode = false) {\n // Strip accents from Latin letters only, so letters such as the Cyrillic й keep their marks\n let plain = deburr(\n text\n .normalize('NFD')\n .replace(/(\\p{Script=Latin})\\p{M}+/gu, '$1')\n .normalize('NFC'),\n )\n\n // The code styles keep the words of an existing camel or Pascal case name, e.g. emailOptIn\n if (format !== 'kebab') {\n plain = plain.replace(/(\\p{Lu}\\p{Ll})/gu, ' $1').replace(/(\\p{Ll})(\\p{Lu})/gu, '$1 $2')\n }\n\n const words = plain\n .split(unicode ? /[^\\p{L}\\p{M}\\p{N}]+/u : /[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((word) => word.toLowerCase())\n\n if (format === 'camel') return words.map((word, index) => (index ? upperFirst(word) : word)).join('')\n if (format === 'pascal') return words.map(upperFirst).join('')\n return words.join(separators[format])\n}\n\n// Whether a value is shaped like the formatter's output: allowed words, joined and cased for the format\nfunction matchesFormat(value: string, format: Format, unicode: boolean) {\n const letters = unicode ? '\\\\p{L}\\\\p{M}\\\\p{N}' : 'a-zA-Z0-9'\n\n // Any case and any underscores, as in imported names like FirstName or utm_source__c\n if (format === 'mixed') return new RegExp(`^[${letters}_]+$`, 'u').test(value)\n\n const word = `[${letters}]+`\n const separator = separators[format]\n const pattern = separator ? `^${word}(?:${separator}${word})*$` : `^${word}$`\n if (!new RegExp(pattern, 'u').test(value)) return false\n\n // Compare with the case the formatter gives, so letters without case suit every format\n const [first] = value\n if (format === 'camel') return first === first.toLowerCase()\n if (format === 'pascal') return first === first.toUpperCase()\n return value === value.toLowerCase()\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n const format = formatOf(schema.options)\n if (!matchesFormat(value, format, schema.options?.unicode === true)) {\n const example = formatIdentifier('my page', format)\n return validationError(value, validationMessage(schema, 'identifier', { example }))\n }\n\n // Only kebab, the URL style, may start with a digit\n if (format !== 'kebab' && !/^\\p{L}/u.test(value)) {\n return validationError(value, validationMessage(schema, 'identifierStart'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n const format = formatOf(options)\n const unicode = options?.unicode === true\n\n // Resolve the source like a condition's field, nearest value scope first\n const scopes = useContext(FieldScopeContext)\n const source = options?.source ? resolveConditionValue(String(options.source), scopes || []) : undefined\n const sourceText = typeof source === 'string' || typeof source === 'number' ? String(source) : ''\n const sourceValue = formatIdentifier(sourceText, format, unicode)\n\n // The value last generated from the source, the field stops following once it holds anything else\n const generated = useRef<string | undefined>(undefined)\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n const update = (next: string, fromSource = false) => {\n if (fromSource) generated.current = next\n if (next !== value) doValidation(next)\n }\n\n // Runs only when the source changes, following it while the field is empty or still generated\n useEffect(() => {\n if (isEmptyValue(value) || value === generated.current) update(sourceValue, true)\n }, [sourceValue])\n\n // An emptied field picks the source back up, and an invalid value is tidied into the format\n const onBlur = () => {\n if (isEmptyValue(value)) update(sourceValue, true)\n else if (!validateValue(value, schema).isValid) update(formatIdentifier(String(value), format, unicode))\n }\n\n return (\n <div className='sorlo-input__identifier'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='text'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n onBlur={onBlur}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n />\n </div>\n )\n}\n\nexport default Component\n","import { formatIdentifier } from '@/inputs/Identifier'\nimport { FieldSchema } from '@/types/fields'\nimport { Input, InputTypeFields } from '@/types/inputs'\nimport { normaliseConditions } from '@/utils/conditions'\n\n// A union of literal types, e.g. '\"red\" | \"blue\"', or never when there are no values\nexport const literalUnion = (values: Array<any>) => values.map((value) => JSON.stringify(value)).join(' | ') || 'never'\n\n// Quote names that aren't plain identifiers, e.g. \"0-1/firstname\"\nconst propertyName = (name: string) => (/^[A-Za-z_$][\\w$]*$/.test(name) ? name : JSON.stringify(name))\n\n// Write a TypeScript declaration for a schema's values, letting each input type its own value\nexport function schemaToTypeScript(\n schema: Array<FieldSchema>,\n inputs: Record<string, Input>,\n options: { name: string },\n) {\n const typeName = formatIdentifier(options.name, 'pascal')\n if (!/^[A-Za-z]/.test(typeName)) throw new Error(`'${options.name}' does not make a valid type name`)\n\n const typeFields: InputTypeFields = (fields) => {\n const properties = fields.flatMap((field) => {\n const input = inputs?.[field.type]\n const type = input?.typeValue ? input.typeValue(field, typeFields) : 'unknown'\n\n // Inputs without a value, such as content, have no property\n if (type === undefined) return []\n\n // Fields that conditions can hide may be missing, like optional ones\n const optional = !field.required || normaliseConditions(field).length > 0\n return [` ${propertyName(field.name)}${optional ? '?' : ''}: ${type.replace(/\\n/g, '\\n ')}`]\n })\n\n return properties.length ? `{\\n${properties.join('\\n')}\\n}` : '{}'\n }\n\n return `export type ${typeName} = ${typeFields(schema)}`\n}\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Color'\n\nexport const description: InputDescription = () => 'A color picker that stores a hex value.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return []\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string' || !/^#[0-9a-fA-F]{6}$/.test(value)) {\n return validationError(value, validationMessage(schema, 'color'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, value = '#000000', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__color'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='color'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n disabled={disabled || readonly}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport { FieldInjectionContext, FieldPath, FieldReportContext, useFormStaticContext } from '@/context/FormProvider'\nimport i18n, { t } from '@/i18n'\nimport { ConditionOperator, FieldSchema } from '@/types/fields'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputRenderValue,\n InputTypeValue,\n InputValidateChildren,\n InputValidateValue,\n ValidationReport,\n} from '@/types/inputs'\nimport { normaliseConditions } from '@/utils/conditions'\nimport { validateSchema, validateValues } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { literalUnion } from '@/utils/typescript'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport isEqual from 'lodash/isEqual.js'\nimport { Fragment, useContext, useEffect, useMemo, useRef } from 'react'\n\ntype Rule = Record<string, any>\n\n// A value rules can test, listed in the fieldChoices option. Its type picks the operators and the value's control,\n// and choices make the value a select.\ninterface FieldChoice {\n value: string\n label?: string\n type?: 'text' | 'number' | 'date' | 'boolean'\n choices?: Array<{ value: any; label?: string }>\n example?: string\n}\n\nexport const name: InputName = () => 'Conditions'\n\nexport const description: InputDescription = () =>\n 'Rules joined by AND and OR, in the shape conditional logic takes, such as for when to show something.'\n\nexport const category: InputCategory = () => 'Choice'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'fieldChoices',\n label: 'Fields',\n type: 'repeater',\n required: false,\n instructions: 'What rules can test, each a dotted path such as address.town. Without any, rules type their own.',\n options: {\n fields: [\n { name: 'value', label: 'Path', type: 'text', required: true, width: 25 },\n { name: 'label', label: 'Label', type: 'text', required: false, width: 25 },\n {\n name: 'type',\n label: 'Type',\n type: 'select',\n required: false,\n width: 25,\n options: {\n placeholder: 'Text',\n choices: [\n { value: 'number', label: 'Number' },\n { value: 'date', label: 'Date' },\n { value: 'boolean', label: 'Yes or no' },\n ],\n },\n },\n { name: 'example', label: 'Example', type: 'text', required: false, width: 25 },\n ],\n },\n },\n ]\n}\n\nconst operators: Array<ConditionOperator> = [\n 'equals',\n 'notEquals',\n 'contains',\n 'notContains',\n 'startsWith',\n 'greaterThan',\n 'lessThan',\n 'empty',\n 'notEmpty',\n]\n\n// The operators that suit each type of value\nconst operatorsByType: Record<string, Array<ConditionOperator>> = {\n text: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'empty', 'notEmpty'],\n number: ['equals', 'notEquals', 'greaterThan', 'lessThan', 'empty', 'notEmpty'],\n date: ['equals', 'notEquals', 'greaterThan', 'lessThan', 'empty', 'notEmpty'],\n boolean: ['equals', 'notEquals'],\n // Contains finds one of a checkbox's choices\n choices: ['equals', 'notEquals', 'contains', 'notContains', 'empty', 'notEmpty'],\n}\n\n// empty and notEmpty test the field alone\nconst takesValue = (operator: unknown) => operator !== 'empty' && operator !== 'notEmpty'\n\nconst fieldChoicesOf = (options?: Record<string, any>): undefined | Array<FieldChoice> => {\n return options?.fieldChoices?.length ? options.fieldChoices : undefined\n}\n\n// A listed field's operators, or all nine for a field that isn't listed\nconst operatorsFor = (choice?: FieldChoice) => {\n if (!choice) return operators\n if (choice.choices?.length) return operatorsByType.choices\n return operatorsByType[choice.type || 'text'] || operatorsByType.text\n}\n\n// An operator's words, which read \"is after\" and \"is before\" for dates\nconst operatorLabel = (operator: string, choice?: FieldChoice) => {\n const dated = choice?.type === 'date' && !choice.choices?.length\n if (dated && operator === 'greaterThan') return i18n.t('ui.operators.after')\n if (dated && operator === 'lessThan') return i18n.t('ui.operators.before')\n return operators.includes(operator as ConditionOperator) ? i18n.t(`ui.operators.${operator}`) : String(operator)\n}\n\n// Values compare as text, which the schema builder always saved them as, so a saved true or 18 shows as 'true' or '18'\nconst asText = (value: any): string => {\n if (value == null) return ''\n return typeof value === 'object' ? JSON.stringify(value) : String(value)\n}\n\n// The rules of each group. Conditions written in another shape core accepts, such as a flat list, show as groups too.\nconst groupsOf = (value: any): Array<Array<Rule>> => {\n if (!Array.isArray(value)) return []\n return normaliseConditions({ type: 'conditions', name: 'conditions', conditions: value }).map((rules) =>\n rules.map((rule) => (rule !== null && typeof rule === 'object' ? rule : {})),\n )\n}\n\n// A rule's value checked as a core field, which also picks the control it's shown in\nconst valueField = (choice?: FieldChoice): Omit<FieldSchema, 'name'> => {\n if (choice?.choices?.length) return { type: 'select', options: { choices: choice.choices } }\n if (choice?.type === 'boolean') {\n const yesNo = [\n { value: 'true', label: i18n.t('ui.conditions.yes') },\n { value: 'false', label: i18n.t('ui.conditions.no') },\n ]\n return { type: 'select', options: { choices: yesNo } }\n }\n if (choice?.type === 'number' || choice?.type === 'date') return { type: choice.type }\n return { type: 'text' }\n}\n\n// A rule's field, operator and value as core fields: a field from fieldChoices, an operator that suits it, and a\n// value it can hold. From a list, the operator and value wait for the field.\nconst ruleFields = (rule: Rule, options?: Record<string, any>): Array<FieldSchema> => {\n const fieldChoices = fieldChoicesOf(options)\n const choice = fieldChoices?.find((item) => item.value === rule.field)\n const waiting = !!fieldChoices && isEmptyValue(rule.field)\n\n return [\n fieldChoices\n ? {\n name: 'field',\n type: 'select',\n required: true,\n options: { choices: fieldChoices.map((item) => ({ value: item.value, label: item.label })) },\n }\n : { name: 'field', type: 'text', required: true },\n {\n name: 'operator',\n type: 'select',\n required: !waiting,\n disabled: waiting,\n options: { choices: operatorsFor(choice).map((value) => ({ value, label: operatorLabel(value, choice) })) },\n },\n ...(takesValue(rule.operator)\n ? [{ name: 'value', ...valueField(choice), required: !waiting, disabled: waiting }]\n : []),\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional, as no conditions match everything\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n // Every group holds rules, as a group of none would always match\n const isRule = (rule: any) => rule !== null && typeof rule === 'object' && !Array.isArray(rule)\n const isGroup = (group: any) => Array.isArray(group?.rules) && group.rules.length >= 1 && group.rules.every(isRule)\n if (!Array.isArray(value) || !value.every(isGroup)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // validateChildren checks each rule, so its messages sit under its controls\n return validationSuccess(value)\n}\n\n// A group's rules nest under rules, as a repeater's items would, so their messages are keyed like\n// conditions.0.rules.1.value\nconst groupReport = (reports: Array<ValidationReport>): ValidationReport => {\n const isValid = reports.every((report) => report.isValid)\n return { isValid, fields: { rules: { isValid, messages: [], children: reports } } }\n}\n\nexport const validateChildren: InputValidateChildren = (value, schema, validateFields) => {\n return groupsOf(value).map((rules) => {\n const reports = rules.map((rule) =>\n validateFields(ruleFields(rule, schema.options), { ...rule, value: asText(rule.value) }),\n )\n\n // On the server validateFields may return promises, so the group's report waits for them\n return reports.some((report) => report instanceof Promise)\n ? Promise.all(reports).then(groupReport)\n : groupReport(reports as Array<ValidationReport>)\n })\n}\n\n// Keep only each rule's field, operator and value\nexport const pickValue: InputPickValue = (value) => {\n if (!Array.isArray(value)) return undefined\n return value.map((group) => ({\n rules: (Array.isArray(group?.rules) ? group.rules : []).map((rule: Rule) => ({\n field: rule?.field,\n operator: rule?.operator,\n ...(rule?.value !== undefined && { value: rule.value }),\n })),\n }))\n}\n\nexport const typeValue: InputTypeValue = () => {\n return `Array<{ rules: Array<{ field: string; operator: ${literalUnion(operators)}; value?: unknown }> }>`\n}\n\n// Reads as a sentence, e.g. \"Category equals News and Featured equals Yes, or Spam equals No\"\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n if (!validation.isValid) return null\n\n const describe = (rule: Rule) => {\n const choice = fieldChoicesOf(schema.options)?.find((item) => item.value === rule.field)\n const valuePart = ruleFields(rule, schema.options).find((field) => field.name === 'value')\n const chosen = valuePart?.options?.choices?.find((item: any) => String(item.value) === asText(rule.value))\n const words = [choice?.label || rule.field, operatorLabel(rule.operator, choice)]\n return [...words, valuePart && (chosen?.label ?? asText(rule.value))].filter(Boolean).join(' ')\n }\n\n return groupsOf(value)\n .map((rules) => rules.map(describe).join(i18n.t('ui.conditions.joinRules')))\n .join(i18n.t('ui.conditions.joinGroups'))\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\n// One of a rule's controls, with its label, the hint under a value, and its messages under it\nfunction RuleControl({\n id,\n column,\n context,\n field,\n value,\n messages,\n valid,\n hint,\n readonly,\n disabled,\n onChange,\n}: {\n id: string\n column: string\n context: string\n field: FieldSchema\n value: string\n messages: Array<string>\n valid?: boolean\n hint?: string\n readonly?: boolean\n disabled?: boolean\n onChange: (value: string) => void\n}) {\n const choices: undefined | Array<{ value: any; label?: string }> = field.options?.choices\n const describedBy = [messages.length >= 1 && `${id}-messages`, hint && `${id}-hint`].filter(Boolean).join(' ')\n const control = {\n id,\n className: 'sorlo-input',\n value,\n 'aria-describedby': describedBy || undefined,\n 'aria-invalid': valid === false || undefined,\n }\n\n return (\n <div className={`sorlo-field ${valid === false ? 'sorlo-invalid' : 'sorlo-valid'}`}>\n <label className='sorlo-label' htmlFor={id}>\n {/* The space sits outside the hidden text, as some browsers trim the text inside it from the name */}\n {column} <span className='sorlo-visually-hidden'>{context}</span>\n </label>\n {choices ? (\n <select {...control} disabled={readonly || disabled} onChange={(event) => onChange(event.target.value)}>\n <option value=''>{t('ui.conditions.select')}</option>\n {/* A saved value that isn't one of the choices shows as it is, beside the message about it */}\n {value !== '' && !choices.some((choice) => String(choice.value) === value) && (\n <option value={value}>{value}</option>\n )}\n {choices.map((choice, choiceIndex) => (\n <option key={choiceIndex} value={String(choice.value)}>\n {choice.label ?? String(choice.value)}\n </option>\n ))}\n </select>\n ) : (\n <input\n {...control}\n // A date that isn't a plain one shows as text, as a date picker would hide it\n type={field.type === 'date' && (value === '' || /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) ? 'date' : 'text'}\n inputMode={field.type === 'number' ? 'decimal' : undefined}\n readOnly={readonly}\n disabled={disabled}\n onChange={(event) => onChange(event.target.value)}\n />\n )}\n {hint && (\n <div className='sorlo-instructions' id={`${id}-hint`}>\n {hint}\n </div>\n )}\n {messages.length >= 1 && (\n <ul className='sorlo-messages' id={`${id}-messages`} role='alert'>\n {messages.map((message, messageIndex) => (\n <li key={messageIndex}>{message}</li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nconst columns = ['field', 'operator', 'value'] as const\n\nconst Component: InputComponent = function () {\n const { id, labelId, label, aria, schema, options, readonly, disabled, value, setValue, setMessages, setValid } =\n useFieldContext()\n const { inputs, validationCounter } = useFormStaticContext()\n const report = useContext(FieldReportContext)\n const injection = useContext(FieldInjectionContext)\n const locked = readonly || disabled\n const root = useRef<HTMLDivElement>(null)\n\n const groups = useMemo(() => groupsOf(value), [value])\n const fieldChoices = fieldChoicesOf(options)\n\n // A control's path in the form, e.g. conditions.0.rules.1.value, which a server report keys its messages by\n const pathOf = (path: FieldPath) => report?.resolve(path).join('.')\n\n // Each control's field and what it says. Until the form validates, a rule shows what's wrong with it but not what\n // it's missing, as fields that haven't been filled in say nothing until then. A server report's messages show until\n // the rule changes.\n const shown = useMemo(() => {\n return groups.map((rules, groupIndex) =>\n rules.map((rule, ruleIndex) => {\n const fields = ruleFields(rule, options)\n const checked = validateValues(fields, { ...rule, value: asText(rule.value) }, inputs, {\n environment: 'client',\n allowIncomplete: validationCounter < 1,\n })\n\n return fields.map((field) => {\n const own = checked.fields[field.name]\n const key = report?.resolve([groupIndex, 'rules', ruleIndex, field.name]).join('.')\n const injected = key !== undefined && injection && key in injection.validity\n return injected\n ? { field, messages: injection.messages[key] || [], valid: injection.validity[key] }\n : { field, messages: own.messages, valid: own.isValid }\n })\n }),\n )\n }, [groups, options, inputs, validationCounter, report, injection])\n\n // Report every control's messages under its path, as nested fields do, removing the paths of rules that went\n const reportedPaths = useRef<Array<FieldPath>>([])\n useEffect(() => {\n if (!report) return\n const paths: Array<FieldPath> = []\n shown.forEach((rules, groupIndex) =>\n rules.forEach((parts, ruleIndex) => {\n for (const { field, messages, valid } of parts) {\n const path = [groupIndex, 'rules', ruleIndex, field.name]\n report.report(path, { messages, valid })\n paths.push(path)\n }\n }),\n )\n for (const path of reportedPaths.current) {\n if (!paths.some((other) => isEqual(other, path))) report.report(path, undefined)\n }\n reportedPaths.current = paths\n }, [report, shown])\n\n // And remove them all when the field goes, e.g. when its own conditions hide it\n useEffect(() => () => reportedPaths.current.forEach((path) => report?.report(path, undefined)), [report])\n\n // The field is invalid while any control is\n const validation = useMemo(() => (value !== undefined ? validateValue(value, schema) : null), [value, schema])\n const rulesValid = shown.every((rules) => rules.every((parts) => parts.every((part) => part.valid !== false)))\n\n useEffect(() => {\n if (!validation) return\n\n setMessages(validation.messages)\n\n if (validation.isValid === false || !rulesValid) {\n setValid(false)\n } else if (validation.isValid === true) {\n setValid(true)\n }\n }, [validation, rulesValid, setMessages, setValid])\n\n // Clear what a server report said under a path, e.g. a rule's, once it changes or moves\n const clearReported = (path: FieldPath) => {\n const prefix = pathOf(path)\n if (!injection || prefix === undefined) return\n for (const key of new Set([...Object.keys(injection.messages), ...Object.keys(injection.validity)])) {\n if (key.startsWith(`${prefix}.`)) injection.clear(key)\n }\n }\n\n // Groups are saved as { rules }, and a group goes with its last rule\n const write = (next: Array<Array<Rule>>) => {\n setValue(next.filter((rules) => rules.length >= 1).map((rules) => ({ rules })))\n }\n\n const changeRule = (groupIndex: number, ruleIndex: number, rule: Rule) => {\n clearReported([groupIndex, 'rules', ruleIndex])\n write(groups.map((rules, index) => (index === groupIndex ? rules.toSpliced(ruleIndex, 1, rule) : rules)))\n }\n\n // A field picked from the list keeps an operator that suits it, or starts at equals, and starts without a value\n const changePart = (groupIndex: number, ruleIndex: number, part: string, partValue: string) => {\n const rule = groups[groupIndex][ruleIndex]\n if (part !== 'field' || !fieldChoices) return changeRule(groupIndex, ruleIndex, { ...rule, [part]: partValue })\n\n const suits = operatorsFor(fieldChoices.find((choice) => choice.value === partValue)).includes(rule.operator)\n const operator = suits ? rule.operator : 'equals'\n changeRule(groupIndex, ruleIndex, partValue ? { field: partValue, operator } : { field: partValue })\n }\n\n // The control that takes focus once the rules change, by its rule's place among them all\n const focus = useRef<{ index: number; control: 'field' | 'remove' }>(undefined)\n\n useEffect(() => {\n const target = focus.current\n if (!target || !root.current) return\n focus.current = undefined\n\n const rules = root.current.querySelectorAll('.sorlo-input__conditions-rule')\n const rule = rules[Math.min(target.index, rules.length - 1)]\n const selector = target.control === 'field' ? '.sorlo-input' : '.sorlo-input__conditions-remove'\n\n // With no rules left, the button that adds one\n ;(rule?.querySelector<HTMLElement>(selector) ?? root.current.querySelector<HTMLElement>('button'))?.focus()\n }, [groups])\n\n const placeOf = (groupIndex: number, ruleIndex: number) => {\n return groups.slice(0, groupIndex).reduce((total, rules) => total + rules.length, 0) + ruleIndex\n }\n\n // Adding or removing a rule moves the rules after it, so what a server report said about them is cleared\n const restructure = (next: Array<Array<Rule>>, target: { index: number; control: 'field' | 'remove' }) => {\n clearReported([])\n focus.current = target\n write(next)\n }\n\n const addRule = (groupIndex: number, ruleIndex: number) => {\n restructure(\n groups.map((rules, index) => (index === groupIndex ? rules.toSpliced(ruleIndex + 1, 0, {}) : rules)),\n { index: placeOf(groupIndex, ruleIndex) + 1, control: 'field' },\n )\n }\n\n const addGroup = () => restructure([...groups, [{}]], { index: placeOf(groups.length, 0), control: 'field' })\n\n const removeRule = (groupIndex: number, ruleIndex: number) => {\n restructure(\n groups.map((rules, index) => (index === groupIndex ? rules.toSpliced(ruleIndex, 1) : rules)),\n { index: placeOf(groupIndex, ruleIndex), control: 'remove' },\n )\n }\n\n return (\n <div\n className='sorlo-input__conditions'\n ref={root}\n role='group'\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={aria['aria-describedby']}\n >\n {groups.length === 0 && (\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n addGroup()\n }}\n >\n {t('ui.conditions.addRule')}\n </button>\n )}\n {groups.length >= 1 && (\n // Each control's label names its column too, so screen readers skip these\n <div className='sorlo-input__conditions-head' aria-hidden='true'>\n {columns.map((column) => (\n <span className='sorlo-label' key={column}>\n {t(`ui.conditions.${column}`)}\n </span>\n ))}\n </div>\n )}\n {groups.map((rules, groupIndex) => (\n <Fragment key={groupIndex}>\n {groupIndex >= 1 && (\n <div className='sorlo-input__conditions-or'>\n <span>{t('ui.conditions.or')}</span>\n </div>\n )}\n <div\n className='sorlo-input__conditions-group'\n role='group'\n aria-label={t('ui.conditions.group', { group: groupIndex + 1 })}\n >\n {rules.map((rule, ruleIndex) => {\n const place = { rule: ruleIndex + 1, group: groupIndex + 1 }\n const choice = fieldChoices?.find((item) => item.value === rule.field)\n const last = groupIndex === groups.length - 1 && ruleIndex === rules.length - 1\n\n return (\n <Fragment key={ruleIndex}>\n {ruleIndex >= 1 && (\n <div className='sorlo-input__conditions-and'>\n <span>{t('ui.conditions.and')}</span>\n </div>\n )}\n <div className='sorlo-input__conditions-rule'>\n {columns.map((column) => {\n const part = shown[groupIndex][ruleIndex].find(({ field }) => field.name === column)\n\n // Without a value to compare, its column stays empty\n if (!part) return <div key={column} />\n\n return (\n <RuleControl\n key={column}\n id={`${id}-${groupIndex}-${ruleIndex}-${column}`}\n column={t(`ui.conditions.${column}`)}\n context={t('ui.conditions.ofRule', place)}\n field={part.field}\n value={asText(rule[column])}\n messages={part.messages}\n valid={part.valid}\n hint={\n column === 'value' && choice?.example\n ? t('ui.conditions.example', { example: choice.example })\n : undefined\n }\n readonly={readonly}\n disabled={disabled || part.field.disabled}\n onChange={(partValue) => changePart(groupIndex, ruleIndex, column, partValue)}\n />\n )\n })}\n <div className='sorlo-input__conditions-actions'>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n aria-label={t('ui.conditions.addRuleAfter', place)}\n onClick={(event) => {\n event.preventDefault()\n addRule(groupIndex, ruleIndex)\n }}\n >\n {t('ui.conditions.and')}\n </button>\n {last && (\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n aria-label={t('ui.conditions.addGroup')}\n onClick={(event) => {\n event.preventDefault()\n addGroup()\n }}\n >\n {t('ui.conditions.or')}\n </button>\n )}\n <button\n className='sorlo-button sorlo-input__conditions-remove'\n type='button'\n disabled={locked}\n aria-label={t('ui.conditions.removeRule', place)}\n onClick={(event) => {\n event.preventDefault()\n removeRule(groupIndex, ruleIndex)\n }}\n >\n ×\n </button>\n </div>\n </div>\n </Fragment>\n )\n })}\n </div>\n </Fragment>\n ))}\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputCoreFields,\n InputDescription,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputTypeValue,\n} from '@/types/inputs'\n\nexport const name: InputName = () => 'Content'\n\nexport const description: InputDescription = () => 'A block of read only content, useful for headings and instructions.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const coreFields: InputCoreFields = (defaultFields) => {\n return defaultFields.filter(({ name }) => ['name', 'label', 'width', 'conditions'].includes(name))\n}\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'content',\n label: 'Content',\n type: 'textarea',\n required: false,\n },\n ]\n}\n\n// Content has no value, so there is nothing to validate, format or render,\n// any posted value is dropped when picking, and it's left out of generated types\nexport const pickValue: InputPickValue = () => undefined\nexport const typeValue: InputTypeValue = () => undefined\n\nconst Component: InputComponent = function () {\n const { options } = useFieldContext()\n\n return <div className='sorlo-input__content'>{options?.content}</div>\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Date'\n\nexport const description: InputDescription = () => 'A date picker that stores an ISO date, e.g. 2026-01-15.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Minimum',\n name: 'min',\n type: 'date',\n required: false,\n width: 50,\n },\n {\n label: 'Maximum',\n name: 'max',\n type: 'date',\n required: false,\n width: 50,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string' || !/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || isNaN(Date.parse(value))) {\n return validationError(value, validationMessage(schema, 'date'))\n }\n\n // ISO dates compare lexicographically, so validate the range as strings\n const min = schema.options?.min\n if (typeof min === 'string' && min && value < min) {\n return validationError(value, validationMessage(schema, 'min', { min }))\n }\n\n const max = schema.options?.max\n if (typeof max === 'string' && max && value > max) {\n return validationError(value, validationMessage(schema, 'max', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n if (!validation.isValid) return null\n return validation.value ? new Date(validation.value).toLocaleDateString() : validation.value\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__date'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='date'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n min={options?.min}\n max={options?.max}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Date & Time'\n\nexport const description: InputDescription = () => 'A picker that stores a local date and time, e.g. 2026-01-15T13:30.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Minimum',\n name: 'min',\n type: 'datetime',\n required: false,\n width: 50,\n },\n {\n label: 'Maximum',\n name: 'max',\n type: 'datetime',\n required: false,\n width: 50,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (\n typeof value !== 'string' ||\n !/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2})?$/.test(value) ||\n isNaN(Date.parse(value))\n ) {\n return validationError(value, validationMessage(schema, 'datetime'))\n }\n\n // Local ISO datetimes compare lexicographically, so validate the range as strings\n const min = schema.options?.min\n if (typeof min === 'string' && min && value < min) {\n return validationError(value, validationMessage(schema, 'min', { min }))\n }\n\n const max = schema.options?.max\n if (typeof max === 'string' && max && value > max) {\n return validationError(value, validationMessage(schema, 'max', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n if (!validation.isValid) return null\n return validation.value ? new Date(validation.value).toLocaleString() : validation.value\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__datetime'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='datetime-local'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n min={options?.min}\n max={options?.max}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmail, isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Email'\n\nexport const description: InputDescription = () => 'A text input specifically designed for storing email addresses.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n {\n name: 'multiple',\n label: 'Multiple',\n type: 'boolean',\n required: false,\n options: {\n message: 'Allow multiple addresses',\n },\n },\n {\n name: 'minLength',\n label: 'Minimum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n name: 'maxLength',\n label: 'Maximum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 1,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n if (!schema.options?.multiple && !isEmail(value)) {\n return validationError(value, validationMessage(schema, 'email'))\n }\n\n // If input allows for multiple addresses\n // @link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#multiple\n if (schema.options?.multiple && value.split(/[ ,]+/).filter((item) => !isEmail(item)).length) {\n return validationError(value, validationMessage(schema, 'emailMultiple'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__email'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='email'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n minLength={options?.minLength}\n maxLength={options?.maxLength}\n placeholder={options?.placeholder}\n multiple={options?.multiple}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport Fieldset, { OnValidityChangeCallback, OnValuesChangeCallback } from '@/components/Fieldset'\nimport { t } from '@/i18n'\nimport { FieldSchema } from '@/types/fields'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputPrepareSchema,\n InputRenderValue,\n InputTypeValue,\n InputValidateChildren,\n InputValidateValue,\n} from '@/types/inputs'\nimport { createId, validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\n// A block holds its layout's field values plus _layout, the name of that layout\ntype Block = Record<string, any>\n\ninterface Layout {\n // A stable ID like a field's, e.g. lay_k3x9q2mz, while blocks keep naming their layout in _layout\n id?: string\n name: string\n label?: string\n fields?: Array<FieldSchema>\n}\n\nexport const name: InputName = () => 'Flexible content'\n\nexport const description: InputDescription = () =>\n 'Lets editors build content from blocks, each using one of a set of layouts with its own fields.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Layouts',\n name: 'layouts',\n type: 'repeater',\n required: true,\n options: {\n minimum: 1,\n fields: [\n {\n label: 'Label',\n name: 'label',\n type: 'text',\n required: true,\n width: 50,\n },\n {\n label: 'Name',\n name: 'name',\n type: 'identifier',\n required: true,\n width: 50,\n options: {\n source: 'label',\n format: 'snake',\n },\n },\n {\n label: 'Fields',\n name: 'fields',\n type: 'schemabuilder',\n },\n ],\n },\n },\n ]\n}\n\n// Give layouts added in the schema builder their IDs, keeping the IDs of existing ones\nexport const prepareSchema: InputPrepareSchema = (schema) => {\n const layouts: Array<Layout> = schema.options?.layouts\n if (!Array.isArray(layouts)) return schema\n\n const withIds = layouts.map((layout) => ({ ...layout, id: layout?.id || createId('lay') }))\n return { ...schema, options: { ...schema.options, layouts: withIds } }\n}\n\n// The field's layouts by name, skipping any without one\nconst layoutsOf = (options?: Record<string, any>): Map<string, Layout> => {\n const layouts: Array<Layout> = Array.isArray(options?.layouts) ? options.layouts : []\n return new Map(layouts.filter((layout) => layout?.name).map((layout) => [layout.name, layout] as const))\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n // Every block must use one of the field's layouts\n const layouts = layoutsOf(schema.options)\n if (!Array.isArray(value) || value.some((block) => !layouts.has(block?._layout))) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n return validationSuccess(value)\n}\n\n// Validate every block's fields against its own layout\nexport const validateChildren: InputValidateChildren = (value, schema, validateFields) => {\n const layouts = layoutsOf(schema.options)\n const blocks: Array<Block> = Array.isArray(value) ? value : []\n return blocks.map((block) => validateFields(layouts.get(block?._layout)?.fields || [], block || {}))\n}\n\n// Keep the blocks whose layout still exists, with only that layout's fields\nexport const pickValue: InputPickValue = (value, schema, pickFields) => {\n if (!Array.isArray(value)) return undefined\n const layouts = layoutsOf(schema.options)\n return value\n .filter((block) => layouts.has(block?._layout))\n .map((block) => ({ ...pickFields(layouts.get(block._layout)?.fields || [], block), _layout: block._layout }))\n}\n\n// A union of every layout's blocks, so checking _layout narrows a block to its layout's fields\nexport const typeValue: InputTypeValue = (schema, typeFields) => {\n const blocks = [...layoutsOf(schema.options).values()].map((layout) => {\n return `{ _layout: ${JSON.stringify(layout.name)} } & ${typeFields(layout.fields || [])}`\n })\n return `Array<${blocks.join(' | ') || 'never'}>`\n}\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? JSON.stringify(validation.value, null, 2) : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\n// A single block, rendered as a group of its layout's fields named by the\n// block's index so nested reports land under paths like 'blocks.0.title'\nfunction FlexibleBlock({\n index,\n layout,\n block,\n valid,\n setBlock,\n setBlockValid,\n}: {\n index: number\n layout: Layout\n block: Block\n valid?: boolean\n setBlock: OnValuesChangeCallback\n setBlockValid: OnValidityChangeCallback\n}) {\n const schema = useMemo<Array<FieldSchema>>(() => {\n return [\n {\n type: 'group',\n name: String(index),\n label: layout.label || layout.name,\n options: { fields: layout.fields || [] },\n },\n ]\n }, [index, layout])\n\n return (\n <Fieldset\n schema={schema}\n values={{ [index]: block }}\n validity={{ [index]: valid }}\n onValuesChange={setBlock}\n onValidityChange={setBlockValid}\n />\n )\n}\n\nconst Component: InputComponent = function () {\n const { schema, options, readonly, disabled, value, setValue, setMessages, setValid } = useFieldContext()\n const locked = readonly || disabled\n\n const [blockValidity, setBlockValidity] = useState<Record<string, boolean | undefined>>({})\n\n // Bumped whenever blocks change position, remounting them so no block keeps another's messages\n const [version, setVersion] = useState(0)\n\n const layouts = useMemo(() => layoutsOf(options), [options])\n const blocks: Array<Block> = Array.isArray(value) ? value : []\n\n const setBlock: OnValuesChangeCallback = useCallback(\n (field, block) => {\n setValue((oldValue: Array<Block>) => {\n if (!Array.isArray(oldValue)) return oldValue\n return oldValue.map((oldBlock, index) => (index === Number(field) ? block : oldBlock))\n })\n },\n [setValue],\n )\n\n const setBlockValid: OnValidityChangeCallback = useCallback((field, valid) => {\n setBlockValidity((old) => ({ ...old, [field]: valid }))\n }, [])\n\n const addBlock = (layout: Layout) => {\n // Seed every field so conditions inside the block resolve against the block first\n const fields = Object.fromEntries((layout.fields || []).map((field) => [field.name, field.defaultValue]))\n\n setValue((oldValue: Array<Block>) => [\n ...(Array.isArray(oldValue) ? oldValue : []),\n { ...fields, _layout: layout.name },\n ])\n }\n\n const removeBlock = (index: number) => {\n setBlockValidity({})\n setVersion((old) => old + 1)\n setValue((oldValue: Array<Block>) => (Array.isArray(oldValue) ? oldValue.toSpliced(index, 1) : []))\n }\n\n const moveBlock = (index: number, offset: number) => {\n setBlockValidity({})\n setVersion((old) => old + 1)\n setValue((oldValue: Array<Block>) => {\n const newValue = [...(Array.isArray(oldValue) ? oldValue : [])]\n const target = index + offset\n\n // Keep the block within the bounds of the list\n if (target < 0 || target >= newValue.length) return oldValue\n\n const [moved] = newValue.splice(index, 1)\n newValue.splice(target, 0, moved)\n return newValue\n })\n }\n\n // Validate the blocks' layouts and aggregate the validity of every block\n const validation = useMemo(() => (value !== undefined ? validateValue(value, schema) : null), [value, schema])\n\n useEffect(() => {\n if (!validation) return\n\n setMessages(validation.messages)\n\n if (validation.isValid === false || Object.values(blockValidity).some((valid) => valid === false)) {\n setValid(false)\n } else if (validation.isValid === true) {\n setValid(true)\n }\n }, [validation, blockValidity, setMessages, setValid])\n\n return (\n <div className='sorlo-input__flexible'>\n {blocks.map((block, index) => {\n const layout = layouts.get(block?._layout)\n\n return (\n <div key={`${version}-${index}`}>\n {layout && (\n <FlexibleBlock\n index={index}\n layout={layout}\n block={block}\n valid={blockValidity[index]}\n setBlock={setBlock}\n setBlockValid={setBlockValid}\n />\n )}\n {!layout && <div>{t('ui.invalidFieldType')}</div>}\n <button\n className='sorlo-button'\n type='button'\n disabled={locked || index === 0}\n onClick={(event) => {\n event.preventDefault()\n moveBlock(index, -1)\n }}\n >\n {t('ui.moveUp')}\n </button>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked || index === blocks.length - 1}\n onClick={(event) => {\n event.preventDefault()\n moveBlock(index, 1)\n }}\n >\n {t('ui.moveDown')}\n </button>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n removeBlock(index)\n }}\n >\n {t('ui.delete')}\n </button>\n </div>\n )\n })}\n <div>\n {[...layouts.values()].map((layout) => {\n return (\n <button\n key={layout.name}\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n addBlock(layout)\n }}\n >\n {t('ui.addBlock', { layout: layout.label || layout.name })}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport Fieldset, {\n OnMessagesChangeCallback,\n OnValidityChangeCallback,\n OnValuesChangeCallback,\n} from '@/components/Fieldset'\nimport { FieldScopeContext, useFormStaticContext } from '@/context/FormProvider'\nimport { FieldMessages } from '@/types/fields'\nimport {\n InputCategory,\n InputComponent,\n InputCoreFields,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputRenderValue,\n InputTypeValue,\n InputValidateChildren,\n InputValidateValue,\n} from '@/types/inputs'\nimport { conditionScope, validateSchema } from '@/utils/inputs'\nimport { validationSuccess } from '@/utils/validation'\nimport { useCallback, useContext, useEffect, useMemo, useState } from 'react'\n\nexport const name: InputName = () => 'Group'\n\nexport const description: InputDescription = () => 'Group your fields.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const coreFields: InputCoreFields = (defaultFields) => {\n return defaultFields.filter(({ name }) => name !== 'required')\n}\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Fields',\n name: 'fields',\n type: 'schemabuilder',\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n return validationSuccess(value)\n}\n\n// Validate the nested fields against the group's value\nexport const validateChildren: InputValidateChildren = (value, schema, validateFields) => {\n return validateFields(schema.options?.fields || [], value || {})\n}\n\n// Pick only the nested fields' values\nexport const pickValue: InputPickValue = (value, schema, pickFields) => {\n if (value === undefined) return undefined\n return pickFields(schema.options?.fields || [], value || {})\n}\n\n// Type the nested fields as an object\nexport const typeValue: InputTypeValue = (schema, typeFields) => typeFields(schema.options?.fields || [])\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? JSON.stringify(validation.value, null, 2) : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { options, value, setValue, setValid } = useFieldContext()\n const { inputs } = useFormStaticContext()\n\n const [tempMessages, setTempMessages] = useState<Record<string, FieldMessages>>({})\n const [tempValidity, setTempValidity] = useState<Record<string, boolean | undefined>>({})\n\n // Extend the condition scopes with the group's own values\n const parentScopes = useContext(FieldScopeContext)\n const scopes = useMemo(() => {\n return [...(parentScopes || []), conditionScope(options?.fields || [], value || {}, inputs)]\n }, [parentScopes, options?.fields, value, inputs])\n\n // Mark the group itself invalid when any nested field is invalid\n useEffect(() => {\n const validity = Object.values(tempValidity)\n if (validity.some((valid) => valid === false)) {\n setValid(false)\n } else if (validity.length >= 1 && validity.every((valid) => valid === true)) {\n setValid(true)\n }\n }, [tempValidity, setValid])\n\n const onValuesChange: OnValuesChangeCallback = useCallback(\n (field, fieldValue) => {\n setValue((old: Record<string, any>) => ({ ...old, [field]: fieldValue }))\n },\n [setValue],\n )\n\n const onMessagesChange: OnMessagesChangeCallback = useCallback((field, messages) => {\n setTempMessages((old) => ({ ...old, [field]: messages }))\n }, [])\n\n const onValidityChange: OnValidityChangeCallback = useCallback((field, valid) => {\n setTempValidity((old) => ({ ...old, [field]: valid }))\n }, [])\n\n return (\n <FieldScopeContext.Provider value={scopes}>\n <Fieldset\n schema={options?.fields || []}\n values={value || {}}\n messages={tempMessages}\n validity={tempValidity}\n onValuesChange={onValuesChange}\n onMessagesChange={onMessagesChange}\n onValidityChange={onValidityChange}\n />\n </FieldScopeContext.Provider>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputCoreFields,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputRenderValue,\n InputTypeValue,\n} from '@/types/inputs'\nimport { useEffect } from 'react'\n\nexport const name: InputName = () => 'Hidden'\n\nexport const description: InputDescription = () => 'An invisible field that carries a fixed value into the form.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const coreFields: InputCoreFields = (defaultFields) => {\n return defaultFields.filter(({ name }) => ['name', 'conditions'].includes(name))\n}\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'value',\n label: 'Value',\n type: 'text',\n required: false,\n },\n ]\n}\n\n// The schema's fixed value always wins over a posted value\nexport const pickValue: InputPickValue = (value, schema) => {\n return schema.options?.value ?? value\n}\n\n// The fixed value's literal type, or anything posted when there is no fixed value\nexport const typeValue: InputTypeValue = (schema) => {\n const value = schema.options?.value\n return value == null ? 'unknown' : JSON.stringify(value)\n}\n\nexport const formatValue: InputFormatValue = (value) => {\n return value === undefined || value === null ? null : String(value)\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, options, value, setValue } = useFieldContext()\n\n // The schema's value option wins when nothing has been committed yet\n const fixedValue = value !== undefined ? value : options?.value\n\n // Commit the fixed value so it is included in the form's values\n useEffect(() => {\n if (fixedValue !== undefined) setValue(fixedValue)\n }, [fixedValue, setValue])\n\n return <input className='sorlo-input' id={id} type='hidden' value={fixedValue ?? ''} readOnly />\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport Fieldset, {\n OnMessagesChangeCallback,\n OnValidityChangeCallback,\n OnValuesChangeCallback,\n} from '@/components/Fieldset'\nimport {\n FieldReportContext,\n FieldReportContextValue,\n FieldScopeContext,\n useFormStaticContext,\n} from '@/context/FormProvider'\nimport { t } from '@/i18n'\nimport { FieldMessages, FieldSchema } from '@/types/fields'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputRenderValue,\n InputTypeValue,\n InputValidateChildren,\n InputValidateValue,\n} from '@/types/inputs'\nimport { conditionScope, validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback, useContext, useEffect, useMemo, useState } from 'react'\n\ntype Column = Record<string, any>\ntype Row = Array<Column>\ntype Matrix = Array<Row>\n\nexport const name: InputName = () => 'Matrix'\n\nexport const description: InputDescription = () =>\n 'Allows a set of fields to be repeated vertically AND horizontally like a table.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Fields',\n name: 'fields',\n type: 'schemabuilder',\n },\n {\n label: 'Minimum rows',\n name: 'minimumRows',\n type: 'number',\n required: false,\n defaultValue: 1,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Maximum rows',\n name: 'maximumRows',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Minimum columns',\n name: 'minimumColumns',\n type: 'number',\n required: false,\n defaultValue: 1,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Maximum columns',\n name: 'maximumColumns',\n type: 'number',\n required: false,\n defaultValue: 1,\n width: 50,\n options: {\n min: 0,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (!Array.isArray(value) || value.some((row) => !Array.isArray(row))) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate the minimum and maximum number of rows\n const minRows = schema.options?.minimumRows\n if (typeof minRows === 'number' && value.length < minRows) {\n return validationError(value, validationMessage(schema, 'minRows', { min: minRows }))\n }\n\n const maxRows = schema.options?.maximumRows\n if (typeof maxRows === 'number' && value.length > maxRows) {\n return validationError(value, validationMessage(schema, 'maxRows', { max: maxRows }))\n }\n\n // Validate the minimum and maximum number of columns, in every row\n const minColumns = schema.options?.minimumColumns\n if (typeof minColumns === 'number' && value.some((row) => row.length < minColumns)) {\n return validationError(value, validationMessage(schema, 'minColumns', { min: minColumns }))\n }\n\n const maxColumns = schema.options?.maximumColumns\n if (typeof maxColumns === 'number' && value.some((row) => row.length > maxColumns)) {\n return validationError(value, validationMessage(schema, 'maxColumns', { max: maxColumns }))\n }\n\n return validationSuccess(value)\n}\n\n// Validate the nested fields against every column of every row\nexport const validateChildren: InputValidateChildren = (value, schema, validateFields) => {\n const rows: Matrix = Array.isArray(value) ? value : []\n return rows.map((row) => {\n return (Array.isArray(row) ? row : []).map((column) => validateFields(schema.options?.fields || [], column || {}))\n })\n}\n\n// Pick only the nested fields' values for every column of every row\nexport const pickValue: InputPickValue = (value, schema, pickFields) => {\n if (!Array.isArray(value)) return undefined\n return value.map((row) => {\n return (Array.isArray(row) ? row : []).map((column) => pickFields(schema.options?.fields || [], column || {}))\n })\n}\n\n// Type every column of every row as an object of the nested fields\nexport const typeValue: InputTypeValue = (schema, typeFields) => {\n return `Array<Array<${typeFields(schema.options?.fields || [])}>>`\n}\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? JSON.stringify(validation.value, null, 2) : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\n// A single cell of the matrix, nesting its fields' reports under the cell's\n// row and column indexes\nfunction MatrixCell({\n rowIndex,\n columnIndex,\n fields,\n column,\n messages,\n validity,\n setColumnValue,\n setColumnMessages,\n setColumnValidity,\n}: {\n rowIndex: number\n columnIndex: number\n fields: Array<FieldSchema>\n column: Column\n messages?: Record<string, FieldMessages>\n validity?: Record<string, boolean | undefined>\n setColumnValue: (row: number, column: number, field: string, value: any) => void\n setColumnMessages: (row: number, column: number, field: string, messages: FieldMessages) => void\n setColumnValidity: (row: number, column: number, field: string, valid: boolean | undefined) => void\n}) {\n const parentReport = useContext(FieldReportContext)\n\n const cellReport = useMemo<FieldReportContextValue | undefined>(() => {\n if (!parentReport) return undefined\n return {\n report: (path, patch) => parentReport.report([rowIndex, columnIndex, ...path], patch),\n resolve: (path) => parentReport.resolve([rowIndex, columnIndex, ...path]),\n }\n }, [parentReport, rowIndex, columnIndex])\n\n // Extend the condition scopes with the cell's own values\n const { inputs } = useFormStaticContext()\n const parentScopes = useContext(FieldScopeContext)\n const scopes = useMemo(() => {\n return [...(parentScopes || []), conditionScope(fields, column || {}, inputs)]\n }, [parentScopes, fields, column, inputs])\n\n const onValuesChange: OnValuesChangeCallback = useCallback(\n (field, fieldValue) => {\n setColumnValue(rowIndex, columnIndex, field, fieldValue)\n },\n [setColumnValue, rowIndex, columnIndex],\n )\n\n const onMessagesChange: OnMessagesChangeCallback = useCallback(\n (field, fieldMessages) => {\n setColumnMessages(rowIndex, columnIndex, field, fieldMessages)\n },\n [setColumnMessages, rowIndex, columnIndex],\n )\n\n const onValidityChange: OnValidityChangeCallback = useCallback(\n (field, fieldValid) => {\n setColumnValidity(rowIndex, columnIndex, field, fieldValid)\n },\n [setColumnValidity, rowIndex, columnIndex],\n )\n\n return (\n <FieldReportContext.Provider value={cellReport}>\n <FieldScopeContext.Provider value={scopes}>\n <Fieldset\n schema={fields}\n values={column}\n messages={messages}\n validity={validity}\n onValuesChange={onValuesChange}\n onMessagesChange={onMessagesChange}\n onValidityChange={onValidityChange}\n />\n </FieldScopeContext.Provider>\n </FieldReportContext.Provider>\n )\n}\n\nconst Component: InputComponent = function () {\n const { schema, options, readonly, disabled, value, setValue, setMessages, setValid } = useFieldContext()\n const locked = readonly || disabled\n\n const [cellMessages, setCellMessages] = useState<Record<string, Record<string, FieldMessages>>>({})\n const [cellValidity, setCellValidity] = useState<Record<string, Record<string, boolean | undefined>>>({})\n\n const fields = useMemo(() => {\n return options?.fields || []\n }, [options?.fields])\n\n const maxRows = useMemo(() => {\n const value = options?.maximumRows ? Number(options?.maximumRows) : null\n if (value !== null && !isNaN(value) && isFinite(value)) {\n return value\n }\n\n return Number.MAX_SAFE_INTEGER\n }, [options])\n\n const maxColumns = useMemo(() => {\n const value = options?.maximumColumns ? Number(options?.maximumColumns) : null\n if (value !== null && !isNaN(value) && isFinite(value)) {\n return value\n }\n\n return Number.MAX_SAFE_INTEGER\n }, [options])\n\n const minRows = useMemo(() => {\n const value = options?.minimumRows ? Number(options?.minimumRows) : null\n if (value !== null && !isNaN(value) && isFinite(value) && value > 0) {\n return value\n }\n\n return 0\n }, [options])\n\n const minColumns = useMemo(() => {\n const value = options?.minimumColumns ? Number(options?.minimumColumns) : null\n if (value !== null && !isNaN(value) && isFinite(value) && value > 0) {\n return value\n }\n\n return 0\n }, [options])\n\n const totalRows = useMemo(() => Number(value?.length) || 0, [value])\n const totalColumns = useMemo(() => Number(value?.[0]?.length) || 0, [value])\n\n const canAddRow = totalRows < maxRows\n const canAddColumn = totalColumns < maxColumns\n const canRemoveRow = totalRows > minRows\n const canRemoveColumn = totalColumns > minColumns\n\n // Normalise a matrix without mutating the old value, enforcing the row and\n // column limits and filling each column with the fields' default values\n const validateMatrix = useCallback(\n (matrix: Matrix): Matrix => {\n let newMatrix = [...matrix]\n\n // Enforce minimum rows\n while (newMatrix.length < minRows) {\n newMatrix.push([])\n }\n\n // Enforce maximum rows, dropping the rows beyond the limit\n if (newMatrix.length > maxRows) {\n newMatrix = newMatrix.slice(0, maxRows)\n }\n\n // Keep the matrix rectangular by matching each row's column count to the previous row\n let lastColumnCount: undefined | number = undefined\n\n return newMatrix.map((row) => {\n let newRow: Row = Array.isArray(row) ? [...row] : []\n\n // Enforce minimum columns\n while (newRow.length < minColumns || (lastColumnCount !== undefined && newRow.length < lastColumnCount)) {\n newRow.push({})\n }\n\n // Enforce maximum columns, dropping the columns beyond the limit\n if (newRow.length > maxColumns) {\n newRow = newRow.slice(0, maxColumns)\n }\n\n lastColumnCount = newRow.length\n\n return newRow.map((column) => {\n const newColumn = fields.map((field: Column) => {\n // Leave fields without a default unset, as a new flexible block does, so inputs fall back to empty\n let value = field.defaultValue\n if (typeof column === 'object' && column.hasOwnProperty(field.name)) {\n value = column[field.name]\n }\n\n return [field.name, value]\n })\n\n // Keep the cell's other values, such as a choice's nested choices, which no field here shows\n return { ...(typeof column === 'object' ? column : {}), ...Object.fromEntries(newColumn) }\n })\n })\n },\n [fields, minRows, maxRows, minColumns, maxColumns],\n )\n\n const addRow = useCallback(\n (row: Row = []) => {\n setValue((oldValue: Matrix) => {\n // Ensure the old value was an array\n if (!Array.isArray(oldValue)) {\n oldValue = []\n }\n\n return validateMatrix([...oldValue, row])\n })\n },\n [setValue, validateMatrix],\n )\n\n const addColumn = useCallback(\n (columns: Array<Column> = []) => {\n setValue((oldValue: Matrix) => {\n // Ensure the old value was an array\n if (!Array.isArray(oldValue)) {\n oldValue = []\n }\n\n const newValue = oldValue.map((row, rowIndex) => {\n // Ensure the old row was an array\n const newRow = Array.isArray(row) ? row : []\n\n // Add new column\n return [...newRow, columns[rowIndex] || {}]\n })\n\n return validateMatrix(newValue)\n })\n },\n [setValue, validateMatrix],\n )\n\n const removeRow = useCallback(\n (index: number) => {\n // Positions shift when a row is removed, so reset the cell feedback\n setCellMessages({})\n setCellValidity({})\n\n setValue((oldValue: Matrix) => {\n // Ensure the old value was an array\n if (!Array.isArray(oldValue)) {\n return []\n }\n\n return oldValue.toSpliced(index, 1)\n })\n },\n [setValue],\n )\n\n const removeColumn = useCallback(\n (index: number) => {\n // Positions shift when a column is removed, so reset the cell feedback\n setCellMessages({})\n setCellValidity({})\n\n setValue((oldValue: Matrix) => {\n // Ensure the old value was an array\n if (!Array.isArray(oldValue)) {\n return []\n }\n\n return oldValue.map((row) => {\n return Array.isArray(row) ? row.toSpliced(index, 1) : row\n })\n })\n },\n [setValue],\n )\n\n const setColumnValue = useCallback(\n (row: number, column: number, columnFieldName: string, columnFieldValue: any) => {\n setValue((oldValue: Matrix) => {\n // Ensure the old value was an array\n if (!Array.isArray(oldValue)) {\n return oldValue\n }\n\n return oldValue.map((oldRow, rowIndex) => {\n if (rowIndex !== row) return oldRow\n\n return oldRow.map((oldColumn, columnIndex) => {\n if (columnIndex !== column) return oldColumn\n\n return { ...oldColumn, [columnFieldName]: columnFieldValue }\n })\n })\n })\n },\n [setValue],\n )\n\n const setColumnMessages = useCallback((row: number, column: number, field: string, messages: FieldMessages) => {\n setCellMessages((old) => {\n const key = `${row}-${column}`\n return { ...old, [key]: { ...old[key], [field]: messages } }\n })\n }, [])\n\n const setColumnValidity = useCallback((row: number, column: number, field: string, valid: boolean | undefined) => {\n setCellValidity((old) => {\n const key = `${row}-${column}`\n return { ...old, [key]: { ...old[key], [field]: valid } }\n })\n }, [])\n\n // Seed the minimum number of rows when there is no value yet\n useEffect(() => {\n if (value === undefined && minRows >= 1) {\n setValue(validateMatrix([]))\n }\n }, [value, minRows, setValue, validateMatrix])\n\n // Validate the matrix bounds and aggregate the validity of every cell\n const validation = useMemo(() => (value !== undefined ? validateValue(value, schema) : null), [value, schema])\n\n useEffect(() => {\n if (!validation) return\n\n setMessages(validation.messages)\n\n const cells = Object.values(cellValidity).flatMap((cell) => Object.values(cell))\n if (validation.isValid === false || cells.some((valid) => valid === false)) {\n setValid(false)\n } else if (validation.isValid === true) {\n setValid(true)\n }\n }, [validation, cellValidity, setMessages, setValid])\n\n return (\n <div className='sorlo-input__matrix'>\n <table>\n <thead>\n <tr>\n <td></td>\n {(value?.[0] || []).map((column: Column, columnIndex: number) => {\n return (\n <th key={columnIndex}>\n <span>{columnIndex + 1}</span>\n {canRemoveColumn && (\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n removeColumn(columnIndex)\n }}\n >\n {t('ui.removeColumn')}\n </button>\n )}\n </th>\n )\n })}\n <td></td>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td></td>\n {(value?.[0] || []).map((column: Column, columnIndex: number) => {\n return <td key={columnIndex}></td>\n })}\n <td rowSpan={totalRows + 1}>\n {canAddColumn && totalRows > 0 && (\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n addColumn()\n }}\n >\n {t('ui.addColumn')}\n </button>\n )}\n </td>\n </tr>\n {(value || []).map((row: Row, rowIndex: number) => {\n return (\n <tr key={rowIndex}>\n <th>\n {rowIndex + 1}\n {canRemoveRow && (\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n removeRow(rowIndex)\n }}\n >\n {t('ui.removeRow')}\n </button>\n )}\n </th>\n {row.map((column, columnIndex) => {\n return (\n <td key={columnIndex}>\n <MatrixCell\n rowIndex={rowIndex}\n columnIndex={columnIndex}\n fields={fields}\n column={column}\n messages={cellMessages[`${rowIndex}-${columnIndex}`]}\n validity={cellValidity[`${rowIndex}-${columnIndex}`]}\n setColumnValue={setColumnValue}\n setColumnMessages={setColumnMessages}\n setColumnValidity={setColumnValidity}\n />\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n <tfoot>\n {canAddRow && (\n <tr>\n <td colSpan={totalColumns + 2}>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n addRow()\n }}\n >\n {t('ui.addRow')}\n </button>\n </td>\n </tr>\n )}\n </tfoot>\n </table>\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Number'\n\nexport const description: InputDescription = () => 'An input limited to numerical values.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Placeholder',\n name: 'placeholder',\n type: 'text',\n required: false,\n },\n {\n label: 'Minimum',\n name: 'min',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Maximum',\n name: 'max',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional, note that 0 is not empty\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n // Enforce number type\n if (typeof value !== 'number') value = Number(value)\n\n // Double check it's a valid number\n if (isNaN(value) || !isFinite(value)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate minimum value\n const min = schema.options?.min\n if (typeof min === 'number' && value < min) {\n return validationError(value, validationMessage(schema, 'min', { min }))\n }\n\n // Validate maximum value\n const max = schema.options?.max\n if (typeof max === 'number' && value > max) {\n return validationError(value, validationMessage(schema, 'max', { max }))\n }\n\n // Return success\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'number'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid\n ? typeof validation.value === 'number'\n ? validation.value.toLocaleString()\n : validation.value\n : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__number'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='number'\n value={value?.toString() ?? ''}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n min={options?.min}\n max={options?.max}\n placeholder={options?.placeholder}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Password'\n\nexport const description: InputDescription = () => 'A text input that masks its value.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n {\n name: 'minLength',\n label: 'Minimum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n name: 'maxLength',\n label: 'Maximum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 1,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate the minimum value length\n const min = schema.options?.minLength\n if (typeof min === 'number' && value.length < min) {\n return validationError(value, validationMessage(schema, 'minLength', { min }))\n }\n\n // Validate the maximum value length\n const max = schema.options?.maxLength\n if (typeof max === 'number' && value.length > max) {\n return validationError(value, validationMessage(schema, 'maxLength', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n\n // Never expose the actual value when formatting\n return validation.isValid ? '••••••••' : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__password'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='password'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n minLength={options?.minLength}\n maxLength={options?.maxLength}\n placeholder={options?.placeholder}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { literalUnion } from '@/utils/typescript'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Radio (Single choice)'\n\nexport const description: InputDescription = () =>\n 'A list of radio buttons with a selection of choices that you specify.'\n\nexport const category: InputCategory = () => 'Choice'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'choices',\n label: 'Choices',\n type: 'repeater',\n required: true,\n options: {\n minimum: 1,\n fields: [\n {\n name: 'value',\n label: 'Value',\n type: 'text',\n required: true,\n width: 50,\n },\n {\n name: 'label',\n label: 'Label',\n type: 'text',\n required: false,\n width: 50,\n },\n ],\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n // The browser gives radio values as strings\n const choices: Array<any> = schema.options?.choices || []\n if (!choices.some((choice) => String(choice.value) === value)) {\n return validationError(value, validationMessage(schema, 'choice'))\n }\n\n return validationSuccess(value)\n}\n\n// The browser gives radio values as strings\nexport const typeValue: InputTypeValue = (schema) => {\n const choices: Array<any> = schema.options?.choices || []\n return literalUnion(choices.map((choice) => String(choice.value)))\n}\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const {\n id,\n labelId,\n aria,\n schema,\n required,\n readonly,\n disabled,\n options,\n value = '',\n handleValidation,\n } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n const choices: Array<any> = options?.choices || []\n\n return (\n <div className='sorlo-input__radio' role='radiogroup' aria-labelledby={labelId} {...aria}>\n {choices.map((choice, choiceIndex) => {\n return (\n <div key={choiceIndex}>\n <input\n className='sorlo-input'\n id={`${id}-${choiceIndex}`}\n type='radio'\n name={id}\n value={choice.value}\n checked={String(value) === String(choice.value)}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n disabled={disabled || readonly}\n />\n <label htmlFor={`${id}-${choiceIndex}`}>{choice.label ?? choice.value.toString()}</label>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Range (Slider)'\n\nexport const description: InputDescription = () => 'A slider for picking a numerical value within a range.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Minimum',\n name: 'min',\n type: 'number',\n required: false,\n width: 50,\n },\n {\n label: 'Maximum',\n name: 'max',\n type: 'number',\n required: false,\n width: 50,\n },\n {\n label: 'Step',\n name: 'step',\n type: 'number',\n required: false,\n options: {\n min: 0,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional, note that 0 is not empty\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n // Enforce number type\n if (typeof value !== 'number') value = Number(value)\n\n // Double check it's a valid number\n if (isNaN(value) || !isFinite(value)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate minimum value\n const min = schema.options?.min\n if (typeof min === 'number' && value < min) {\n return validationError(value, validationMessage(schema, 'min', { min }))\n }\n\n // Validate maximum value\n const max = schema.options?.max\n if (typeof max === 'number' && value > max) {\n return validationError(value, validationMessage(schema, 'max', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'number'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid\n ? typeof validation.value === 'number'\n ? validation.value.toLocaleString()\n : validation.value\n : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__range'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='range'\n value={value?.toString() ?? ''}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n disabled={disabled || readonly}\n min={options?.min}\n max={options?.max}\n step={options?.step}\n />\n {value !== '' && value !== undefined && <span className='sorlo-input__range-value'>{value}</span>}\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport Fieldset, { OnValidityChangeCallback, OnValuesChangeCallback } from '@/components/Fieldset'\nimport { FieldPath, FieldReportContext, FieldReportContextValue } from '@/context/FormProvider'\nimport { FieldSchema } from '@/types/fields'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputRenderValue,\n InputTypeValue,\n InputValidateChildren,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback, useContext, useEffect, useMemo, useState } from 'react'\n\ntype Column = Record<string, any>\ntype Row = Array<Column>\ntype Matrix = Array<Row>\n\nexport const name: InputName = () => 'Repeater'\n\nexport const description: InputDescription = () => 'Allows a set of fields to be repeated vertically OR horizontally.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Fields',\n name: 'fields',\n type: 'schemabuilder',\n },\n {\n label: 'Minimum',\n name: 'minimum',\n type: 'number',\n required: false,\n defaultValue: 1,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Maximum',\n name: 'maximum',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Repeat direction',\n name: 'direction',\n type: 'select',\n options: {\n choices: [\n {\n value: 'y',\n label: 'Vertically',\n },\n {\n value: 'x',\n label: 'Horizontally',\n },\n ],\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (!Array.isArray(value)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate the minimum number of items\n const min = schema.options?.minimum\n if (typeof min === 'number' && value.length < min) {\n return validationError(value, validationMessage(schema, 'minItems', { min }))\n }\n\n // Validate the maximum number of items\n const max = schema.options?.maximum\n if (typeof max === 'number' && value.length > max) {\n return validationError(value, validationMessage(schema, 'maxItems', { max }))\n }\n\n return validationSuccess(value)\n}\n\n// Validate the nested fields against every repeated item\nexport const validateChildren: InputValidateChildren = (value, schema, validateFields) => {\n const items: Row = Array.isArray(value) ? value : []\n return items.map((item) => validateFields(schema.options?.fields || [], item || {}))\n}\n\n// Pick only the nested fields' values for every item\nexport const pickValue: InputPickValue = (value, schema, pickFields) => {\n if (!Array.isArray(value)) return undefined\n return value.map((item) => pickFields(schema.options?.fields || [], item || {}))\n}\n\n// Type every item as an object of the nested fields\nexport const typeValue: InputTypeValue = (schema, typeFields) => `Array<${typeFields(schema.options?.fields || [])}>`\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? JSON.stringify(validation.value, null, 2) : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { schema, options, value, setValue, setMessages, setValid } = useFieldContext()\n\n const [childValid, setChildValid] = useState<boolean | undefined>(undefined)\n\n const isHorizontal = options?.direction === 'x'\n\n // A repeater is a matrix locked to a single column or a single row\n const matrixSchema: Array<FieldSchema> = useMemo(() => {\n const minimum = options?.minimum ?? 0\n const maximum = options?.maximum ?? null\n\n return [\n {\n name: 'value',\n type: 'matrix',\n options: {\n fields: options?.fields || [],\n minimumRows: isHorizontal ? 1 : minimum,\n maximumRows: isHorizontal ? 1 : maximum,\n minimumColumns: isHorizontal ? minimum : 1,\n maximumColumns: isHorizontal ? maximum : 1,\n },\n },\n ]\n }, [options?.fields, options?.minimum, options?.maximum, isHorizontal])\n\n // Convert the repeated items to and from the matrix format, leaving an\n // unset value unset so the matrix can seed its own minimum rows\n const matrixValues = useMemo(() => {\n if (value === undefined) return {}\n const items: Row = Array.isArray(value) ? value : []\n const matrixValue: Matrix = isHorizontal ? [items] : items.map((item) => [item])\n return { value: matrixValue }\n }, [value, isHorizontal])\n\n const onValuesChange: OnValuesChangeCallback = useCallback(\n (field, matrixValue: Matrix) => {\n setValue(isHorizontal ? matrixValue[0] || [] : matrixValue.map((row) => row[0]))\n },\n [setValue, isHorizontal],\n )\n\n const onValidityChange: OnValidityChangeCallback = useCallback((field, valid) => {\n setChildValid(valid)\n }, [])\n\n // Rewrite the internal matrix's paths so nested fields appear as\n // e.g. 'pets.0.petname' rather than 'pets.value.0.0.petname'\n const parentReport = useContext(FieldReportContext)\n\n const childReport = useMemo<FieldReportContextValue | undefined>(() => {\n if (!parentReport) return undefined\n\n // Returns null for the internal matrix's own state, which is already\n // reported by the repeater itself\n const rewrite = (path: FieldPath): null | FieldPath => {\n const [name, row, column, ...rest] = path\n\n // Anything not from the internal matrix passes through untouched\n if (name !== 'value') return path\n if (rest.length === 0) return null\n\n const index = isHorizontal ? column : row\n return [index, ...rest]\n }\n\n return {\n report: (path, patch) => {\n const rewritten = rewrite(path)\n if (rewritten) parentReport.report(rewritten, patch)\n },\n resolve: (path) => {\n const rewritten = rewrite(path)\n return rewritten ? parentReport.resolve(rewritten) : path\n },\n }\n }, [parentReport, isHorizontal])\n\n // Validate the item bounds and aggregate the nested matrix's validity\n const validation = useMemo(() => (value !== undefined ? validateValue(value, schema) : null), [value, schema])\n\n useEffect(() => {\n if (!validation) return\n\n setMessages(validation.messages)\n\n if (validation.isValid === false || childValid === false) {\n setValid(false)\n } else if (validation.isValid === true) {\n setValid(true)\n }\n }, [validation, childValid, setMessages, setValid])\n\n return (\n <FieldReportContext.Provider value={childReport}>\n <Fieldset\n schema={matrixSchema}\n values={matrixValues}\n onValuesChange={onValuesChange}\n onValidityChange={onValidityChange}\n />\n </FieldReportContext.Provider>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport Fieldset, {\n OnMessagesChangeCallback,\n OnValidityChangeCallback,\n OnValuesChangeCallback,\n} from '@/components/Fieldset'\nimport Modal from '@/components/Modal'\nimport { FieldReportContext, FieldScopeContext, FormStaticContext, useFormStaticContext } from '@/context/FormProvider'\nimport { t } from '@/i18n'\nimport { FieldMessages, FieldSchema } from '@/types/fields'\nimport {\n Input,\n InputCategory,\n InputComponent,\n InputCoreFields,\n InputDescription,\n InputFormatValue,\n InputName,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { normaliseConditions } from '@/utils/conditions'\nimport { conditionScope, createId, validateInputSchemaFields, validateSchema, validateValues } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport isEqual from 'lodash/isEqual.js'\nimport { Dispatch, Fragment, createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'\n\nexport const name: InputName = () => 'Schema Builder'\n\nexport const description: InputDescription = () => 'An intuitive interface for building form schemas.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const coreFields: InputCoreFields = () => {\n return [] // Prevent's its self from appearing in fields list\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional, e.g. a group with no fields yet\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (!Array.isArray(value)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n return validationSuccess(value)\n}\n\n// A list of field schemas\nexport const typeValue: InputTypeValue = () => 'Array<Record<string, unknown>>'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? JSON.stringify(validation.value, null, 2) : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\n// Let the field's input finish its schema, e.g. giving new flexible layouts their IDs\nconst prepareSchema = (input: Input, schema: FieldSchema) => {\n return input.prepareSchema ? input.prepareSchema(schema) : schema\n}\n\n// Fill unset fields with their defaults, including those in groups such as options, e.g. a matrix's minimum rows,\n// so the editor saves the values it shows\nconst withDefaults = (schema: Array<FieldSchema>, values: Record<string, any>): Record<string, any> => {\n const merged = { ...values }\n\n for (const field of schema) {\n if (field.type === 'group') {\n const group = withDefaults(field.options?.fields || [], merged[field.name] || {})\n if (Object.keys(group).length >= 1) merged[field.name] = group\n } else if (merged[field.name] === undefined && field.defaultValue !== undefined) {\n merged[field.name] = field.defaultValue\n }\n }\n\n return merged\n}\n\n// The fields at each level around a field being edited, outermost first, which its conditions can test. An editor\n// adds the fields beside its own, so a builder inside it, such as a group's, reaches those as well as its own.\nconst LevelsContext = createContext<Array<Array<FieldSchema>>>([])\n\n// A rule's type for a field, by its input. Choice fields give their choices instead, and other fields are text.\nconst ruleTypes: Record<string, string> = {\n boolean: 'boolean',\n number: 'number',\n range: 'number',\n date: 'date',\n datetime: 'date',\n}\n\n// What a field's conditions can test, nearest first, the way conditions resolve a path: the fields beside it, then\n// those of each level around it. A group's fields are tested through it, e.g. address.town. Fields without a value,\n// such as content, are left out.\nconst conditionChoices = (levels: Array<Array<FieldSchema>>, inputs: Record<string, Input>) => {\n const choices = new Map<string, Record<string, any>>()\n\n const add = (fields: Array<FieldSchema>, path: string, label: string) => {\n for (const field of fields) {\n const input = inputs[field?.type]\n if (!field?.name || choices.has(path + field.name)) continue\n\n if (field.type === 'group') {\n add(field.options?.fields || [], `${path}${field.name}.`, `${label}${field.label || field.name} › `)\n } else if (!input?.typeValue || input.typeValue(field, () => '') !== undefined) {\n const listed: Array<any> = field.options?.choices || []\n const optionChoices = listed.flatMap((choice) => (choice?.choices?.length ? choice.choices : [choice]))\n choices.set(path + field.name, {\n value: path + field.name,\n label: label + (field.label || field.name),\n ...(['select', 'radio', 'checkbox'].includes(field.type)\n ? { choices: optionChoices.map((choice) => ({ value: choice?.value, label: choice?.label })) }\n : { type: ruleTypes[field.type] || 'text' }),\n })\n }\n }\n }\n\n for (const fields of [...levels].reverse()) add(fields, '', '')\n return [...choices.values()]\n}\n\n// The schema of a field's editor, listing what its conditional logic can test. Keyed by the list's contents, so an\n// equal list never resets an open editor.\nconst useEditorSchema = (input: Input, levels: Array<Array<FieldSchema>>) => {\n const { inputs } = useFormStaticContext()\n const fieldChoices = conditionChoices(levels, inputs)\n const key = JSON.stringify(fieldChoices)\n\n return useMemo(() => {\n return validateInputSchemaFields(input).map((field) => {\n if (field.name !== 'conditions' || field.type !== 'conditions') return field\n return { ...field, options: { ...field.options, fieldChoices } }\n })\n }, [input, key])\n}\n\nconst Component: InputComponent = function () {\n const { inputs } = useFormStaticContext()\n const { value = [], setValue } = useFieldContext()\n\n const inputEntries = useMemo(() => {\n return Object.entries(inputs).filter(([type, input]) => {\n return validateInputSchemaFields(input).length >= 1\n })\n }, [inputs])\n\n return (\n <div className='sorlo-input__schemabuilder'>\n {/* Edit */}\n {Array.isArray(value) && value.length > 0 && (\n <div className='sorlo-fieldset'>\n {value.map((valueSchema: FieldSchema, valueIndex) => {\n const isValidType = valueSchema.type in inputs\n const valueInput = inputs[valueSchema.type]\n\n return (\n <Fragment key={valueIndex}>\n <div style={{ width: valueSchema.width ? `${valueSchema.width}%` : '100%' }}>\n {!isValidType && <div>{t('ui.invalidFieldType')}</div>}\n {isValidType && (\n <EditValueItem\n index={valueIndex}\n fields={value}\n total={value.length}\n input={valueInput}\n value={valueSchema}\n setValue={setValue}\n />\n )}\n </div>\n </Fragment>\n )\n })}\n </div>\n )}\n\n {/* Add new */}\n <div>\n {inputEntries.map(([type, input], inputIndex) => {\n return (\n <CreateValueItem\n key={inputIndex}\n type={type}\n input={input}\n fields={Array.isArray(value) ? value : []}\n setValue={setValue}\n />\n )\n })}\n </div>\n </div>\n )\n}\n\nfunction CreateValueItem({\n type,\n input,\n fields,\n setValue,\n}: {\n type: string\n input: Input\n fields: Array<FieldSchema>\n setValue: Dispatch<any>\n}) {\n // A new field's conditions can test every field in the builder\n const outer = useContext(LevelsContext)\n const levels = useMemo(() => [...outer, fields], [outer, fields])\n const schema = useEditorSchema(input, levels)\n\n const onSave = useCallback(\n (editorValues: Record<string, any>) => {\n const field = { id: createId('fld'), type, ...editorValues } as FieldSchema\n setValue((old: Array<FieldSchema>) => [...(old || []), prepareSchema(input, field)])\n },\n [setValue, type, input],\n )\n\n return (\n <LevelsContext.Provider value={levels}>\n <SchemaEditor\n schema={schema}\n onSave={onSave}\n label={\n <>\n <strong>{input?.name?.() || type}</strong>\n <br />\n <span>{input?.description?.()}</span>\n </>\n }\n />\n </LevelsContext.Provider>\n )\n}\n\nfunction EditValueItem({\n index,\n fields,\n total,\n value,\n input,\n setValue,\n}: {\n index: number\n fields: Array<FieldSchema>\n total: number\n value: FieldSchema\n input: Input\n setValue: Dispatch<any>\n}) {\n const { readonly, disabled } = useFieldContext()\n const locked = readonly || disabled\n\n // Its conditions can test the fields beside it, but not itself\n const outer = useContext(LevelsContext)\n const levels = useMemo(() => [...outer, fields.toSpliced(index, 1)], [outer, fields, index])\n const schema = useEditorSchema(input, levels)\n\n // Conditions show as groups whatever shape they were written in, such as a flat list with conditionsMode\n const conditions = useMemo(() => value.conditions && normaliseConditions(value).map((rules) => ({ rules })), [value])\n\n const values = useMemo(() => {\n const valueRecord: Record<string, any> = { ...value, conditions }\n return Object.fromEntries(\n schema.map((item) => {\n return [item.name, valueRecord[item.name] ?? item.defaultValue]\n }),\n )\n }, [schema, value, conditions])\n\n const label = useMemo(() => {\n if (value.name && value.label) {\n return `${value.label} (${value.name})`\n } else if (!value.name && value.label) {\n return value.label\n } else if (value.name && !value.label) {\n return value.name\n }\n\n return value.type\n }, [value.name, value.label, value.type])\n\n const onSave = useCallback(\n (editorValues: Record<string, any>) => {\n // Keep the field's ID and the keys the editor doesn't show, such as readonly, giving an ID to fields from\n // schemas written without them. Conditions stay as they were written unless they're edited, which saves them\n // as groups that need no conditionsMode.\n const { conditionsMode, ...rest } = value\n const field = (\n isEqual(editorValues.conditions ?? [], conditions ?? [])\n ? { id: value.id ?? createId('fld'), ...value, ...editorValues, conditions: value.conditions }\n : { id: value.id ?? createId('fld'), ...rest, ...editorValues }\n ) as FieldSchema\n setValue((old: Array<FieldSchema>) => {\n const newValue = [...(old || [])]\n newValue[index] = prepareSchema(input, field)\n return newValue\n })\n },\n [setValue, index, input, value, conditions],\n )\n\n const onDelete = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n event.preventDefault()\n setValue((old: Array<FieldSchema>) => (old || []).toSpliced(index, 1))\n },\n [setValue, index],\n )\n\n const onMove = useCallback(\n (offset: number) => {\n setValue((old: Array<FieldSchema>) => {\n const newValue = [...(old || [])]\n const target = index + offset\n\n // Keep the field within the bounds of the list\n if (target < 0 || target >= newValue.length) return old\n\n const [moved] = newValue.splice(index, 1)\n newValue.splice(target, 0, moved)\n return newValue\n })\n },\n [setValue, index],\n )\n\n return (\n <LevelsContext.Provider value={levels}>\n <SchemaEditor schema={schema} values={values} onSave={onSave} label={label} />\n <button\n className='sorlo-button'\n type='button'\n disabled={locked || index === 0}\n onClick={(event) => {\n event.preventDefault()\n onMove(-1)\n }}\n >\n {t('ui.moveUp')}\n </button>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked || index === total - 1}\n onClick={(event) => {\n event.preventDefault()\n onMove(1)\n }}\n >\n {t('ui.moveDown')}\n </button>\n <button className='sorlo-button sorlo-button--danger' type='button' disabled={locked} onClick={onDelete}>\n {t('ui.delete')}\n </button>\n </LevelsContext.Provider>\n )\n}\n\nfunction SchemaEditor({\n label,\n cancelLabel,\n saveLabel,\n schema,\n values,\n onSave,\n onCancel,\n}: {\n label: string | React.ReactNode\n saveLabel?: string | React.ReactNode\n cancelLabel?: string | React.ReactNode\n schema: Array<FieldSchema>\n values?: Record<string, any>\n onSave: (value: Record<string, any>) => void\n onCancel?: () => void\n}) {\n const staticContext = useFormStaticContext()\n const { inputs } = staticContext\n const { readonly, disabled } = useFieldContext()\n const locked = readonly || disabled\n\n const mergedValues = useMemo(() => withDefaults(schema, values || {}), [schema, values])\n\n const [open, setOpen] = useState(false)\n const [tempValue, setTempValue] = useState<Record<string, any>>(mergedValues)\n const [tempMessages, setTempMessages] = useState<Record<string, FieldMessages>>({})\n const [tempValidity, setTempValidity] = useState<Record<string, boolean | undefined>>({})\n const [validationCounter, setValidationCounter] = useState(0)\n\n const closeModal = () => {\n setTempMessages({})\n setTempValidity({})\n setValidationCounter(0)\n setOpen(false)\n setTempValue(mergedValues)\n }\n\n useEffect(() => {\n setTempValue((old) => {\n if (Object.is(mergedValues, old)) return old\n return mergedValues\n })\n }, [mergedValues])\n\n const handleCancel = (event?: React.MouseEvent<HTMLElement, MouseEvent>) => {\n if (event) event.preventDefault()\n closeModal()\n if (onCancel) onCancel()\n }\n\n const handleSave = (event?: React.MouseEvent<HTMLElement, MouseEvent>) => {\n if (event) event.preventDefault()\n\n // Validate every field, including nested fields, and block the save while any are invalid, asking every field\n // in the editor to show its own messages as a form's validate does\n if (!validateValues(schema, tempValue, inputs, { environment: 'client' }).isValid) {\n setValidationCounter((old) => old + 1)\n return\n }\n\n onSave({ ...tempValue })\n closeModal()\n }\n\n // The editor counts its own validation passes, so fields in an editor opened after the form validated start clean\n const editorContext = useMemo(() => ({ ...staticContext, validationCounter }), [staticContext, validationCounter])\n\n const editorScopes = useMemo(() => [conditionScope(schema, tempValue || {}, inputs)], [schema, tempValue, inputs])\n\n const handleValuesChange: OnValuesChangeCallback = useCallback((field, value) => {\n setTempValue((old) => {\n if (Object.is(old?.[field], value)) return old\n return { ...old, [field]: value }\n })\n }, [])\n\n const handleMessagesChange: OnMessagesChangeCallback = useCallback((field, messages) => {\n setTempMessages((old) => {\n if (Object.is(old?.[field], messages)) return old\n return { ...old, [field]: messages }\n })\n }, [])\n\n const handleValidityChange: OnValidityChangeCallback = useCallback((field, valid) => {\n setTempValidity((old) => {\n if (Object.is(old?.[field], valid)) return old\n return { ...old, [field]: valid }\n })\n }, [])\n\n // The button stays mounted when the editor closes, so the browser can return focus to it\n return (\n <>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n setOpen((old) => !old)\n }}\n >\n {label}\n </button>\n <Modal open={open} onClose={handleCancel} header={label}>\n {/* This condition prevents infinite rendering */}\n {open && (\n /* The editor's state is temporary, so keep its reports out of the\n form's messages and evaluate its conditions against its own values */\n <FormStaticContext.Provider value={editorContext}>\n <FieldReportContext.Provider value={undefined}>\n <FieldScopeContext.Provider value={editorScopes}>\n <Fieldset\n schema={schema}\n values={tempValue}\n messages={tempMessages}\n validity={tempValidity}\n onValuesChange={handleValuesChange}\n onMessagesChange={handleMessagesChange}\n onValidityChange={handleValidityChange}\n />\n </FieldScopeContext.Provider>\n </FieldReportContext.Provider>\n </FormStaticContext.Provider>\n )}\n <button className='sorlo-button' type='button' onClick={handleCancel}>\n {cancelLabel || t('ui.cancel')}\n </button>\n <button className='sorlo-button sorlo-button--primary' type='button' disabled={locked} onClick={handleSave}>\n {saveLabel || t('ui.save')}\n </button>\n </Modal>\n </>\n )\n}\n\nexport default Component\n","import { t } from '@/i18n'\nimport { useCallback, useEffect, useId, useRef } from 'react'\n\nexport interface ModalProps {\n open: React.HTMLProps<HTMLDialogElement>['open']\n header?: React.ReactNode\n footer?: React.ReactNode\n closeButton?: boolean | React.ReactNode\n children: React.ReactNode\n onClose?: () => void\n onOpen?: () => void\n}\n\nexport default function Modal({ open, header, footer, closeButton, onOpen, onClose, children }: ModalProps) {\n const headerId = useId()\n const dialogRef = useRef<null | HTMLDialogElement>(null)\n\n const handleClose = useCallback(() => {\n const dialog = dialogRef.current\n if (dialog) {\n dialog.close()\n }\n }, [dialogRef])\n\n // An element, not a component made here, which React would rebuild on every render, losing a focused button\n const close =\n closeButton === true ? (\n <button\n className='sorlo-button'\n type='button'\n onClick={(event) => {\n event.preventDefault()\n handleClose()\n }}\n >\n {t('ui.close')}\n </button>\n ) : (\n closeButton\n )\n\n // Open dialog with JS api gives us the ::backdrop psuedo element\n // @link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog#open\n useEffect(() => {\n const dialog = dialogRef.current\n if (dialog) {\n if (open && !dialog.open) {\n dialog.showModal()\n if (onOpen) onOpen()\n } else if (!open && dialog.open) {\n dialog.close()\n }\n }\n }, [dialogRef, open, onOpen])\n\n // Fire the close event when the dialog is dismissed natively, e.g. with the escape key\n useEffect(() => {\n const dialog = dialogRef.current\n if (dialog) {\n const closeListener = () => (onClose ? onClose() : null)\n dialog.addEventListener('close', closeListener)\n\n return () => {\n dialog.removeEventListener('close', closeListener)\n }\n }\n }, [dialogRef, onClose])\n\n return (\n <dialog ref={dialogRef} className='sorlo-modal' aria-labelledby={header ? headerId : undefined}>\n {header && (\n <div className='sorlo-modal__header' id={headerId}>\n {header}\n {close}\n </div>\n )}\n\n {!header && close}\n\n <div className='sorlo-modal__body'>{children}</div>\n\n {footer && <div className='sorlo-modal__footer'>{footer}</div>}\n </dialog>\n )\n}\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputSchema,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { literalUnion } from '@/utils/typescript'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { Fragment, useCallback } from 'react'\n\nexport const name: InputName = () => 'Select (Dropdown)'\n\nexport const description: InputDescription = () => 'A dropdown list with a selection of choices that you specify.'\n\nexport const category: InputCategory = () => 'Choice'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'choices',\n label: 'Choices',\n type: 'repeater',\n required: true,\n options: {\n minimum: 1,\n fields: [\n {\n name: 'value',\n label: 'Value',\n type: 'text',\n required: true,\n width: 50,\n },\n {\n name: 'label',\n label: 'Label',\n type: 'text',\n required: false,\n width: 50,\n },\n ],\n },\n },\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n {\n name: 'multiple',\n label: 'Multiple',\n type: 'boolean',\n required: false,\n options: {\n message: 'Allow multiple selections',\n },\n },\n ]\n}\n\n// Option values come from the browser as strings, and option groups hold choices of their own\nconst choiceValues = (schema: InputSchema): Array<string> => {\n const choices: Array<any> = schema.options?.choices || []\n const values = choices.flatMap((choice) => (choice?.choices?.length > 0 ? choice.choices : [choice]))\n return values.map((choice) => String(choice.value))\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(\n value,\n schema.options?.multiple ? validationMessage(schema, 'selection') : validationMessage(schema, 'required'),\n )\n }\n\n // Check that every selection is one of the choices\n const values = choiceValues(schema)\n const selections = schema.options?.multiple ? value : [value]\n if (!Array.isArray(selections) || !selections.every((selection) => values.includes(selection))) {\n return validationError(value, validationMessage(schema, 'choice'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = (schema) => {\n const union = literalUnion(choiceValues(schema))\n return schema.options?.multiple ? `Array<${union}>` : union\n}\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n const handleOnChange = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const inputValue = schema.options?.multiple\n ? Array.from(event.target.selectedOptions).map((option) => option.value)\n : event.target.value\n doValidation(inputValue)\n },\n [doValidation, schema],\n )\n\n const choices: Array<any> = options?.choices || []\n const multiple = options?.multiple || false\n\n return (\n <div className='sorlo-input__select'>\n <select\n className='sorlo-input'\n id={id}\n {...aria}\n value={multiple && !Array.isArray(value) ? [value] : value}\n onChange={handleOnChange}\n required={required}\n disabled={disabled || readonly}\n multiple={multiple}\n >\n {/* An empty choice so the select does not appear filled before a value is set */}\n {!multiple && <option value=''>{options?.placeholder ?? ''}</option>}\n {choices.map((choice, choiceIndex) => {\n const hasChildren = choice?.choices?.length > 0\n return (\n <Fragment key={choiceIndex}>\n {hasChildren && (\n <optgroup label={choice.label ?? choice.value.toString()}>\n {choice.choices.map((childChoice: any, childChoiceIndex: number) => {\n return (\n <option value={childChoice.value} key={childChoiceIndex}>\n {childChoice.label ?? childChoice.value.toString()}\n </option>\n )\n })}\n </optgroup>\n )}\n {!hasChildren && <option value={choice.value}>{choice.label ?? choice.value.toString()}</option>}\n </Fragment>\n )\n })}\n </select>\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, isTel, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Telephone'\n\nexport const description: InputDescription = () => 'A text input specifically designed for storing phone numbers.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n if (!isTel(value)) {\n return validationError(value, validationMessage(schema, 'tel'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__tel'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='tel'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n placeholder={options?.placeholder}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Text'\n\nexport const description: InputDescription = () => 'A basic text input, useful for storing single string values.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n {\n name: 'minLength',\n label: 'Minimum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n name: 'maxLength',\n label: 'Maximum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 1,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate the minimum value length\n const min = schema.options?.minLength\n if (typeof min === 'number' && value.length < min) {\n return validationError(value, validationMessage(schema, 'minLength', { min }))\n }\n\n // Validate the maximum value length\n const max = schema.options?.maxLength\n if (typeof max === 'number' && value.length > max) {\n return validationError(value, validationMessage(schema, 'maxLength', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__text'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='text'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n minLength={options?.minLength}\n maxLength={options?.maxLength}\n placeholder={options?.placeholder}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Textarea (Multi-line text)'\n\nexport const description: InputDescription = () => 'A basic textarea input for storing paragraphs of text.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n {\n name: 'rows',\n label: 'Rows',\n type: 'number',\n required: false,\n options: {\n min: 1,\n },\n },\n {\n name: 'minLength',\n label: 'Minimum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n name: 'maxLength',\n label: 'Maximum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 1,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate the minimum value length\n const min = schema.options?.minLength\n if (typeof min === 'number' && value.length < min) {\n return validationError(value, validationMessage(schema, 'minLength', { min }))\n }\n\n // Validate the maximum value length\n const max = schema.options?.maxLength\n if (typeof max === 'number' && value.length > max) {\n return validationError(value, validationMessage(schema, 'maxLength', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__textarea'>\n <textarea\n className='sorlo-input'\n id={id}\n {...aria}\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n minLength={options?.minLength}\n maxLength={options?.maxLength}\n placeholder={options?.placeholder}\n rows={options?.rows}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Time'\n\nexport const description: InputDescription = () => 'A time picker that stores a 24 hour time, e.g. 13:30.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Minimum',\n name: 'min',\n type: 'time',\n required: false,\n width: 50,\n },\n {\n label: 'Maximum',\n name: 'max',\n type: 'time',\n required: false,\n width: 50,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n const match = typeof value === 'string' ? /^(\\d{2}):(\\d{2})(?::(\\d{2}))?$/.exec(value) : null\n if (!match || Number(match[1]) > 23 || Number(match[2]) > 59 || Number(match[3] || 0) > 59) {\n return validationError(value, validationMessage(schema, 'time'))\n }\n\n // Times compare lexicographically, so validate the range as strings\n const min = schema.options?.min\n if (typeof min === 'string' && min && value < min) {\n return validationError(value, validationMessage(schema, 'min', { min }))\n }\n\n const max = schema.options?.max\n if (typeof max === 'string' && max && value > max) {\n return validationError(value, validationMessage(schema, 'max', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__time'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='time'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n min={options?.min}\n max={options?.max}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, isUrl, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'URL'\n\nexport const description: InputDescription = () => 'A text input specifically designed for storing web addresses.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n if (!isUrl(value)) {\n return validationError(value, validationMessage(schema, 'url'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__url'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='url'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n placeholder={options?.placeholder}\n />\n </div>\n )\n}\n\nexport default Component\n","import Fieldset, {\n OnMessagesChangeCallback,\n OnValidityChangeCallback,\n OnValuesChangeCallback,\n} from '@/components/Fieldset'\nimport {\n Context,\n FieldInjectionContext,\n FieldReportContext,\n FieldReportContextValue,\n FieldScopeContext,\n FieldStateReport,\n FormContext,\n FormStaticContext,\n} from '@/context/FormProvider'\nimport * as coreInputs from '@/inputs'\nimport { FieldMessages } from '@/types/fields'\nimport { Input, ValidationReport } from '@/types/inputs'\nimport { conditionScope, flattenValidationReport, ValidateValuesOptions, validateValues } from '@/utils/inputs'\nimport { SetStateAction, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nexport interface FormHandle {\n validate: (options?: Pick<ValidateValuesOptions, 'allowIncomplete'>) => ValidationReport\n applyReport: (report: ValidationReport) => void\n}\n\nexport interface FormProps<Values extends Record<string, any> = Record<string, any>> {\n schema: Context['schema']\n values?: Values\n messages?: Context['messages']\n validity?: Context['validity']\n inputs?: Record<string, Input>\n onValuesChange?: (values: Values) => void\n onMessagesChange?: (messages: Context['messages']) => void\n onValidityChange?: (validity: Context['validity']) => void\n className?: string\n ref?: React.Ref<FormHandle>\n}\n\nexport default function Form<Values extends Record<string, any> = Record<string, any>>({\n schema: defaultSchema,\n values: defaultValues,\n messages: defaultMessages,\n validity: defaultValidity,\n inputs,\n onValuesChange,\n onMessagesChange,\n onValidityChange,\n className,\n ref,\n}: FormProps<Values>) {\n const [schema, setSchema] = useState<Context['schema']>(defaultSchema || [])\n const [values, setValues] = useState<Context['values']>(defaultValues || {})\n const [messages, setMessages] = useState<Context['messages']>(defaultMessages || {})\n const [validity, setValidity] = useState<Context['validity']>(defaultValidity || {})\n const [validationCounter, setValidationCounter] = useState(0)\n const [injectedMessages, setInjectedMessages] = useState<Record<string, FieldMessages>>({})\n const [injectedValidity, setInjectedValidity] = useState<Record<string, boolean | undefined>>({})\n\n // Every write goes through these refs so each change commits exactly one\n // object identity, reads the very latest state, and is emitted exactly once\n // from its write site. Emitting from an effect instead would echo adopted\n // props back to a controlling parent and feed back forever.\n const schemaRef = useRef(schema)\n const valuesRef = useRef(values)\n const messagesRef = useRef(messages)\n const validityRef = useRef(validity)\n\n const callbacks = useRef({ onValuesChange, onMessagesChange, onValidityChange })\n callbacks.current = { onValuesChange, onMessagesChange, onValidityChange }\n\n const commitSchema = useCallback((next: Context['schema']) => {\n schemaRef.current = next\n setSchema(next)\n }, [])\n\n const commitValues = useCallback((next: Context['values'], emit = true) => {\n valuesRef.current = next\n setValues(next)\n if (emit && callbacks.current.onValuesChange) callbacks.current.onValuesChange(next as Values)\n }, [])\n\n const commitMessages = useCallback((next: Context['messages'], emit = true) => {\n messagesRef.current = next\n setMessages(next)\n if (emit && callbacks.current.onMessagesChange) callbacks.current.onMessagesChange(next)\n }, [])\n\n const commitValidity = useCallback((next: Context['validity'], emit = true) => {\n validityRef.current = next\n setValidity(next)\n if (emit && callbacks.current.onValidityChange) callbacks.current.onValidityChange(next)\n }, [])\n\n // Adopt controlled props without emitting them back to the parent. Compare with the state this render shows, as a\n // child's effect may have changed the refs since, and a parent passing that change back only shows it next render\n useEffect(() => {\n if (defaultSchema === undefined) return\n if (Object.is(defaultSchema, schema)) return\n commitSchema(defaultSchema)\n }, [defaultSchema, commitSchema])\n\n useEffect(() => {\n if (defaultValues === undefined) return\n if (Object.is(defaultValues, values)) return\n commitValues(defaultValues, false)\n }, [defaultValues, commitValues])\n\n useEffect(() => {\n if (defaultMessages === undefined) return\n if (Object.is(defaultMessages, messages)) return\n commitMessages(defaultMessages, false)\n }, [defaultMessages, commitMessages])\n\n useEffect(() => {\n if (defaultValidity === undefined) return\n if (Object.is(defaultValidity, validity)) return\n commitValidity(defaultValidity, false)\n }, [defaultValidity, commitValidity])\n\n // Merge internal inputs with user defined\n const mergedInputs = useMemo(() => {\n return {\n ...coreInputs,\n ...(inputs || {}),\n }\n }, [inputs])\n\n const onFieldsetValuesChange: OnValuesChangeCallback = useCallback(\n (field, value) => {\n const old = valuesRef.current\n if (Object.is(old?.[field], value)) return\n commitValues({ ...old, [field]: value })\n },\n [commitValues],\n )\n\n const onFieldsetMessagesChange: OnMessagesChangeCallback = useCallback(\n (field, fieldMessages) => {\n const old = messagesRef.current\n if (Object.is(old?.[field], fieldMessages)) return\n commitMessages({ ...old, [field]: fieldMessages })\n },\n [commitMessages],\n )\n\n const onFieldsetValidityChange: OnValidityChangeCallback = useCallback(\n (field, fieldValidity) => {\n const old = validityRef.current\n if (Object.is(old?.[field], fieldValidity)) return\n commitValidity({ ...old, [field]: fieldValidity })\n },\n [commitValidity],\n )\n\n // Collect every field's messages and validity into path keyed maps, so\n // nested fields appear as e.g. 'address.town' or 'pets.0.petname'\n const onFieldReport: FieldStateReport = useCallback(\n (path, patch) => {\n const key = path.join('.')\n\n // An undefined patch removes the field's entries entirely\n if (patch === undefined) {\n if (key in messagesRef.current) {\n const { [key]: removed, ...rest } = messagesRef.current\n commitMessages(rest)\n }\n\n if (key in validityRef.current) {\n const { [key]: removed, ...rest } = validityRef.current\n commitValidity(rest)\n }\n\n return\n }\n\n if ('messages' in patch && !Object.is(messagesRef.current?.[key], patch.messages)) {\n commitMessages({ ...messagesRef.current, [key]: patch.messages })\n }\n\n if ('valid' in patch && !Object.is(validityRef.current?.[key], patch.valid)) {\n commitValidity({ ...validityRef.current, [key]: patch.valid })\n }\n },\n [commitMessages, commitValidity],\n )\n\n // Validate the current values against the schema, and ask every rendered\n // field to re-run its own validation so all messages are displayed, even\n // those allowIncomplete leaves out of the report\n const validate = useCallback(\n (options: Pick<ValidateValuesOptions, 'allowIncomplete'> = {}) => {\n setValidationCounter((old) => old + 1)\n return validateValues(schemaRef.current, valuesRef.current, mergedInputs, {\n environment: 'client',\n allowIncomplete: options.allowIncomplete,\n })\n },\n [mergedInputs],\n )\n\n // Apply an external validation report, e.g. one returned by a server, and\n // show its messages inline until each field next reports for itself\n const applyReport = useCallback(\n (report: ValidationReport) => {\n const flat = flattenValidationReport(report)\n\n commitMessages(flat.messages)\n commitValidity(flat.validity)\n setInjectedMessages(flat.messages)\n setInjectedValidity(flat.validity)\n },\n [commitMessages, commitValidity],\n )\n\n useImperativeHandle(ref, () => ({ validate, applyReport }), [validate, applyReport])\n\n const clearInjected = useCallback((key: string) => {\n setInjectedMessages((old) => {\n if (!(key in old)) return old\n const { [key]: removed, ...rest } = old\n return rest\n })\n\n setInjectedValidity((old) => {\n if (!(key in old)) return old\n const { [key]: removed, ...rest } = old\n return rest\n })\n }, [])\n\n // External setters go through the same write path, so state, refs and\n // change callbacks stay coherent\n const setSchemaExternal = useCallback(\n (action: SetStateAction<Context['schema']>) => {\n const next = typeof action === 'function' ? action(schemaRef.current) : action\n if (Object.is(next, schemaRef.current)) return\n commitSchema(next)\n },\n [commitSchema],\n )\n\n const setValuesExternal = useCallback(\n (action: SetStateAction<Context['values']>) => {\n const next = typeof action === 'function' ? action(valuesRef.current) : action\n if (Object.is(next, valuesRef.current)) return\n commitValues(next)\n },\n [commitValues],\n )\n\n const setMessagesExternal = useCallback(\n (action: SetStateAction<Context['messages']>) => {\n const next = typeof action === 'function' ? action(messagesRef.current) : action\n if (Object.is(next, messagesRef.current)) return\n commitMessages(next)\n },\n [commitMessages],\n )\n\n const setValidityExternal = useCallback(\n (action: SetStateAction<Context['validity']>) => {\n const next = typeof action === 'function' ? action(validityRef.current) : action\n if (Object.is(next, validityRef.current)) return\n commitValidity(next)\n },\n [commitValidity],\n )\n\n const injectionContextValue = useMemo(() => {\n return {\n messages: injectedMessages,\n validity: injectedValidity,\n clear: clearInjected,\n }\n }, [injectedMessages, injectedValidity, clearInjected])\n\n const dataContextValue = useMemo(() => {\n return {\n schema,\n values,\n messages,\n validity,\n }\n }, [schema, values, messages, validity])\n\n const staticContextValue = useMemo(() => {\n return {\n inputs: mergedInputs,\n validationCounter,\n\n setSchema: setSchemaExternal,\n setValues: setValuesExternal,\n setMessages: setMessagesExternal,\n setValidity: setValidityExternal,\n }\n }, [mergedInputs, validationCounter, setSchemaExternal, setValuesExternal, setMessagesExternal, setValidityExternal])\n\n const reportContextValue = useMemo<FieldReportContextValue>(() => {\n return {\n report: onFieldReport,\n resolve: (path) => path,\n }\n }, [onFieldReport])\n\n const scopeContextValue = useMemo(\n () => [conditionScope(schema, values, mergedInputs)],\n [schema, values, mergedInputs],\n )\n\n return (\n <FormContext.Provider value={dataContextValue}>\n <FormStaticContext.Provider value={staticContextValue}>\n <FieldReportContext.Provider value={reportContextValue}>\n <FieldInjectionContext.Provider value={injectionContextValue}>\n <FieldScopeContext.Provider value={scopeContextValue}>\n {/* Prevent implicit submissions from reloading the page */}\n <form\n className={`sorlo-form${className ? ` ${className}` : ''}`}\n onSubmit={(event) => event.preventDefault()}\n >\n <Fieldset\n schema={schema}\n values={values}\n messages={messages}\n validity={validity}\n onValuesChange={onFieldsetValuesChange}\n onMessagesChange={onFieldsetMessagesChange}\n onValidityChange={onFieldsetValidityChange}\n />\n </form>\n </FieldScopeContext.Provider>\n </FieldInjectionContext.Provider>\n </FieldReportContext.Provider>\n </FormStaticContext.Provider>\n </FormContext.Provider>\n )\n}\n","import Form from '@/components/Form'\n\nexport { default as Field, useFieldContext } from '@/components/Field'\nexport { default as Fieldset } from '@/components/Fieldset'\nexport { default as Modal } from '@/components/Modal'\nexport {\n FieldInjectionContext,\n FieldReportContext,\n FormContext,\n FormStaticContext,\n useFormContext,\n useFormStaticContext,\n} from '@/context/FormProvider'\nexport * as inputs from '@/inputs'\nexport {\n baseInputSchemaFields,\n flattenValidationReport,\n pickValues,\n resolveValidateValue,\n validateInputSchemaFields,\n validateSchema,\n validateServerValues,\n validateValues,\n} from '@/utils/inputs'\nexport { evaluateCondition, evaluateConditions, normaliseConditions, resolveConditionValue } from '@/utils/conditions'\nexport { validationMessage } from '@/utils/messages'\nexport { schemaToTypeScript } from '@/utils/typescript'\nexport {\n isEmail,\n isEmptyValue,\n isTel,\n isUrl,\n validationError,\n validationReset,\n validationSuccess,\n} from '@/utils/validation'\n\nexport type { FieldProps, OnValueChangeCallback } from '@/components/Field'\nexport type {\n FieldsetProps,\n OnMessagesChangeCallback,\n OnValidityChangeCallback,\n OnValuesChangeCallback,\n} from '@/components/Fieldset'\nexport type { FormHandle, FormProps } from '@/components/Form'\nexport type { ModalProps } from '@/components/Modal'\nexport type {\n Context,\n DataContext,\n FieldInjectionContextValue,\n FieldPath,\n FieldReportContextValue,\n FieldStatePatch,\n FieldStateReport,\n StaticContext,\n} from '@/context/FormProvider'\nexport type {\n ConditionGroup,\n ConditionOperator,\n FieldCondition,\n FieldConditions,\n FieldMessages,\n FieldSchema,\n} from '@/types/fields'\nexport type { ConditionScopes } from '@/utils/conditions'\nexport type { FlatValidationReport, ValidateValuesOptions } from '@/utils/inputs'\nexport type {\n FieldValidationReport,\n Input,\n InputCategory,\n InputComponent,\n InputCoreFields,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickFields,\n InputPickValue,\n InputPrepareSchema,\n InputRenderValue,\n InputSchema,\n InputTypeFields,\n InputTypeValue,\n InputValidateChildren,\n InputValidateClientValue,\n InputValidateFields,\n InputValidateServerValue,\n InputValidateValue,\n InputValidationResponse,\n ValidationEnvironment,\n ValidationReport,\n ValidationReportChildren,\n} from '@/types/inputs'\nexport type {\n ValidationResponse,\n ValidationResponseError,\n ValidationResponseReset,\n ValidationResponseSuccess,\n} from '@/utils/validation'\n\nexport { Form }\nexport default Form\n"],"mappings":"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","names":["report","name","optionFields","isEqual","createContext","useContext","useMemo","name","isValid","value","messages","schema","validate","handleValidation","useCallback","useContext","jsx","jsxs","FieldsetItem","Component","value","messages","name","useCallback","jsx","jsxs","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","useContext","useEffect","useRef","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","name","useCallback","Fragment","jsx","jsxs","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","isEqual","Fragment","useContext","useEffect","useMemo","useRef","jsx","jsxs","name","description","category","optionFields","validateValue","isRule","typeValue","formatValue","renderValue","Component","category","description","name","optionFields","pickValue","typeValue","jsx","name","description","category","optionFields","pickValue","typeValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","pickValue","renderValue","typeValue","validateChildren","validateValue","useCallback","useEffect","useMemo","Fragment","jsx","jsxs","name","description","category","optionFields","validateValue","validateChildren","pickValue","typeValue","formatValue","renderValue","Component","category","coreFields","description","formatValue","name","optionFields","pickValue","renderValue","typeValue","validateChildren","validateValue","useCallback","useContext","useEffect","useMemo","useState","Fragment","jsx","name","description","category","coreFields","optionFields","validateValue","validateChildren","pickValue","typeValue","formatValue","renderValue","Component","category","coreFields","description","formatValue","name","optionFields","pickValue","renderValue","typeValue","useEffect","Fragment","jsx","name","description","category","coreFields","optionFields","pickValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","pickValue","renderValue","typeValue","validateChildren","validateValue","useCallback","useContext","useEffect","useMemo","useState","Fragment","jsx","jsxs","name","description","category","optionFields","validateValue","validateChildren","pickValue","typeValue","formatValue","renderValue","Component","value","columns","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","jsxs","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","jsxs","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","pickValue","renderValue","typeValue","validateChildren","validateValue","useCallback","useContext","useEffect","useMemo","useState","Fragment","jsx","name","description","category","optionFields","validateValue","validateChildren","pickValue","typeValue","formatValue","renderValue","Component","category","coreFields","description","formatValue","name","renderValue","typeValue","validateValue","useCallback","useEffect","useId","useRef","jsx","jsxs","isEqual","Fragment","createContext","useCallback","useContext","useEffect","useMemo","useState","jsx","jsxs","name","description","category","coreFields","validateValue","typeValue","formatValue","renderValue","prepareSchema","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","Fragment","useCallback","jsx","jsxs","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","useCallback","useEffect","useMemo","useRef","useState","jsx","defaultMessages"]}
|
|
1
|
+
{"version":3,"sources":["../src/context/FormProvider/index.tsx","../src/utils/validation.ts","../src/utils/conditions.ts","../src/utils/inputs.ts","../src/components/Field/index.tsx","../src/translations/index.ts","../src/translations/en.ts","../src/i18n.ts","../src/components/Fieldset/index.tsx","../src/inputs/index.tsx","../src/inputs/Boolean/index.tsx","../src/utils/messages.ts","../src/inputs/Checkbox/index.tsx","../src/inputs/Identifier/index.tsx","../src/utils/typescript.ts","../src/inputs/Color/index.tsx","../src/inputs/Conditions/index.tsx","../src/inputs/Content/index.tsx","../src/inputs/Date/index.tsx","../src/inputs/Datetime/index.tsx","../src/inputs/Email/index.tsx","../src/inputs/Flexible/index.tsx","../src/inputs/Group/index.tsx","../src/inputs/Hidden/index.tsx","../src/inputs/Matrix/index.tsx","../src/inputs/Number/index.tsx","../src/inputs/Password/index.tsx","../src/inputs/Radio/index.tsx","../src/inputs/Range/index.tsx","../src/inputs/Repeater/index.tsx","../src/inputs/SchemaBuilder/index.tsx","../src/components/Modal/index.tsx","../src/inputs/Select/index.tsx","../src/inputs/Tel/index.tsx","../src/inputs/Text/index.tsx","../src/inputs/Textarea/index.tsx","../src/inputs/Time/index.tsx","../src/inputs/Url/index.tsx","../src/components/Form/index.tsx","../src/index.tsx"],"sourcesContent":["import { FieldMessages, FieldSchema } from '@/types/fields'\nimport { Input } from '@/types/inputs'\nimport { ConditionScopes } from '@/utils/conditions'\nimport { Dispatch, SetStateAction, createContext, useContext, useMemo } from 'react'\n\n// Data that changes as the form is used\nexport interface DataContext {\n schema: Array<FieldSchema>\n values: Record<string, any>\n messages: Record<string, any>\n validity: Record<string, boolean | undefined>\n}\n\n// Values with stable identities, so consumers that only need these are not\n// re-rendered by every value change\nexport interface StaticContext {\n inputs: Record<string, Input>\n validationCounter: number\n\n setSchema: Dispatch<SetStateAction<DataContext['schema']>>\n setValues: Dispatch<SetStateAction<DataContext['values']>>\n setMessages: Dispatch<SetStateAction<DataContext['messages']>>\n setValidity: Dispatch<SetStateAction<DataContext['validity']>>\n}\n\nexport type Context = DataContext & StaticContext\n\n// The path of a field relative to the form's root, e.g. ['pets', 0, 'petname']\nexport type FieldPath = Array<string | number>\n\n// A partial update of a field's state, where an undefined patch removes the\n// field's entries entirely\nexport type FieldStatePatch = undefined | { messages?: FieldMessages; valid?: boolean | undefined }\n\n// Report a field's messages and validity to the form's path keyed maps\nexport type FieldStateReport = (path: FieldPath, patch: FieldStatePatch) => void\n\n// Carries reporting upwards and path resolution downwards; both compose the\n// same way at every level, so a field can learn its absolute path\nexport interface FieldReportContextValue {\n report: FieldStateReport\n resolve: (path: FieldPath) => FieldPath\n}\n\n// State injected from outside the form, e.g. a server validation report,\n// shown for a field until that field next reports its own state\nexport interface FieldInjectionContextValue {\n messages: Record<string, FieldMessages>\n validity: Record<string, boolean | undefined>\n clear: (key: string) => void\n}\n\n// Create form Context\nexport const FormContext = createContext<undefined | DataContext>(undefined)\nexport const FormStaticContext = createContext<undefined | StaticContext>(undefined)\nexport const FieldReportContext = createContext<undefined | FieldReportContextValue>(undefined)\nexport const FieldInjectionContext = createContext<undefined | FieldInjectionContextValue>(undefined)\n\n// The stack of value scopes conditions are evaluated against, extended by\n// every container (group, repeater item, matrix cell)\nexport const FieldScopeContext = createContext<undefined | ConditionScopes>(undefined)\n\n// Hook for consuming form context\nexport const useFormContext = (): Context => {\n const context = useContext(FormContext)\n const staticContext = useContext(FormStaticContext)\n\n const merged = useMemo(() => {\n if (!context || !staticContext) return undefined\n return { ...context, ...staticContext }\n }, [context, staticContext])\n\n if (!merged) {\n throw new Error('useFormContext must be used within a <FormProvider>')\n }\n\n return merged\n}\n\n// Hook for consuming static form context\nexport const useFormStaticContext = () => {\n const context = useContext(FormStaticContext)\n if (!context) {\n throw new Error('useFormStaticContext must be used within a <FormProvider>')\n }\n return context\n}\n","export interface ValidationResponse {\n isValid: boolean | undefined\n messages: Array<string>\n value: any\n}\n\nexport interface ValidationResponseReset extends ValidationResponse {\n isValid: undefined\n}\n\nexport interface ValidationResponseError extends ValidationResponse {\n isValid: false\n}\n\nexport interface ValidationResponseSuccess extends ValidationResponse {\n isValid: true\n}\n\nexport function validationReset(value: any, message: string | Array<string>): ValidationResponseReset {\n return {\n isValid: undefined,\n messages: Array.isArray(message) ? message : message ? [message] : [],\n value: value,\n }\n}\n\nexport function validationError(value: any, message: string | Array<string>): ValidationResponseError {\n return {\n isValid: false,\n messages: Array.isArray(message) ? message : message ? [message] : [],\n value: value,\n }\n}\n\nexport function validationSuccess(value: any, message?: string | Array<string>): ValidationResponseSuccess {\n return {\n isValid: true,\n messages: Array.isArray(message) ? message : message ? [message] : [],\n value: value,\n }\n}\n\n// Check whether a value is considered empty, note that 0 and false are not empty\nexport function isEmptyValue(value: any) {\n if (Array.isArray(value)) return value.length === 0\n return value === '' || value === null || value === undefined\n}\n\n// Check whether a value is a valid http(s) URL\nexport function isUrl(url: string) {\n try {\n const parsed = new URL(url)\n return parsed.protocol === 'http:' || parsed.protocol === 'https:'\n } catch {\n return false\n }\n}\n\n// Check whether a value looks like a phone number, allowing common formatting\nexport function isTel(tel: string) {\n const digits = tel.replace(/[\\s().-]/g, '')\n return /^\\+?\\d{5,15}$/.test(digits)\n}\n\nexport function isEmail(email: string) {\n const pattern =\n /^[-!#$%&'*+\\/0-9=?A-Z^_a-z`{|}~](\\.?[-!#$%&'*+\\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\\.?[a-zA-Z0-9])*\\.[a-zA-Z](-?[a-zA-Z0-9])+$/\n\n const emailParts = email.split('@')\n\n if (emailParts.length !== 2) return false\n\n const [account, address] = emailParts\n\n if (account.length > 64) {\n return false\n } else if (address.length > 255) {\n return false\n }\n\n const domainParts = address.split('.')\n\n if (domainParts.some((part) => part.length > 63)) {\n return false\n }\n\n return pattern.test(email)\n}\n","import { FieldCondition, FieldSchema } from '@/types/fields'\nimport { isEmptyValue } from '@/utils/validation'\nimport isEqual from 'lodash/isEqual.js'\n\n// The stack of value scopes a condition can see, from the form's root values\n// down to the nearest group, repeater item or matrix cell\nexport type ConditionScopes = Array<Record<string, any>>\n\n// Compare loosely so values built in the schema builder, which are always\n// strings, still match numbers and booleans\nconst looseEquals = (a: any, b: any): boolean => {\n if (isEqual(a, b)) return true\n if (a == null || b == null) return false\n if (typeof a === 'object' || typeof b === 'object') return false\n return String(a) === String(b)\n}\n\n// ISO dates and date-times, e.g. 2026-01-15 and 2026-01-15T13:30, or times of day, e.g. 13:30\nconst isoDate = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$/\nconst isoTime = /^\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?$/\n\n// Two dates, or two times, which order as text, so a date-time falls after the start of its day\n// shortcut: compares as text, so times in different time zones misorder, parse them if sites mix zones\nconst bothIso = (a: any, b: any) => {\n if (typeof a !== 'string' || typeof b !== 'string') return false\n return (isoDate.test(a) && isoDate.test(b)) || (isoTime.test(a) && isoTime.test(b))\n}\n\n// Resolve a dotted path against the nearest scope containing its first\n// segment, falling outwards to the form's root values\nexport function resolveConditionValue(path: string, scopes: ConditionScopes): any {\n const segments = path.split('.')\n\n for (let index = scopes.length - 1; index >= 0; index--) {\n const scope = scopes[index]\n\n if (scope && typeof scope === 'object' && segments[0] in scope) {\n return segments.reduce((value, segment) => (value == null ? undefined : value[segment]), scope)\n }\n }\n\n return undefined\n}\n\nexport function evaluateCondition(condition: FieldCondition, scopes: ConditionScopes): boolean {\n const value = resolveConditionValue(condition.field, scopes)\n\n switch (condition.operator) {\n case 'equals':\n return looseEquals(value, condition.value)\n case 'notEquals':\n return !looseEquals(value, condition.value)\n case 'contains':\n if (Array.isArray(value)) return value.includes(condition.value)\n return typeof value === 'string' && value.includes(String(condition.value))\n case 'notContains':\n if (Array.isArray(value)) return !value.includes(condition.value)\n return !(typeof value === 'string' && value.includes(String(condition.value)))\n case 'startsWith':\n return typeof value === 'string' && value.startsWith(String(condition.value))\n case 'greaterThan':\n return bothIso(value, condition.value) ? value > condition.value : Number(value) > Number(condition.value)\n case 'lessThan':\n return bothIso(value, condition.value) ? value < condition.value : Number(value) < Number(condition.value)\n case 'empty':\n return isEmptyValue(value)\n case 'notEmpty':\n return !isEmptyValue(value)\n default:\n return true\n }\n}\n\nconst isRule = (item: any): item is FieldCondition => {\n return item !== null && typeof item === 'object' && !Array.isArray(item) && 'operator' in item\n}\n\n// Normalise any accepted conditions shape into groups of rules, where the\n// field shows when any group has all of its rules matching\nexport function normaliseConditions(schema: FieldSchema): Array<Array<FieldCondition>> {\n const conditions = schema.conditions\n\n if (!conditions || conditions.length === 0) return []\n\n // A flat list of rules keeps its original meaning: one group that must all\n // match, or one group per rule when conditionsMode is 'any'\n if (conditions.every(isRule)) {\n const rules = conditions as Array<FieldCondition>\n return schema.conditionsMode === 'any' ? rules.map((rule) => [rule]) : [rules]\n }\n\n // Otherwise every item is a group: an array of rules, a { rules } object,\n // or a bare rule acting as a group of one\n return conditions.map((group) => {\n if (Array.isArray(group)) return group\n if (isRule(group)) return [group]\n return group?.rules || []\n })\n}\n\n// Check whether a field should be shown for the given value scopes\nexport function evaluateConditions(schema: FieldSchema, scopes: ConditionScopes): boolean {\n const groups = normaliseConditions(schema)\n\n if (groups.length === 0) return true\n\n return groups.some((rules) => rules.every((rule) => evaluateCondition(rule, scopes)))\n}\n","import { FieldSchema } from '@/types/fields'\nimport {\n FieldValidationReport,\n Input,\n InputPickFields,\n InputSchema,\n InputValidateFields,\n InputValidateServerValue,\n InputValidateValue,\n ValidationEnvironment,\n ValidationReport,\n ValidationReportChildren,\n} from '@/types/inputs'\nimport { ConditionScopes, evaluateConditions } from '@/utils/conditions'\nimport { validationSuccess } from '@/utils/validation'\n\nexport interface ValidateValuesOptions {\n environment?: ValidationEnvironment\n scopes?: ConditionScopes\n // Leave out the checks a value fails only because it isn't finished, e.g. to save a draft or a step of a form\n allowIncomplete?: boolean\n}\n\n// A field's schema without the checks an unfinished value fails: required, and the minimum length and count options.\n// Formats, maximums and ranges such as a number's min still apply\nconst incompleteSchema = (field: FieldSchema): FieldSchema => {\n const { minLength, minimum, minimumRows, minimumColumns, ...options } = field.options || {}\n return { ...field, required: false, options }\n}\n\n// Resolve the validator for an environment, falling back to the shared validateValue\nexport function resolveValidateValue(input: undefined | Input, environment?: 'client'): InputValidateValue | undefined\nexport function resolveValidateValue(\n input: undefined | Input,\n environment: 'server',\n): InputValidateServerValue | undefined\nexport function resolveValidateValue(\n input: undefined | Input,\n environment?: ValidationEnvironment,\n): InputValidateValue | InputValidateServerValue | undefined\nexport function resolveValidateValue(input: undefined | Input, environment?: ValidationEnvironment) {\n if (environment === 'client') return input?.validateClientValue || input?.validateValue\n if (environment === 'server') return input?.validateServerValue || input?.validateValue\n return input?.validateValue\n}\n\n// Check whether every report in a tree of child reports is valid\nconst childrenAreValid = (children: ValidationReportChildren): boolean => {\n if (children instanceof Promise) {\n throw new Error('validateChildren returned a promise, use validateServerValues instead')\n }\n if (Array.isArray(children)) return children.every(childrenAreValid)\n return children.isValid\n}\n\n// Resolve any promises inside a tree of child reports\nconst resolveReportChildren = async (children: ValidationReportChildren): Promise<ValidationReportChildren> => {\n const resolved = await children\n if (Array.isArray(resolved)) {\n return Promise.all(resolved.map((child) => resolveReportChildren(child)))\n }\n return resolved\n}\n\n// A field's value as pickValues keeps it, letting the input pick its own nested values\nconst pickFieldValue = (\n field: FieldSchema,\n values: Record<string, any>,\n inputs: Record<string, Input>,\n pickFields: InputPickFields,\n): any => {\n const input = inputs?.[field.type]\n\n // Fall back to the schema default when no value is set\n let value = values?.[field.name]\n if (value === undefined) value = field.defaultValue\n\n // Keep the value the input's validator returns, as a form does, so a posted '5' for a number becomes 5\n if (input?.validateValue) value = input.validateValue(value, field).value\n\n return input?.pickValue ? input.pickValue(value, field, pickFields) : value\n}\n\n// Conditions see each field's value as pickValues keeps it, shown or not, so a posted 'on' meets a condition on true\nexport const conditionScope = (\n schema: Array<FieldSchema>,\n values: Record<string, any>,\n inputs: Record<string, Input>,\n): Record<string, any> => {\n const scope: Record<string, any> = { ...values }\n const scopeFields: InputPickFields = (childSchema, childValues) => conditionScope(childSchema, childValues, inputs)\n\n for (const field of schema) {\n const value = pickFieldValue(field, values, inputs, scopeFields)\n\n // An unset field stays out, so a condition still falls through to an outer field of the same name\n if (value !== undefined) scope[field.name] = value\n }\n\n return scope\n}\n\n// Validate a set of values against a schema, letting each input walk its own nested fields\nexport function validateValues<Values extends Record<string, any> = Record<string, any>>(\n schema: Array<FieldSchema>,\n values: Values,\n inputs: Record<string, Input>,\n options: ValidateValuesOptions = {},\n): ValidationReport {\n const fields: Record<string, FieldValidationReport> = {}\n const scopes = options.scopes || [conditionScope(schema, values, inputs)]\n\n const validateFields: InputValidateFields = (childSchema, childValues) => {\n const childScopes = [...scopes, conditionScope(childSchema, childValues, inputs)]\n return validateValues(childSchema, childValues, inputs, { ...options, scopes: childScopes })\n }\n\n for (const field of schema) {\n const input = inputs?.[field.type]\n\n // Skip fields hidden by their conditions\n if (!evaluateConditions(field, scopes)) continue\n\n // Fall back to the schema default when no value is set\n let value = values?.[field.name]\n if (value === undefined) value = field.defaultValue\n\n const fieldSchema = options.allowIncomplete ? incompleteSchema(field) : field\n\n const validate = resolveValidateValue(input, options.environment)\n const validation = validate ? validate(value, fieldSchema) : validationSuccess(value)\n\n if (validation instanceof Promise) {\n throw new Error('The validator returned a promise, use validateServerValues instead')\n }\n\n const report: FieldValidationReport = {\n isValid: validation.isValid !== false,\n messages: validation.messages,\n }\n\n // Let the input validate its nested fields, once the field passes its own check, so a list over its maximum\n // reports that alone rather than every item too\n if (input?.validateChildren && report.isValid) {\n const children = input.validateChildren(value, fieldSchema, validateFields)\n report.children = children\n if (!childrenAreValid(children)) report.isValid = false\n }\n\n fields[field.name] = report\n }\n\n return {\n isValid: Object.values(fields).every((field) => field.isValid),\n fields,\n }\n}\n\n// Validate a set of values on the server, where validators may be asynchronous\nexport async function validateServerValues<Values extends Record<string, any> = Record<string, any>>(\n schema: Array<FieldSchema>,\n values: Values,\n inputs: Record<string, Input>,\n options: ValidateValuesOptions = {},\n): Promise<ValidationReport> {\n const fields: Record<string, FieldValidationReport> = {}\n const scopes = options.scopes || [conditionScope(schema, values, inputs)]\n\n const validateFields: InputValidateFields = (childSchema, childValues) => {\n const childScopes = [...scopes, conditionScope(childSchema, childValues, inputs)]\n return validateServerValues(childSchema, childValues, inputs, { ...options, scopes: childScopes })\n }\n\n for (const field of schema) {\n const input = inputs?.[field.type]\n\n // Skip fields hidden by their conditions\n if (!evaluateConditions(field, scopes)) continue\n\n // Fall back to the schema default when no value is set\n let value = values?.[field.name]\n if (value === undefined) value = field.defaultValue\n\n const fieldSchema = options.allowIncomplete ? incompleteSchema(field) : field\n\n const validate = resolveValidateValue(input, 'server')\n const validation = validate ? await validate(value, fieldSchema) : validationSuccess(value)\n\n const report: FieldValidationReport = {\n isValid: validation.isValid !== false,\n messages: validation.messages,\n }\n\n // Let the input validate its nested fields, once the field passes its own check\n if (input?.validateChildren && report.isValid) {\n const children = await resolveReportChildren(input.validateChildren(value, fieldSchema, validateFields))\n report.children = children\n if (!childrenAreValid(children)) report.isValid = false\n }\n\n fields[field.name] = report\n }\n\n return {\n isValid: Object.values(fields).every((field) => field.isValid),\n fields,\n }\n}\n\nexport interface FlatValidationReport {\n messages: Record<string, Array<string>>\n validity: Record<string, boolean | undefined>\n}\n\n// Flatten a nested validation report into path keyed maps matching the form's\n// own messages and validity maps, e.g. 'pets.0.petname'\nexport function flattenValidationReport(report: ValidationReport): FlatValidationReport {\n const flat: FlatValidationReport = { messages: {}, validity: {} }\n\n const walkReport = (report: ValidationReport, prefix: Array<string | number>) => {\n for (const [name, fieldReport] of Object.entries(report.fields)) {\n const path = [...prefix, name]\n const key = path.join('.')\n\n if (fieldReport.messages.length >= 1) flat.messages[key] = fieldReport.messages\n flat.validity[key] = fieldReport.isValid\n\n if (fieldReport.children !== undefined) walkChildren(fieldReport.children, path)\n }\n }\n\n const walkChildren = (children: ValidationReportChildren, prefix: Array<string | number>) => {\n if (children instanceof Promise) {\n throw new Error('The report contains unresolved children')\n }\n\n if (Array.isArray(children)) {\n children.forEach((child, index) => walkChildren(child, [...prefix, index]))\n return\n }\n\n walkReport(children, prefix)\n }\n\n walkReport(report, [])\n\n return flat\n}\n\n// Reduce a set of values to only the fields defined by a schema, letting each\n// input pick its own nested values\nexport function pickValues<Values extends Record<string, any> = Record<string, any>>(\n schema: Array<FieldSchema>,\n values: Record<string, any>,\n inputs: Record<string, Input>,\n options: { scopes?: ConditionScopes } = {},\n): Partial<Values> {\n const picked: Record<string, any> = {}\n const scopes = options.scopes || [conditionScope(schema, values, inputs)]\n\n const pickFields: InputPickFields = (childSchema, childValues) => {\n const childScopes = [...scopes, conditionScope(childSchema, childValues, inputs)]\n return pickValues(childSchema, childValues, inputs, { scopes: childScopes })\n }\n\n for (const field of schema) {\n // Skip fields hidden by their conditions\n if (!evaluateConditions(field, scopes)) continue\n\n const pickedValue = pickFieldValue(field, values, inputs, pickFields)\n if (pickedValue === undefined) continue\n\n picked[field.name] = pickedValue\n }\n\n return picked as Partial<Values>\n}\n\n// A short random ID for something the schema builder creates, e.g. fld_k3x9q2mz for a field\nexport const createId = (prefix: string) => {\n const characters = Array.from(crypto.getRandomValues(new Uint8Array(8)), (byte) => (byte % 36).toString(36))\n return `${prefix}_${characters.join('')}`\n}\n\n// Strip unknown properties from a field schema\nexport function validateSchema({\n id,\n name,\n label,\n required,\n instructions,\n defaultValue,\n readonly,\n disabled,\n width,\n options,\n}: InputSchema) {\n return {\n id,\n name,\n label,\n required,\n instructions,\n defaultValue,\n readonly,\n disabled,\n width,\n options,\n }\n}\n\nexport function validateInputSchemaFields(input: Input) {\n const baseFields = baseInputSchemaFields()\n const schema = [...(input?.coreFields ? input.coreFields(baseFields) : baseFields)]\n\n const optionFields = input?.optionFields ? input?.optionFields([]) : []\n\n if (optionFields.length >= 1) {\n schema.push({\n name: 'options',\n label: 'Options',\n type: 'group',\n options: {\n fields: optionFields,\n },\n })\n }\n\n return schema\n}\n\nexport const baseInputSchemaFields = (): Array<FieldSchema> => {\n return [\n {\n name: 'name',\n label: 'Field Name',\n type: 'identifier',\n required: true,\n width: 50,\n // Names are path segments, e.g. address.town, so they can't hold dots or spaces\n options: {\n source: 'label',\n format: 'mixed',\n },\n },\n {\n name: 'label',\n label: 'Field Label',\n type: 'text',\n required: false,\n width: 50,\n },\n {\n name: 'required',\n label: 'Required',\n type: 'boolean',\n required: false,\n options: {\n message: 'Yes',\n },\n },\n {\n name: 'instructions',\n label: 'Instructions',\n type: 'textarea',\n required: false,\n },\n {\n name: 'width',\n label: 'Width',\n type: 'number',\n required: false,\n options: {\n min: 1,\n max: 100,\n },\n },\n {\n // The schema builder lists the fields its rules can test as the input's fieldChoices\n name: 'conditions',\n label: 'Conditional logic',\n type: 'conditions',\n required: false,\n instructions: 'Show this field when any group below has all of its rules matching.',\n },\n ]\n}\n","import {\n FieldInjectionContext,\n FieldReportContext,\n FieldReportContextValue,\n FormStaticContext,\n} from '@/context/FormProvider'\nimport { FieldMessages } from '@/types/fields'\nimport { InputSchema, InputValidateValue, InputValidationResponse } from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport isEqual from 'lodash/isEqual.js'\nimport { SetStateAction, createContext, useCallback, useContext, useEffect, useId, useMemo, useRef } from 'react'\n\ninterface Context {\n id: string\n labelId: string\n aria: {\n 'aria-describedby'?: string\n 'aria-invalid'?: boolean\n }\n schema: InputSchema\n name: InputSchema['name']\n label: InputSchema['label']\n required: InputSchema['required']\n instructions: InputSchema['instructions']\n defaultValue: InputSchema['defaultValue']\n readonly: InputSchema['readonly']\n disabled: InputSchema['disabled']\n width: InputSchema['width']\n options: InputSchema['options']\n\n value: any\n messages: FieldMessages\n valid: boolean | undefined\n\n setValue: (value: SetStateAction<Context['value']>) => void\n setMessages: (messages: SetStateAction<Context['messages']>) => void\n setValid: (valid: SetStateAction<Context['valid']>) => void\n\n handleValidation: (response: InputValidationResponse) => void\n}\n\n// Create Field Context\nconst FieldContext = createContext<undefined | Context>(undefined)\n\n// Hook for consuming field context\nexport const useFieldContext = () => {\n const context = useContext(FieldContext)\n if (!context) {\n throw new Error('useFieldContext must be used within a <Field>')\n }\n return context\n}\n\nexport type OnValueChangeCallback = (value: Context['value']) => void\nexport type OnMessagesChangeCallback = (messages: Context['messages']) => void\nexport type OnValidityChangeCallback = (validity: Context['valid']) => void\n\nexport interface FieldProps extends InputSchema {\n children: React.ReactNode\n value?: any\n messages?: FieldMessages\n valid?: boolean\n validate?: InputValidateValue\n onValueChange: OnValueChangeCallback\n onMessagesChange: OnMessagesChangeCallback\n onValidityChange: OnValidityChangeCallback\n}\n\nconst defaultMessages: FieldMessages = []\n\n// Field Provider Component\nexport default function Field({\n value,\n messages = defaultMessages,\n valid,\n validate,\n onValueChange,\n onMessagesChange,\n onValidityChange,\n children,\n ...rawSchema\n}: FieldProps) {\n const { name, label, required, instructions, defaultValue, width, options } = rawSchema\n\n // A read-only or disabled container passes its state to every field inside it\n const parent = useContext(FieldContext)\n const readonly = parent?.readonly || rawSchema.readonly\n const disabled = parent?.disabled || rawSchema.disabled\n\n // Strip unknown properties from the schema\n const schema = useMemo(() => {\n return validateSchema({ ...rawSchema, readonly, disabled })\n }, [rawSchema.id, name, label, required, instructions, defaultValue, readonly, disabled, width, options])\n\n // Fall back to the schema default when no value is set\n if (value === undefined) value = defaultValue\n\n const id = useId()\n\n // Report state changes to the form's path keyed maps\n const parentReport = useContext(FieldReportContext)\n\n // State injected from outside, e.g. a server validation report, shown for\n // this field until it next reports its own state\n const injection = useContext(FieldInjectionContext)\n const injectionKey = useMemo(() => {\n return (parentReport ? parentReport.resolve([name]) : [name]).join('.')\n }, [parentReport, name])\n\n const setValue = useCallback(\n (newValue: SetStateAction<Context['value']>) => {\n if (typeof newValue === 'function') newValue = newValue(value)\n if (onValueChange && !isEqual(value, newValue)) {\n onValueChange(newValue)\n }\n },\n [value, onValueChange],\n )\n\n const setMessages = useCallback(\n (newMessages: SetStateAction<Context['messages']>) => {\n if (typeof newMessages === 'function') newMessages = newMessages(messages)\n if (!isEqual(messages, newMessages)) {\n if (onMessagesChange) onMessagesChange(newMessages)\n if (parentReport) parentReport.report([name], { messages: newMessages })\n if (injection) injection.clear(injectionKey)\n }\n },\n [messages, onMessagesChange, parentReport, name, injection, injectionKey],\n )\n\n const setValid = useCallback(\n (newValid: SetStateAction<Context['valid']>) => {\n if (typeof newValid === 'function') newValid = newValid(valid)\n if (!isEqual(valid, newValid)) {\n if (onValidityChange) onValidityChange(newValid)\n if (parentReport) parentReport.report([name], { valid: newValid })\n if (injection) injection.clear(injectionKey)\n }\n },\n [valid, onValidityChange, parentReport, name, injection, injectionKey],\n )\n\n const handleValidation = useCallback(\n ({ isValid, value, messages }: InputValidationResponse) => {\n setValid(isValid)\n setMessages(messages)\n setValue(value)\n },\n [setValue, setMessages, setValid],\n )\n\n // Re-validate exactly once per form wide validation pass, reading the\n // latest state from a ref so container inputs that aggregate their own\n // validity afterwards are not overwritten\n const staticContext = useContext(FormStaticContext)\n const validationCounter = staticContext?.validationCounter || 0\n\n const latest = useRef({ value, schema, validate, handleValidation })\n latest.current = { value, schema, validate, handleValidation }\n\n useEffect(() => {\n const { value, schema, validate, handleValidation } = latest.current\n if (validationCounter >= 1 && validate) {\n handleValidation(validate(value, schema))\n }\n }, [validationCounter])\n\n // Remove the field's entries from the form's path keyed maps when it\n // unmounts or its path changes\n useEffect(() => {\n if (!parentReport) return\n return () => parentReport.report([name], undefined)\n }, [parentReport, name])\n\n // Nest children's reports and path resolution under this field's name\n const childReport = useMemo<FieldReportContextValue | undefined>(() => {\n if (!parentReport) return undefined\n return {\n report: (path, patch) => parentReport.report([name, ...path], patch),\n resolve: (path) => parentReport.resolve([name, ...path]),\n }\n }, [parentReport, name])\n\n // Injected state wins until the field reports for itself\n const displayMessages = injection && injectionKey in injection.messages ? injection.messages[injectionKey] : messages\n const displayValid = injection && injectionKey in injection.validity ? injection.validity[injectionKey] : valid\n\n // Accessibility wiring for the input itself\n const labelId = `${id}-label`\n const messagesId = `${id}-messages`\n const instructionsId = `${id}-instructions`\n\n const aria = useMemo(() => {\n const describedBy = [displayMessages.length > 0 ? messagesId : null, instructions ? instructionsId : null]\n .filter(Boolean)\n .join(' ')\n\n return {\n 'aria-describedby': describedBy || undefined,\n 'aria-invalid': displayValid === false || undefined,\n }\n }, [displayMessages, messagesId, instructions, instructionsId, displayValid])\n\n const contextValue = useMemo(() => {\n return {\n id,\n labelId,\n aria,\n schema,\n name,\n label,\n required,\n instructions,\n defaultValue,\n readonly,\n disabled,\n width,\n options: options || {},\n\n value,\n messages,\n valid,\n\n setValue,\n setMessages,\n setValid,\n\n handleValidation,\n }\n }, [id, labelId, aria, schema, value, messages, valid, setValue, setMessages, setValid, handleValidation])\n\n const isValid = displayValid === true\n const isInvalid = displayValid === false\n\n return (\n <FieldContext.Provider value={contextValue}>\n <FieldReportContext.Provider value={childReport}>\n <div style={{ width: width ? `${width}%` : '100%' }}>\n <div className={`sorlo-field${isValid ? ' sorlo-valid' : ''}${isInvalid ? ' sorlo-invalid' : ''}`}>\n <div className='sorlo-meta'>\n {label && (\n <label className='sorlo-label' id={labelId} htmlFor={id}>\n {label}\n {required && <span aria-hidden='true'>*</span>}\n </label>\n )}\n {instructions && (\n <div className='sorlo-instructions' id={instructionsId}>\n {instructions}\n </div>\n )}\n </div>\n {displayMessages.length > 0 && (\n <ul className='sorlo-messages' id={messagesId} role='alert'>\n {displayMessages.map((message, messageIndex) => {\n return <li key={messageIndex}>{message}</li>\n })}\n </ul>\n )}\n {children}\n </div>\n </div>\n </FieldReportContext.Provider>\n </FieldContext.Provider>\n )\n}\n","import en from './en'\n\nexport { en }\n","export default {\n translation: {\n validation: {\n invalid: 'Invalid value.',\n required: 'This field is required.',\n minLength: 'This field requires a minimum of {{min}} character(s).',\n maxLength: 'This field requires a maximum of {{max}} character(s).',\n min: 'This field requires a minimum value of {{min}}.',\n max: 'This field requires a maximum value of {{max}}.',\n email: 'A valid email address required.',\n emailMultiple: 'One or more email address(es) is invalid.',\n url: 'A valid URL required.',\n tel: 'A valid phone number required.',\n identifier: 'A valid identifier required, e.g. {{example}}.',\n identifierStart: 'This field must start with a letter.',\n color: 'A valid color required.',\n date: 'A valid date required.',\n time: 'A valid time required.',\n datetime: 'A valid date and time required.',\n selection: 'At least one selection is required.',\n choice: 'A valid choice required.',\n minItems: 'This field requires a minimum of {{min}} item(s).',\n maxItems: 'This field requires a maximum of {{max}} item(s).',\n minRows: 'This field requires a minimum of {{min}} row(s).',\n maxRows: 'This field requires a maximum of {{max}} row(s).',\n minColumns: 'This field requires a minimum of {{min}} column(s).',\n maxColumns: 'This field requires a maximum of {{max}} column(s).',\n },\n ui: {\n cancel: 'Cancel',\n save: 'Save',\n close: 'Close',\n delete: 'Delete',\n moveUp: 'Move up',\n moveDown: 'Move down',\n addRow: 'Add row',\n removeRow: 'Remove row',\n addColumn: 'Add column',\n removeColumn: 'Remove column',\n addBlock: 'Add {{layout}}',\n invalidFieldType: 'Invalid field type.',\n conditions: {\n field: 'Field',\n operator: 'Operator',\n value: 'Value',\n // Read after a column's name, e.g. \"Operator for rule 2 of group 1\"\n ofRule: 'for rule {{rule}} of group {{group}}',\n group: 'Group {{group}}',\n and: 'And',\n or: 'Or',\n addRule: 'Add a rule',\n addRuleAfter: 'And: add a rule after rule {{rule}} of group {{group}}',\n addGroup: 'Or: add a group',\n removeRule: 'Remove rule {{rule}} of group {{group}}',\n select: 'Select…',\n yes: 'Yes',\n no: 'No',\n example: 'e.g. {{example}}',\n // How formatted conditions join rules and groups, e.g. \"Category equals News and Spam equals No, or …\"\n joinRules: ' and ',\n joinGroups: ', or ',\n },\n operators: {\n equals: 'equals',\n notEquals: 'does not equal',\n contains: 'contains',\n notContains: 'does not contain',\n startsWith: 'starts with',\n greaterThan: 'is greater than',\n lessThan: 'is less than',\n empty: 'is empty',\n notEmpty: 'is not empty',\n // greaterThan and lessThan on dates\n after: 'is after',\n before: 'is before',\n },\n },\n },\n}\n","import * as resources from '@/translations'\nimport i18next, { type i18n as I18n } from 'i18next'\n\n// Its own instance, without react-i18next, whose default instance and defaults belong to a host sharing its copy\nconst i18n: I18n = i18next.createInstance()\n\ni18n.init({\n resources: resources,\n lng: 'en',\n fallbackLng: 'en',\n interpolation: { escapeValue: false },\n})\n\nexport const { t } = i18n\nexport default i18n\n","import Field, {\n OnMessagesChangeCallback as OnFieldMessagesChangeCallback,\n OnValidityChangeCallback as OnFieldValidityChangeCallback,\n OnValueChangeCallback as OnFieldValueChangeCallback,\n} from '@/components/Field'\nimport { FieldScopeContext, useFormStaticContext } from '@/context/FormProvider'\nimport { t } from '@/i18n'\nimport { FieldMessages, FieldSchema } from '@/types/fields'\nimport { InputComponent, InputValidateValue } from '@/types/inputs'\nimport { evaluateConditions } from '@/utils/conditions'\nimport { conditionScope, resolveValidateValue } from '@/utils/inputs'\nimport { memo, useCallback, useContext } from 'react'\n\nexport type OnValuesChangeCallback = (field: string, value: any) => void\nexport type OnMessagesChangeCallback = (field: string, messages: FieldMessages) => void\nexport type OnValidityChangeCallback = (field: string, valid: boolean | undefined) => void\n\nexport interface FieldsetProps {\n schema: Array<FieldSchema>\n values?: Record<string, any>\n messages?: Record<string, FieldMessages>\n validity?: Record<string, boolean | undefined>\n onValuesChange?: OnValuesChangeCallback\n onMessagesChange?: OnMessagesChangeCallback\n onValidityChange?: OnValidityChangeCallback\n}\n\nexport default function Fieldset({\n schema,\n values = {},\n messages = {},\n validity = {},\n onValuesChange = () => {},\n onMessagesChange = () => {},\n onValidityChange = () => {},\n}: FieldsetProps) {\n const { inputs } = useFormStaticContext()\n\n // Hide fields whose conditions do not match the surrounding values\n const scopes = useContext(FieldScopeContext) || [conditionScope(schema, values, inputs)]\n\n return (\n <div className='sorlo-fieldset'>\n {schema.map((fieldSchema, fieldIndex) => {\n if (!evaluateConditions(fieldSchema, scopes)) return null\n\n return (\n <FieldsetItem\n key={fieldSchema.name ?? fieldIndex}\n schema={fieldSchema}\n component={inputs?.[fieldSchema.type]?.default}\n validate={resolveValidateValue(inputs?.[fieldSchema.type], 'client')}\n value={values[fieldSchema.name]}\n messages={messages[fieldSchema.name]}\n valid={validity[fieldSchema.name]}\n onValuesChange={onValuesChange}\n onMessagesChange={onMessagesChange}\n onValidityChange={onValidityChange}\n />\n )\n })}\n </div>\n )\n}\n\n// Memoised so a field only re-renders when its own schema or state changes\nconst FieldsetItem = memo(function FieldsetItem({\n schema,\n component: Component,\n validate,\n value,\n messages,\n valid,\n onValuesChange = () => {},\n onMessagesChange = () => {},\n onValidityChange = () => {},\n}: {\n schema: FieldSchema\n component?: InputComponent\n validate?: InputValidateValue\n value?: any\n messages?: FieldMessages\n valid?: boolean\n onValuesChange?: OnValuesChangeCallback\n onMessagesChange?: OnMessagesChangeCallback\n onValidityChange?: OnValidityChangeCallback\n}) {\n const { type, ...fieldProps } = schema\n\n const onValueChangeHandler: OnFieldValueChangeCallback = useCallback(\n (value) => {\n onValuesChange(schema.name, value)\n },\n [onValuesChange, schema.name],\n )\n\n const onMessagesChangeHandler: OnFieldMessagesChangeCallback = useCallback(\n (messages) => {\n onMessagesChange(schema.name, messages)\n },\n [onMessagesChange, schema.name],\n )\n\n const onValidityChangeHandler: OnFieldValidityChangeCallback = useCallback(\n (validity) => {\n onValidityChange(schema.name, validity)\n },\n [onValidityChange, schema.name],\n )\n\n return (\n <Field\n {...fieldProps}\n value={value}\n messages={messages}\n valid={valid}\n validate={validate}\n onValueChange={onValueChangeHandler}\n onMessagesChange={onMessagesChangeHandler}\n onValidityChange={onValidityChangeHandler}\n >\n {Component && <Component />}\n {!Component && t('ui.invalidFieldType')}\n </Field>\n )\n})\n","import * as boolean from './Boolean'\nimport * as checkbox from './Checkbox'\nimport * as color from './Color'\nimport * as conditions from './Conditions'\nimport * as content from './Content'\nimport * as date from './Date'\nimport * as datetime from './Datetime'\nimport * as email from './Email'\nimport * as flexible from './Flexible'\nimport * as group from './Group'\nimport * as hidden from './Hidden'\nimport * as identifier from './Identifier'\nimport * as matrix from './Matrix'\nimport * as number from './Number'\nimport * as password from './Password'\nimport * as radio from './Radio'\nimport * as range from './Range'\nimport * as repeater from './Repeater'\nimport * as schemabuilder from './SchemaBuilder'\nimport * as select from './Select'\nimport * as tel from './Tel'\nimport * as text from './Text'\nimport * as textarea from './Textarea'\nimport * as time from './Time'\nimport * as url from './Url'\n\nexport {\n boolean,\n checkbox,\n color,\n conditions,\n content,\n date,\n datetime,\n email,\n flexible,\n group,\n hidden,\n identifier,\n matrix,\n number,\n password,\n radio,\n range,\n repeater,\n schemabuilder,\n select,\n tel,\n text,\n textarea,\n time,\n url,\n}\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Boolean (True / False)'\n\nexport const description: InputDescription = () => 'A toggle that allows you to pick a value of true or false.'\n\nexport const category: InputCategory = () => 'Choice'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'message',\n label: 'Message',\n type: 'text',\n required: true,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // 'on' is what a browser posts for a checked box without a value attribute\n value = [true, 1, 'yes', '1', 'true', 'on'].includes(typeof value === 'string' ? value.trim().toLowerCase() : value)\n\n // A required boolean must be checked\n if (schema.required && !value) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'boolean'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? (validation.value ? 'TRUE' : 'FALSE') : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = false, handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__boolean'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='checkbox'\n checked={!!value}\n onChange={(event) => doValidation(event.target.checked)}\n required={required}\n disabled={disabled || readonly}\n />\n <label htmlFor={id}>{options?.message}</label>\n </div>\n )\n}\n\nexport default Component\n","import i18n from '@/i18n'\nimport { InputSchema } from '@/types/inputs'\n\n// Resolve a validation message, preferring a per field override from the\n// schema's options.messages over the built in translations, e.g.\n// options: { messages: { required: 'Please enter your work email' } }\nexport function validationMessage(schema: InputSchema, key: string, params?: Record<string, any>): string {\n const override = schema.options?.messages?.[key]\n\n if (typeof override === 'string') {\n return Object.entries(params || {}).reduce((message, [name, value]) => {\n return message.replaceAll(`{{${name}}}`, String(value))\n }, override)\n }\n\n return i18n.t(`validation.${key}`, params)\n}\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { literalUnion } from '@/utils/typescript'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Checkbox (Multiple choice)'\n\nexport const description: InputDescription = () => 'A list of checkboxes with a selection of choices that you specify.'\n\nexport const category: InputCategory = () => 'Choice'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'choices',\n label: 'Choices',\n type: 'repeater',\n required: true,\n options: {\n minimum: 1,\n fields: [\n {\n name: 'value',\n label: 'Value',\n type: 'text',\n required: true,\n width: 50,\n },\n {\n name: 'label',\n label: 'Label',\n type: 'text',\n required: false,\n width: 50,\n },\n ],\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty selection\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'selection'))\n }\n\n if (!Array.isArray(value)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Checkboxes keep the choices' own values\n const choices: Array<any> = schema.options?.choices || []\n if (!value.every((item) => choices.some((choice) => choice.value === item))) {\n return validationError(value, validationMessage(schema, 'choice'))\n }\n\n return validationSuccess(value)\n}\n\n// Checkboxes keep the choices' own values\nexport const typeValue: InputTypeValue = (schema) => {\n const choices: Array<any> = schema.options?.choices || []\n return `Array<${literalUnion(choices.map((choice) => choice.value))}>`\n}\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, labelId, aria, schema, readonly, disabled, options, value, handleValidation } = useFieldContext()\n\n const selected: Array<any> = Array.isArray(value) ? value : []\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n const handleOnChange = useCallback(\n (choiceValue: any, checked: boolean) => {\n doValidation(checked ? [...selected, choiceValue] : selected.filter((item) => item !== choiceValue))\n },\n [doValidation, selected],\n )\n\n const choices: Array<any> = options?.choices || []\n\n return (\n <div className='sorlo-input__checkbox' role='group' aria-labelledby={labelId} {...aria}>\n {choices.map((choice, choiceIndex) => {\n return (\n <div key={choiceIndex}>\n <input\n className='sorlo-input'\n id={`${id}-${choiceIndex}`}\n type='checkbox'\n value={choice.value}\n checked={selected.includes(choice.value)}\n onChange={(event) => handleOnChange(choice.value, event.target.checked)}\n disabled={disabled || readonly}\n />\n <label htmlFor={`${id}-${choiceIndex}`}>{choice.label ?? choice.value.toString()}</label>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport { FieldScopeContext } from '@/context/FormProvider'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { resolveConditionValue } from '@/utils/conditions'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport deburr from 'lodash/deburr.js'\nimport upperFirst from 'lodash/upperFirst.js'\nimport { useCallback, useContext, useEffect, useRef } from 'react'\n\nexport const name: InputName = () => 'Identifier'\n\nexport const description: InputDescription = () =>\n 'A URL or code friendly name, such as a slug or API key, optionally generated from another field until it is edited.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'source',\n label: 'Generate from field',\n type: 'text',\n required: false,\n options: {\n placeholder: 'e.g. title',\n },\n },\n {\n name: 'format',\n label: 'Format',\n type: 'select',\n required: false,\n width: 50,\n options: {\n choices: [\n {\n value: 'kebab',\n label: 'Kebab case (my-page)',\n },\n {\n value: 'snake',\n label: 'Snake case (my_page)',\n },\n {\n value: 'camel',\n label: 'Camel case (myPage)',\n },\n {\n value: 'pascal',\n label: 'Pascal case (MyPage)',\n },\n {\n value: 'mixed',\n label: 'Mixed case (FirstName, utm_source)',\n },\n ],\n },\n },\n {\n name: 'unicode',\n label: 'Non-Latin letters',\n type: 'boolean',\n required: false,\n width: 50,\n options: {\n message: 'Keep letters from other scripts, e.g. 東京',\n },\n },\n ]\n}\n\nconst formats = ['kebab', 'snake', 'camel', 'pascal', 'mixed'] as const\n\ntype Format = (typeof formats)[number]\n\n// Mixed accepts any of the code styles but generates snake case\nconst separators: Record<Format, string> = { kebab: '-', snake: '_', camel: '', pascal: '', mixed: '_' }\n\nconst formatOf = (options?: Record<string, any>): Format =>\n formats.includes(options?.format) ? options?.format : 'kebab'\n\n// Words of letters and numbers, cased and joined for the format, e.g. 'Crème brûlée!' becomes 'creme-brulee'\n// shortcut: other scripts are kept or dropped but never romanised, add a transliteration option when a site needs romanised identifiers\nexport function formatIdentifier(text: string, format: Format = 'kebab', unicode = false) {\n // Strip accents from Latin letters only, so letters such as the Cyrillic й keep their marks\n let plain = deburr(\n text\n .normalize('NFD')\n .replace(/(\\p{Script=Latin})\\p{M}+/gu, '$1')\n .normalize('NFC'),\n )\n\n // The code styles keep the words of an existing camel or Pascal case name, e.g. emailOptIn\n if (format !== 'kebab') {\n plain = plain.replace(/(\\p{Lu}\\p{Ll})/gu, ' $1').replace(/(\\p{Ll})(\\p{Lu})/gu, '$1 $2')\n }\n\n const words = plain\n .split(unicode ? /[^\\p{L}\\p{M}\\p{N}]+/u : /[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((word) => word.toLowerCase())\n\n if (format === 'camel') return words.map((word, index) => (index ? upperFirst(word) : word)).join('')\n if (format === 'pascal') return words.map(upperFirst).join('')\n return words.join(separators[format])\n}\n\n// Whether a value is shaped like the formatter's output: allowed words, joined and cased for the format\nfunction matchesFormat(value: string, format: Format, unicode: boolean) {\n const letters = unicode ? '\\\\p{L}\\\\p{M}\\\\p{N}' : 'a-zA-Z0-9'\n\n // Any case and any underscores, as in imported names like FirstName or utm_source__c\n if (format === 'mixed') return new RegExp(`^[${letters}_]+$`, 'u').test(value)\n\n const word = `[${letters}]+`\n const separator = separators[format]\n const pattern = separator ? `^${word}(?:${separator}${word})*$` : `^${word}$`\n if (!new RegExp(pattern, 'u').test(value)) return false\n\n // Compare with the case the formatter gives, so letters without case suit every format\n const [first] = value\n if (format === 'camel') return first === first.toLowerCase()\n if (format === 'pascal') return first === first.toUpperCase()\n return value === value.toLowerCase()\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n const format = formatOf(schema.options)\n if (!matchesFormat(value, format, schema.options?.unicode === true)) {\n const example = formatIdentifier('my page', format)\n return validationError(value, validationMessage(schema, 'identifier', { example }))\n }\n\n // Only kebab, the URL style, may start with a digit\n if (format !== 'kebab' && !/^\\p{L}/u.test(value)) {\n return validationError(value, validationMessage(schema, 'identifierStart'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n const format = formatOf(options)\n const unicode = options?.unicode === true\n\n // Resolve the source like a condition's field, nearest value scope first\n const scopes = useContext(FieldScopeContext)\n const source = options?.source ? resolveConditionValue(String(options.source), scopes || []) : undefined\n const sourceText = typeof source === 'string' || typeof source === 'number' ? String(source) : ''\n const sourceValue = formatIdentifier(sourceText, format, unicode)\n\n // The value last generated from the source, the field stops following once it holds anything else\n const generated = useRef<string | undefined>(undefined)\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n const update = (next: string, fromSource = false) => {\n if (fromSource) generated.current = next\n if (next !== value) doValidation(next)\n }\n\n // Runs only when the source changes, following it while the field is empty or still generated\n useEffect(() => {\n if (isEmptyValue(value) || value === generated.current) update(sourceValue, true)\n }, [sourceValue])\n\n // An emptied field picks the source back up, and an invalid value is tidied into the format\n const onBlur = () => {\n if (isEmptyValue(value)) update(sourceValue, true)\n else if (!validateValue(value, schema).isValid) update(formatIdentifier(String(value), format, unicode))\n }\n\n return (\n <div className='sorlo-input__identifier'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='text'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n onBlur={onBlur}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n />\n </div>\n )\n}\n\nexport default Component\n","import { formatIdentifier } from '@/inputs/Identifier'\nimport { FieldSchema } from '@/types/fields'\nimport { Input, InputTypeFields } from '@/types/inputs'\nimport { normaliseConditions } from '@/utils/conditions'\n\n// A union of literal types, e.g. '\"red\" | \"blue\"', or never when there are no values\nexport const literalUnion = (values: Array<any>) => values.map((value) => JSON.stringify(value)).join(' | ') || 'never'\n\n// Quote names that aren't plain identifiers, e.g. \"0-1/firstname\"\nconst propertyName = (name: string) => (/^[A-Za-z_$][\\w$]*$/.test(name) ? name : JSON.stringify(name))\n\n// Write a TypeScript declaration for a schema's values, letting each input type its own value\nexport function schemaToTypeScript(\n schema: Array<FieldSchema>,\n inputs: Record<string, Input>,\n options: { name: string },\n) {\n const typeName = formatIdentifier(options.name, 'pascal')\n if (!/^[A-Za-z]/.test(typeName)) throw new Error(`'${options.name}' does not make a valid type name`)\n\n const typeFields: InputTypeFields = (fields) => {\n const properties = fields.flatMap((field) => {\n const input = inputs?.[field.type]\n const type = input?.typeValue ? input.typeValue(field, typeFields) : 'unknown'\n\n // Inputs without a value, such as content, have no property\n if (type === undefined) return []\n\n // Fields that conditions can hide may be missing, like optional ones\n const optional = !field.required || normaliseConditions(field).length > 0\n return [` ${propertyName(field.name)}${optional ? '?' : ''}: ${type.replace(/\\n/g, '\\n ')}`]\n })\n\n return properties.length ? `{\\n${properties.join('\\n')}\\n}` : '{}'\n }\n\n return `export type ${typeName} = ${typeFields(schema)}`\n}\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Color'\n\nexport const description: InputDescription = () => 'A color picker that stores a hex value.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return []\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string' || !/^#[0-9a-fA-F]{6}$/.test(value)) {\n return validationError(value, validationMessage(schema, 'color'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, value = '#000000', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__color'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='color'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n disabled={disabled || readonly}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport { FieldInjectionContext, FieldPath, FieldReportContext, useFormStaticContext } from '@/context/FormProvider'\nimport i18n, { t } from '@/i18n'\nimport { ConditionOperator, FieldSchema } from '@/types/fields'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputRenderValue,\n InputTypeValue,\n InputValidateChildren,\n InputValidateValue,\n ValidationReport,\n} from '@/types/inputs'\nimport { normaliseConditions } from '@/utils/conditions'\nimport { validateSchema, validateValues } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { literalUnion } from '@/utils/typescript'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport isEqual from 'lodash/isEqual.js'\nimport { Fragment, useContext, useEffect, useMemo, useRef } from 'react'\n\ntype Rule = Record<string, any>\n\n// A value rules can test, listed in the fieldChoices option. Its type picks the operators and the value's control,\n// and choices make the value a select.\ninterface FieldChoice {\n value: string\n label?: string\n type?: 'text' | 'number' | 'date' | 'boolean'\n choices?: Array<{ value: any; label?: string }>\n example?: string\n}\n\nexport const name: InputName = () => 'Conditions'\n\nexport const description: InputDescription = () =>\n 'Rules joined by AND and OR, in the shape conditional logic takes, such as for when to show something.'\n\nexport const category: InputCategory = () => 'Choice'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'fieldChoices',\n label: 'Fields',\n type: 'repeater',\n required: false,\n instructions: 'What rules can test, each a dotted path such as address.town. Without any, rules type their own.',\n options: {\n fields: [\n { name: 'value', label: 'Path', type: 'text', required: true, width: 25 },\n { name: 'label', label: 'Label', type: 'text', required: false, width: 25 },\n {\n name: 'type',\n label: 'Type',\n type: 'select',\n required: false,\n width: 25,\n options: {\n placeholder: 'Text',\n choices: [\n { value: 'number', label: 'Number' },\n { value: 'date', label: 'Date' },\n { value: 'boolean', label: 'Yes or no' },\n ],\n },\n },\n { name: 'example', label: 'Example', type: 'text', required: false, width: 25 },\n ],\n },\n },\n ]\n}\n\nconst operators: Array<ConditionOperator> = [\n 'equals',\n 'notEquals',\n 'contains',\n 'notContains',\n 'startsWith',\n 'greaterThan',\n 'lessThan',\n 'empty',\n 'notEmpty',\n]\n\n// The operators that suit each type of value\nconst operatorsByType: Record<string, Array<ConditionOperator>> = {\n text: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'empty', 'notEmpty'],\n number: ['equals', 'notEquals', 'greaterThan', 'lessThan', 'empty', 'notEmpty'],\n date: ['equals', 'notEquals', 'greaterThan', 'lessThan', 'empty', 'notEmpty'],\n boolean: ['equals', 'notEquals'],\n // Contains finds one of a checkbox's choices\n choices: ['equals', 'notEquals', 'contains', 'notContains', 'empty', 'notEmpty'],\n}\n\n// empty and notEmpty test the field alone\nconst takesValue = (operator: unknown) => operator !== 'empty' && operator !== 'notEmpty'\n\nconst fieldChoicesOf = (options?: Record<string, any>): undefined | Array<FieldChoice> => {\n return options?.fieldChoices?.length ? options.fieldChoices : undefined\n}\n\n// A listed field's operators, or all nine for a field that isn't listed\nconst operatorsFor = (choice?: FieldChoice) => {\n if (!choice) return operators\n if (choice.choices?.length) return operatorsByType.choices\n return operatorsByType[choice.type || 'text'] || operatorsByType.text\n}\n\n// An operator's words, which read \"is after\" and \"is before\" for dates\nconst operatorLabel = (operator: string, choice?: FieldChoice) => {\n const dated = choice?.type === 'date' && !choice.choices?.length\n if (dated && operator === 'greaterThan') return i18n.t('ui.operators.after')\n if (dated && operator === 'lessThan') return i18n.t('ui.operators.before')\n return operators.includes(operator as ConditionOperator) ? i18n.t(`ui.operators.${operator}`) : String(operator)\n}\n\n// Values compare as text, which the schema builder always saved them as, so a saved true or 18 shows as 'true' or '18'\nconst asText = (value: any): string => {\n if (value == null) return ''\n return typeof value === 'object' ? JSON.stringify(value) : String(value)\n}\n\n// The rules of each group. Conditions written in another shape core accepts, such as a flat list, show as groups too.\nconst groupsOf = (value: any): Array<Array<Rule>> => {\n if (!Array.isArray(value)) return []\n return normaliseConditions({ type: 'conditions', name: 'conditions', conditions: value }).map((rules) =>\n rules.map((rule) => (rule !== null && typeof rule === 'object' ? rule : {})),\n )\n}\n\n// A rule's value checked as a core field, which also picks the control it's shown in\nconst valueField = (choice?: FieldChoice): Omit<FieldSchema, 'name'> => {\n if (choice?.choices?.length) return { type: 'select', options: { choices: choice.choices } }\n if (choice?.type === 'boolean') {\n const yesNo = [\n { value: 'true', label: i18n.t('ui.conditions.yes') },\n { value: 'false', label: i18n.t('ui.conditions.no') },\n ]\n return { type: 'select', options: { choices: yesNo } }\n }\n if (choice?.type === 'number' || choice?.type === 'date') return { type: choice.type }\n return { type: 'text' }\n}\n\n// A rule's field, operator and value as core fields: a field from fieldChoices, an operator that suits it, and a\n// value it can hold. From a list, the operator and value wait for the field.\nconst ruleFields = (rule: Rule, options?: Record<string, any>): Array<FieldSchema> => {\n const fieldChoices = fieldChoicesOf(options)\n const choice = fieldChoices?.find((item) => item.value === rule.field)\n const waiting = !!fieldChoices && isEmptyValue(rule.field)\n\n return [\n fieldChoices\n ? {\n name: 'field',\n type: 'select',\n required: true,\n options: { choices: fieldChoices.map((item) => ({ value: item.value, label: item.label })) },\n }\n : { name: 'field', type: 'text', required: true },\n {\n name: 'operator',\n type: 'select',\n required: !waiting,\n disabled: waiting,\n options: { choices: operatorsFor(choice).map((value) => ({ value, label: operatorLabel(value, choice) })) },\n },\n ...(takesValue(rule.operator)\n ? [{ name: 'value', ...valueField(choice), required: !waiting, disabled: waiting }]\n : []),\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional, as no conditions match everything\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n // Every group holds rules, as a group of none would always match\n const isRule = (rule: any) => rule !== null && typeof rule === 'object' && !Array.isArray(rule)\n const isGroup = (group: any) => Array.isArray(group?.rules) && group.rules.length >= 1 && group.rules.every(isRule)\n if (!Array.isArray(value) || !value.every(isGroup)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // validateChildren checks each rule, so its messages sit under its controls\n return validationSuccess(value)\n}\n\n// A group's rules nest under rules, as a repeater's items would, so their messages are keyed like\n// conditions.0.rules.1.value\nconst groupReport = (reports: Array<ValidationReport>): ValidationReport => {\n const isValid = reports.every((report) => report.isValid)\n return { isValid, fields: { rules: { isValid, messages: [], children: reports } } }\n}\n\nexport const validateChildren: InputValidateChildren = (value, schema, validateFields) => {\n return groupsOf(value).map((rules) => {\n const reports = rules.map((rule) =>\n validateFields(ruleFields(rule, schema.options), { ...rule, value: asText(rule.value) }),\n )\n\n // On the server validateFields may return promises, so the group's report waits for them\n return reports.some((report) => report instanceof Promise)\n ? Promise.all(reports).then(groupReport)\n : groupReport(reports as Array<ValidationReport>)\n })\n}\n\n// Keep only each rule's field, operator and value\nexport const pickValue: InputPickValue = (value) => {\n if (!Array.isArray(value)) return undefined\n return value.map((group) => ({\n rules: (Array.isArray(group?.rules) ? group.rules : []).map((rule: Rule) => ({\n field: rule?.field,\n operator: rule?.operator,\n ...(rule?.value !== undefined && { value: rule.value }),\n })),\n }))\n}\n\nexport const typeValue: InputTypeValue = () => {\n return `Array<{ rules: Array<{ field: string; operator: ${literalUnion(operators)}; value?: unknown }> }>`\n}\n\n// Reads as a sentence, e.g. \"Category equals News and Featured equals Yes, or Spam equals No\"\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n if (!validation.isValid) return null\n\n const describe = (rule: Rule) => {\n const choice = fieldChoicesOf(schema.options)?.find((item) => item.value === rule.field)\n const valuePart = ruleFields(rule, schema.options).find((field) => field.name === 'value')\n const chosen = valuePart?.options?.choices?.find((item: any) => String(item.value) === asText(rule.value))\n const words = [choice?.label || rule.field, operatorLabel(rule.operator, choice)]\n return [...words, valuePart && (chosen?.label ?? asText(rule.value))].filter(Boolean).join(' ')\n }\n\n return groupsOf(value)\n .map((rules) => rules.map(describe).join(i18n.t('ui.conditions.joinRules')))\n .join(i18n.t('ui.conditions.joinGroups'))\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\n// One of a rule's controls, with its label, the hint under a value, and its messages under it\nfunction RuleControl({\n id,\n column,\n context,\n field,\n value,\n messages,\n valid,\n hint,\n readonly,\n disabled,\n onChange,\n}: {\n id: string\n column: string\n context: string\n field: FieldSchema\n value: string\n messages: Array<string>\n valid?: boolean\n hint?: string\n readonly?: boolean\n disabled?: boolean\n onChange: (value: string) => void\n}) {\n const choices: undefined | Array<{ value: any; label?: string }> = field.options?.choices\n const describedBy = [messages.length >= 1 && `${id}-messages`, hint && `${id}-hint`].filter(Boolean).join(' ')\n const control = {\n id,\n className: 'sorlo-input',\n value,\n 'aria-describedby': describedBy || undefined,\n 'aria-invalid': valid === false || undefined,\n }\n\n return (\n <div className={`sorlo-field ${valid === false ? 'sorlo-invalid' : 'sorlo-valid'}`}>\n <label className='sorlo-label' htmlFor={id}>\n {/* The space sits outside the hidden text, as some browsers trim the text inside it from the name */}\n {column} <span className='sorlo-visually-hidden'>{context}</span>\n </label>\n {choices ? (\n <select {...control} disabled={readonly || disabled} onChange={(event) => onChange(event.target.value)}>\n <option value=''>{t('ui.conditions.select')}</option>\n {/* A saved value that isn't one of the choices shows as it is, beside the message about it */}\n {value !== '' && !choices.some((choice) => String(choice.value) === value) && (\n <option value={value}>{value}</option>\n )}\n {choices.map((choice, choiceIndex) => (\n <option key={choiceIndex} value={String(choice.value)}>\n {choice.label ?? String(choice.value)}\n </option>\n ))}\n </select>\n ) : (\n <input\n {...control}\n // A date that isn't a plain one shows as text, as a date picker would hide it\n type={field.type === 'date' && (value === '' || /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) ? 'date' : 'text'}\n inputMode={field.type === 'number' ? 'decimal' : undefined}\n readOnly={readonly}\n disabled={disabled}\n onChange={(event) => onChange(event.target.value)}\n />\n )}\n {hint && (\n <div className='sorlo-instructions' id={`${id}-hint`}>\n {hint}\n </div>\n )}\n {messages.length >= 1 && (\n <ul className='sorlo-messages' id={`${id}-messages`} role='alert'>\n {messages.map((message, messageIndex) => (\n <li key={messageIndex}>{message}</li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nconst columns = ['field', 'operator', 'value'] as const\n\nconst Component: InputComponent = function () {\n const { id, labelId, label, aria, schema, options, readonly, disabled, value, setValue, setMessages, setValid } =\n useFieldContext()\n const { inputs, validationCounter } = useFormStaticContext()\n const report = useContext(FieldReportContext)\n const injection = useContext(FieldInjectionContext)\n const locked = readonly || disabled\n const root = useRef<HTMLDivElement>(null)\n\n const groups = useMemo(() => groupsOf(value), [value])\n const fieldChoices = fieldChoicesOf(options)\n\n // A control's path in the form, e.g. conditions.0.rules.1.value, which a server report keys its messages by\n const pathOf = (path: FieldPath) => report?.resolve(path).join('.')\n\n // Each control's field and what it says. Until the form validates, a rule shows what's wrong with it but not what\n // it's missing, as fields that haven't been filled in say nothing until then. A server report's messages show until\n // the rule changes.\n const shown = useMemo(() => {\n return groups.map((rules, groupIndex) =>\n rules.map((rule, ruleIndex) => {\n const fields = ruleFields(rule, options)\n const checked = validateValues(fields, { ...rule, value: asText(rule.value) }, inputs, {\n environment: 'client',\n allowIncomplete: validationCounter < 1,\n })\n\n return fields.map((field) => {\n const own = checked.fields[field.name]\n const key = report?.resolve([groupIndex, 'rules', ruleIndex, field.name]).join('.')\n const injected = key !== undefined && injection && key in injection.validity\n return injected\n ? { field, messages: injection.messages[key] || [], valid: injection.validity[key] }\n : { field, messages: own.messages, valid: own.isValid }\n })\n }),\n )\n }, [groups, options, inputs, validationCounter, report, injection])\n\n // Report every control's messages under its path, as nested fields do, removing the paths of rules that went\n const reportedPaths = useRef<Array<FieldPath>>([])\n useEffect(() => {\n if (!report) return\n const paths: Array<FieldPath> = []\n shown.forEach((rules, groupIndex) =>\n rules.forEach((parts, ruleIndex) => {\n for (const { field, messages, valid } of parts) {\n const path = [groupIndex, 'rules', ruleIndex, field.name]\n report.report(path, { messages, valid })\n paths.push(path)\n }\n }),\n )\n for (const path of reportedPaths.current) {\n if (!paths.some((other) => isEqual(other, path))) report.report(path, undefined)\n }\n reportedPaths.current = paths\n }, [report, shown])\n\n // And remove them all when the field goes, e.g. when its own conditions hide it\n useEffect(() => () => reportedPaths.current.forEach((path) => report?.report(path, undefined)), [report])\n\n // The field is invalid while any control is\n const validation = useMemo(() => (value !== undefined ? validateValue(value, schema) : null), [value, schema])\n const rulesValid = shown.every((rules) => rules.every((parts) => parts.every((part) => part.valid !== false)))\n\n useEffect(() => {\n if (!validation) return\n\n setMessages(validation.messages)\n\n if (validation.isValid === false || !rulesValid) {\n setValid(false)\n } else if (validation.isValid === true) {\n setValid(true)\n }\n }, [validation, rulesValid, setMessages, setValid])\n\n // Clear what a server report said under a path, e.g. a rule's, once it changes or moves\n const clearReported = (path: FieldPath) => {\n const prefix = pathOf(path)\n if (!injection || prefix === undefined) return\n for (const key of new Set([...Object.keys(injection.messages), ...Object.keys(injection.validity)])) {\n if (key.startsWith(`${prefix}.`)) injection.clear(key)\n }\n }\n\n // Groups are saved as { rules }, and a group goes with its last rule\n const write = (next: Array<Array<Rule>>) => {\n setValue(next.filter((rules) => rules.length >= 1).map((rules) => ({ rules })))\n }\n\n const changeRule = (groupIndex: number, ruleIndex: number, rule: Rule) => {\n clearReported([groupIndex, 'rules', ruleIndex])\n write(groups.map((rules, index) => (index === groupIndex ? rules.toSpliced(ruleIndex, 1, rule) : rules)))\n }\n\n // A field picked from the list keeps an operator that suits it, or starts at equals, and starts without a value\n const changePart = (groupIndex: number, ruleIndex: number, part: string, partValue: string) => {\n const rule = groups[groupIndex][ruleIndex]\n if (part !== 'field' || !fieldChoices) return changeRule(groupIndex, ruleIndex, { ...rule, [part]: partValue })\n\n const suits = operatorsFor(fieldChoices.find((choice) => choice.value === partValue)).includes(rule.operator)\n const operator = suits ? rule.operator : 'equals'\n changeRule(groupIndex, ruleIndex, partValue ? { field: partValue, operator } : { field: partValue })\n }\n\n // The control that takes focus once the rules change, by its rule's place among them all\n const focus = useRef<{ index: number; control: 'field' | 'remove' }>(undefined)\n\n useEffect(() => {\n const target = focus.current\n if (!target || !root.current) return\n focus.current = undefined\n\n const rules = root.current.querySelectorAll('.sorlo-input__conditions-rule')\n const rule = rules[Math.min(target.index, rules.length - 1)]\n const selector = target.control === 'field' ? '.sorlo-input' : '.sorlo-input__conditions-remove'\n\n // With no rules left, the button that adds one\n ;(rule?.querySelector<HTMLElement>(selector) ?? root.current.querySelector<HTMLElement>('button'))?.focus()\n }, [groups])\n\n const placeOf = (groupIndex: number, ruleIndex: number) => {\n return groups.slice(0, groupIndex).reduce((total, rules) => total + rules.length, 0) + ruleIndex\n }\n\n // Adding or removing a rule moves the rules after it, so what a server report said about them is cleared\n const restructure = (next: Array<Array<Rule>>, target: { index: number; control: 'field' | 'remove' }) => {\n clearReported([])\n focus.current = target\n write(next)\n }\n\n const addRule = (groupIndex: number, ruleIndex: number) => {\n restructure(\n groups.map((rules, index) => (index === groupIndex ? rules.toSpliced(ruleIndex + 1, 0, {}) : rules)),\n { index: placeOf(groupIndex, ruleIndex) + 1, control: 'field' },\n )\n }\n\n const addGroup = () => restructure([...groups, [{}]], { index: placeOf(groups.length, 0), control: 'field' })\n\n const removeRule = (groupIndex: number, ruleIndex: number) => {\n restructure(\n groups.map((rules, index) => (index === groupIndex ? rules.toSpliced(ruleIndex, 1) : rules)),\n { index: placeOf(groupIndex, ruleIndex), control: 'remove' },\n )\n }\n\n return (\n <div\n className='sorlo-input__conditions'\n ref={root}\n role='group'\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={aria['aria-describedby']}\n >\n {groups.length === 0 && (\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n addGroup()\n }}\n >\n {t('ui.conditions.addRule')}\n </button>\n )}\n {groups.length >= 1 && (\n // Each control's label names its column too, so screen readers skip these\n <div className='sorlo-input__conditions-head' aria-hidden='true'>\n {columns.map((column) => (\n <span className='sorlo-label' key={column}>\n {t(`ui.conditions.${column}`)}\n </span>\n ))}\n </div>\n )}\n {groups.map((rules, groupIndex) => (\n <Fragment key={groupIndex}>\n {groupIndex >= 1 && (\n <div className='sorlo-input__conditions-or'>\n <span>{t('ui.conditions.or')}</span>\n </div>\n )}\n <div\n className='sorlo-input__conditions-group'\n role='group'\n aria-label={t('ui.conditions.group', { group: groupIndex + 1 })}\n >\n {rules.map((rule, ruleIndex) => {\n const place = { rule: ruleIndex + 1, group: groupIndex + 1 }\n const choice = fieldChoices?.find((item) => item.value === rule.field)\n const last = groupIndex === groups.length - 1 && ruleIndex === rules.length - 1\n\n return (\n <Fragment key={ruleIndex}>\n {ruleIndex >= 1 && (\n <div className='sorlo-input__conditions-and'>\n <span>{t('ui.conditions.and')}</span>\n </div>\n )}\n <div className='sorlo-input__conditions-rule'>\n {columns.map((column) => {\n const part = shown[groupIndex][ruleIndex].find(({ field }) => field.name === column)\n\n // Without a value to compare, its column stays empty\n if (!part) return <div key={column} />\n\n return (\n <RuleControl\n key={column}\n id={`${id}-${groupIndex}-${ruleIndex}-${column}`}\n column={t(`ui.conditions.${column}`)}\n context={t('ui.conditions.ofRule', place)}\n field={part.field}\n value={asText(rule[column])}\n messages={part.messages}\n valid={part.valid}\n hint={\n column === 'value' && choice?.example\n ? t('ui.conditions.example', { example: choice.example })\n : undefined\n }\n readonly={readonly}\n disabled={disabled || part.field.disabled}\n onChange={(partValue) => changePart(groupIndex, ruleIndex, column, partValue)}\n />\n )\n })}\n <div className='sorlo-input__conditions-actions'>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n aria-label={t('ui.conditions.addRuleAfter', place)}\n onClick={(event) => {\n event.preventDefault()\n addRule(groupIndex, ruleIndex)\n }}\n >\n {t('ui.conditions.and')}\n </button>\n {last && (\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n aria-label={t('ui.conditions.addGroup')}\n onClick={(event) => {\n event.preventDefault()\n addGroup()\n }}\n >\n {t('ui.conditions.or')}\n </button>\n )}\n <button\n className='sorlo-button sorlo-input__conditions-remove'\n type='button'\n disabled={locked}\n aria-label={t('ui.conditions.removeRule', place)}\n onClick={(event) => {\n event.preventDefault()\n removeRule(groupIndex, ruleIndex)\n }}\n >\n ×\n </button>\n </div>\n </div>\n </Fragment>\n )\n })}\n </div>\n </Fragment>\n ))}\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputCoreFields,\n InputDescription,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputTypeValue,\n} from '@/types/inputs'\n\nexport const name: InputName = () => 'Content'\n\nexport const description: InputDescription = () => 'A block of read only content, useful for headings and instructions.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const coreFields: InputCoreFields = (defaultFields) => {\n return defaultFields.filter(({ name }) => ['name', 'label', 'width', 'conditions'].includes(name))\n}\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'content',\n label: 'Content',\n type: 'textarea',\n required: false,\n },\n ]\n}\n\n// Content has no value, so there is nothing to validate, format or render,\n// any posted value is dropped when picking, and it's left out of generated types\nexport const pickValue: InputPickValue = () => undefined\nexport const typeValue: InputTypeValue = () => undefined\n\nconst Component: InputComponent = function () {\n const { options } = useFieldContext()\n\n return <div className='sorlo-input__content'>{options?.content}</div>\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Date'\n\nexport const description: InputDescription = () => 'A date picker that stores an ISO date, e.g. 2026-01-15.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Minimum',\n name: 'min',\n type: 'date',\n required: false,\n width: 50,\n },\n {\n label: 'Maximum',\n name: 'max',\n type: 'date',\n required: false,\n width: 50,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string' || !/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || isNaN(Date.parse(value))) {\n return validationError(value, validationMessage(schema, 'date'))\n }\n\n // ISO dates compare lexicographically, so validate the range as strings\n const min = schema.options?.min\n if (typeof min === 'string' && min && value < min) {\n return validationError(value, validationMessage(schema, 'min', { min }))\n }\n\n const max = schema.options?.max\n if (typeof max === 'string' && max && value > max) {\n return validationError(value, validationMessage(schema, 'max', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n if (!validation.isValid) return null\n return validation.value ? new Date(validation.value).toLocaleDateString() : validation.value\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__date'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='date'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n min={options?.min}\n max={options?.max}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Date & Time'\n\nexport const description: InputDescription = () => 'A picker that stores a local date and time, e.g. 2026-01-15T13:30.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Minimum',\n name: 'min',\n type: 'datetime',\n required: false,\n width: 50,\n },\n {\n label: 'Maximum',\n name: 'max',\n type: 'datetime',\n required: false,\n width: 50,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (\n typeof value !== 'string' ||\n !/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2})?$/.test(value) ||\n isNaN(Date.parse(value))\n ) {\n return validationError(value, validationMessage(schema, 'datetime'))\n }\n\n // Local ISO datetimes compare lexicographically, so validate the range as strings\n const min = schema.options?.min\n if (typeof min === 'string' && min && value < min) {\n return validationError(value, validationMessage(schema, 'min', { min }))\n }\n\n const max = schema.options?.max\n if (typeof max === 'string' && max && value > max) {\n return validationError(value, validationMessage(schema, 'max', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n if (!validation.isValid) return null\n return validation.value ? new Date(validation.value).toLocaleString() : validation.value\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__datetime'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='datetime-local'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n min={options?.min}\n max={options?.max}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmail, isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Email'\n\nexport const description: InputDescription = () => 'A text input specifically designed for storing email addresses.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n {\n name: 'multiple',\n label: 'Multiple',\n type: 'boolean',\n required: false,\n options: {\n message: 'Allow multiple addresses',\n },\n },\n {\n name: 'minLength',\n label: 'Minimum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n name: 'maxLength',\n label: 'Maximum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 1,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n if (!schema.options?.multiple && !isEmail(value)) {\n return validationError(value, validationMessage(schema, 'email'))\n }\n\n // If input allows for multiple addresses\n // @link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#multiple\n if (schema.options?.multiple && value.split(/[ ,]+/).filter((item) => !isEmail(item)).length) {\n return validationError(value, validationMessage(schema, 'emailMultiple'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__email'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='email'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n minLength={options?.minLength}\n maxLength={options?.maxLength}\n placeholder={options?.placeholder}\n multiple={options?.multiple}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport Fieldset, { OnValidityChangeCallback, OnValuesChangeCallback } from '@/components/Fieldset'\nimport { t } from '@/i18n'\nimport { FieldSchema } from '@/types/fields'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputPrepareSchema,\n InputRenderValue,\n InputTypeValue,\n InputValidateChildren,\n InputValidateValue,\n} from '@/types/inputs'\nimport { createId, validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\n// A block holds its layout's field values plus _layout, the name of that layout\ntype Block = Record<string, any>\n\ninterface Layout {\n // A stable ID like a field's, e.g. lay_k3x9q2mz, while blocks keep naming their layout in _layout\n id?: string\n name: string\n label?: string\n fields?: Array<FieldSchema>\n}\n\nexport const name: InputName = () => 'Flexible content'\n\nexport const description: InputDescription = () =>\n 'Lets editors build content from blocks, each using one of a set of layouts with its own fields.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Layouts',\n name: 'layouts',\n type: 'repeater',\n required: true,\n options: {\n minimum: 1,\n fields: [\n {\n label: 'Label',\n name: 'label',\n type: 'text',\n required: true,\n width: 50,\n },\n {\n label: 'Name',\n name: 'name',\n type: 'identifier',\n required: true,\n width: 50,\n options: {\n source: 'label',\n format: 'snake',\n },\n },\n {\n label: 'Fields',\n name: 'fields',\n type: 'schemabuilder',\n },\n ],\n },\n },\n ]\n}\n\n// Give layouts added in the schema builder their IDs, keeping the IDs of existing ones\nexport const prepareSchema: InputPrepareSchema = (schema) => {\n const layouts: Array<Layout> = schema.options?.layouts\n if (!Array.isArray(layouts)) return schema\n\n const withIds = layouts.map((layout) => ({ ...layout, id: layout?.id || createId('lay') }))\n return { ...schema, options: { ...schema.options, layouts: withIds } }\n}\n\n// The field's layouts by name, skipping any without one\nconst layoutsOf = (options?: Record<string, any>): Map<string, Layout> => {\n const layouts: Array<Layout> = Array.isArray(options?.layouts) ? options.layouts : []\n return new Map(layouts.filter((layout) => layout?.name).map((layout) => [layout.name, layout] as const))\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n // Every block must use one of the field's layouts\n const layouts = layoutsOf(schema.options)\n if (!Array.isArray(value) || value.some((block) => !layouts.has(block?._layout))) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n return validationSuccess(value)\n}\n\n// Validate every block's fields against its own layout\nexport const validateChildren: InputValidateChildren = (value, schema, validateFields) => {\n const layouts = layoutsOf(schema.options)\n const blocks: Array<Block> = Array.isArray(value) ? value : []\n return blocks.map((block) => validateFields(layouts.get(block?._layout)?.fields || [], block || {}))\n}\n\n// Keep the blocks whose layout still exists, with only that layout's fields\nexport const pickValue: InputPickValue = (value, schema, pickFields) => {\n if (!Array.isArray(value)) return undefined\n const layouts = layoutsOf(schema.options)\n return value\n .filter((block) => layouts.has(block?._layout))\n .map((block) => ({ ...pickFields(layouts.get(block._layout)?.fields || [], block), _layout: block._layout }))\n}\n\n// A union of every layout's blocks, so checking _layout narrows a block to its layout's fields\nexport const typeValue: InputTypeValue = (schema, typeFields) => {\n const blocks = [...layoutsOf(schema.options).values()].map((layout) => {\n return `{ _layout: ${JSON.stringify(layout.name)} } & ${typeFields(layout.fields || [])}`\n })\n return `Array<${blocks.join(' | ') || 'never'}>`\n}\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? JSON.stringify(validation.value, null, 2) : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\n// A single block, rendered as a group of its layout's fields named by the\n// block's index so nested reports land under paths like 'blocks.0.title'\nfunction FlexibleBlock({\n index,\n layout,\n block,\n valid,\n setBlock,\n setBlockValid,\n}: {\n index: number\n layout: Layout\n block: Block\n valid?: boolean\n setBlock: OnValuesChangeCallback\n setBlockValid: OnValidityChangeCallback\n}) {\n const schema = useMemo<Array<FieldSchema>>(() => {\n return [\n {\n type: 'group',\n name: String(index),\n label: layout.label || layout.name,\n options: { fields: layout.fields || [] },\n },\n ]\n }, [index, layout])\n\n return (\n <Fieldset\n schema={schema}\n values={{ [index]: block }}\n validity={{ [index]: valid }}\n onValuesChange={setBlock}\n onValidityChange={setBlockValid}\n />\n )\n}\n\nconst Component: InputComponent = function () {\n const { schema, options, readonly, disabled, value, setValue, setMessages, setValid } = useFieldContext()\n const locked = readonly || disabled\n\n const [blockValidity, setBlockValidity] = useState<Record<string, boolean | undefined>>({})\n\n // Bumped whenever blocks change position, remounting them so no block keeps another's messages\n const [version, setVersion] = useState(0)\n\n const layouts = useMemo(() => layoutsOf(options), [options])\n const blocks: Array<Block> = Array.isArray(value) ? value : []\n\n const setBlock: OnValuesChangeCallback = useCallback(\n (field, block) => {\n setValue((oldValue: Array<Block>) => {\n if (!Array.isArray(oldValue)) return oldValue\n return oldValue.map((oldBlock, index) => (index === Number(field) ? block : oldBlock))\n })\n },\n [setValue],\n )\n\n const setBlockValid: OnValidityChangeCallback = useCallback((field, valid) => {\n setBlockValidity((old) => ({ ...old, [field]: valid }))\n }, [])\n\n const addBlock = (layout: Layout) => {\n // Seed every field so conditions inside the block resolve against the block first\n const fields = Object.fromEntries((layout.fields || []).map((field) => [field.name, field.defaultValue]))\n\n setValue((oldValue: Array<Block>) => [\n ...(Array.isArray(oldValue) ? oldValue : []),\n { ...fields, _layout: layout.name },\n ])\n }\n\n const removeBlock = (index: number) => {\n setBlockValidity({})\n setVersion((old) => old + 1)\n setValue((oldValue: Array<Block>) => (Array.isArray(oldValue) ? oldValue.toSpliced(index, 1) : []))\n }\n\n const moveBlock = (index: number, offset: number) => {\n setBlockValidity({})\n setVersion((old) => old + 1)\n setValue((oldValue: Array<Block>) => {\n const newValue = [...(Array.isArray(oldValue) ? oldValue : [])]\n const target = index + offset\n\n // Keep the block within the bounds of the list\n if (target < 0 || target >= newValue.length) return oldValue\n\n const [moved] = newValue.splice(index, 1)\n newValue.splice(target, 0, moved)\n return newValue\n })\n }\n\n // Validate the blocks' layouts and aggregate the validity of every block\n const validation = useMemo(() => (value !== undefined ? validateValue(value, schema) : null), [value, schema])\n\n useEffect(() => {\n if (!validation) return\n\n setMessages(validation.messages)\n\n if (validation.isValid === false || Object.values(blockValidity).some((valid) => valid === false)) {\n setValid(false)\n } else if (validation.isValid === true) {\n setValid(true)\n }\n }, [validation, blockValidity, setMessages, setValid])\n\n return (\n <div className='sorlo-input__flexible'>\n {blocks.map((block, index) => {\n const layout = layouts.get(block?._layout)\n\n return (\n <div key={`${version}-${index}`}>\n {layout && (\n <FlexibleBlock\n index={index}\n layout={layout}\n block={block}\n valid={blockValidity[index]}\n setBlock={setBlock}\n setBlockValid={setBlockValid}\n />\n )}\n {!layout && <div>{t('ui.invalidFieldType')}</div>}\n <button\n className='sorlo-button'\n type='button'\n disabled={locked || index === 0}\n onClick={(event) => {\n event.preventDefault()\n moveBlock(index, -1)\n }}\n >\n {t('ui.moveUp')}\n </button>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked || index === blocks.length - 1}\n onClick={(event) => {\n event.preventDefault()\n moveBlock(index, 1)\n }}\n >\n {t('ui.moveDown')}\n </button>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n removeBlock(index)\n }}\n >\n {t('ui.delete')}\n </button>\n </div>\n )\n })}\n <div>\n {[...layouts.values()].map((layout) => {\n return (\n <button\n key={layout.name}\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n addBlock(layout)\n }}\n >\n {t('ui.addBlock', { layout: layout.label || layout.name })}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport Fieldset, {\n OnMessagesChangeCallback,\n OnValidityChangeCallback,\n OnValuesChangeCallback,\n} from '@/components/Fieldset'\nimport { FieldScopeContext, useFormStaticContext } from '@/context/FormProvider'\nimport { FieldMessages } from '@/types/fields'\nimport {\n InputCategory,\n InputComponent,\n InputCoreFields,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputRenderValue,\n InputTypeValue,\n InputValidateChildren,\n InputValidateValue,\n} from '@/types/inputs'\nimport { conditionScope, validateSchema } from '@/utils/inputs'\nimport { validationSuccess } from '@/utils/validation'\nimport { useCallback, useContext, useEffect, useMemo, useState } from 'react'\n\nexport const name: InputName = () => 'Group'\n\nexport const description: InputDescription = () => 'Group your fields.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const coreFields: InputCoreFields = (defaultFields) => {\n return defaultFields.filter(({ name }) => name !== 'required')\n}\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Fields',\n name: 'fields',\n type: 'schemabuilder',\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n return validationSuccess(value)\n}\n\n// Validate the nested fields against the group's value\nexport const validateChildren: InputValidateChildren = (value, schema, validateFields) => {\n return validateFields(schema.options?.fields || [], value || {})\n}\n\n// Pick only the nested fields' values\nexport const pickValue: InputPickValue = (value, schema, pickFields) => {\n if (value === undefined) return undefined\n return pickFields(schema.options?.fields || [], value || {})\n}\n\n// Type the nested fields as an object\nexport const typeValue: InputTypeValue = (schema, typeFields) => typeFields(schema.options?.fields || [])\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? JSON.stringify(validation.value, null, 2) : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { options, value, setValue, setValid } = useFieldContext()\n const { inputs } = useFormStaticContext()\n\n const [tempMessages, setTempMessages] = useState<Record<string, FieldMessages>>({})\n const [tempValidity, setTempValidity] = useState<Record<string, boolean | undefined>>({})\n\n // Extend the condition scopes with the group's own values\n const parentScopes = useContext(FieldScopeContext)\n const scopes = useMemo(() => {\n return [...(parentScopes || []), conditionScope(options?.fields || [], value || {}, inputs)]\n }, [parentScopes, options?.fields, value, inputs])\n\n // Mark the group itself invalid when any nested field is invalid\n useEffect(() => {\n const validity = Object.values(tempValidity)\n if (validity.some((valid) => valid === false)) {\n setValid(false)\n } else if (validity.length >= 1 && validity.every((valid) => valid === true)) {\n setValid(true)\n }\n }, [tempValidity, setValid])\n\n const onValuesChange: OnValuesChangeCallback = useCallback(\n (field, fieldValue) => {\n setValue((old: Record<string, any>) => ({ ...old, [field]: fieldValue }))\n },\n [setValue],\n )\n\n const onMessagesChange: OnMessagesChangeCallback = useCallback((field, messages) => {\n setTempMessages((old) => ({ ...old, [field]: messages }))\n }, [])\n\n const onValidityChange: OnValidityChangeCallback = useCallback((field, valid) => {\n setTempValidity((old) => ({ ...old, [field]: valid }))\n }, [])\n\n return (\n <FieldScopeContext.Provider value={scopes}>\n <Fieldset\n schema={options?.fields || []}\n values={value || {}}\n messages={tempMessages}\n validity={tempValidity}\n onValuesChange={onValuesChange}\n onMessagesChange={onMessagesChange}\n onValidityChange={onValidityChange}\n />\n </FieldScopeContext.Provider>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputCoreFields,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputRenderValue,\n InputTypeValue,\n} from '@/types/inputs'\nimport { useEffect } from 'react'\n\nexport const name: InputName = () => 'Hidden'\n\nexport const description: InputDescription = () => 'An invisible field that carries a fixed value into the form.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const coreFields: InputCoreFields = (defaultFields) => {\n return defaultFields.filter(({ name }) => ['name', 'conditions'].includes(name))\n}\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'value',\n label: 'Value',\n type: 'text',\n required: false,\n },\n ]\n}\n\n// The schema's fixed value always wins over a posted value\nexport const pickValue: InputPickValue = (value, schema) => {\n return schema.options?.value ?? value\n}\n\n// The fixed value's literal type, or anything posted when there is no fixed value\nexport const typeValue: InputTypeValue = (schema) => {\n const value = schema.options?.value\n return value == null ? 'unknown' : JSON.stringify(value)\n}\n\nexport const formatValue: InputFormatValue = (value) => {\n return value === undefined || value === null ? null : String(value)\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, options, value, setValue } = useFieldContext()\n\n // The schema's value option wins when nothing has been committed yet\n const fixedValue = value !== undefined ? value : options?.value\n\n // Commit the fixed value so it is included in the form's values\n useEffect(() => {\n if (fixedValue !== undefined) setValue(fixedValue)\n }, [fixedValue, setValue])\n\n return <input className='sorlo-input' id={id} type='hidden' value={fixedValue ?? ''} readOnly />\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport Fieldset, {\n OnMessagesChangeCallback,\n OnValidityChangeCallback,\n OnValuesChangeCallback,\n} from '@/components/Fieldset'\nimport {\n FieldReportContext,\n FieldReportContextValue,\n FieldScopeContext,\n useFormStaticContext,\n} from '@/context/FormProvider'\nimport { t } from '@/i18n'\nimport { FieldMessages, FieldSchema } from '@/types/fields'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputRenderValue,\n InputTypeValue,\n InputValidateChildren,\n InputValidateValue,\n} from '@/types/inputs'\nimport { conditionScope, validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback, useContext, useEffect, useMemo, useState } from 'react'\n\ntype Column = Record<string, any>\ntype Row = Array<Column>\ntype Matrix = Array<Row>\n\nexport const name: InputName = () => 'Matrix'\n\nexport const description: InputDescription = () =>\n 'Allows a set of fields to be repeated vertically AND horizontally like a table.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Fields',\n name: 'fields',\n type: 'schemabuilder',\n },\n {\n label: 'Minimum rows',\n name: 'minimumRows',\n type: 'number',\n required: false,\n defaultValue: 1,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Maximum rows',\n name: 'maximumRows',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Minimum columns',\n name: 'minimumColumns',\n type: 'number',\n required: false,\n defaultValue: 1,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Maximum columns',\n name: 'maximumColumns',\n type: 'number',\n required: false,\n defaultValue: 1,\n width: 50,\n options: {\n min: 0,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (!Array.isArray(value) || value.some((row) => !Array.isArray(row))) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate the minimum and maximum number of rows\n const minRows = schema.options?.minimumRows\n if (typeof minRows === 'number' && value.length < minRows) {\n return validationError(value, validationMessage(schema, 'minRows', { min: minRows }))\n }\n\n const maxRows = schema.options?.maximumRows\n if (typeof maxRows === 'number' && value.length > maxRows) {\n return validationError(value, validationMessage(schema, 'maxRows', { max: maxRows }))\n }\n\n // Validate the minimum and maximum number of columns, in every row\n const minColumns = schema.options?.minimumColumns\n if (typeof minColumns === 'number' && value.some((row) => row.length < minColumns)) {\n return validationError(value, validationMessage(schema, 'minColumns', { min: minColumns }))\n }\n\n const maxColumns = schema.options?.maximumColumns\n if (typeof maxColumns === 'number' && value.some((row) => row.length > maxColumns)) {\n return validationError(value, validationMessage(schema, 'maxColumns', { max: maxColumns }))\n }\n\n return validationSuccess(value)\n}\n\n// Validate the nested fields against every column of every row\nexport const validateChildren: InputValidateChildren = (value, schema, validateFields) => {\n const rows: Matrix = Array.isArray(value) ? value : []\n return rows.map((row) => {\n return (Array.isArray(row) ? row : []).map((column) => validateFields(schema.options?.fields || [], column || {}))\n })\n}\n\n// Pick only the nested fields' values for every column of every row\nexport const pickValue: InputPickValue = (value, schema, pickFields) => {\n if (!Array.isArray(value)) return undefined\n return value.map((row) => {\n return (Array.isArray(row) ? row : []).map((column) => pickFields(schema.options?.fields || [], column || {}))\n })\n}\n\n// Type every column of every row as an object of the nested fields\nexport const typeValue: InputTypeValue = (schema, typeFields) => {\n return `Array<Array<${typeFields(schema.options?.fields || [])}>>`\n}\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? JSON.stringify(validation.value, null, 2) : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\n// A single cell of the matrix, nesting its fields' reports under the cell's\n// row and column indexes\nfunction MatrixCell({\n rowIndex,\n columnIndex,\n fields,\n column,\n messages,\n validity,\n setColumnValue,\n setColumnMessages,\n setColumnValidity,\n}: {\n rowIndex: number\n columnIndex: number\n fields: Array<FieldSchema>\n column: Column\n messages?: Record<string, FieldMessages>\n validity?: Record<string, boolean | undefined>\n setColumnValue: (row: number, column: number, field: string, value: any) => void\n setColumnMessages: (row: number, column: number, field: string, messages: FieldMessages) => void\n setColumnValidity: (row: number, column: number, field: string, valid: boolean | undefined) => void\n}) {\n const parentReport = useContext(FieldReportContext)\n\n const cellReport = useMemo<FieldReportContextValue | undefined>(() => {\n if (!parentReport) return undefined\n return {\n report: (path, patch) => parentReport.report([rowIndex, columnIndex, ...path], patch),\n resolve: (path) => parentReport.resolve([rowIndex, columnIndex, ...path]),\n }\n }, [parentReport, rowIndex, columnIndex])\n\n // Extend the condition scopes with the cell's own values\n const { inputs } = useFormStaticContext()\n const parentScopes = useContext(FieldScopeContext)\n const scopes = useMemo(() => {\n return [...(parentScopes || []), conditionScope(fields, column || {}, inputs)]\n }, [parentScopes, fields, column, inputs])\n\n const onValuesChange: OnValuesChangeCallback = useCallback(\n (field, fieldValue) => {\n setColumnValue(rowIndex, columnIndex, field, fieldValue)\n },\n [setColumnValue, rowIndex, columnIndex],\n )\n\n const onMessagesChange: OnMessagesChangeCallback = useCallback(\n (field, fieldMessages) => {\n setColumnMessages(rowIndex, columnIndex, field, fieldMessages)\n },\n [setColumnMessages, rowIndex, columnIndex],\n )\n\n const onValidityChange: OnValidityChangeCallback = useCallback(\n (field, fieldValid) => {\n setColumnValidity(rowIndex, columnIndex, field, fieldValid)\n },\n [setColumnValidity, rowIndex, columnIndex],\n )\n\n return (\n <FieldReportContext.Provider value={cellReport}>\n <FieldScopeContext.Provider value={scopes}>\n <Fieldset\n schema={fields}\n values={column}\n messages={messages}\n validity={validity}\n onValuesChange={onValuesChange}\n onMessagesChange={onMessagesChange}\n onValidityChange={onValidityChange}\n />\n </FieldScopeContext.Provider>\n </FieldReportContext.Provider>\n )\n}\n\nconst Component: InputComponent = function () {\n const { schema, options, readonly, disabled, value, setValue, setMessages, setValid } = useFieldContext()\n const locked = readonly || disabled\n\n const [cellMessages, setCellMessages] = useState<Record<string, Record<string, FieldMessages>>>({})\n const [cellValidity, setCellValidity] = useState<Record<string, Record<string, boolean | undefined>>>({})\n\n const fields = useMemo(() => {\n return options?.fields || []\n }, [options?.fields])\n\n const maxRows = useMemo(() => {\n const value = options?.maximumRows ? Number(options?.maximumRows) : null\n if (value !== null && !isNaN(value) && isFinite(value)) {\n return value\n }\n\n return Number.MAX_SAFE_INTEGER\n }, [options])\n\n const maxColumns = useMemo(() => {\n const value = options?.maximumColumns ? Number(options?.maximumColumns) : null\n if (value !== null && !isNaN(value) && isFinite(value)) {\n return value\n }\n\n return Number.MAX_SAFE_INTEGER\n }, [options])\n\n const minRows = useMemo(() => {\n const value = options?.minimumRows ? Number(options?.minimumRows) : null\n if (value !== null && !isNaN(value) && isFinite(value) && value > 0) {\n return value\n }\n\n return 0\n }, [options])\n\n const minColumns = useMemo(() => {\n const value = options?.minimumColumns ? Number(options?.minimumColumns) : null\n if (value !== null && !isNaN(value) && isFinite(value) && value > 0) {\n return value\n }\n\n return 0\n }, [options])\n\n const totalRows = useMemo(() => Number(value?.length) || 0, [value])\n const totalColumns = useMemo(() => Number(value?.[0]?.length) || 0, [value])\n\n const canAddRow = totalRows < maxRows\n const canAddColumn = totalColumns < maxColumns\n const canRemoveRow = totalRows > minRows\n const canRemoveColumn = totalColumns > minColumns\n\n // Normalise a matrix without mutating the old value, enforcing the row and\n // column limits and filling each column with the fields' default values\n const validateMatrix = useCallback(\n (matrix: Matrix): Matrix => {\n let newMatrix = [...matrix]\n\n // Enforce minimum rows\n while (newMatrix.length < minRows) {\n newMatrix.push([])\n }\n\n // Enforce maximum rows, dropping the rows beyond the limit\n if (newMatrix.length > maxRows) {\n newMatrix = newMatrix.slice(0, maxRows)\n }\n\n // Keep the matrix rectangular by matching each row's column count to the previous row\n let lastColumnCount: undefined | number = undefined\n\n return newMatrix.map((row) => {\n let newRow: Row = Array.isArray(row) ? [...row] : []\n\n // Enforce minimum columns\n while (newRow.length < minColumns || (lastColumnCount !== undefined && newRow.length < lastColumnCount)) {\n newRow.push({})\n }\n\n // Enforce maximum columns, dropping the columns beyond the limit\n if (newRow.length > maxColumns) {\n newRow = newRow.slice(0, maxColumns)\n }\n\n lastColumnCount = newRow.length\n\n return newRow.map((column) => {\n const newColumn = fields.map((field: Column) => {\n // Leave fields without a default unset, as a new flexible block does, so inputs fall back to empty\n let value = field.defaultValue\n if (typeof column === 'object' && column.hasOwnProperty(field.name)) {\n value = column[field.name]\n }\n\n return [field.name, value]\n })\n\n // Keep the cell's other values, such as a choice's nested choices, which no field here shows\n return { ...(typeof column === 'object' ? column : {}), ...Object.fromEntries(newColumn) }\n })\n })\n },\n [fields, minRows, maxRows, minColumns, maxColumns],\n )\n\n const addRow = useCallback(\n (row: Row = []) => {\n setValue((oldValue: Matrix) => {\n // Ensure the old value was an array\n if (!Array.isArray(oldValue)) {\n oldValue = []\n }\n\n return validateMatrix([...oldValue, row])\n })\n },\n [setValue, validateMatrix],\n )\n\n const addColumn = useCallback(\n (columns: Array<Column> = []) => {\n setValue((oldValue: Matrix) => {\n // Ensure the old value was an array\n if (!Array.isArray(oldValue)) {\n oldValue = []\n }\n\n const newValue = oldValue.map((row, rowIndex) => {\n // Ensure the old row was an array\n const newRow = Array.isArray(row) ? row : []\n\n // Add new column\n return [...newRow, columns[rowIndex] || {}]\n })\n\n return validateMatrix(newValue)\n })\n },\n [setValue, validateMatrix],\n )\n\n const removeRow = useCallback(\n (index: number) => {\n // Positions shift when a row is removed, so reset the cell feedback\n setCellMessages({})\n setCellValidity({})\n\n setValue((oldValue: Matrix) => {\n // Ensure the old value was an array\n if (!Array.isArray(oldValue)) {\n return []\n }\n\n return oldValue.toSpliced(index, 1)\n })\n },\n [setValue],\n )\n\n const removeColumn = useCallback(\n (index: number) => {\n // Positions shift when a column is removed, so reset the cell feedback\n setCellMessages({})\n setCellValidity({})\n\n setValue((oldValue: Matrix) => {\n // Ensure the old value was an array\n if (!Array.isArray(oldValue)) {\n return []\n }\n\n return oldValue.map((row) => {\n return Array.isArray(row) ? row.toSpliced(index, 1) : row\n })\n })\n },\n [setValue],\n )\n\n const setColumnValue = useCallback(\n (row: number, column: number, columnFieldName: string, columnFieldValue: any) => {\n setValue((oldValue: Matrix) => {\n // Ensure the old value was an array\n if (!Array.isArray(oldValue)) {\n return oldValue\n }\n\n return oldValue.map((oldRow, rowIndex) => {\n if (rowIndex !== row) return oldRow\n\n return oldRow.map((oldColumn, columnIndex) => {\n if (columnIndex !== column) return oldColumn\n\n return { ...oldColumn, [columnFieldName]: columnFieldValue }\n })\n })\n })\n },\n [setValue],\n )\n\n const setColumnMessages = useCallback((row: number, column: number, field: string, messages: FieldMessages) => {\n setCellMessages((old) => {\n const key = `${row}-${column}`\n return { ...old, [key]: { ...old[key], [field]: messages } }\n })\n }, [])\n\n const setColumnValidity = useCallback((row: number, column: number, field: string, valid: boolean | undefined) => {\n setCellValidity((old) => {\n const key = `${row}-${column}`\n return { ...old, [key]: { ...old[key], [field]: valid } }\n })\n }, [])\n\n // Seed the minimum number of rows when there is no value yet\n useEffect(() => {\n if (value === undefined && minRows >= 1) {\n setValue(validateMatrix([]))\n }\n }, [value, minRows, setValue, validateMatrix])\n\n // Validate the matrix bounds and aggregate the validity of every cell\n const validation = useMemo(() => (value !== undefined ? validateValue(value, schema) : null), [value, schema])\n\n useEffect(() => {\n if (!validation) return\n\n setMessages(validation.messages)\n\n const cells = Object.values(cellValidity).flatMap((cell) => Object.values(cell))\n if (validation.isValid === false || cells.some((valid) => valid === false)) {\n setValid(false)\n } else if (validation.isValid === true) {\n setValid(true)\n }\n }, [validation, cellValidity, setMessages, setValid])\n\n return (\n <div className='sorlo-input__matrix'>\n <table>\n <thead>\n <tr>\n <td></td>\n {(value?.[0] || []).map((column: Column, columnIndex: number) => {\n return (\n <th key={columnIndex}>\n <span>{columnIndex + 1}</span>\n {canRemoveColumn && (\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n removeColumn(columnIndex)\n }}\n >\n {t('ui.removeColumn')}\n </button>\n )}\n </th>\n )\n })}\n <td></td>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td></td>\n {(value?.[0] || []).map((column: Column, columnIndex: number) => {\n return <td key={columnIndex}></td>\n })}\n <td rowSpan={totalRows + 1}>\n {canAddColumn && totalRows > 0 && (\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n addColumn()\n }}\n >\n {t('ui.addColumn')}\n </button>\n )}\n </td>\n </tr>\n {(value || []).map((row: Row, rowIndex: number) => {\n return (\n <tr key={rowIndex}>\n <th>\n {rowIndex + 1}\n {canRemoveRow && (\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n removeRow(rowIndex)\n }}\n >\n {t('ui.removeRow')}\n </button>\n )}\n </th>\n {row.map((column, columnIndex) => {\n return (\n <td key={columnIndex}>\n <MatrixCell\n rowIndex={rowIndex}\n columnIndex={columnIndex}\n fields={fields}\n column={column}\n messages={cellMessages[`${rowIndex}-${columnIndex}`]}\n validity={cellValidity[`${rowIndex}-${columnIndex}`]}\n setColumnValue={setColumnValue}\n setColumnMessages={setColumnMessages}\n setColumnValidity={setColumnValidity}\n />\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n <tfoot>\n {canAddRow && (\n <tr>\n <td colSpan={totalColumns + 2}>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n addRow()\n }}\n >\n {t('ui.addRow')}\n </button>\n </td>\n </tr>\n )}\n </tfoot>\n </table>\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Number'\n\nexport const description: InputDescription = () => 'An input limited to numerical values.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Placeholder',\n name: 'placeholder',\n type: 'text',\n required: false,\n },\n {\n label: 'Minimum',\n name: 'min',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Maximum',\n name: 'max',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional, note that 0 is not empty\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n // Enforce number type\n if (typeof value !== 'number') value = Number(value)\n\n // Double check it's a valid number\n if (isNaN(value) || !isFinite(value)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate minimum value\n const min = schema.options?.min\n if (typeof min === 'number' && value < min) {\n return validationError(value, validationMessage(schema, 'min', { min }))\n }\n\n // Validate maximum value\n const max = schema.options?.max\n if (typeof max === 'number' && value > max) {\n return validationError(value, validationMessage(schema, 'max', { max }))\n }\n\n // Return success\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'number'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid\n ? typeof validation.value === 'number'\n ? validation.value.toLocaleString()\n : validation.value\n : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__number'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='number'\n value={value?.toString() ?? ''}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n min={options?.min}\n max={options?.max}\n placeholder={options?.placeholder}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Password'\n\nexport const description: InputDescription = () => 'A text input that masks its value.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n {\n name: 'minLength',\n label: 'Minimum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n name: 'maxLength',\n label: 'Maximum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 1,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate the minimum value length\n const min = schema.options?.minLength\n if (typeof min === 'number' && value.length < min) {\n return validationError(value, validationMessage(schema, 'minLength', { min }))\n }\n\n // Validate the maximum value length\n const max = schema.options?.maxLength\n if (typeof max === 'number' && value.length > max) {\n return validationError(value, validationMessage(schema, 'maxLength', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n\n // Never expose the actual value when formatting\n return validation.isValid ? '••••••••' : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__password'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='password'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n minLength={options?.minLength}\n maxLength={options?.maxLength}\n placeholder={options?.placeholder}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { literalUnion } from '@/utils/typescript'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Radio (Single choice)'\n\nexport const description: InputDescription = () =>\n 'A list of radio buttons with a selection of choices that you specify.'\n\nexport const category: InputCategory = () => 'Choice'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'choices',\n label: 'Choices',\n type: 'repeater',\n required: true,\n options: {\n minimum: 1,\n fields: [\n {\n name: 'value',\n label: 'Value',\n type: 'text',\n required: true,\n width: 50,\n },\n {\n name: 'label',\n label: 'Label',\n type: 'text',\n required: false,\n width: 50,\n },\n ],\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n // The browser gives radio values as strings\n const choices: Array<any> = schema.options?.choices || []\n if (!choices.some((choice) => String(choice.value) === value)) {\n return validationError(value, validationMessage(schema, 'choice'))\n }\n\n return validationSuccess(value)\n}\n\n// The browser gives radio values as strings\nexport const typeValue: InputTypeValue = (schema) => {\n const choices: Array<any> = schema.options?.choices || []\n return literalUnion(choices.map((choice) => String(choice.value)))\n}\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const {\n id,\n labelId,\n aria,\n schema,\n required,\n readonly,\n disabled,\n options,\n value = '',\n handleValidation,\n } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n const choices: Array<any> = options?.choices || []\n\n return (\n <div className='sorlo-input__radio' role='radiogroup' aria-labelledby={labelId} {...aria}>\n {choices.map((choice, choiceIndex) => {\n return (\n <div key={choiceIndex}>\n <input\n className='sorlo-input'\n id={`${id}-${choiceIndex}`}\n type='radio'\n name={id}\n value={choice.value}\n checked={String(value) === String(choice.value)}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n disabled={disabled || readonly}\n />\n <label htmlFor={`${id}-${choiceIndex}`}>{choice.label ?? choice.value.toString()}</label>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Range (Slider)'\n\nexport const description: InputDescription = () => 'A slider for picking a numerical value within a range.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Minimum',\n name: 'min',\n type: 'number',\n required: false,\n width: 50,\n },\n {\n label: 'Maximum',\n name: 'max',\n type: 'number',\n required: false,\n width: 50,\n },\n {\n label: 'Step',\n name: 'step',\n type: 'number',\n required: false,\n options: {\n min: 0,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional, note that 0 is not empty\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n // Enforce number type\n if (typeof value !== 'number') value = Number(value)\n\n // Double check it's a valid number\n if (isNaN(value) || !isFinite(value)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate minimum value\n const min = schema.options?.min\n if (typeof min === 'number' && value < min) {\n return validationError(value, validationMessage(schema, 'min', { min }))\n }\n\n // Validate maximum value\n const max = schema.options?.max\n if (typeof max === 'number' && value > max) {\n return validationError(value, validationMessage(schema, 'max', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'number'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid\n ? typeof validation.value === 'number'\n ? validation.value.toLocaleString()\n : validation.value\n : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__range'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='range'\n value={value?.toString() ?? ''}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n disabled={disabled || readonly}\n min={options?.min}\n max={options?.max}\n step={options?.step}\n />\n {value !== '' && value !== undefined && <span className='sorlo-input__range-value'>{value}</span>}\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport Fieldset, { OnValidityChangeCallback, OnValuesChangeCallback } from '@/components/Fieldset'\nimport { FieldPath, FieldReportContext, FieldReportContextValue } from '@/context/FormProvider'\nimport { FieldSchema } from '@/types/fields'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickValue,\n InputRenderValue,\n InputTypeValue,\n InputValidateChildren,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback, useContext, useEffect, useMemo, useState } from 'react'\n\ntype Column = Record<string, any>\ntype Row = Array<Column>\ntype Matrix = Array<Row>\n\nexport const name: InputName = () => 'Repeater'\n\nexport const description: InputDescription = () => 'Allows a set of fields to be repeated vertically OR horizontally.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Fields',\n name: 'fields',\n type: 'schemabuilder',\n },\n {\n label: 'Minimum',\n name: 'minimum',\n type: 'number',\n required: false,\n defaultValue: 1,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Maximum',\n name: 'maximum',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n label: 'Repeat direction',\n name: 'direction',\n type: 'select',\n options: {\n choices: [\n {\n value: 'y',\n label: 'Vertically',\n },\n {\n value: 'x',\n label: 'Horizontally',\n },\n ],\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (!Array.isArray(value)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate the minimum number of items\n const min = schema.options?.minimum\n if (typeof min === 'number' && value.length < min) {\n return validationError(value, validationMessage(schema, 'minItems', { min }))\n }\n\n // Validate the maximum number of items\n const max = schema.options?.maximum\n if (typeof max === 'number' && value.length > max) {\n return validationError(value, validationMessage(schema, 'maxItems', { max }))\n }\n\n return validationSuccess(value)\n}\n\n// Validate the nested fields against every repeated item\nexport const validateChildren: InputValidateChildren = (value, schema, validateFields) => {\n const items: Row = Array.isArray(value) ? value : []\n return items.map((item) => validateFields(schema.options?.fields || [], item || {}))\n}\n\n// Pick only the nested fields' values for every item\nexport const pickValue: InputPickValue = (value, schema, pickFields) => {\n if (!Array.isArray(value)) return undefined\n return value.map((item) => pickFields(schema.options?.fields || [], item || {}))\n}\n\n// Type every item as an object of the nested fields\nexport const typeValue: InputTypeValue = (schema, typeFields) => `Array<${typeFields(schema.options?.fields || [])}>`\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? JSON.stringify(validation.value, null, 2) : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { schema, options, value, setValue, setMessages, setValid } = useFieldContext()\n\n const [childValid, setChildValid] = useState<boolean | undefined>(undefined)\n\n const isHorizontal = options?.direction === 'x'\n\n // A repeater is a matrix locked to a single column or a single row\n const matrixSchema: Array<FieldSchema> = useMemo(() => {\n const minimum = options?.minimum ?? 0\n const maximum = options?.maximum ?? null\n\n return [\n {\n name: 'value',\n type: 'matrix',\n options: {\n fields: options?.fields || [],\n minimumRows: isHorizontal ? 1 : minimum,\n maximumRows: isHorizontal ? 1 : maximum,\n minimumColumns: isHorizontal ? minimum : 1,\n maximumColumns: isHorizontal ? maximum : 1,\n },\n },\n ]\n }, [options?.fields, options?.minimum, options?.maximum, isHorizontal])\n\n // Convert the repeated items to and from the matrix format, leaving an\n // unset value unset so the matrix can seed its own minimum rows\n const matrixValues = useMemo(() => {\n if (value === undefined) return {}\n const items: Row = Array.isArray(value) ? value : []\n const matrixValue: Matrix = isHorizontal ? [items] : items.map((item) => [item])\n return { value: matrixValue }\n }, [value, isHorizontal])\n\n const onValuesChange: OnValuesChangeCallback = useCallback(\n (field, matrixValue: Matrix) => {\n setValue(isHorizontal ? matrixValue[0] || [] : matrixValue.map((row) => row[0]))\n },\n [setValue, isHorizontal],\n )\n\n const onValidityChange: OnValidityChangeCallback = useCallback((field, valid) => {\n setChildValid(valid)\n }, [])\n\n // Rewrite the internal matrix's paths so nested fields appear as\n // e.g. 'pets.0.petname' rather than 'pets.value.0.0.petname'\n const parentReport = useContext(FieldReportContext)\n\n const childReport = useMemo<FieldReportContextValue | undefined>(() => {\n if (!parentReport) return undefined\n\n // Returns null for the internal matrix's own state, which is already\n // reported by the repeater itself\n const rewrite = (path: FieldPath): null | FieldPath => {\n const [name, row, column, ...rest] = path\n\n // Anything not from the internal matrix passes through untouched\n if (name !== 'value') return path\n if (rest.length === 0) return null\n\n const index = isHorizontal ? column : row\n return [index, ...rest]\n }\n\n return {\n report: (path, patch) => {\n const rewritten = rewrite(path)\n if (rewritten) parentReport.report(rewritten, patch)\n },\n resolve: (path) => {\n const rewritten = rewrite(path)\n return rewritten ? parentReport.resolve(rewritten) : path\n },\n }\n }, [parentReport, isHorizontal])\n\n // Validate the item bounds and aggregate the nested matrix's validity\n const validation = useMemo(() => (value !== undefined ? validateValue(value, schema) : null), [value, schema])\n\n useEffect(() => {\n if (!validation) return\n\n setMessages(validation.messages)\n\n if (validation.isValid === false || childValid === false) {\n setValid(false)\n } else if (validation.isValid === true) {\n setValid(true)\n }\n }, [validation, childValid, setMessages, setValid])\n\n return (\n <FieldReportContext.Provider value={childReport}>\n <Fieldset\n schema={matrixSchema}\n values={matrixValues}\n onValuesChange={onValuesChange}\n onValidityChange={onValidityChange}\n />\n </FieldReportContext.Provider>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport Fieldset, {\n OnMessagesChangeCallback,\n OnValidityChangeCallback,\n OnValuesChangeCallback,\n} from '@/components/Fieldset'\nimport Modal from '@/components/Modal'\nimport { FieldReportContext, FieldScopeContext, FormStaticContext, useFormStaticContext } from '@/context/FormProvider'\nimport { t } from '@/i18n'\nimport { FieldMessages, FieldSchema } from '@/types/fields'\nimport {\n Input,\n InputCategory,\n InputComponent,\n InputCoreFields,\n InputDescription,\n InputFormatValue,\n InputName,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { normaliseConditions } from '@/utils/conditions'\nimport { conditionScope, createId, validateInputSchemaFields, validateSchema, validateValues } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport isEqual from 'lodash/isEqual.js'\nimport { Dispatch, Fragment, createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'\n\nexport const name: InputName = () => 'Schema Builder'\n\nexport const description: InputDescription = () => 'An intuitive interface for building form schemas.'\n\nexport const category: InputCategory = () => 'Layout'\n\nexport const coreFields: InputCoreFields = () => {\n return [] // Prevent's its self from appearing in fields list\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional, e.g. a group with no fields yet\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (!Array.isArray(value)) {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n return validationSuccess(value)\n}\n\n// A list of field schemas\nexport const typeValue: InputTypeValue = () => 'Array<Record<string, unknown>>'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? JSON.stringify(validation.value, null, 2) : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\n// Let the field's input finish its schema, e.g. giving new flexible layouts their IDs\nconst prepareSchema = (input: Input, schema: FieldSchema) => {\n return input.prepareSchema ? input.prepareSchema(schema) : schema\n}\n\n// Fill unset fields with their defaults, including those in groups such as options, e.g. a matrix's minimum rows,\n// so the editor saves the values it shows\nconst withDefaults = (schema: Array<FieldSchema>, values: Record<string, any>): Record<string, any> => {\n const merged = { ...values }\n\n for (const field of schema) {\n if (field.type === 'group') {\n const group = withDefaults(field.options?.fields || [], merged[field.name] || {})\n if (Object.keys(group).length >= 1) merged[field.name] = group\n } else if (merged[field.name] === undefined && field.defaultValue !== undefined) {\n merged[field.name] = field.defaultValue\n }\n }\n\n return merged\n}\n\n// The fields at each level around a field being edited, outermost first, which its conditions can test. An editor\n// adds the fields beside its own, so a builder inside it, such as a group's, reaches those as well as its own.\nconst LevelsContext = createContext<Array<Array<FieldSchema>>>([])\n\n// A rule's type for a field, by its input. Choice fields give their choices instead, and other fields are text.\nconst ruleTypes: Record<string, string> = {\n boolean: 'boolean',\n number: 'number',\n range: 'number',\n date: 'date',\n datetime: 'date',\n}\n\n// What a field's conditions can test, nearest first, the way conditions resolve a path: the fields beside it, then\n// those of each level around it. A group's fields are tested through it, e.g. address.town. Fields without a value,\n// such as content, are left out.\nconst conditionChoices = (levels: Array<Array<FieldSchema>>, inputs: Record<string, Input>) => {\n const choices = new Map<string, Record<string, any>>()\n\n const add = (fields: Array<FieldSchema>, path: string, label: string) => {\n for (const field of fields) {\n const input = inputs[field?.type]\n if (!field?.name || choices.has(path + field.name)) continue\n\n if (field.type === 'group') {\n add(field.options?.fields || [], `${path}${field.name}.`, `${label}${field.label || field.name} › `)\n } else if (!input?.typeValue || input.typeValue(field, () => '') !== undefined) {\n const listed: Array<any> = field.options?.choices || []\n const optionChoices = listed.flatMap((choice) => (choice?.choices?.length ? choice.choices : [choice]))\n choices.set(path + field.name, {\n value: path + field.name,\n label: label + (field.label || field.name),\n ...(['select', 'radio', 'checkbox'].includes(field.type)\n ? { choices: optionChoices.map((choice) => ({ value: choice?.value, label: choice?.label })) }\n : { type: ruleTypes[field.type] || 'text' }),\n })\n }\n }\n }\n\n for (const fields of [...levels].reverse()) add(fields, '', '')\n return [...choices.values()]\n}\n\n// The schema of a field's editor, listing what its conditional logic can test. Keyed by the list's contents, so an\n// equal list never resets an open editor.\nconst useEditorSchema = (input: Input, levels: Array<Array<FieldSchema>>) => {\n const { inputs } = useFormStaticContext()\n const fieldChoices = conditionChoices(levels, inputs)\n const key = JSON.stringify(fieldChoices)\n\n return useMemo(() => {\n return validateInputSchemaFields(input).map((field) => {\n if (field.name !== 'conditions' || field.type !== 'conditions') return field\n return { ...field, options: { ...field.options, fieldChoices } }\n })\n }, [input, key])\n}\n\nconst Component: InputComponent = function () {\n const { inputs } = useFormStaticContext()\n const { value = [], setValue } = useFieldContext()\n\n const inputEntries = useMemo(() => {\n return Object.entries(inputs).filter(([type, input]) => {\n return validateInputSchemaFields(input).length >= 1\n })\n }, [inputs])\n\n return (\n <div className='sorlo-input__schemabuilder'>\n {/* Edit */}\n {Array.isArray(value) && value.length > 0 && (\n <div className='sorlo-fieldset'>\n {value.map((valueSchema: FieldSchema, valueIndex) => {\n const isValidType = valueSchema.type in inputs\n const valueInput = inputs[valueSchema.type]\n\n return (\n <Fragment key={valueIndex}>\n <div style={{ width: valueSchema.width ? `${valueSchema.width}%` : '100%' }}>\n {!isValidType && <div>{t('ui.invalidFieldType')}</div>}\n {isValidType && (\n <EditValueItem\n index={valueIndex}\n fields={value}\n total={value.length}\n input={valueInput}\n value={valueSchema}\n setValue={setValue}\n />\n )}\n </div>\n </Fragment>\n )\n })}\n </div>\n )}\n\n {/* Add new */}\n <div>\n {inputEntries.map(([type, input], inputIndex) => {\n return (\n <CreateValueItem\n key={inputIndex}\n type={type}\n input={input}\n fields={Array.isArray(value) ? value : []}\n setValue={setValue}\n />\n )\n })}\n </div>\n </div>\n )\n}\n\nfunction CreateValueItem({\n type,\n input,\n fields,\n setValue,\n}: {\n type: string\n input: Input\n fields: Array<FieldSchema>\n setValue: Dispatch<any>\n}) {\n // A new field's conditions can test every field in the builder\n const outer = useContext(LevelsContext)\n const levels = useMemo(() => [...outer, fields], [outer, fields])\n const schema = useEditorSchema(input, levels)\n\n const onSave = useCallback(\n (editorValues: Record<string, any>) => {\n const field = { id: createId('fld'), type, ...editorValues } as FieldSchema\n setValue((old: Array<FieldSchema>) => [...(old || []), prepareSchema(input, field)])\n },\n [setValue, type, input],\n )\n\n return (\n <LevelsContext.Provider value={levels}>\n <SchemaEditor\n schema={schema}\n onSave={onSave}\n label={\n <>\n <strong>{input?.name?.() || type}</strong>\n <br />\n <span>{input?.description?.()}</span>\n </>\n }\n />\n </LevelsContext.Provider>\n )\n}\n\nfunction EditValueItem({\n index,\n fields,\n total,\n value,\n input,\n setValue,\n}: {\n index: number\n fields: Array<FieldSchema>\n total: number\n value: FieldSchema\n input: Input\n setValue: Dispatch<any>\n}) {\n const { readonly, disabled } = useFieldContext()\n const locked = readonly || disabled\n\n // Its conditions can test the fields beside it, but not itself\n const outer = useContext(LevelsContext)\n const levels = useMemo(() => [...outer, fields.toSpliced(index, 1)], [outer, fields, index])\n const schema = useEditorSchema(input, levels)\n\n // Conditions show as groups whatever shape they were written in, such as a flat list with conditionsMode\n const conditions = useMemo(() => value.conditions && normaliseConditions(value).map((rules) => ({ rules })), [value])\n\n const values = useMemo(() => {\n const valueRecord: Record<string, any> = { ...value, conditions }\n return Object.fromEntries(\n schema.map((item) => {\n return [item.name, valueRecord[item.name] ?? item.defaultValue]\n }),\n )\n }, [schema, value, conditions])\n\n const label = useMemo(() => {\n if (value.name && value.label) {\n return `${value.label} (${value.name})`\n } else if (!value.name && value.label) {\n return value.label\n } else if (value.name && !value.label) {\n return value.name\n }\n\n return value.type\n }, [value.name, value.label, value.type])\n\n const onSave = useCallback(\n (editorValues: Record<string, any>) => {\n // Keep the field's ID and the keys the editor doesn't show, such as readonly, giving an ID to fields from\n // schemas written without them. Conditions stay as they were written unless they're edited, which saves them\n // as groups that need no conditionsMode.\n const { conditionsMode, ...rest } = value\n const field = (\n isEqual(editorValues.conditions ?? [], conditions ?? [])\n ? { id: value.id ?? createId('fld'), ...value, ...editorValues, conditions: value.conditions }\n : { id: value.id ?? createId('fld'), ...rest, ...editorValues }\n ) as FieldSchema\n setValue((old: Array<FieldSchema>) => {\n const newValue = [...(old || [])]\n newValue[index] = prepareSchema(input, field)\n return newValue\n })\n },\n [setValue, index, input, value, conditions],\n )\n\n const onDelete = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n event.preventDefault()\n setValue((old: Array<FieldSchema>) => (old || []).toSpliced(index, 1))\n },\n [setValue, index],\n )\n\n const onMove = useCallback(\n (offset: number) => {\n setValue((old: Array<FieldSchema>) => {\n const newValue = [...(old || [])]\n const target = index + offset\n\n // Keep the field within the bounds of the list\n if (target < 0 || target >= newValue.length) return old\n\n const [moved] = newValue.splice(index, 1)\n newValue.splice(target, 0, moved)\n return newValue\n })\n },\n [setValue, index],\n )\n\n return (\n <LevelsContext.Provider value={levels}>\n <SchemaEditor schema={schema} values={values} onSave={onSave} label={label} />\n <button\n className='sorlo-button'\n type='button'\n disabled={locked || index === 0}\n onClick={(event) => {\n event.preventDefault()\n onMove(-1)\n }}\n >\n {t('ui.moveUp')}\n </button>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked || index === total - 1}\n onClick={(event) => {\n event.preventDefault()\n onMove(1)\n }}\n >\n {t('ui.moveDown')}\n </button>\n <button className='sorlo-button sorlo-button--danger' type='button' disabled={locked} onClick={onDelete}>\n {t('ui.delete')}\n </button>\n </LevelsContext.Provider>\n )\n}\n\nfunction SchemaEditor({\n label,\n cancelLabel,\n saveLabel,\n schema,\n values,\n onSave,\n onCancel,\n}: {\n label: string | React.ReactNode\n saveLabel?: string | React.ReactNode\n cancelLabel?: string | React.ReactNode\n schema: Array<FieldSchema>\n values?: Record<string, any>\n onSave: (value: Record<string, any>) => void\n onCancel?: () => void\n}) {\n const staticContext = useFormStaticContext()\n const { inputs } = staticContext\n const { readonly, disabled } = useFieldContext()\n const locked = readonly || disabled\n\n const mergedValues = useMemo(() => withDefaults(schema, values || {}), [schema, values])\n\n const [open, setOpen] = useState(false)\n const [tempValue, setTempValue] = useState<Record<string, any>>(mergedValues)\n const [tempMessages, setTempMessages] = useState<Record<string, FieldMessages>>({})\n const [tempValidity, setTempValidity] = useState<Record<string, boolean | undefined>>({})\n const [validationCounter, setValidationCounter] = useState(0)\n\n const closeModal = () => {\n setTempMessages({})\n setTempValidity({})\n setValidationCounter(0)\n setOpen(false)\n setTempValue(mergedValues)\n }\n\n useEffect(() => {\n setTempValue((old) => {\n if (Object.is(mergedValues, old)) return old\n return mergedValues\n })\n }, [mergedValues])\n\n const handleCancel = (event?: React.MouseEvent<HTMLElement, MouseEvent>) => {\n if (event) event.preventDefault()\n closeModal()\n if (onCancel) onCancel()\n }\n\n const handleSave = (event?: React.MouseEvent<HTMLElement, MouseEvent>) => {\n if (event) event.preventDefault()\n\n // Validate every field, including nested fields, and block the save while any are invalid, asking every field\n // in the editor to show its own messages as a form's validate does\n if (!validateValues(schema, tempValue, inputs, { environment: 'client' }).isValid) {\n setValidationCounter((old) => old + 1)\n return\n }\n\n onSave({ ...tempValue })\n closeModal()\n }\n\n // The editor counts its own validation passes, so fields in an editor opened after the form validated start clean\n const editorContext = useMemo(() => ({ ...staticContext, validationCounter }), [staticContext, validationCounter])\n\n const editorScopes = useMemo(() => [conditionScope(schema, tempValue || {}, inputs)], [schema, tempValue, inputs])\n\n const handleValuesChange: OnValuesChangeCallback = useCallback((field, value) => {\n setTempValue((old) => {\n if (Object.is(old?.[field], value)) return old\n return { ...old, [field]: value }\n })\n }, [])\n\n const handleMessagesChange: OnMessagesChangeCallback = useCallback((field, messages) => {\n setTempMessages((old) => {\n if (Object.is(old?.[field], messages)) return old\n return { ...old, [field]: messages }\n })\n }, [])\n\n const handleValidityChange: OnValidityChangeCallback = useCallback((field, valid) => {\n setTempValidity((old) => {\n if (Object.is(old?.[field], valid)) return old\n return { ...old, [field]: valid }\n })\n }, [])\n\n // The button stays mounted when the editor closes, so the browser can return focus to it\n return (\n <>\n <button\n className='sorlo-button'\n type='button'\n disabled={locked}\n onClick={(event) => {\n event.preventDefault()\n setOpen((old) => !old)\n }}\n >\n {label}\n </button>\n <Modal open={open} onClose={handleCancel} header={label}>\n {/* This condition prevents infinite rendering */}\n {open && (\n /* The editor's state is temporary, so keep its reports out of the\n form's messages and evaluate its conditions against its own values */\n <FormStaticContext.Provider value={editorContext}>\n <FieldReportContext.Provider value={undefined}>\n <FieldScopeContext.Provider value={editorScopes}>\n <Fieldset\n schema={schema}\n values={tempValue}\n messages={tempMessages}\n validity={tempValidity}\n onValuesChange={handleValuesChange}\n onMessagesChange={handleMessagesChange}\n onValidityChange={handleValidityChange}\n />\n </FieldScopeContext.Provider>\n </FieldReportContext.Provider>\n </FormStaticContext.Provider>\n )}\n <button className='sorlo-button' type='button' onClick={handleCancel}>\n {cancelLabel || t('ui.cancel')}\n </button>\n <button className='sorlo-button sorlo-button--primary' type='button' disabled={locked} onClick={handleSave}>\n {saveLabel || t('ui.save')}\n </button>\n </Modal>\n </>\n )\n}\n\nexport default Component\n","import { t } from '@/i18n'\nimport { useCallback, useEffect, useId, useRef } from 'react'\n\nexport interface ModalProps {\n open: React.HTMLProps<HTMLDialogElement>['open']\n header?: React.ReactNode\n footer?: React.ReactNode\n closeButton?: boolean | React.ReactNode\n children: React.ReactNode\n onClose?: () => void\n onOpen?: () => void\n}\n\nexport default function Modal({ open, header, footer, closeButton, onOpen, onClose, children }: ModalProps) {\n const headerId = useId()\n const dialogRef = useRef<null | HTMLDialogElement>(null)\n\n const handleClose = useCallback(() => {\n const dialog = dialogRef.current\n if (dialog) {\n dialog.close()\n }\n }, [dialogRef])\n\n // An element, not a component made here, which React would rebuild on every render, losing a focused button\n const close =\n closeButton === true ? (\n <button\n className='sorlo-button'\n type='button'\n onClick={(event) => {\n event.preventDefault()\n handleClose()\n }}\n >\n {t('ui.close')}\n </button>\n ) : (\n closeButton\n )\n\n // Open dialog with JS api gives us the ::backdrop psuedo element\n // @link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog#open\n useEffect(() => {\n const dialog = dialogRef.current\n if (dialog) {\n if (open && !dialog.open) {\n dialog.showModal()\n if (onOpen) onOpen()\n } else if (!open && dialog.open) {\n dialog.close()\n }\n }\n }, [dialogRef, open, onOpen])\n\n // Fire the close event when the dialog is dismissed natively, e.g. with the escape key\n useEffect(() => {\n const dialog = dialogRef.current\n if (dialog) {\n const closeListener = () => (onClose ? onClose() : null)\n dialog.addEventListener('close', closeListener)\n\n return () => {\n dialog.removeEventListener('close', closeListener)\n }\n }\n }, [dialogRef, onClose])\n\n return (\n <dialog ref={dialogRef} className='sorlo-modal' aria-labelledby={header ? headerId : undefined}>\n {header && (\n <div className='sorlo-modal__header' id={headerId}>\n {header}\n {close}\n </div>\n )}\n\n {!header && close}\n\n <div className='sorlo-modal__body'>{children}</div>\n\n {footer && <div className='sorlo-modal__footer'>{footer}</div>}\n </dialog>\n )\n}\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputSchema,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { literalUnion } from '@/utils/typescript'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { Fragment, useCallback } from 'react'\n\nexport const name: InputName = () => 'Select (Dropdown)'\n\nexport const description: InputDescription = () => 'A dropdown list with a selection of choices that you specify.'\n\nexport const category: InputCategory = () => 'Choice'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'choices',\n label: 'Choices',\n type: 'repeater',\n required: true,\n options: {\n minimum: 1,\n fields: [\n {\n name: 'value',\n label: 'Value',\n type: 'text',\n required: true,\n width: 50,\n },\n {\n name: 'label',\n label: 'Label',\n type: 'text',\n required: false,\n width: 50,\n },\n ],\n },\n },\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n {\n name: 'multiple',\n label: 'Multiple',\n type: 'boolean',\n required: false,\n options: {\n message: 'Allow multiple selections',\n },\n },\n ]\n}\n\n// Option values come from the browser as strings, and option groups hold choices of their own\nconst choiceValues = (schema: InputSchema): Array<string> => {\n const choices: Array<any> = schema.options?.choices || []\n const values = choices.flatMap((choice) => (choice?.choices?.length > 0 ? choice.choices : [choice]))\n return values.map((choice) => String(choice.value))\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(\n value,\n schema.options?.multiple ? validationMessage(schema, 'selection') : validationMessage(schema, 'required'),\n )\n }\n\n // Check that every selection is one of the choices\n const values = choiceValues(schema)\n const selections = schema.options?.multiple ? value : [value]\n if (!Array.isArray(selections) || !selections.every((selection) => values.includes(selection))) {\n return validationError(value, validationMessage(schema, 'choice'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = (schema) => {\n const union = literalUnion(choiceValues(schema))\n return schema.options?.multiple ? `Array<${union}>` : union\n}\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n const handleOnChange = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const inputValue = schema.options?.multiple\n ? Array.from(event.target.selectedOptions).map((option) => option.value)\n : event.target.value\n doValidation(inputValue)\n },\n [doValidation, schema],\n )\n\n const choices: Array<any> = options?.choices || []\n const multiple = options?.multiple || false\n\n return (\n <div className='sorlo-input__select'>\n <select\n className='sorlo-input'\n id={id}\n {...aria}\n value={multiple && !Array.isArray(value) ? [value] : value}\n onChange={handleOnChange}\n required={required}\n disabled={disabled || readonly}\n multiple={multiple}\n >\n {/* An empty choice so the select does not appear filled before a value is set */}\n {!multiple && <option value=''>{options?.placeholder ?? ''}</option>}\n {choices.map((choice, choiceIndex) => {\n const hasChildren = choice?.choices?.length > 0\n return (\n <Fragment key={choiceIndex}>\n {hasChildren && (\n <optgroup label={choice.label ?? choice.value.toString()}>\n {choice.choices.map((childChoice: any, childChoiceIndex: number) => {\n return (\n <option value={childChoice.value} key={childChoiceIndex}>\n {childChoice.label ?? childChoice.value.toString()}\n </option>\n )\n })}\n </optgroup>\n )}\n {!hasChildren && <option value={choice.value}>{choice.label ?? choice.value.toString()}</option>}\n </Fragment>\n )\n })}\n </select>\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, isTel, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Telephone'\n\nexport const description: InputDescription = () => 'A text input specifically designed for storing phone numbers.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n if (!isTel(value)) {\n return validationError(value, validationMessage(schema, 'tel'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__tel'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='tel'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n placeholder={options?.placeholder}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Text'\n\nexport const description: InputDescription = () => 'A basic text input, useful for storing single string values.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n {\n name: 'minLength',\n label: 'Minimum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n name: 'maxLength',\n label: 'Maximum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 1,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate the minimum value length\n const min = schema.options?.minLength\n if (typeof min === 'number' && value.length < min) {\n return validationError(value, validationMessage(schema, 'minLength', { min }))\n }\n\n // Validate the maximum value length\n const max = schema.options?.maxLength\n if (typeof max === 'number' && value.length > max) {\n return validationError(value, validationMessage(schema, 'maxLength', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__text'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='text'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n minLength={options?.minLength}\n maxLength={options?.maxLength}\n placeholder={options?.placeholder}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Textarea (Multi-line text)'\n\nexport const description: InputDescription = () => 'A basic textarea input for storing paragraphs of text.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n {\n name: 'rows',\n label: 'Rows',\n type: 'number',\n required: false,\n options: {\n min: 1,\n },\n },\n {\n name: 'minLength',\n label: 'Minimum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 0,\n },\n },\n {\n name: 'maxLength',\n label: 'Maximum length',\n type: 'number',\n required: false,\n width: 50,\n options: {\n min: 1,\n },\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n // Validate the minimum value length\n const min = schema.options?.minLength\n if (typeof min === 'number' && value.length < min) {\n return validationError(value, validationMessage(schema, 'minLength', { min }))\n }\n\n // Validate the maximum value length\n const max = schema.options?.maxLength\n if (typeof max === 'number' && value.length > max) {\n return validationError(value, validationMessage(schema, 'maxLength', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__textarea'>\n <textarea\n className='sorlo-input'\n id={id}\n {...aria}\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n minLength={options?.minLength}\n maxLength={options?.maxLength}\n placeholder={options?.placeholder}\n rows={options?.rows}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'Time'\n\nexport const description: InputDescription = () => 'A time picker that stores a 24 hour time, e.g. 13:30.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n label: 'Minimum',\n name: 'min',\n type: 'time',\n required: false,\n width: 50,\n },\n {\n label: 'Maximum',\n name: 'max',\n type: 'time',\n required: false,\n width: 50,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n const match = typeof value === 'string' ? /^(\\d{2}):(\\d{2})(?::(\\d{2}))?$/.exec(value) : null\n if (!match || Number(match[1]) > 23 || Number(match[2]) > 59 || Number(match[3] || 0) > 59) {\n return validationError(value, validationMessage(schema, 'time'))\n }\n\n // Times compare lexicographically, so validate the range as strings\n const min = schema.options?.min\n if (typeof min === 'string' && min && value < min) {\n return validationError(value, validationMessage(schema, 'min', { min }))\n }\n\n const max = schema.options?.max\n if (typeof max === 'string' && max && value > max) {\n return validationError(value, validationMessage(schema, 'max', { max }))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__time'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='time'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n min={options?.min}\n max={options?.max}\n />\n </div>\n )\n}\n\nexport default Component\n","import { useFieldContext } from '@/components/Field'\nimport {\n InputCategory,\n InputComponent,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputRenderValue,\n InputTypeValue,\n InputValidateValue,\n} from '@/types/inputs'\nimport { validateSchema } from '@/utils/inputs'\nimport { validationMessage } from '@/utils/messages'\nimport { isEmptyValue, isUrl, validationError, validationSuccess } from '@/utils/validation'\nimport { useCallback } from 'react'\n\nexport const name: InputName = () => 'URL'\n\nexport const description: InputDescription = () => 'A text input specifically designed for storing web addresses.'\n\nexport const category: InputCategory = () => 'Standard'\n\nexport const optionFields: InputOptionFields = () => {\n return [\n {\n name: 'placeholder',\n label: 'Placeholder',\n type: 'text',\n required: false,\n },\n ]\n}\n\nexport const validateValue: InputValidateValue = (value, schema) => {\n schema = validateSchema(schema)\n\n // Return early if the value is empty and the field is optional\n if (!schema.required && isEmptyValue(value)) {\n return validationSuccess(value)\n }\n\n // Check for an empty value\n if (schema.required && isEmptyValue(value)) {\n return validationError(value, validationMessage(schema, 'required'))\n }\n\n if (typeof value !== 'string') {\n return validationError(value, validationMessage(schema, 'invalid'))\n }\n\n if (!isUrl(value)) {\n return validationError(value, validationMessage(schema, 'url'))\n }\n\n return validationSuccess(value)\n}\n\nexport const typeValue: InputTypeValue = () => 'string'\n\nexport const formatValue: InputFormatValue = (value, schema) => {\n schema = validateSchema(schema)\n const validation = validateValue(value, schema)\n return validation.isValid ? validation.value : null\n}\n\nexport const renderValue: InputRenderValue = (value, schema) => {\n return <>{formatValue(value, schema)}</>\n}\n\nconst Component: InputComponent = function () {\n const { id, aria, schema, required, readonly, disabled, options, value = '', handleValidation } = useFieldContext()\n\n const doValidation = useCallback(\n (input: any) => {\n handleValidation(validateValue(input, schema))\n },\n [handleValidation, schema],\n )\n\n return (\n <div className='sorlo-input__url'>\n <input\n className='sorlo-input'\n id={id}\n {...aria}\n type='url'\n value={value}\n onChange={(event) => doValidation(event.target.value)}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n placeholder={options?.placeholder}\n />\n </div>\n )\n}\n\nexport default Component\n","import Fieldset, {\n OnMessagesChangeCallback,\n OnValidityChangeCallback,\n OnValuesChangeCallback,\n} from '@/components/Fieldset'\nimport {\n Context,\n FieldInjectionContext,\n FieldReportContext,\n FieldReportContextValue,\n FieldScopeContext,\n FieldStateReport,\n FormContext,\n FormStaticContext,\n} from '@/context/FormProvider'\nimport * as coreInputs from '@/inputs'\nimport { FieldMessages } from '@/types/fields'\nimport { Input, ValidationReport } from '@/types/inputs'\nimport { conditionScope, flattenValidationReport, ValidateValuesOptions, validateValues } from '@/utils/inputs'\nimport { SetStateAction, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nexport interface FormHandle {\n validate: (options?: Pick<ValidateValuesOptions, 'allowIncomplete'>) => ValidationReport\n applyReport: (report: ValidationReport) => void\n}\n\nexport interface FormProps<Values extends Record<string, any> = Record<string, any>> {\n schema: Context['schema']\n values?: Values\n messages?: Context['messages']\n validity?: Context['validity']\n inputs?: Record<string, Input>\n onValuesChange?: (values: Values) => void\n onMessagesChange?: (messages: Context['messages']) => void\n onValidityChange?: (validity: Context['validity']) => void\n className?: string\n ref?: React.Ref<FormHandle>\n}\n\nexport default function Form<Values extends Record<string, any> = Record<string, any>>({\n schema: defaultSchema,\n values: defaultValues,\n messages: defaultMessages,\n validity: defaultValidity,\n inputs,\n onValuesChange,\n onMessagesChange,\n onValidityChange,\n className,\n ref,\n}: FormProps<Values>) {\n const [schema, setSchema] = useState<Context['schema']>(defaultSchema || [])\n const [values, setValues] = useState<Context['values']>(defaultValues || {})\n const [messages, setMessages] = useState<Context['messages']>(defaultMessages || {})\n const [validity, setValidity] = useState<Context['validity']>(defaultValidity || {})\n const [validationCounter, setValidationCounter] = useState(0)\n const [injectedMessages, setInjectedMessages] = useState<Record<string, FieldMessages>>({})\n const [injectedValidity, setInjectedValidity] = useState<Record<string, boolean | undefined>>({})\n\n // Every write goes through these refs so each change commits exactly one\n // object identity, reads the very latest state, and is emitted exactly once\n // from its write site. Emitting from an effect instead would echo adopted\n // props back to a controlling parent and feed back forever.\n const schemaRef = useRef(schema)\n const valuesRef = useRef(values)\n const messagesRef = useRef(messages)\n const validityRef = useRef(validity)\n\n const callbacks = useRef({ onValuesChange, onMessagesChange, onValidityChange })\n callbacks.current = { onValuesChange, onMessagesChange, onValidityChange }\n\n const commitSchema = useCallback((next: Context['schema']) => {\n schemaRef.current = next\n setSchema(next)\n }, [])\n\n const commitValues = useCallback((next: Context['values'], emit = true) => {\n valuesRef.current = next\n setValues(next)\n if (emit && callbacks.current.onValuesChange) callbacks.current.onValuesChange(next as Values)\n }, [])\n\n const commitMessages = useCallback((next: Context['messages'], emit = true) => {\n messagesRef.current = next\n setMessages(next)\n if (emit && callbacks.current.onMessagesChange) callbacks.current.onMessagesChange(next)\n }, [])\n\n const commitValidity = useCallback((next: Context['validity'], emit = true) => {\n validityRef.current = next\n setValidity(next)\n if (emit && callbacks.current.onValidityChange) callbacks.current.onValidityChange(next)\n }, [])\n\n // Adopt controlled props without emitting them back to the parent. Compare with the state this render shows, as a\n // child's effect may have changed the refs since, and a parent passing that change back only shows it next render\n useEffect(() => {\n if (defaultSchema === undefined) return\n if (Object.is(defaultSchema, schema)) return\n commitSchema(defaultSchema)\n }, [defaultSchema, commitSchema])\n\n useEffect(() => {\n if (defaultValues === undefined) return\n if (Object.is(defaultValues, values)) return\n commitValues(defaultValues, false)\n }, [defaultValues, commitValues])\n\n useEffect(() => {\n if (defaultMessages === undefined) return\n if (Object.is(defaultMessages, messages)) return\n commitMessages(defaultMessages, false)\n }, [defaultMessages, commitMessages])\n\n useEffect(() => {\n if (defaultValidity === undefined) return\n if (Object.is(defaultValidity, validity)) return\n commitValidity(defaultValidity, false)\n }, [defaultValidity, commitValidity])\n\n // Merge internal inputs with user defined\n const mergedInputs = useMemo(() => {\n return {\n ...coreInputs,\n ...(inputs || {}),\n }\n }, [inputs])\n\n const onFieldsetValuesChange: OnValuesChangeCallback = useCallback(\n (field, value) => {\n const old = valuesRef.current\n if (Object.is(old?.[field], value)) return\n commitValues({ ...old, [field]: value })\n },\n [commitValues],\n )\n\n const onFieldsetMessagesChange: OnMessagesChangeCallback = useCallback(\n (field, fieldMessages) => {\n const old = messagesRef.current\n if (Object.is(old?.[field], fieldMessages)) return\n commitMessages({ ...old, [field]: fieldMessages })\n },\n [commitMessages],\n )\n\n const onFieldsetValidityChange: OnValidityChangeCallback = useCallback(\n (field, fieldValidity) => {\n const old = validityRef.current\n if (Object.is(old?.[field], fieldValidity)) return\n commitValidity({ ...old, [field]: fieldValidity })\n },\n [commitValidity],\n )\n\n // Collect every field's messages and validity into path keyed maps, so\n // nested fields appear as e.g. 'address.town' or 'pets.0.petname'\n const onFieldReport: FieldStateReport = useCallback(\n (path, patch) => {\n const key = path.join('.')\n\n // An undefined patch removes the field's entries entirely\n if (patch === undefined) {\n if (key in messagesRef.current) {\n const { [key]: removed, ...rest } = messagesRef.current\n commitMessages(rest)\n }\n\n if (key in validityRef.current) {\n const { [key]: removed, ...rest } = validityRef.current\n commitValidity(rest)\n }\n\n return\n }\n\n if ('messages' in patch && !Object.is(messagesRef.current?.[key], patch.messages)) {\n commitMessages({ ...messagesRef.current, [key]: patch.messages })\n }\n\n if ('valid' in patch && !Object.is(validityRef.current?.[key], patch.valid)) {\n commitValidity({ ...validityRef.current, [key]: patch.valid })\n }\n },\n [commitMessages, commitValidity],\n )\n\n // Validate the current values against the schema, and ask every rendered\n // field to re-run its own validation so all messages are displayed, even\n // those allowIncomplete leaves out of the report\n const validate = useCallback(\n (options: Pick<ValidateValuesOptions, 'allowIncomplete'> = {}) => {\n setValidationCounter((old) => old + 1)\n return validateValues(schemaRef.current, valuesRef.current, mergedInputs, {\n environment: 'client',\n allowIncomplete: options.allowIncomplete,\n })\n },\n [mergedInputs],\n )\n\n // Apply an external validation report, e.g. one returned by a server, and\n // show its messages inline until each field next reports for itself\n const applyReport = useCallback(\n (report: ValidationReport) => {\n const flat = flattenValidationReport(report)\n\n commitMessages(flat.messages)\n commitValidity(flat.validity)\n setInjectedMessages(flat.messages)\n setInjectedValidity(flat.validity)\n },\n [commitMessages, commitValidity],\n )\n\n useImperativeHandle(ref, () => ({ validate, applyReport }), [validate, applyReport])\n\n const clearInjected = useCallback((key: string) => {\n setInjectedMessages((old) => {\n if (!(key in old)) return old\n const { [key]: removed, ...rest } = old\n return rest\n })\n\n setInjectedValidity((old) => {\n if (!(key in old)) return old\n const { [key]: removed, ...rest } = old\n return rest\n })\n }, [])\n\n // External setters go through the same write path, so state, refs and\n // change callbacks stay coherent\n const setSchemaExternal = useCallback(\n (action: SetStateAction<Context['schema']>) => {\n const next = typeof action === 'function' ? action(schemaRef.current) : action\n if (Object.is(next, schemaRef.current)) return\n commitSchema(next)\n },\n [commitSchema],\n )\n\n const setValuesExternal = useCallback(\n (action: SetStateAction<Context['values']>) => {\n const next = typeof action === 'function' ? action(valuesRef.current) : action\n if (Object.is(next, valuesRef.current)) return\n commitValues(next)\n },\n [commitValues],\n )\n\n const setMessagesExternal = useCallback(\n (action: SetStateAction<Context['messages']>) => {\n const next = typeof action === 'function' ? action(messagesRef.current) : action\n if (Object.is(next, messagesRef.current)) return\n commitMessages(next)\n },\n [commitMessages],\n )\n\n const setValidityExternal = useCallback(\n (action: SetStateAction<Context['validity']>) => {\n const next = typeof action === 'function' ? action(validityRef.current) : action\n if (Object.is(next, validityRef.current)) return\n commitValidity(next)\n },\n [commitValidity],\n )\n\n const injectionContextValue = useMemo(() => {\n return {\n messages: injectedMessages,\n validity: injectedValidity,\n clear: clearInjected,\n }\n }, [injectedMessages, injectedValidity, clearInjected])\n\n const dataContextValue = useMemo(() => {\n return {\n schema,\n values,\n messages,\n validity,\n }\n }, [schema, values, messages, validity])\n\n const staticContextValue = useMemo(() => {\n return {\n inputs: mergedInputs,\n validationCounter,\n\n setSchema: setSchemaExternal,\n setValues: setValuesExternal,\n setMessages: setMessagesExternal,\n setValidity: setValidityExternal,\n }\n }, [mergedInputs, validationCounter, setSchemaExternal, setValuesExternal, setMessagesExternal, setValidityExternal])\n\n const reportContextValue = useMemo<FieldReportContextValue>(() => {\n return {\n report: onFieldReport,\n resolve: (path) => path,\n }\n }, [onFieldReport])\n\n const scopeContextValue = useMemo(\n () => [conditionScope(schema, values, mergedInputs)],\n [schema, values, mergedInputs],\n )\n\n return (\n <FormContext.Provider value={dataContextValue}>\n <FormStaticContext.Provider value={staticContextValue}>\n <FieldReportContext.Provider value={reportContextValue}>\n <FieldInjectionContext.Provider value={injectionContextValue}>\n <FieldScopeContext.Provider value={scopeContextValue}>\n {/* Prevent implicit submissions from reloading the page */}\n <form\n className={`sorlo-form${className ? ` ${className}` : ''}`}\n onSubmit={(event) => event.preventDefault()}\n >\n <Fieldset\n schema={schema}\n values={values}\n messages={messages}\n validity={validity}\n onValuesChange={onFieldsetValuesChange}\n onMessagesChange={onFieldsetMessagesChange}\n onValidityChange={onFieldsetValidityChange}\n />\n </form>\n </FieldScopeContext.Provider>\n </FieldInjectionContext.Provider>\n </FieldReportContext.Provider>\n </FormStaticContext.Provider>\n </FormContext.Provider>\n )\n}\n","import Form from '@/components/Form'\n\nexport { default as Field, useFieldContext } from '@/components/Field'\nexport { default as Fieldset } from '@/components/Fieldset'\nexport { default as Modal } from '@/components/Modal'\nexport {\n FieldInjectionContext,\n FieldReportContext,\n FormContext,\n FormStaticContext,\n useFormContext,\n useFormStaticContext,\n} from '@/context/FormProvider'\nexport * as inputs from '@/inputs'\nexport {\n baseInputSchemaFields,\n flattenValidationReport,\n pickValues,\n resolveValidateValue,\n validateInputSchemaFields,\n validateSchema,\n validateServerValues,\n validateValues,\n} from '@/utils/inputs'\nexport { evaluateCondition, evaluateConditions, normaliseConditions, resolveConditionValue } from '@/utils/conditions'\nexport { validationMessage } from '@/utils/messages'\nexport { schemaToTypeScript } from '@/utils/typescript'\nexport {\n isEmail,\n isEmptyValue,\n isTel,\n isUrl,\n validationError,\n validationReset,\n validationSuccess,\n} from '@/utils/validation'\n\nexport type { FieldProps, OnValueChangeCallback } from '@/components/Field'\nexport type {\n FieldsetProps,\n OnMessagesChangeCallback,\n OnValidityChangeCallback,\n OnValuesChangeCallback,\n} from '@/components/Fieldset'\nexport type { FormHandle, FormProps } from '@/components/Form'\nexport type { ModalProps } from '@/components/Modal'\nexport type {\n Context,\n DataContext,\n FieldInjectionContextValue,\n FieldPath,\n FieldReportContextValue,\n FieldStatePatch,\n FieldStateReport,\n StaticContext,\n} from '@/context/FormProvider'\nexport type {\n ConditionGroup,\n ConditionOperator,\n FieldCondition,\n FieldConditions,\n FieldMessages,\n FieldSchema,\n} from '@/types/fields'\nexport type { ConditionScopes } from '@/utils/conditions'\nexport type { FlatValidationReport, ValidateValuesOptions } from '@/utils/inputs'\nexport type {\n FieldValidationReport,\n Input,\n InputCategory,\n InputComponent,\n InputCoreFields,\n InputDescription,\n InputFormatValue,\n InputName,\n InputOptionFields,\n InputPickFields,\n InputPickValue,\n InputPrepareSchema,\n InputRenderValue,\n InputSchema,\n InputTypeFields,\n InputTypeValue,\n InputValidateChildren,\n InputValidateClientValue,\n InputValidateFields,\n InputValidateServerValue,\n InputValidateValue,\n InputValidationResponse,\n ValidationEnvironment,\n ValidationReport,\n ValidationReportChildren,\n} from '@/types/inputs'\nexport type {\n ValidationResponse,\n ValidationResponseError,\n ValidationResponseReset,\n ValidationResponseSuccess,\n} from '@/utils/validation'\n\nexport { Form }\nexport default Form\n"],"mappings":"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","names":["report","name","optionFields","isEqual","createContext","useContext","useMemo","name","isValid","value","messages","schema","validate","handleValidation","useCallback","useContext","jsx","jsxs","FieldsetItem","Component","value","messages","name","useCallback","jsx","jsxs","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","useContext","useEffect","useRef","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","name","useCallback","Fragment","jsx","jsxs","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","isEqual","Fragment","useContext","useEffect","useMemo","useRef","jsx","jsxs","name","description","category","optionFields","validateValue","isRule","typeValue","formatValue","renderValue","Component","category","description","name","optionFields","pickValue","typeValue","jsx","name","description","category","optionFields","pickValue","typeValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","pickValue","renderValue","typeValue","validateChildren","validateValue","useCallback","useEffect","useMemo","Fragment","jsx","jsxs","name","description","category","optionFields","validateValue","validateChildren","pickValue","typeValue","formatValue","renderValue","Component","category","coreFields","description","formatValue","name","optionFields","pickValue","renderValue","typeValue","validateChildren","validateValue","useCallback","useContext","useEffect","useMemo","useState","Fragment","jsx","name","description","category","coreFields","optionFields","validateValue","validateChildren","pickValue","typeValue","formatValue","renderValue","Component","category","coreFields","description","formatValue","name","optionFields","pickValue","renderValue","typeValue","useEffect","Fragment","jsx","name","description","category","coreFields","optionFields","pickValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","pickValue","renderValue","typeValue","validateChildren","validateValue","useCallback","useContext","useEffect","useMemo","useState","Fragment","jsx","jsxs","name","description","category","optionFields","validateValue","validateChildren","pickValue","typeValue","formatValue","renderValue","Component","value","columns","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","jsxs","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","jsxs","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","pickValue","renderValue","typeValue","validateChildren","validateValue","useCallback","useContext","useEffect","useMemo","useState","Fragment","jsx","name","description","category","optionFields","validateValue","validateChildren","pickValue","typeValue","formatValue","renderValue","Component","category","coreFields","description","formatValue","name","renderValue","typeValue","validateValue","useCallback","useEffect","useId","useRef","jsx","jsxs","isEqual","Fragment","createContext","useCallback","useContext","useEffect","useMemo","useState","jsx","jsxs","name","description","category","coreFields","validateValue","typeValue","formatValue","renderValue","prepareSchema","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","Fragment","useCallback","jsx","jsxs","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","category","description","formatValue","name","optionFields","renderValue","typeValue","validateValue","useCallback","Fragment","jsx","name","description","category","optionFields","validateValue","typeValue","formatValue","renderValue","Component","useCallback","useEffect","useMemo","useRef","useState","jsx","defaultMessages"]}
|