@webiny/app-headless-cms 6.5.0 → 6.5.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/features/formModel/CmsFormModelBuilder.test.js +213 -0
  2. package/features/formModel/CmsFormModelBuilder.test.js.map +1 -1
  3. package/features/formModel/CmsValidationMapper.d.ts +9 -0
  4. package/features/formModel/CmsValidationMapper.js +25 -19
  5. package/features/formModel/CmsValidationMapper.js.map +1 -1
  6. package/features/formModel/mappers/DateTimeFieldMapper.js +3 -0
  7. package/features/formModel/mappers/DateTimeFieldMapper.js.map +1 -1
  8. package/package.json +20 -20
  9. package/presentation/fieldEditor/groups/AppearanceGroup.js +12 -0
  10. package/presentation/fieldEditor/groups/AppearanceGroup.js.map +1 -1
  11. package/presentation/fieldEditor/groups/ValidationsGroup.d.ts +2 -0
  12. package/presentation/fieldEditor/groups/ValidationsGroup.js +20 -6
  13. package/presentation/fieldEditor/groups/ValidationsGroup.js.map +1 -1
  14. package/presentation/fieldEditor/renderers/CmsValidatorsRenderer.js +2 -2
  15. package/presentation/fieldEditor/renderers/CmsValidatorsRenderer.js.map +1 -1
  16. package/presentation/fieldRenderers/feature.js +2 -1
  17. package/presentation/fieldRenderers/feature.js.map +1 -1
  18. package/presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.d.ts +15 -0
  19. package/presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.js +19 -0
  20. package/presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.js.map +1 -0
  21. package/presentation/fieldTypes/renderers/index.d.ts +1 -0
  22. package/presentation/fieldTypes/renderers/index.js +1 -0
  23. package/presentation/fieldValidators/abstractions.d.ts +7 -0
  24. package/presentation/fieldValidators/abstractions.js.map +1 -1
  25. package/presentation/fieldValidators/validators/DateGteValidator.d.ts +6 -0
  26. package/presentation/fieldValidators/validators/DateGteValidator.js +17 -25
  27. package/presentation/fieldValidators/validators/DateGteValidator.js.map +1 -1
  28. package/presentation/fieldValidators/validators/DateLteValidator.d.ts +6 -0
  29. package/presentation/fieldValidators/validators/DateLteValidator.js +17 -25
  30. package/presentation/fieldValidators/validators/DateLteValidator.js.map +1 -1
  31. package/presentation/fieldValidators/validators/dateLimitSettings.d.ts +20 -0
  32. package/presentation/fieldValidators/validators/dateLimitSettings.js +124 -0
  33. package/presentation/fieldValidators/validators/dateLimitSettings.js.map +1 -0
  34. package/presentation/fieldValidators/validators/dateLimitSettings.test.d.ts +1 -0
  35. package/presentation/fieldValidators/validators/dateLimitSettings.test.js +111 -0
  36. package/presentation/fieldValidators/validators/dateLimitSettings.test.js.map +1 -0
@@ -16,6 +16,8 @@ declare class ValidationsGroupImpl implements CmsFieldEditorGroup.Interface {
16
16
  };
17
17
  mapFromForm(formData: Record<string, unknown>, field: CmsModelField): void;
18
18
  private flattenValidators;
19
+ private settingsToForm;
20
+ private settingsFromForm;
19
21
  }
20
22
  export declare const ValidationsGroup: typeof ValidationsGroupImpl & {
21
23
  __abstraction: import("@webiny/di").Abstraction<import("../abstractions.js").ICmsFieldEditorGroup>;
@@ -128,14 +128,14 @@ class ValidationsGroupImpl {
128
128
  validationMap[validator.name] = {
129
129
  enabled: true,
130
130
  message: validator.message,
131
- settings: validator.settings || {}
131
+ settings: this.settingsToForm(validator.name, validator.settings || {}, field)
132
132
  };
133
133
  }
134
134
  const listValidationMap = {};
135
135
  for (const v of field.listValidation || [])listValidationMap[v.name] = {
136
136
  enabled: true,
137
137
  message: v.message,
138
- settings: v.settings || {}
138
+ settings: this.settingsToForm(v.name, v.settings || {}, field)
139
139
  };
140
140
  return {
141
141
  validation: validationMap,
@@ -143,16 +143,30 @@ class ValidationsGroupImpl {
143
143
  };
144
144
  }
145
145
  mapFromForm(formData, field) {
146
- field.validation = this.flattenValidators(formData.validation || {});
147
- field.listValidation = this.flattenValidators(formData.listValidation || {});
146
+ field.validation = this.flattenValidators(formData.validation || {}, field);
147
+ field.listValidation = this.flattenValidators(formData.listValidation || {}, field);
148
148
  }
149
- flattenValidators(data) {
149
+ flattenValidators(data, field) {
150
150
  return Object.entries(data).filter(([_, v])=>v && v.enabled).map(([name, v])=>({
151
151
  name,
152
152
  message: v.message,
153
- settings: v.settings
153
+ settings: this.settingsFromForm(name, v.settings, field)
154
154
  }));
155
155
  }
156
+ settingsToForm(name, settings, field) {
157
+ const validator = this.allValidators.find((v)=>v.name === name);
158
+ if (!validator?.mapSettingsToForm) return settings;
159
+ return validator.mapSettingsToForm(settings, {
160
+ field
161
+ });
162
+ }
163
+ settingsFromForm(name, settings, field) {
164
+ const validator = this.allValidators.find((v)=>v.name === name);
165
+ if (!settings || !validator?.mapSettingsFromForm) return settings;
166
+ return validator.mapSettingsFromForm(settings, {
167
+ field
168
+ });
169
+ }
156
170
  }
157
171
  const ValidationsGroup = CmsFieldEditorGroup.createImplementation({
158
172
  implementation: ValidationsGroupImpl,
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldEditor/groups/ValidationsGroup.js","sources":["../../../../src/presentation/fieldEditor/groups/ValidationsGroup.ts"],"sourcesContent":["import { CmsFieldEditorGroup } from \"../abstractions.js\";\nimport type { ICmsFieldEditorFormBuilder, ICmsFieldEditorContext } from \"../abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport type { CmsModelFieldValidatorsGroup } from \"~/presentation/fieldTypes/abstractions.js\";\nimport { CmsFieldValidator } from \"~/presentation/fieldValidators/abstractions.js\";\nimport type {\n ICmsFieldValidator,\n ICmsFieldValidatorFormBuilder\n} from \"~/presentation/fieldValidators/abstractions.js\";\nimport type { FormModelFactory, FormModel } from \"@webiny/app-admin\";\n\nfunction resolveValidatorNames(\n config:\n | string[]\n | CmsModelFieldValidatorsGroup\n | ((field: CmsModelField) => string[] | CmsModelFieldValidatorsGroup)\n | undefined,\n field: CmsModelField\n): string[] {\n if (!config) {\n return [];\n }\n if (typeof config === \"function\") {\n return resolveValidatorNames(config(field), field);\n }\n if (Array.isArray(config)) {\n return config;\n }\n return config.validators.map(v => (typeof v === \"string\" ? v : v.name));\n}\n\ninterface ValidatorBuildResult {\n fields: Record<string, FormModelFactory.FieldBuilder>;\n layouts: Map<\n string,\n {\n settingsLayoutFns: Array<\n (l: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]\n >;\n hasSettings: boolean;\n }\n >;\n}\n\nclass ValidationsGroupImpl implements CmsFieldEditorGroup.Interface {\n name = \"validations\";\n label = \"Validations\";\n\n constructor(private allValidators: ICmsFieldValidator[]) {}\n\n buildForm(form: ICmsFieldEditorFormBuilder, context: ICmsFieldEditorContext) {\n const fieldValidatorNames = resolveValidatorNames(\n context.fieldType.validators,\n context.field\n );\n const DEFAULT_LIST_VALIDATORS = [\"minLength\", \"maxLength\"];\n const listValidatorNames =\n resolveValidatorNames(context.fieldType.listValidators, context.field).length > 0\n ? resolveValidatorNames(context.fieldType.listValidators, context.field)\n : DEFAULT_LIST_VALIDATORS;\n\n const fieldValidators = this.allValidators.filter(v =>\n fieldValidatorNames.includes(v.name)\n );\n const listValidators = this.allValidators.filter(v => listValidatorNames.includes(v.name));\n\n let fieldResult: ValidatorBuildResult | null = null;\n let listResult: ValidatorBuildResult | null = null;\n\n form.fields(fields => {\n const result: Record<string, FormModelFactory.FieldBuilder> = {};\n\n if (listValidators.length > 0) {\n listResult = this.buildValidatorFields(\n fields as FormModelFactory.FieldBuilderRegistry,\n listValidators,\n context\n );\n result.listValidation = fields\n .object()\n .renderer(\"passthrough\")\n .hiddenWhen(\n ({ form }: FormModel.CallbackParams) =>\n !form.field(\"general.list\").getValue()\n )\n .fields(() => listResult!.fields);\n }\n\n if (fieldValidators.length > 0) {\n fieldResult = this.buildValidatorFields(\n fields as FormModelFactory.FieldBuilderRegistry,\n fieldValidators,\n context\n );\n result.validation = fields\n .object()\n .renderer(\"passthrough\")\n .fields(() => fieldResult!.fields);\n }\n\n return result;\n });\n\n const listRule = {\n type: \"condition\",\n target: \"general.list\",\n operator: \"isFalsy\",\n value: null,\n action: \"hide\" as const\n };\n\n form.layout(layout => {\n const rows: FormModel.LayoutNodeBuilder[] = [];\n\n if (listValidators.length > 0 && listResult) {\n rows.push(\n layout\n .separator()\n .title(\"List validators\")\n .description(\"These validators are applied to the entire list of values.\")\n .rules([listRule])\n );\n rows.push(\n layout.object(\"listValidation\", inner =>\n this.buildValidatorLayouts(inner, listValidators, listResult!)\n )\n );\n }\n\n if (fieldValidators.length > 0 && fieldResult) {\n if (listValidators.length > 0) {\n rows.push(\n layout\n .separator()\n .title(\"Individual value validators\")\n .description(\"These validators are applied to each value in the list.\")\n .rules([listRule])\n );\n }\n rows.push(\n layout.object(\"validation\", inner =>\n this.buildValidatorLayouts(inner, fieldValidators, fieldResult!)\n )\n );\n }\n\n return rows;\n });\n }\n\n private buildValidatorLayouts(\n layout: FormModelFactory.LayoutBuilder,\n validators: ICmsFieldValidator[],\n result: ValidatorBuildResult\n ): FormModel.LayoutNodeBuilder[] {\n return validators.map(validator => {\n const meta = result.layouts.get(validator.name);\n return layout.object(validator.name, inner => {\n const rows: FormModel.LayoutNodeBuilder[] = [inner.row(\"message\")];\n if (meta && meta.hasSettings) {\n rows.push(\n inner.object(\"settings\", settingsLayout =>\n meta.settingsLayoutFns.flatMap(fn => fn(settingsLayout))\n )\n );\n }\n return rows;\n });\n });\n }\n\n private buildValidatorFields(\n fields: FormModelFactory.FieldBuilderRegistry,\n validators: ICmsFieldValidator[],\n context: ICmsFieldEditorContext\n ): ValidatorBuildResult {\n const resultFields: Record<string, FormModelFactory.FieldBuilder> = {};\n const layouts = new Map<\n string,\n {\n settingsLayoutFns: Array<\n (l: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]\n >;\n hasSettings: boolean;\n }\n >();\n\n for (const validator of validators) {\n let messageDescription = \"This message will be displayed to the user.\";\n if (validator.variables && validator.variables.length > 0) {\n const vars = validator.variables.map(v => `{${v.name}}`).join(\", \");\n messageDescription += ` Available variables: ${vars}.`;\n }\n\n const notEnabled = ({ field }: FormModel.CallbackParams) =>\n !field.parent().field(\"enabled\").getValue();\n\n const childFields: Record<string, FormModelFactory.FieldBuilder> = {\n enabled: fields.boolean().label(\"Enabled\").defaultValue(false).hidden(),\n message: fields\n .text()\n .label(\"Message\")\n .description(messageDescription)\n .defaultValue(validator.defaultMessage)\n .hiddenWhen(notEnabled)\n };\n\n const settingsLayoutFns: Array<\n (l: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]\n > = [];\n let hasSettings = false;\n\n if (validator.buildSettingsForm) {\n const settingsFieldsFns: Array<\n (\n f: FormModelFactory.FieldBuilderRegistry\n ) => Record<string, FormModelFactory.FieldBuilder>\n > = [];\n\n const builder: ICmsFieldValidatorFormBuilder = {\n message: childFields.message,\n fields: fn => {\n settingsFieldsFns.push(fn);\n },\n layout: fn => {\n settingsLayoutFns.push(fn);\n }\n };\n validator.buildSettingsForm(builder, { field: context.field });\n\n if (settingsFieldsFns.length > 0) {\n hasSettings = true;\n childFields.settings = fields\n .object()\n .renderer(\"passthrough\")\n .hiddenWhen(notEnabled)\n .fields((f: FormModelFactory.FieldBuilderRegistry) => {\n const merged: Record<string, FormModelFactory.FieldBuilder> = {};\n for (const fn of settingsFieldsFns) {\n Object.assign(merged, fn(f));\n }\n return merged;\n });\n }\n }\n\n layouts.set(validator.name, { settingsLayoutFns, hasSettings });\n\n resultFields[validator.name] = fields\n .object()\n .label(validator.label)\n .description(validator.description)\n .renderer(\"cmsValidatorItem\")\n .fields(() => childFields);\n }\n\n return { fields: resultFields, layouts };\n }\n\n mapToForm(field: CmsModelField) {\n const validationMap: Record<string, Record<string, unknown>> = {};\n for (const v of field.validation || []) {\n const validator = v as {\n name: string;\n message?: string;\n settings?: Record<string, unknown>;\n };\n validationMap[validator.name] = {\n enabled: true,\n message: validator.message,\n settings: validator.settings || {}\n };\n }\n\n const listValidationMap: Record<string, Record<string, unknown>> = {};\n for (const v of field.listValidation || []) {\n listValidationMap[v.name] = {\n enabled: true,\n message: v.message,\n settings: v.settings || {}\n };\n }\n\n return {\n validation: validationMap,\n listValidation: listValidationMap\n };\n }\n\n mapFromForm(formData: Record<string, unknown>, field: CmsModelField) {\n field.validation = this.flattenValidators(\n (formData.validation || {}) as Record<string, any>\n );\n field.listValidation = this.flattenValidators(\n (formData.listValidation || {}) as Record<string, any>\n );\n }\n\n private flattenValidators(\n data: Record<\n string,\n {\n enabled?: boolean;\n message?: string;\n settings?: Record<string, unknown>;\n }\n >\n ) {\n return Object.entries(data)\n .filter(([_, v]) => v && v.enabled)\n .map(([name, v]) => ({\n name,\n message: v.message,\n settings: v.settings\n }));\n }\n}\n\nexport const ValidationsGroup = CmsFieldEditorGroup.createImplementation({\n implementation: ValidationsGroupImpl,\n dependencies: [[CmsFieldValidator, { multiple: true }]]\n});\n"],"names":["resolveValidatorNames","config","field","Array","v","ValidationsGroupImpl","allValidators","form","context","fieldValidatorNames","DEFAULT_LIST_VALIDATORS","listValidatorNames","fieldValidators","listValidators","fieldResult","listResult","fields","result","listRule","layout","rows","inner","validators","validator","meta","settingsLayout","fn","resultFields","layouts","Map","messageDescription","vars","notEnabled","childFields","settingsLayoutFns","hasSettings","settingsFieldsFns","builder","f","merged","Object","validationMap","listValidationMap","formData","data","_","name","ValidationsGroup","CmsFieldEditorGroup","CmsFieldValidator"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/fieldEditor/groups/ValidationsGroup.js","sources":["../../../../src/presentation/fieldEditor/groups/ValidationsGroup.ts"],"sourcesContent":["import { CmsFieldEditorGroup } from \"../abstractions.js\";\nimport type { ICmsFieldEditorFormBuilder, ICmsFieldEditorContext } from \"../abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport type { CmsModelFieldValidatorsGroup } from \"~/presentation/fieldTypes/abstractions.js\";\nimport { CmsFieldValidator } from \"~/presentation/fieldValidators/abstractions.js\";\nimport type {\n ICmsFieldValidator,\n ICmsFieldValidatorFormBuilder\n} from \"~/presentation/fieldValidators/abstractions.js\";\nimport type { FormModelFactory, FormModel } from \"@webiny/app-admin\";\n\nfunction resolveValidatorNames(\n config:\n | string[]\n | CmsModelFieldValidatorsGroup\n | ((field: CmsModelField) => string[] | CmsModelFieldValidatorsGroup)\n | undefined,\n field: CmsModelField\n): string[] {\n if (!config) {\n return [];\n }\n if (typeof config === \"function\") {\n return resolveValidatorNames(config(field), field);\n }\n if (Array.isArray(config)) {\n return config;\n }\n return config.validators.map(v => (typeof v === \"string\" ? v : v.name));\n}\n\ninterface ValidatorBuildResult {\n fields: Record<string, FormModelFactory.FieldBuilder>;\n layouts: Map<\n string,\n {\n settingsLayoutFns: Array<\n (l: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]\n >;\n hasSettings: boolean;\n }\n >;\n}\n\nclass ValidationsGroupImpl implements CmsFieldEditorGroup.Interface {\n name = \"validations\";\n label = \"Validations\";\n\n constructor(private allValidators: ICmsFieldValidator[]) {}\n\n buildForm(form: ICmsFieldEditorFormBuilder, context: ICmsFieldEditorContext) {\n const fieldValidatorNames = resolveValidatorNames(\n context.fieldType.validators,\n context.field\n );\n const DEFAULT_LIST_VALIDATORS = [\"minLength\", \"maxLength\"];\n const listValidatorNames =\n resolveValidatorNames(context.fieldType.listValidators, context.field).length > 0\n ? resolveValidatorNames(context.fieldType.listValidators, context.field)\n : DEFAULT_LIST_VALIDATORS;\n\n const fieldValidators = this.allValidators.filter(v =>\n fieldValidatorNames.includes(v.name)\n );\n const listValidators = this.allValidators.filter(v => listValidatorNames.includes(v.name));\n\n let fieldResult: ValidatorBuildResult | null = null;\n let listResult: ValidatorBuildResult | null = null;\n\n form.fields(fields => {\n const result: Record<string, FormModelFactory.FieldBuilder> = {};\n\n if (listValidators.length > 0) {\n listResult = this.buildValidatorFields(\n fields as FormModelFactory.FieldBuilderRegistry,\n listValidators,\n context\n );\n result.listValidation = fields\n .object()\n .renderer(\"passthrough\")\n .hiddenWhen(\n ({ form }: FormModel.CallbackParams) =>\n !form.field(\"general.list\").getValue()\n )\n .fields(() => listResult!.fields);\n }\n\n if (fieldValidators.length > 0) {\n fieldResult = this.buildValidatorFields(\n fields as FormModelFactory.FieldBuilderRegistry,\n fieldValidators,\n context\n );\n result.validation = fields\n .object()\n .renderer(\"passthrough\")\n .fields(() => fieldResult!.fields);\n }\n\n return result;\n });\n\n const listRule = {\n type: \"condition\",\n target: \"general.list\",\n operator: \"isFalsy\",\n value: null,\n action: \"hide\" as const\n };\n\n form.layout(layout => {\n const rows: FormModel.LayoutNodeBuilder[] = [];\n\n if (listValidators.length > 0 && listResult) {\n rows.push(\n layout\n .separator()\n .title(\"List validators\")\n .description(\"These validators are applied to the entire list of values.\")\n .rules([listRule])\n );\n rows.push(\n layout.object(\"listValidation\", inner =>\n this.buildValidatorLayouts(inner, listValidators, listResult!)\n )\n );\n }\n\n if (fieldValidators.length > 0 && fieldResult) {\n if (listValidators.length > 0) {\n rows.push(\n layout\n .separator()\n .title(\"Individual value validators\")\n .description(\"These validators are applied to each value in the list.\")\n .rules([listRule])\n );\n }\n rows.push(\n layout.object(\"validation\", inner =>\n this.buildValidatorLayouts(inner, fieldValidators, fieldResult!)\n )\n );\n }\n\n return rows;\n });\n }\n\n private buildValidatorLayouts(\n layout: FormModelFactory.LayoutBuilder,\n validators: ICmsFieldValidator[],\n result: ValidatorBuildResult\n ): FormModel.LayoutNodeBuilder[] {\n return validators.map(validator => {\n const meta = result.layouts.get(validator.name);\n return layout.object(validator.name, inner => {\n const rows: FormModel.LayoutNodeBuilder[] = [inner.row(\"message\")];\n if (meta && meta.hasSettings) {\n rows.push(\n inner.object(\"settings\", settingsLayout =>\n meta.settingsLayoutFns.flatMap(fn => fn(settingsLayout))\n )\n );\n }\n return rows;\n });\n });\n }\n\n private buildValidatorFields(\n fields: FormModelFactory.FieldBuilderRegistry,\n validators: ICmsFieldValidator[],\n context: ICmsFieldEditorContext\n ): ValidatorBuildResult {\n const resultFields: Record<string, FormModelFactory.FieldBuilder> = {};\n const layouts = new Map<\n string,\n {\n settingsLayoutFns: Array<\n (l: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]\n >;\n hasSettings: boolean;\n }\n >();\n\n for (const validator of validators) {\n let messageDescription = \"This message will be displayed to the user.\";\n if (validator.variables && validator.variables.length > 0) {\n const vars = validator.variables.map(v => `{${v.name}}`).join(\", \");\n messageDescription += ` Available variables: ${vars}.`;\n }\n\n const notEnabled = ({ field }: FormModel.CallbackParams) =>\n !field.parent().field(\"enabled\").getValue();\n\n const childFields: Record<string, FormModelFactory.FieldBuilder> = {\n enabled: fields.boolean().label(\"Enabled\").defaultValue(false).hidden(),\n message: fields\n .text()\n .label(\"Message\")\n .description(messageDescription)\n .defaultValue(validator.defaultMessage)\n .hiddenWhen(notEnabled)\n };\n\n const settingsLayoutFns: Array<\n (l: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]\n > = [];\n let hasSettings = false;\n\n if (validator.buildSettingsForm) {\n const settingsFieldsFns: Array<\n (\n f: FormModelFactory.FieldBuilderRegistry\n ) => Record<string, FormModelFactory.FieldBuilder>\n > = [];\n\n const builder: ICmsFieldValidatorFormBuilder = {\n message: childFields.message,\n fields: fn => {\n settingsFieldsFns.push(fn);\n },\n layout: fn => {\n settingsLayoutFns.push(fn);\n }\n };\n validator.buildSettingsForm(builder, { field: context.field });\n\n if (settingsFieldsFns.length > 0) {\n hasSettings = true;\n childFields.settings = fields\n .object()\n .renderer(\"passthrough\")\n .hiddenWhen(notEnabled)\n .fields((f: FormModelFactory.FieldBuilderRegistry) => {\n const merged: Record<string, FormModelFactory.FieldBuilder> = {};\n for (const fn of settingsFieldsFns) {\n Object.assign(merged, fn(f));\n }\n return merged;\n });\n }\n }\n\n layouts.set(validator.name, { settingsLayoutFns, hasSettings });\n\n resultFields[validator.name] = fields\n .object()\n .label(validator.label)\n .description(validator.description)\n .renderer(\"cmsValidatorItem\")\n .fields(() => childFields);\n }\n\n return { fields: resultFields, layouts };\n }\n\n mapToForm(field: CmsModelField) {\n const validationMap: Record<string, Record<string, unknown>> = {};\n for (const v of field.validation || []) {\n const validator = v as {\n name: string;\n message?: string;\n settings?: Record<string, unknown>;\n };\n validationMap[validator.name] = {\n enabled: true,\n message: validator.message,\n settings: this.settingsToForm(validator.name, validator.settings || {}, field)\n };\n }\n\n const listValidationMap: Record<string, Record<string, unknown>> = {};\n for (const v of field.listValidation || []) {\n listValidationMap[v.name] = {\n enabled: true,\n message: v.message,\n settings: this.settingsToForm(v.name, v.settings || {}, field)\n };\n }\n\n return {\n validation: validationMap,\n listValidation: listValidationMap\n };\n }\n\n mapFromForm(formData: Record<string, unknown>, field: CmsModelField) {\n field.validation = this.flattenValidators(\n (formData.validation || {}) as Record<string, any>,\n field\n );\n field.listValidation = this.flattenValidators(\n (formData.listValidation || {}) as Record<string, any>,\n field\n );\n }\n\n private flattenValidators(\n data: Record<\n string,\n {\n enabled?: boolean;\n message?: string;\n settings?: Record<string, unknown>;\n }\n >,\n field: CmsModelField\n ) {\n return Object.entries(data)\n .filter(([_, v]) => v && v.enabled)\n .map(([name, v]) => ({\n name,\n message: v.message,\n settings: this.settingsFromForm(name, v.settings, field)\n }));\n }\n\n private settingsToForm(\n name: string,\n settings: Record<string, unknown>,\n field: CmsModelField\n ): Record<string, unknown> {\n const validator = this.allValidators.find(v => v.name === name);\n if (!validator?.mapSettingsToForm) {\n return settings;\n }\n return validator.mapSettingsToForm(settings, { field });\n }\n\n private settingsFromForm(\n name: string,\n settings: Record<string, unknown> | undefined,\n field: CmsModelField\n ): Record<string, unknown> | undefined {\n const validator = this.allValidators.find(v => v.name === name);\n if (!settings || !validator?.mapSettingsFromForm) {\n return settings;\n }\n return validator.mapSettingsFromForm(settings, { field });\n }\n}\n\nexport const ValidationsGroup = CmsFieldEditorGroup.createImplementation({\n implementation: ValidationsGroupImpl,\n dependencies: [[CmsFieldValidator, { multiple: true }]]\n});\n"],"names":["resolveValidatorNames","config","field","Array","v","ValidationsGroupImpl","allValidators","form","context","fieldValidatorNames","DEFAULT_LIST_VALIDATORS","listValidatorNames","fieldValidators","listValidators","fieldResult","listResult","fields","result","listRule","layout","rows","inner","validators","validator","meta","settingsLayout","fn","resultFields","layouts","Map","messageDescription","vars","notEnabled","childFields","settingsLayoutFns","hasSettings","settingsFieldsFns","builder","f","merged","Object","validationMap","listValidationMap","formData","data","_","name","settings","ValidationsGroup","CmsFieldEditorGroup","CmsFieldValidator"],"mappings":"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"}
@@ -2,7 +2,7 @@ import react from "react";
2
2
  import { observer } from "mobx-react-lite";
3
3
  import { createObjectFieldRenderer } from "@webiny/app-admin/features/formModel/createFieldRenderer.js";
4
4
  import { LayoutNodeRenderer } from "@webiny/app-admin/features/formModel/FormView.js";
5
- import { Accordion, Switch } from "@webiny/admin-ui";
5
+ import { Accordion, SwitchPrimitive } from "@webiny/admin-ui";
6
6
  const CmsValidatorItemRenderer = createObjectFieldRenderer(({ field })=>/*#__PURE__*/ react.createElement(ValidatorItem, {
7
7
  field: field
8
8
  }));
@@ -20,7 +20,7 @@ const ValidatorItem = observer(({ field })=>{
20
20
  open: isEnabled,
21
21
  title: field.label,
22
22
  description: field.description,
23
- actions: /*#__PURE__*/ react.createElement(Switch, {
23
+ actions: /*#__PURE__*/ react.createElement(SwitchPrimitive, {
24
24
  label: "Enabled",
25
25
  checked: isEnabled,
26
26
  onChange: toggleEnabled
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldEditor/renderers/CmsValidatorsRenderer.js","sources":["../../../../src/presentation/fieldEditor/renderers/CmsValidatorsRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { createObjectFieldRenderer } from \"@webiny/app-admin/features/formModel/createFieldRenderer.js\";\nimport { LayoutNodeRenderer } from \"@webiny/app-admin/features/formModel/FormView.js\";\nimport type { IObjectFieldVM } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { Accordion, Switch } from \"@webiny/admin-ui\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n cmsValidatorItem: { fieldType: \"object\"; settings: undefined };\n }\n}\n\nexport const CmsValidatorItemRenderer = createObjectFieldRenderer(({ field }) => {\n return <ValidatorItem field={field} />;\n});\n\ninterface ValidatorItemProps {\n field: IObjectFieldVM;\n}\n\nconst ValidatorItem = observer(({ field }: ValidatorItemProps) => {\n const value = field.value as Record<string, unknown> | null;\n const isEnabled = Boolean(value && value.enabled);\n\n const toggleEnabled = (checked: boolean) => {\n field.onChange({ ...value, enabled: checked });\n };\n\n return (\n <Accordion.Item\n interactive={false}\n open={isEnabled}\n title={field.label}\n description={field.description}\n actions={<Switch label=\"Enabled\" checked={isEnabled} onChange={toggleEnabled} />}\n >\n {isEnabled ? (\n <div className={\"flex flex-col gap-md p-md\"}>\n {field.layout.map((node, index) => (\n <LayoutNodeRenderer key={index} node={node} />\n ))}\n </div>\n ) : null}\n </Accordion.Item>\n );\n});\n"],"names":["CmsValidatorItemRenderer","createObjectFieldRenderer","field","ValidatorItem","observer","value","isEnabled","Boolean","toggleEnabled","checked","Accordion","Switch","node","index","LayoutNodeRenderer"],"mappings":";;;;;AAaO,MAAMA,2BAA2BC,0BAA0B,CAAC,EAAEC,KAAK,EAAE,GACjE,WAAP,GAAO,oBAACC,eAAaA;QAAC,OAAOD;;AAOjC,MAAMC,gBAAgBC,SAAS,CAAC,EAAEF,KAAK,EAAsB;IACzD,MAAMG,QAAQH,MAAM,KAAK;IACzB,MAAMI,YAAYC,QAAQF,SAASA,MAAM,OAAO;IAEhD,MAAMG,gBAAgB,CAACC;QACnBP,MAAM,QAAQ,CAAC;YAAE,GAAGG,KAAK;YAAE,SAASI;QAAQ;IAChD;IAEA,OAAO,WAAP,GACI,oBAACC,UAAU,IAAI;QACX,aAAa;QACb,MAAMJ;QACN,OAAOJ,MAAM,KAAK;QAClB,aAAaA,MAAM,WAAW;QAC9B,uBAAS,oBAACS,QAAMA;YAAC,OAAM;YAAU,SAASL;YAAW,UAAUE;;OAE9DF,YAAY,WAAZA,GACG,oBAAC;QAAI,WAAW;OACXJ,MAAM,MAAM,CAAC,GAAG,CAAC,CAACU,MAAMC,QAAAA,WAAAA,GACrB,oBAACC,oBAAkBA;YAAC,KAAKD;YAAO,MAAMD;eAG9C;AAGhB"}
1
+ {"version":3,"file":"presentation/fieldEditor/renderers/CmsValidatorsRenderer.js","sources":["../../../../src/presentation/fieldEditor/renderers/CmsValidatorsRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { createObjectFieldRenderer } from \"@webiny/app-admin/features/formModel/createFieldRenderer.js\";\nimport { LayoutNodeRenderer } from \"@webiny/app-admin/features/formModel/FormView.js\";\nimport type { IObjectFieldVM } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { Accordion, SwitchPrimitive } from \"@webiny/admin-ui\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n cmsValidatorItem: { fieldType: \"object\"; settings: undefined };\n }\n}\n\nexport const CmsValidatorItemRenderer = createObjectFieldRenderer(({ field }) => {\n return <ValidatorItem field={field} />;\n});\n\ninterface ValidatorItemProps {\n field: IObjectFieldVM;\n}\n\nconst ValidatorItem = observer(({ field }: ValidatorItemProps) => {\n const value = field.value as Record<string, unknown> | null;\n const isEnabled = Boolean(value && value.enabled);\n\n const toggleEnabled = (checked: boolean) => {\n field.onChange({ ...value, enabled: checked });\n };\n\n return (\n <Accordion.Item\n interactive={false}\n open={isEnabled}\n title={field.label}\n description={field.description}\n actions={\n // The primitive keeps the label inline: in an accordion header the switch is\n // an action next to the title, not a form field with a label above it.\n <SwitchPrimitive label=\"Enabled\" checked={isEnabled} onChange={toggleEnabled} />\n }\n >\n {isEnabled ? (\n <div className={\"flex flex-col gap-md p-md\"}>\n {field.layout.map((node, index) => (\n <LayoutNodeRenderer key={index} node={node} />\n ))}\n </div>\n ) : null}\n </Accordion.Item>\n );\n});\n"],"names":["CmsValidatorItemRenderer","createObjectFieldRenderer","field","ValidatorItem","observer","value","isEnabled","Boolean","toggleEnabled","checked","Accordion","SwitchPrimitive","node","index","LayoutNodeRenderer"],"mappings":";;;;;AAaO,MAAMA,2BAA2BC,0BAA0B,CAAC,EAAEC,KAAK,EAAE,GACjE,WAAP,GAAO,oBAACC,eAAaA;QAAC,OAAOD;;AAOjC,MAAMC,gBAAgBC,SAAS,CAAC,EAAEF,KAAK,EAAsB;IACzD,MAAMG,QAAQH,MAAM,KAAK;IACzB,MAAMI,YAAYC,QAAQF,SAASA,MAAM,OAAO;IAEhD,MAAMG,gBAAgB,CAACC;QACnBP,MAAM,QAAQ,CAAC;YAAE,GAAGG,KAAK;YAAE,SAASI;QAAQ;IAChD;IAEA,OAAO,WAAP,GACI,oBAACC,UAAU,IAAI;QACX,aAAa;QACb,MAAMJ;QACN,OAAOJ,MAAM,KAAK;QAClB,aAAaA,MAAM,WAAW;QAC9B,S,cAGI,oBAACS,iBAAeA;YAAC,OAAM;YAAU,SAASL;YAAW,UAAUE;;OAGlEF,YAAY,WAAZA,GACG,oBAAC;QAAI,WAAW;OACXJ,MAAM,MAAM,CAAC,GAAG,CAAC,CAACU,MAAMC,QAAAA,WAAAA,GACrB,oBAACC,oBAAkBA;YAAC,KAAKD;YAAO,MAAMD;eAG9C;AAGhB"}
@@ -1,5 +1,5 @@
1
1
  import { createFeature } from "@webiny/feature/admin";
2
- import { BooleanSwitchRenderer, CheckboxesRenderer, DateTimeInputRenderer, DateTimeInputsRenderer, DynamicZoneRenderer, HiddenRenderer, LexicalTextInputRenderer, LexicalTextInputsRenderer, LongTextRenderer, LongTextsRenderer, NumberInputRenderer, NumberInputsRenderer, ObjectAccordionMultipleRenderer, ObjectAccordionRenderer, ObjectsAccordionRenderer, PassthroughRenderer, RadioButtonsRenderer, RefDetailedMultipleRenderer, RefDetailedSingleRenderer, RefInputRenderer, RefInputsRenderer, RefSimpleMultipleRenderer, RefSimpleSingleRenderer, SelectBoxRenderer, TagsRenderer, TextInputRenderer, TextInputsRenderer } from "../fieldTypes/renderers/index.js";
2
+ import { BirthdayInputRenderer, BooleanSwitchRenderer, CheckboxesRenderer, DateTimeInputRenderer, DateTimeInputsRenderer, DynamicZoneRenderer, HiddenRenderer, LexicalTextInputRenderer, LexicalTextInputsRenderer, LongTextRenderer, LongTextsRenderer, NumberInputRenderer, NumberInputsRenderer, ObjectAccordionMultipleRenderer, ObjectAccordionRenderer, ObjectsAccordionRenderer, PassthroughRenderer, RadioButtonsRenderer, RefDetailedMultipleRenderer, RefDetailedSingleRenderer, RefInputRenderer, RefInputsRenderer, RefSimpleMultipleRenderer, RefSimpleSingleRenderer, SelectBoxRenderer, TagsRenderer, TextInputRenderer, TextInputsRenderer } from "../fieldTypes/renderers/index.js";
3
3
  const CmsFieldRendererFeature = createFeature({
4
4
  name: "CmsFieldRenderers",
5
5
  register (container) {
@@ -13,6 +13,7 @@ const CmsFieldRendererFeature = createFeature({
13
13
  container.register(BooleanSwitchRenderer);
14
14
  container.register(DateTimeInputRenderer);
15
15
  container.register(DateTimeInputsRenderer);
16
+ container.register(BirthdayInputRenderer);
16
17
  container.register(SelectBoxRenderer);
17
18
  container.register(RadioButtonsRenderer);
18
19
  container.register(CheckboxesRenderer);
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldRenderers/feature.js","sources":["../../../src/presentation/fieldRenderers/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport {\n TextInputRenderer,\n TextInputsRenderer,\n TagsRenderer,\n LongTextRenderer,\n LongTextsRenderer,\n NumberInputRenderer,\n NumberInputsRenderer,\n BooleanSwitchRenderer,\n DateTimeInputRenderer,\n DateTimeInputsRenderer,\n SelectBoxRenderer,\n RadioButtonsRenderer,\n CheckboxesRenderer,\n HiddenRenderer,\n PassthroughRenderer,\n LexicalTextInputRenderer,\n LexicalTextInputsRenderer,\n ObjectAccordionRenderer,\n ObjectsAccordionRenderer,\n ObjectAccordionMultipleRenderer,\n DynamicZoneRenderer,\n RefInputRenderer,\n RefInputsRenderer,\n RefSimpleSingleRenderer,\n RefSimpleMultipleRenderer,\n RefDetailedSingleRenderer,\n RefDetailedMultipleRenderer\n} from \"../fieldTypes/renderers/index.js\";\n\nexport const CmsFieldRendererFeature = createFeature({\n name: \"CmsFieldRenderers\",\n register(container) {\n container.register(TextInputRenderer);\n container.register(TextInputsRenderer);\n container.register(TagsRenderer);\n container.register(LongTextRenderer);\n container.register(LongTextsRenderer);\n container.register(NumberInputRenderer);\n container.register(NumberInputsRenderer);\n container.register(BooleanSwitchRenderer);\n container.register(DateTimeInputRenderer);\n container.register(DateTimeInputsRenderer);\n container.register(SelectBoxRenderer);\n container.register(RadioButtonsRenderer);\n container.register(CheckboxesRenderer);\n container.register(HiddenRenderer);\n container.register(PassthroughRenderer);\n container.register(LexicalTextInputRenderer);\n container.register(LexicalTextInputsRenderer);\n container.register(ObjectAccordionRenderer);\n container.register(ObjectsAccordionRenderer);\n container.register(ObjectAccordionMultipleRenderer);\n container.register(DynamicZoneRenderer);\n container.register(RefInputRenderer);\n container.register(RefInputsRenderer);\n container.register(RefSimpleSingleRenderer);\n container.register(RefSimpleMultipleRenderer);\n container.register(RefDetailedSingleRenderer);\n container.register(RefDetailedMultipleRenderer);\n }\n});\n"],"names":["CmsFieldRendererFeature","createFeature","container","TextInputRenderer","TextInputsRenderer","TagsRenderer","LongTextRenderer","LongTextsRenderer","NumberInputRenderer","NumberInputsRenderer","BooleanSwitchRenderer","DateTimeInputRenderer","DateTimeInputsRenderer","SelectBoxRenderer","RadioButtonsRenderer","CheckboxesRenderer","HiddenRenderer","PassthroughRenderer","LexicalTextInputRenderer","LexicalTextInputsRenderer","ObjectAccordionRenderer","ObjectsAccordionRenderer","ObjectAccordionMultipleRenderer","DynamicZoneRenderer","RefInputRenderer","RefInputsRenderer","RefSimpleSingleRenderer","RefSimpleMultipleRenderer","RefDetailedSingleRenderer","RefDetailedMultipleRenderer"],"mappings":";;AA+BO,MAAMA,0BAA0BC,cAAc;IACjD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;QACnBN,UAAU,QAAQ,CAACO;QACnBP,UAAU,QAAQ,CAACQ;QACnBR,UAAU,QAAQ,CAACS;QACnBT,UAAU,QAAQ,CAACU;QACnBV,UAAU,QAAQ,CAACW;QACnBX,UAAU,QAAQ,CAACY;QACnBZ,UAAU,QAAQ,CAACa;QACnBb,UAAU,QAAQ,CAACc;QACnBd,UAAU,QAAQ,CAACe;QACnBf,UAAU,QAAQ,CAACgB;QACnBhB,UAAU,QAAQ,CAACiB;QACnBjB,UAAU,QAAQ,CAACkB;QACnBlB,UAAU,QAAQ,CAACmB;QACnBnB,UAAU,QAAQ,CAACoB;QACnBpB,UAAU,QAAQ,CAACqB;QACnBrB,UAAU,QAAQ,CAACsB;QACnBtB,UAAU,QAAQ,CAACuB;QACnBvB,UAAU,QAAQ,CAACwB;QACnBxB,UAAU,QAAQ,CAACyB;QACnBzB,UAAU,QAAQ,CAAC0B;QACnB1B,UAAU,QAAQ,CAAC2B;IACvB;AACJ"}
1
+ {"version":3,"file":"presentation/fieldRenderers/feature.js","sources":["../../../src/presentation/fieldRenderers/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport {\n TextInputRenderer,\n TextInputsRenderer,\n TagsRenderer,\n LongTextRenderer,\n LongTextsRenderer,\n NumberInputRenderer,\n NumberInputsRenderer,\n BooleanSwitchRenderer,\n DateTimeInputRenderer,\n DateTimeInputsRenderer,\n BirthdayInputRenderer,\n SelectBoxRenderer,\n RadioButtonsRenderer,\n CheckboxesRenderer,\n HiddenRenderer,\n PassthroughRenderer,\n LexicalTextInputRenderer,\n LexicalTextInputsRenderer,\n ObjectAccordionRenderer,\n ObjectsAccordionRenderer,\n ObjectAccordionMultipleRenderer,\n DynamicZoneRenderer,\n RefInputRenderer,\n RefInputsRenderer,\n RefSimpleSingleRenderer,\n RefSimpleMultipleRenderer,\n RefDetailedSingleRenderer,\n RefDetailedMultipleRenderer\n} from \"../fieldTypes/renderers/index.js\";\n\nexport const CmsFieldRendererFeature = createFeature({\n name: \"CmsFieldRenderers\",\n register(container) {\n container.register(TextInputRenderer);\n container.register(TextInputsRenderer);\n container.register(TagsRenderer);\n container.register(LongTextRenderer);\n container.register(LongTextsRenderer);\n container.register(NumberInputRenderer);\n container.register(NumberInputsRenderer);\n container.register(BooleanSwitchRenderer);\n container.register(DateTimeInputRenderer);\n container.register(DateTimeInputsRenderer);\n container.register(BirthdayInputRenderer);\n container.register(SelectBoxRenderer);\n container.register(RadioButtonsRenderer);\n container.register(CheckboxesRenderer);\n container.register(HiddenRenderer);\n container.register(PassthroughRenderer);\n container.register(LexicalTextInputRenderer);\n container.register(LexicalTextInputsRenderer);\n container.register(ObjectAccordionRenderer);\n container.register(ObjectsAccordionRenderer);\n container.register(ObjectAccordionMultipleRenderer);\n container.register(DynamicZoneRenderer);\n container.register(RefInputRenderer);\n container.register(RefInputsRenderer);\n container.register(RefSimpleSingleRenderer);\n container.register(RefSimpleMultipleRenderer);\n container.register(RefDetailedSingleRenderer);\n container.register(RefDetailedMultipleRenderer);\n }\n});\n"],"names":["CmsFieldRendererFeature","createFeature","container","TextInputRenderer","TextInputsRenderer","TagsRenderer","LongTextRenderer","LongTextsRenderer","NumberInputRenderer","NumberInputsRenderer","BooleanSwitchRenderer","DateTimeInputRenderer","DateTimeInputsRenderer","BirthdayInputRenderer","SelectBoxRenderer","RadioButtonsRenderer","CheckboxesRenderer","HiddenRenderer","PassthroughRenderer","LexicalTextInputRenderer","LexicalTextInputsRenderer","ObjectAccordionRenderer","ObjectsAccordionRenderer","ObjectAccordionMultipleRenderer","DynamicZoneRenderer","RefInputRenderer","RefInputsRenderer","RefSimpleSingleRenderer","RefSimpleMultipleRenderer","RefDetailedSingleRenderer","RefDetailedMultipleRenderer"],"mappings":";;AAgCO,MAAMA,0BAA0BC,cAAc;IACjD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;QACnBN,UAAU,QAAQ,CAACO;QACnBP,UAAU,QAAQ,CAACQ;QACnBR,UAAU,QAAQ,CAACS;QACnBT,UAAU,QAAQ,CAACU;QACnBV,UAAU,QAAQ,CAACW;QACnBX,UAAU,QAAQ,CAACY;QACnBZ,UAAU,QAAQ,CAACa;QACnBb,UAAU,QAAQ,CAACc;QACnBd,UAAU,QAAQ,CAACe;QACnBf,UAAU,QAAQ,CAACgB;QACnBhB,UAAU,QAAQ,CAACiB;QACnBjB,UAAU,QAAQ,CAACkB;QACnBlB,UAAU,QAAQ,CAACmB;QACnBnB,UAAU,QAAQ,CAACoB;QACnBpB,UAAU,QAAQ,CAACqB;QACnBrB,UAAU,QAAQ,CAACsB;QACnBtB,UAAU,QAAQ,CAACuB;QACnBvB,UAAU,QAAQ,CAACwB;QACnBxB,UAAU,QAAQ,CAACyB;QACnBzB,UAAU,QAAQ,CAAC0B;QACnB1B,UAAU,QAAQ,CAAC2B;QACnB3B,UAAU,QAAQ,CAAC4B;IACvB;AACJ"}
@@ -0,0 +1,15 @@
1
+ import { CmsFieldRenderer } from "../../../../presentation/fieldRenderers/abstractions.js";
2
+ import type { CmsModelField } from "../../../../types.js";
3
+ declare class BirthdayInputRendererImpl implements CmsFieldRenderer.Interface {
4
+ rendererName: string;
5
+ formRenderer: string;
6
+ name: string;
7
+ description: string;
8
+ canUse({ field }: {
9
+ field: CmsModelField;
10
+ }): boolean;
11
+ }
12
+ export declare const BirthdayInputRenderer: typeof BirthdayInputRendererImpl & {
13
+ __abstraction: import("@webiny/di").Abstraction<import("~/presentation/fieldRenderers/abstractions.js").ICmsFieldRenderer>;
14
+ };
15
+ export {};
@@ -0,0 +1,19 @@
1
+ import { CmsFieldRenderer } from "../../../fieldRenderers/abstractions.js";
2
+ class BirthdayInputRendererImpl {
3
+ canUse({ field }) {
4
+ return "datetime" === field.type && field.settings?.type === "date" && !field.list && !field.predefinedValues?.enabled;
5
+ }
6
+ constructor(){
7
+ this.rendererName = "birthday-input";
8
+ this.formRenderer = "birthdayInput";
9
+ this.name = "Birthday Picker";
10
+ this.description = "Picks a day, then a month, then a year. Suits dates far in the past, like a date of birth.";
11
+ }
12
+ }
13
+ const BirthdayInputRenderer = CmsFieldRenderer.createImplementation({
14
+ implementation: BirthdayInputRendererImpl,
15
+ dependencies: []
16
+ });
17
+ export { BirthdayInputRenderer };
18
+
19
+ //# sourceMappingURL=BirthdayInputRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.js","sources":["../../../../../src/presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass BirthdayInputRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"birthday-input\";\n formRenderer = \"birthdayInput\";\n name = \"Birthday Picker\";\n description =\n \"Picks a day, then a month, then a year. Suits dates far in the past, like a date of birth.\";\n\n canUse({ field }: { field: CmsModelField }) {\n return (\n field.type === \"datetime\" &&\n field.settings?.type === \"date\" &&\n !field.list &&\n !field.predefinedValues?.enabled\n );\n }\n}\n\nexport const BirthdayInputRenderer = CmsFieldRenderer.createImplementation({\n implementation: BirthdayInputRendererImpl,\n dependencies: []\n});\n"],"names":["BirthdayInputRendererImpl","field","BirthdayInputRenderer","CmsFieldRenderer"],"mappings":";AAGA,MAAMA;IAOF,OAAO,EAAEC,KAAK,EAA4B,EAAE;QACxC,OACIA,AAAe,eAAfA,MAAM,IAAI,IACVA,MAAM,QAAQ,EAAE,SAAS,UACzB,CAACA,MAAM,IAAI,IACX,CAACA,MAAM,gBAAgB,EAAE;IAEjC;;aAbA,YAAY,GAAG;aACf,YAAY,GAAG;aACf,IAAI,GAAG;aACP,WAAW,GACP;;AAUR;AAEO,MAAMC,wBAAwBC,iBAAiB,oBAAoB,CAAC;IACvE,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
@@ -8,6 +8,7 @@ export { NumberInputsRenderer } from "./number/NumberInputsRenderer.js";
8
8
  export { BooleanSwitchRenderer } from "./boolean/BooleanSwitchRenderer.js";
9
9
  export { DateTimeInputRenderer } from "./dateTime/DateTimeInputRenderer.js";
10
10
  export { DateTimeInputsRenderer } from "./dateTime/DateTimeInputsRenderer.js";
11
+ export { BirthdayInputRenderer } from "./dateTime/BirthdayInputRenderer.js";
11
12
  export { SelectBoxRenderer } from "./common/SelectBoxRenderer.js";
12
13
  export { RadioButtonsRenderer } from "./common/RadioButtonsRenderer.js";
13
14
  export { CheckboxesRenderer } from "./common/CheckboxesRenderer.js";
@@ -8,6 +8,7 @@ export { NumberInputsRenderer } from "./number/NumberInputsRenderer.js";
8
8
  export { BooleanSwitchRenderer } from "./boolean/BooleanSwitchRenderer.js";
9
9
  export { DateTimeInputRenderer } from "./dateTime/DateTimeInputRenderer.js";
10
10
  export { DateTimeInputsRenderer } from "./dateTime/DateTimeInputsRenderer.js";
11
+ export { BirthdayInputRenderer } from "./dateTime/BirthdayInputRenderer.js";
11
12
  export { SelectBoxRenderer } from "./common/SelectBoxRenderer.js";
12
13
  export { RadioButtonsRenderer } from "./common/RadioButtonsRenderer.js";
13
14
  export { CheckboxesRenderer } from "./common/CheckboxesRenderer.js";
@@ -25,6 +25,13 @@ export interface ICmsFieldValidator {
25
25
  validator: CmsModelFieldValidator;
26
26
  }): Record<string, string>;
27
27
  buildSettingsForm?(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext): void;
28
+ /**
29
+ * Turns the stored settings into the settings form's values, when the form shows them
30
+ * differently. Without it, the stored settings are the form's values.
31
+ */
32
+ mapSettingsToForm?(settings: Record<string, unknown>, context: ICmsFieldValidatorContext): Record<string, unknown>;
33
+ /** Turns the settings form's values back into the settings to store. */
34
+ mapSettingsFromForm?(settings: Record<string, unknown>, context: ICmsFieldValidatorContext): Record<string, unknown>;
28
35
  mapToFieldBuilder(builder: IFieldBuilder, validator: CmsModelFieldValidator, field: CmsModelField): void;
29
36
  }
30
37
  export declare const CmsFieldValidator: import("@webiny/di").Abstraction<ICmsFieldValidator>;
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldValidators/abstractions.js","sources":["../../../src/presentation/fieldValidators/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport { FormModel, FormModelFactory } from \"@webiny/app-admin\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\n\nexport interface ICmsFieldValidatorVariable {\n name: string;\n description: string;\n}\n\nexport interface ICmsFieldValidatorFormBuilder {\n message: FormModelFactory.FieldBuilder;\n fields(\n fn: (\n fields: FormModelFactory.FieldBuilderRegistry\n ) => Record<string, FormModelFactory.FieldBuilder>\n ): void;\n layout(fn: (layout: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]): void;\n}\n\nexport interface ICmsFieldValidatorContext {\n field: CmsModelField;\n}\n\nexport interface ICmsFieldValidator {\n readonly name: string;\n readonly label: string;\n readonly description: string;\n readonly defaultMessage: string;\n readonly defaultSettings?: Record<string, unknown>;\n readonly variables?: ICmsFieldValidatorVariable[];\n\n getVariableValues?(context: { validator: CmsModelFieldValidator }): Record<string, string>;\n\n buildSettingsForm?(\n form: ICmsFieldValidatorFormBuilder,\n context: ICmsFieldValidatorContext\n ): void;\n\n mapToFieldBuilder(\n builder: IFieldBuilder,\n validator: CmsModelFieldValidator,\n field: CmsModelField\n ): void;\n}\n\nexport const CmsFieldValidator = createAbstraction<ICmsFieldValidator>(\"CmsFieldValidator\");\n\nexport namespace CmsFieldValidator {\n export type Interface = ICmsFieldValidator;\n export type FormBuilder = ICmsFieldValidatorFormBuilder;\n export type Context = ICmsFieldValidatorContext;\n export type Variable = ICmsFieldValidatorVariable;\n}\n"],"names":["CmsFieldValidator","createAbstraction"],"mappings":";AA+CO,MAAMA,oBAAoBC,kBAAsC"}
1
+ {"version":3,"file":"presentation/fieldValidators/abstractions.js","sources":["../../../src/presentation/fieldValidators/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport { FormModel, FormModelFactory } from \"@webiny/app-admin\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\n\nexport interface ICmsFieldValidatorVariable {\n name: string;\n description: string;\n}\n\nexport interface ICmsFieldValidatorFormBuilder {\n message: FormModelFactory.FieldBuilder;\n fields(\n fn: (\n fields: FormModelFactory.FieldBuilderRegistry\n ) => Record<string, FormModelFactory.FieldBuilder>\n ): void;\n layout(fn: (layout: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]): void;\n}\n\nexport interface ICmsFieldValidatorContext {\n field: CmsModelField;\n}\n\nexport interface ICmsFieldValidator {\n readonly name: string;\n readonly label: string;\n readonly description: string;\n readonly defaultMessage: string;\n readonly defaultSettings?: Record<string, unknown>;\n readonly variables?: ICmsFieldValidatorVariable[];\n\n getVariableValues?(context: { validator: CmsModelFieldValidator }): Record<string, string>;\n\n buildSettingsForm?(\n form: ICmsFieldValidatorFormBuilder,\n context: ICmsFieldValidatorContext\n ): void;\n\n /**\n * Turns the stored settings into the settings form's values, when the form shows them\n * differently. Without it, the stored settings are the form's values.\n */\n mapSettingsToForm?(\n settings: Record<string, unknown>,\n context: ICmsFieldValidatorContext\n ): Record<string, unknown>;\n\n /** Turns the settings form's values back into the settings to store. */\n mapSettingsFromForm?(\n settings: Record<string, unknown>,\n context: ICmsFieldValidatorContext\n ): Record<string, unknown>;\n\n mapToFieldBuilder(\n builder: IFieldBuilder,\n validator: CmsModelFieldValidator,\n field: CmsModelField\n ): void;\n}\n\nexport const CmsFieldValidator = createAbstraction<ICmsFieldValidator>(\"CmsFieldValidator\");\n\nexport namespace CmsFieldValidator {\n export type Interface = ICmsFieldValidator;\n export type FormBuilder = ICmsFieldValidatorFormBuilder;\n export type Context = ICmsFieldValidatorContext;\n export type Variable = ICmsFieldValidatorVariable;\n}\n"],"names":["CmsFieldValidator","createAbstraction"],"mappings":";AA8DO,MAAMA,oBAAoBC,kBAAsC"}
@@ -8,7 +8,13 @@ declare class DateGteValidatorImpl implements CmsFieldValidator.Interface {
8
8
  label: string;
9
9
  description: string;
10
10
  defaultMessage: string;
11
+ variables: {
12
+ name: string;
13
+ description: string;
14
+ }[];
11
15
  buildSettingsForm(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext): void;
16
+ mapSettingsToForm(settings: Record<string, unknown>, context: ICmsFieldValidatorContext): Record<string, unknown>;
17
+ mapSettingsFromForm(settings: Record<string, unknown>): Record<string, unknown>;
12
18
  mapToFieldBuilder(builder: IFieldBuilder, validator: CmsModelFieldValidator, _field: CmsModelField): void;
13
19
  }
14
20
  export declare const DateGteValidator: typeof DateGteValidatorImpl & {
@@ -1,31 +1,17 @@
1
1
  import { z } from "zod";
2
2
  import { CmsFieldValidator } from "../abstractions.js";
3
+ import { buildDateLimitSettingsForm, dateLimitSettingsFromForm, dateLimitSettingsToForm } from "./dateLimitSettings.js";
3
4
  class DateGteValidatorImpl {
4
5
  buildSettingsForm(form, context) {
5
- const type = context.field.settings ? context.field.settings.type : "date";
6
- form.fields((fields)=>{
7
- const valueField = fields.datetime().label("Value").description("This is the earliest date/time that will be allowed.");
8
- switch(type){
9
- case "time":
10
- valueField.timeOnly();
11
- break;
12
- case "dateTimeWithTimezone":
13
- valueField.withTimezone();
14
- break;
15
- case "dateTimeWithoutTimezone":
16
- valueField.withoutTimezone();
17
- break;
18
- default:
19
- valueField.dateOnly();
20
- break;
21
- }
22
- return {
23
- value: valueField
24
- };
6
+ buildDateLimitSettingsForm(form, context, {
7
+ valueDescription: "This is the earliest date/time that will be allowed."
25
8
  });
26
- form.layout((layout)=>[
27
- layout.row("value")
28
- ]);
9
+ }
10
+ mapSettingsToForm(settings, context) {
11
+ return dateLimitSettingsToForm(settings, context);
12
+ }
13
+ mapSettingsFromForm(settings) {
14
+ return dateLimitSettingsFromForm(settings);
29
15
  }
30
16
  mapToFieldBuilder(builder, validator, _field) {
31
17
  const minDate = validator.settings?.value;
@@ -36,8 +22,14 @@ class DateGteValidatorImpl {
36
22
  constructor(){
37
23
  this.name = "dateGte";
38
24
  this.label = "Later or equal";
39
- this.description = "Entered date/time must be equal or later compared to the provided date.";
40
- this.defaultMessage = "Date/time is earlier than the provided one.";
25
+ this.description = "Entered date/time must be equal or later compared to the provided date. A date relative to today is worked out from the current date every time the value is checked.";
26
+ this.defaultMessage = "Must be on or after {date}.";
27
+ this.variables = [
28
+ {
29
+ name: "date",
30
+ description: "The earliest allowed date, worked out when the value is checked."
31
+ }
32
+ ];
41
33
  }
42
34
  }
43
35
  const DateGteValidator = CmsFieldValidator.createImplementation({
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldValidators/validators/DateGteValidator.js","sources":["../../../../src/presentation/fieldValidators/validators/DateGteValidator.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { CmsFieldValidator } from \"../abstractions.js\";\nimport type { ICmsFieldValidatorFormBuilder, ICmsFieldValidatorContext } from \"../abstractions.js\";\n\nclass DateGteValidatorImpl implements CmsFieldValidator.Interface {\n name = \"dateGte\";\n label = \"Later or equal\";\n description = \"Entered date/time must be equal or later compared to the provided date.\";\n defaultMessage = \"Date/time is earlier than the provided one.\";\n\n buildSettingsForm(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext) {\n const type = context.field.settings ? context.field.settings.type : \"date\";\n\n form.fields(fields => {\n const valueField = fields\n .datetime()\n .label(\"Value\")\n .description(\"This is the earliest date/time that will be allowed.\");\n\n switch (type) {\n case \"time\":\n valueField.timeOnly();\n break;\n case \"dateTimeWithTimezone\":\n valueField.withTimezone();\n break;\n case \"dateTimeWithoutTimezone\":\n valueField.withoutTimezone();\n break;\n default:\n valueField.dateOnly();\n break;\n }\n\n return { value: valueField };\n });\n form.layout(layout => [layout.row(\"value\")]);\n }\n\n mapToFieldBuilder(\n builder: IFieldBuilder,\n validator: CmsModelFieldValidator,\n _field: CmsModelField\n ) {\n const minDate = validator.settings?.value;\n if (minDate != null) {\n builder.schema(\n z.string().refine(val => val >= minDate, {\n message: validator.message || `Must be on or after ${minDate}`\n })\n );\n }\n }\n}\n\nexport const DateGteValidator = CmsFieldValidator.createImplementation({\n implementation: DateGteValidatorImpl,\n dependencies: []\n});\n"],"names":["DateGteValidatorImpl","form","context","type","fields","valueField","layout","builder","validator","_field","minDate","z","val","DateGteValidator","CmsFieldValidator"],"mappings":";;AAOA,MAAMA;IAMF,kBAAkBC,IAAmC,EAAEC,OAAkC,EAAE;QACvF,MAAMC,OAAOD,QAAQ,KAAK,CAAC,QAAQ,GAAGA,QAAQ,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG;QAEpED,KAAK,MAAM,CAACG,CAAAA;YACR,MAAMC,aAAaD,OACd,QAAQ,GACR,KAAK,CAAC,SACN,WAAW,CAAC;YAEjB,OAAQD;gBACJ,KAAK;oBACDE,WAAW,QAAQ;oBACnB;gBACJ,KAAK;oBACDA,WAAW,YAAY;oBACvB;gBACJ,KAAK;oBACDA,WAAW,eAAe;oBAC1B;gBACJ;oBACIA,WAAW,QAAQ;oBACnB;YACR;YAEA,OAAO;gBAAE,OAAOA;YAAW;QAC/B;QACAJ,KAAK,MAAM,CAACK,CAAAA,SAAU;gBAACA,OAAO,GAAG,CAAC;aAAS;IAC/C;IAEA,kBACIC,OAAsB,EACtBC,SAAiC,EACjCC,MAAqB,EACvB;QACE,MAAMC,UAAUF,UAAU,QAAQ,EAAE;QACpC,IAAIE,AAAW,QAAXA,SACAH,QAAQ,MAAM,CACVI,EAAE,MAAM,GAAG,MAAM,CAACC,CAAAA,MAAOA,OAAOF,SAAS;YACrC,SAASF,UAAU,OAAO,IAAI,CAAC,oBAAoB,EAAEE,SAAS;QAClE;IAGZ;;aA/CA,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GAAG;aACd,cAAc,GAAG;;AA6CrB;AAEO,MAAMG,mBAAmBC,kBAAkB,oBAAoB,CAAC;IACnE,gBAAgBd;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"presentation/fieldValidators/validators/DateGteValidator.js","sources":["../../../../src/presentation/fieldValidators/validators/DateGteValidator.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { CmsFieldValidator } from \"../abstractions.js\";\nimport type { ICmsFieldValidatorFormBuilder, ICmsFieldValidatorContext } from \"../abstractions.js\";\nimport {\n buildDateLimitSettingsForm,\n dateLimitSettingsFromForm,\n dateLimitSettingsToForm\n} from \"./dateLimitSettings.js\";\n\nclass DateGteValidatorImpl implements CmsFieldValidator.Interface {\n name = \"dateGte\";\n label = \"Later or equal\";\n description =\n \"Entered date/time must be equal or later compared to the provided date. A date relative to today is worked out from the current date every time the value is checked.\";\n defaultMessage = \"Must be on or after {date}.\";\n variables = [\n {\n name: \"date\",\n description: \"The earliest allowed date, worked out when the value is checked.\"\n }\n ];\n\n buildSettingsForm(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext) {\n buildDateLimitSettingsForm(form, context, {\n valueDescription: \"This is the earliest date/time that will be allowed.\"\n });\n }\n\n mapSettingsToForm(settings: Record<string, unknown>, context: ICmsFieldValidatorContext) {\n return dateLimitSettingsToForm(settings, context);\n }\n\n mapSettingsFromForm(settings: Record<string, unknown>) {\n return dateLimitSettingsFromForm(settings);\n }\n\n mapToFieldBuilder(\n builder: IFieldBuilder,\n validator: CmsModelFieldValidator,\n _field: CmsModelField\n ) {\n const minDate = validator.settings?.value;\n if (minDate != null) {\n builder.schema(\n z.string().refine(val => val >= minDate, {\n message: validator.message || `Must be on or after ${minDate}`\n })\n );\n }\n }\n}\n\nexport const DateGteValidator = CmsFieldValidator.createImplementation({\n implementation: DateGteValidatorImpl,\n dependencies: []\n});\n"],"names":["DateGteValidatorImpl","form","context","buildDateLimitSettingsForm","settings","dateLimitSettingsToForm","dateLimitSettingsFromForm","builder","validator","_field","minDate","z","val","DateGteValidator","CmsFieldValidator"],"mappings":";;;AAYA,MAAMA;IAaF,kBAAkBC,IAAmC,EAAEC,OAAkC,EAAE;QACvFC,2BAA2BF,MAAMC,SAAS;YACtC,kBAAkB;QACtB;IACJ;IAEA,kBAAkBE,QAAiC,EAAEF,OAAkC,EAAE;QACrF,OAAOG,wBAAwBD,UAAUF;IAC7C;IAEA,oBAAoBE,QAAiC,EAAE;QACnD,OAAOE,0BAA0BF;IACrC;IAEA,kBACIG,OAAsB,EACtBC,SAAiC,EACjCC,MAAqB,EACvB;QACE,MAAMC,UAAUF,UAAU,QAAQ,EAAE;QACpC,IAAIE,AAAW,QAAXA,SACAH,QAAQ,MAAM,CACVI,EAAE,MAAM,GAAG,MAAM,CAACC,CAAAA,MAAOA,OAAOF,SAAS;YACrC,SAASF,UAAU,OAAO,IAAI,CAAC,oBAAoB,EAAEE,SAAS;QAClE;IAGZ;;aAvCA,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GACP;aACJ,cAAc,GAAG;aACjB,SAAS,GAAG;YACR;gBACI,MAAM;gBACN,aAAa;YACjB;SACH;;AA8BL;AAEO,MAAMG,mBAAmBC,kBAAkB,oBAAoB,CAAC;IACnE,gBAAgBd;IAChB,cAAc,EAAE;AACpB"}
@@ -8,7 +8,13 @@ declare class DateLteValidatorImpl implements CmsFieldValidator.Interface {
8
8
  label: string;
9
9
  description: string;
10
10
  defaultMessage: string;
11
+ variables: {
12
+ name: string;
13
+ description: string;
14
+ }[];
11
15
  buildSettingsForm(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext): void;
16
+ mapSettingsToForm(settings: Record<string, unknown>, context: ICmsFieldValidatorContext): Record<string, unknown>;
17
+ mapSettingsFromForm(settings: Record<string, unknown>): Record<string, unknown>;
12
18
  mapToFieldBuilder(builder: IFieldBuilder, validator: CmsModelFieldValidator, _field: CmsModelField): void;
13
19
  }
14
20
  export declare const DateLteValidator: typeof DateLteValidatorImpl & {
@@ -1,31 +1,17 @@
1
1
  import { z } from "zod";
2
2
  import { CmsFieldValidator } from "../abstractions.js";
3
+ import { buildDateLimitSettingsForm, dateLimitSettingsFromForm, dateLimitSettingsToForm } from "./dateLimitSettings.js";
3
4
  class DateLteValidatorImpl {
4
5
  buildSettingsForm(form, context) {
5
- const type = context.field.settings ? context.field.settings.type : "date";
6
- form.fields((fields)=>{
7
- const valueField = fields.datetime().label("Value").description("This is the latest date/time that will be allowed.");
8
- switch(type){
9
- case "time":
10
- valueField.timeOnly();
11
- break;
12
- case "dateTimeWithTimezone":
13
- valueField.withTimezone();
14
- break;
15
- case "dateTimeWithoutTimezone":
16
- valueField.withoutTimezone();
17
- break;
18
- default:
19
- valueField.dateOnly();
20
- break;
21
- }
22
- return {
23
- value: valueField
24
- };
6
+ buildDateLimitSettingsForm(form, context, {
7
+ valueDescription: "This is the latest date/time that will be allowed."
25
8
  });
26
- form.layout((layout)=>[
27
- layout.row("value")
28
- ]);
9
+ }
10
+ mapSettingsToForm(settings, context) {
11
+ return dateLimitSettingsToForm(settings, context);
12
+ }
13
+ mapSettingsFromForm(settings) {
14
+ return dateLimitSettingsFromForm(settings);
29
15
  }
30
16
  mapToFieldBuilder(builder, validator, _field) {
31
17
  const maxDate = validator.settings?.value;
@@ -36,8 +22,14 @@ class DateLteValidatorImpl {
36
22
  constructor(){
37
23
  this.name = "dateLte";
38
24
  this.label = "Earlier or equal";
39
- this.description = "Entered date/time must be equal or earlier compared to the provided date.";
40
- this.defaultMessage = "Date/time is later than the provided one.";
25
+ this.description = "Entered date/time must be equal or earlier compared to the provided date. A date relative to today is worked out from the current date every time the value is checked.";
26
+ this.defaultMessage = "Must be on or before {date}.";
27
+ this.variables = [
28
+ {
29
+ name: "date",
30
+ description: "The latest allowed date, worked out when the value is checked."
31
+ }
32
+ ];
41
33
  }
42
34
  }
43
35
  const DateLteValidator = CmsFieldValidator.createImplementation({
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldValidators/validators/DateLteValidator.js","sources":["../../../../src/presentation/fieldValidators/validators/DateLteValidator.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { CmsFieldValidator } from \"../abstractions.js\";\nimport type { ICmsFieldValidatorFormBuilder, ICmsFieldValidatorContext } from \"../abstractions.js\";\n\nclass DateLteValidatorImpl implements CmsFieldValidator.Interface {\n name = \"dateLte\";\n label = \"Earlier or equal\";\n description = \"Entered date/time must be equal or earlier compared to the provided date.\";\n defaultMessage = \"Date/time is later than the provided one.\";\n\n buildSettingsForm(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext) {\n const type = context.field.settings ? context.field.settings.type : \"date\";\n\n form.fields(fields => {\n const valueField = fields\n .datetime()\n .label(\"Value\")\n .description(\"This is the latest date/time that will be allowed.\");\n\n switch (type) {\n case \"time\":\n valueField.timeOnly();\n break;\n case \"dateTimeWithTimezone\":\n valueField.withTimezone();\n break;\n case \"dateTimeWithoutTimezone\":\n valueField.withoutTimezone();\n break;\n default:\n valueField.dateOnly();\n break;\n }\n\n return { value: valueField };\n });\n form.layout(layout => [layout.row(\"value\")]);\n }\n\n mapToFieldBuilder(\n builder: IFieldBuilder,\n validator: CmsModelFieldValidator,\n _field: CmsModelField\n ) {\n const maxDate = validator.settings?.value;\n if (maxDate != null) {\n builder.schema(\n z.string().refine(val => val <= maxDate, {\n message: validator.message || `Must be on or before ${maxDate}`\n })\n );\n }\n }\n}\n\nexport const DateLteValidator = CmsFieldValidator.createImplementation({\n implementation: DateLteValidatorImpl,\n dependencies: []\n});\n"],"names":["DateLteValidatorImpl","form","context","type","fields","valueField","layout","builder","validator","_field","maxDate","z","val","DateLteValidator","CmsFieldValidator"],"mappings":";;AAOA,MAAMA;IAMF,kBAAkBC,IAAmC,EAAEC,OAAkC,EAAE;QACvF,MAAMC,OAAOD,QAAQ,KAAK,CAAC,QAAQ,GAAGA,QAAQ,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG;QAEpED,KAAK,MAAM,CAACG,CAAAA;YACR,MAAMC,aAAaD,OACd,QAAQ,GACR,KAAK,CAAC,SACN,WAAW,CAAC;YAEjB,OAAQD;gBACJ,KAAK;oBACDE,WAAW,QAAQ;oBACnB;gBACJ,KAAK;oBACDA,WAAW,YAAY;oBACvB;gBACJ,KAAK;oBACDA,WAAW,eAAe;oBAC1B;gBACJ;oBACIA,WAAW,QAAQ;oBACnB;YACR;YAEA,OAAO;gBAAE,OAAOA;YAAW;QAC/B;QACAJ,KAAK,MAAM,CAACK,CAAAA,SAAU;gBAACA,OAAO,GAAG,CAAC;aAAS;IAC/C;IAEA,kBACIC,OAAsB,EACtBC,SAAiC,EACjCC,MAAqB,EACvB;QACE,MAAMC,UAAUF,UAAU,QAAQ,EAAE;QACpC,IAAIE,AAAW,QAAXA,SACAH,QAAQ,MAAM,CACVI,EAAE,MAAM,GAAG,MAAM,CAACC,CAAAA,MAAOA,OAAOF,SAAS;YACrC,SAASF,UAAU,OAAO,IAAI,CAAC,qBAAqB,EAAEE,SAAS;QACnE;IAGZ;;aA/CA,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GAAG;aACd,cAAc,GAAG;;AA6CrB;AAEO,MAAMG,mBAAmBC,kBAAkB,oBAAoB,CAAC;IACnE,gBAAgBd;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"presentation/fieldValidators/validators/DateLteValidator.js","sources":["../../../../src/presentation/fieldValidators/validators/DateLteValidator.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { CmsFieldValidator } from \"../abstractions.js\";\nimport type { ICmsFieldValidatorFormBuilder, ICmsFieldValidatorContext } from \"../abstractions.js\";\nimport {\n buildDateLimitSettingsForm,\n dateLimitSettingsFromForm,\n dateLimitSettingsToForm\n} from \"./dateLimitSettings.js\";\n\nclass DateLteValidatorImpl implements CmsFieldValidator.Interface {\n name = \"dateLte\";\n label = \"Earlier or equal\";\n description =\n \"Entered date/time must be equal or earlier compared to the provided date. A date relative to today is worked out from the current date every time the value is checked.\";\n defaultMessage = \"Must be on or before {date}.\";\n variables = [\n {\n name: \"date\",\n description: \"The latest allowed date, worked out when the value is checked.\"\n }\n ];\n\n buildSettingsForm(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext) {\n buildDateLimitSettingsForm(form, context, {\n valueDescription: \"This is the latest date/time that will be allowed.\"\n });\n }\n\n mapSettingsToForm(settings: Record<string, unknown>, context: ICmsFieldValidatorContext) {\n return dateLimitSettingsToForm(settings, context);\n }\n\n mapSettingsFromForm(settings: Record<string, unknown>) {\n return dateLimitSettingsFromForm(settings);\n }\n\n mapToFieldBuilder(\n builder: IFieldBuilder,\n validator: CmsModelFieldValidator,\n _field: CmsModelField\n ) {\n const maxDate = validator.settings?.value;\n if (maxDate != null) {\n builder.schema(\n z.string().refine(val => val <= maxDate, {\n message: validator.message || `Must be on or before ${maxDate}`\n })\n );\n }\n }\n}\n\nexport const DateLteValidator = CmsFieldValidator.createImplementation({\n implementation: DateLteValidatorImpl,\n dependencies: []\n});\n"],"names":["DateLteValidatorImpl","form","context","buildDateLimitSettingsForm","settings","dateLimitSettingsToForm","dateLimitSettingsFromForm","builder","validator","_field","maxDate","z","val","DateLteValidator","CmsFieldValidator"],"mappings":";;;AAYA,MAAMA;IAaF,kBAAkBC,IAAmC,EAAEC,OAAkC,EAAE;QACvFC,2BAA2BF,MAAMC,SAAS;YACtC,kBAAkB;QACtB;IACJ;IAEA,kBAAkBE,QAAiC,EAAEF,OAAkC,EAAE;QACrF,OAAOG,wBAAwBD,UAAUF;IAC7C;IAEA,oBAAoBE,QAAiC,EAAE;QACnD,OAAOE,0BAA0BF;IACrC;IAEA,kBACIG,OAAsB,EACtBC,SAAiC,EACjCC,MAAqB,EACvB;QACE,MAAMC,UAAUF,UAAU,QAAQ,EAAE;QACpC,IAAIE,AAAW,QAAXA,SACAH,QAAQ,MAAM,CACVI,EAAE,MAAM,GAAG,MAAM,CAACC,CAAAA,MAAOA,OAAOF,SAAS;YACrC,SAASF,UAAU,OAAO,IAAI,CAAC,qBAAqB,EAAEE,SAAS;QACnE;IAGZ;;aAvCA,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GACP;aACJ,cAAc,GAAG;aACjB,SAAS,GAAG;YACR;gBACI,MAAM;gBACN,aAAa;YACjB;SACH;;AA8BL;AAEO,MAAMG,mBAAmBC,kBAAkB,oBAAoB,CAAC;IACnE,gBAAgBd;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,20 @@
1
+ import { type DateExpressionUnit } from "@webiny/utils";
2
+ import type { ICmsFieldValidatorFormBuilder, ICmsFieldValidatorContext } from "../abstractions.js";
3
+ /**
4
+ * The settings form of the `dateGte`/`dateLte` validators. On a date-only field, a limit is a
5
+ * fixed date or relative to today: a number, a unit and a direction, which the form turns into
6
+ * a date expression (`today-18y`) when the field is saved, and back when it's opened.
7
+ */
8
+ type DateLimitDirection = "before" | "after";
9
+ interface DateLimitFormOptions {
10
+ /** The Value field's description, for a fixed limit. */
11
+ valueDescription: string;
12
+ }
13
+ export declare function buildDateLimitSettingsForm(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext, options: DateLimitFormOptions): void;
14
+ /** Stored settings (`{ value }` or `{ expression }`) as the settings form's values. */
15
+ export declare function dateLimitSettingsToForm(settings: Record<string, unknown>, context: ICmsFieldValidatorContext): Record<string, unknown>;
16
+ /** The settings form's values as stored settings: a fixed `value` or an `expression`. */
17
+ export declare function dateLimitSettingsFromForm(settings: Record<string, unknown>): Record<string, unknown>;
18
+ /** `today`, or `today` plus or minus the amount: 18 years before today is `today-18y`. */
19
+ export declare function toDateExpression(amount: number, unit: DateExpressionUnit, direction: DateLimitDirection): string;
20
+ export {};