@webiny/app-headless-cms 6.5.0 → 6.5.1-beta.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/features/formModel/CmsFormModelBuilder.test.js +213 -0
- package/features/formModel/CmsFormModelBuilder.test.js.map +1 -1
- package/features/formModel/CmsValidationMapper.d.ts +9 -0
- package/features/formModel/CmsValidationMapper.js +25 -19
- package/features/formModel/CmsValidationMapper.js.map +1 -1
- package/features/formModel/mappers/DateTimeFieldMapper.js +3 -0
- package/features/formModel/mappers/DateTimeFieldMapper.js.map +1 -1
- package/package.json +21 -21
- package/presentation/contentEntries/views/actions/SaveAndPublishButton.js +8 -5
- package/presentation/contentEntries/views/actions/SaveAndPublishButton.js.map +1 -1
- package/presentation/fieldEditor/groups/AppearanceGroup.js +12 -0
- package/presentation/fieldEditor/groups/AppearanceGroup.js.map +1 -1
- package/presentation/fieldEditor/groups/ValidationsGroup.d.ts +2 -0
- package/presentation/fieldEditor/groups/ValidationsGroup.js +20 -6
- package/presentation/fieldEditor/groups/ValidationsGroup.js.map +1 -1
- package/presentation/fieldEditor/renderers/CmsValidatorsRenderer.js +2 -2
- package/presentation/fieldEditor/renderers/CmsValidatorsRenderer.js.map +1 -1
- package/presentation/fieldRenderers/feature.js +2 -1
- package/presentation/fieldRenderers/feature.js.map +1 -1
- package/presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.d.ts +15 -0
- package/presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.js +19 -0
- package/presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.js.map +1 -0
- package/presentation/fieldTypes/renderers/index.d.ts +1 -0
- package/presentation/fieldTypes/renderers/index.js +1 -0
- package/presentation/fieldValidators/abstractions.d.ts +7 -0
- package/presentation/fieldValidators/abstractions.js.map +1 -1
- package/presentation/fieldValidators/validators/DateGteValidator.d.ts +6 -0
- package/presentation/fieldValidators/validators/DateGteValidator.js +17 -25
- package/presentation/fieldValidators/validators/DateGteValidator.js.map +1 -1
- package/presentation/fieldValidators/validators/DateLteValidator.d.ts +6 -0
- package/presentation/fieldValidators/validators/DateLteValidator.js +17 -25
- package/presentation/fieldValidators/validators/DateLteValidator.js.map +1 -1
- package/presentation/fieldValidators/validators/dateLimitSettings.d.ts +20 -0
- package/presentation/fieldValidators/validators/dateLimitSettings.js +124 -0
- package/presentation/fieldValidators/validators/dateLimitSettings.js.map +1 -0
- package/presentation/fieldValidators/validators/dateLimitSettings.test.d.ts +1 -0
- package/presentation/fieldValidators/validators/dateLimitSettings.test.js +111 -0
- package/presentation/fieldValidators/validators/dateLimitSettings.test.js.map +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldEditor/groups/AppearanceGroup.js","sources":["../../../../src/presentation/fieldEditor/groups/AppearanceGroup.ts"],"sourcesContent":["import { CmsFieldEditorGroup } from \"../abstractions.js\";\nimport type { ICmsFieldEditorFormBuilder, ICmsFieldEditorContext } from \"../abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type {\n ICmsFieldRenderer,\n ICmsFieldRendererFormBuilder\n} from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { FormModelFactory, FormModel } from \"@webiny/app-admin\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n cmsAppearance: { fieldType: \"object\"; settings: undefined };\n }\n}\n\ninterface RendererSettingsBuild {\n rendererName: string;\n fieldsFns: Array<\n (f: FormModelFactory.FieldBuilderRegistry) => Record<string, FormModelFactory.FieldBuilder>\n >;\n layoutFns: Array<(l: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]>;\n}\n\nclass AppearanceGroupImpl implements CmsFieldEditorGroup.Interface {\n name = \"appearance\";\n label = \"Appearance\";\n\n constructor(private allRenderers: ICmsFieldRenderer[]) {}\n\n buildForm(form: ICmsFieldEditorFormBuilder, context: ICmsFieldEditorContext) {\n const settingsBuilds = this.collectRendererSettings(this.allRenderers);\n\n form.fields(fields => {\n const rendererChildren: Record<string, FormModelFactory.FieldBuilder> = {\n name: fields.text().options(({ form }) => {\n const list = Boolean(form.field(\"general.list\").getValue());\n const predefined = Boolean(\n form.field(\"general.predefinedValuesEnabled\").getValue()\n );\n const liveField = {\n ...context.field,\n list,\n predefinedValues: {\n values: context.field.predefinedValues?.values ?? [],\n enabled: predefined\n }\n };\n\n return this.allRenderers\n .filter(r => r.canUse({ field: liveField, model: context.model }))\n .map(r => ({ label: r.name, value: r.rendererName }));\n })\n };\n\n for (const build of settingsBuilds) {\n const notSelected = ({ field }: FormModel.CallbackParams) =>\n field.parent().field(\"name\").getValue() !== build.rendererName;\n\n rendererChildren[`settings__${build.rendererName}`] = fields\n .object()\n .renderer(\"passthrough\")\n .hiddenWhen(notSelected)\n .fields((f: FormModelFactory.FieldBuilderRegistry) => {\n const merged: Record<string, FormModelFactory.FieldBuilder> = {};\n for (const fn of build.fieldsFns) {\n Object.assign(merged, fn(f));\n }\n return merged;\n });\n }\n\n return {\n renderer: fields\n .object()\n .renderer(\"cmsAppearance\")\n .fields(() => rendererChildren)\n };\n });\n\n form.layout(layout => {\n const innerLayout = (inner: FormModelFactory.LayoutBuilder) => {\n const nodes: FormModel.LayoutNodeBuilder[] = [inner.row(\"name\")];\n for (const build of settingsBuilds) {\n nodes.push(\n inner.object(`settings__${build.rendererName}`, settingsInner =>\n build.layoutFns.flatMap(fn => fn(settingsInner))\n )\n );\n }\n return nodes;\n };\n\n return [layout.object(\"renderer\", innerLayout)];\n });\n }\n\n mapToForm(field: CmsModelField) {\n const renderer = typeof field.renderer === \"object\" ? field.renderer : null;\n const rendererName = renderer ? renderer.name : \"\";\n const settings = renderer ? (renderer.settings ?? {}) : {};\n\n const result: Record<string, unknown> = {\n name: rendererName\n };\n\n for (const r of this.allRenderers) {\n if (r.buildSettingsForm) {\n result[`settings__${r.rendererName}`] =\n r.rendererName === rendererName ? settings : {};\n }\n }\n\n return { renderer: result };\n }\n\n mapFromForm(formData: Record<string, any>, field: CmsModelField) {\n const rendererName = formData.renderer?.name || \"\";\n const settingsKey = `settings__${rendererName}`;\n const settings = formData.renderer?.[settingsKey] ?? {};\n\n field.renderer = {\n name: rendererName,\n settings\n };\n }\n\n private collectRendererSettings(renderers: ICmsFieldRenderer[]): RendererSettingsBuild[] {\n const builds: RendererSettingsBuild[] = [];\n\n for (const renderer of renderers) {\n if (!renderer.buildSettingsForm) {\n continue;\n }\n\n const fieldsFns: RendererSettingsBuild[\"fieldsFns\"] = [];\n const layoutFns: RendererSettingsBuild[\"layoutFns\"] = [];\n\n const builder: ICmsFieldRendererFormBuilder = {\n fields: fn => {\n fieldsFns.push(fn);\n },\n layout: fn => {\n layoutFns.push(fn);\n }\n };\n\n renderer.buildSettingsForm(builder);\n\n if (fieldsFns.length > 0) {\n builds.push({ rendererName: renderer.rendererName, fieldsFns, layoutFns });\n }\n }\n\n return builds;\n }\n}\n\nexport const AppearanceGroup = CmsFieldEditorGroup.createImplementation({\n implementation: AppearanceGroupImpl,\n dependencies: [[CmsFieldRenderer, { multiple: true }]]\n});\n"],"names":["AppearanceGroupImpl","allRenderers","form","context","settingsBuilds","fields","rendererChildren","list","Boolean","predefined","liveField","r","build","notSelected","field","f","merged","fn","Object","layout","innerLayout","inner","nodes","settingsInner","renderer","rendererName","settings","result","formData","settingsKey","renderers","builds","fieldsFns","layoutFns","builder","AppearanceGroup","CmsFieldEditorGroup","CmsFieldRenderer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"presentation/fieldEditor/groups/AppearanceGroup.js","sources":["../../../../src/presentation/fieldEditor/groups/AppearanceGroup.ts"],"sourcesContent":["import { CmsFieldEditorGroup } from \"../abstractions.js\";\nimport type { ICmsFieldEditorFormBuilder, ICmsFieldEditorContext } from \"../abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type {\n ICmsFieldRenderer,\n ICmsFieldRendererFormBuilder\n} from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { FormModelFactory, FormModel } from \"@webiny/app-admin\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n cmsAppearance: { fieldType: \"object\"; settings: undefined };\n }\n}\n\n/**\n * Only some field types add the field (date/time adds `general.settingsType`, the Format\n * dropdown), and `form.field()` throws for a path the form doesn't have.\n */\nconst getOptionalValue = (form: FormModel.Interface, path: string): unknown => {\n try {\n return form.field(path).getValue();\n } catch {\n return undefined;\n }\n};\n\ninterface RendererSettingsBuild {\n rendererName: string;\n fieldsFns: Array<\n (f: FormModelFactory.FieldBuilderRegistry) => Record<string, FormModelFactory.FieldBuilder>\n >;\n layoutFns: Array<(l: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]>;\n}\n\nclass AppearanceGroupImpl implements CmsFieldEditorGroup.Interface {\n name = \"appearance\";\n label = \"Appearance\";\n\n constructor(private allRenderers: ICmsFieldRenderer[]) {}\n\n buildForm(form: ICmsFieldEditorFormBuilder, context: ICmsFieldEditorContext) {\n const settingsBuilds = this.collectRendererSettings(this.allRenderers);\n\n form.fields(fields => {\n const rendererChildren: Record<string, FormModelFactory.FieldBuilder> = {\n name: fields.text().options(({ form }) => {\n const list = Boolean(form.field(\"general.list\").getValue());\n const predefined = Boolean(\n form.field(\"general.predefinedValuesEnabled\").getValue()\n );\n const settingsType = getOptionalValue(form, \"general.settingsType\");\n const liveField = {\n ...context.field,\n list,\n settings:\n typeof settingsType === \"string\"\n ? { ...context.field.settings, type: settingsType }\n : context.field.settings,\n predefinedValues: {\n values: context.field.predefinedValues?.values ?? [],\n enabled: predefined\n }\n };\n\n return this.allRenderers\n .filter(r => r.canUse({ field: liveField, model: context.model }))\n .map(r => ({ label: r.name, value: r.rendererName }));\n })\n };\n\n for (const build of settingsBuilds) {\n const notSelected = ({ field }: FormModel.CallbackParams) =>\n field.parent().field(\"name\").getValue() !== build.rendererName;\n\n rendererChildren[`settings__${build.rendererName}`] = fields\n .object()\n .renderer(\"passthrough\")\n .hiddenWhen(notSelected)\n .fields((f: FormModelFactory.FieldBuilderRegistry) => {\n const merged: Record<string, FormModelFactory.FieldBuilder> = {};\n for (const fn of build.fieldsFns) {\n Object.assign(merged, fn(f));\n }\n return merged;\n });\n }\n\n return {\n renderer: fields\n .object()\n .renderer(\"cmsAppearance\")\n .fields(() => rendererChildren)\n };\n });\n\n form.layout(layout => {\n const innerLayout = (inner: FormModelFactory.LayoutBuilder) => {\n const nodes: FormModel.LayoutNodeBuilder[] = [inner.row(\"name\")];\n for (const build of settingsBuilds) {\n nodes.push(\n inner.object(`settings__${build.rendererName}`, settingsInner =>\n build.layoutFns.flatMap(fn => fn(settingsInner))\n )\n );\n }\n return nodes;\n };\n\n return [layout.object(\"renderer\", innerLayout)];\n });\n }\n\n mapToForm(field: CmsModelField) {\n const renderer = typeof field.renderer === \"object\" ? field.renderer : null;\n const rendererName = renderer ? renderer.name : \"\";\n const settings = renderer ? (renderer.settings ?? {}) : {};\n\n const result: Record<string, unknown> = {\n name: rendererName\n };\n\n for (const r of this.allRenderers) {\n if (r.buildSettingsForm) {\n result[`settings__${r.rendererName}`] =\n r.rendererName === rendererName ? settings : {};\n }\n }\n\n return { renderer: result };\n }\n\n mapFromForm(formData: Record<string, any>, field: CmsModelField) {\n const rendererName = formData.renderer?.name || \"\";\n const settingsKey = `settings__${rendererName}`;\n const settings = formData.renderer?.[settingsKey] ?? {};\n\n field.renderer = {\n name: rendererName,\n settings\n };\n }\n\n private collectRendererSettings(renderers: ICmsFieldRenderer[]): RendererSettingsBuild[] {\n const builds: RendererSettingsBuild[] = [];\n\n for (const renderer of renderers) {\n if (!renderer.buildSettingsForm) {\n continue;\n }\n\n const fieldsFns: RendererSettingsBuild[\"fieldsFns\"] = [];\n const layoutFns: RendererSettingsBuild[\"layoutFns\"] = [];\n\n const builder: ICmsFieldRendererFormBuilder = {\n fields: fn => {\n fieldsFns.push(fn);\n },\n layout: fn => {\n layoutFns.push(fn);\n }\n };\n\n renderer.buildSettingsForm(builder);\n\n if (fieldsFns.length > 0) {\n builds.push({ rendererName: renderer.rendererName, fieldsFns, layoutFns });\n }\n }\n\n return builds;\n }\n}\n\nexport const AppearanceGroup = CmsFieldEditorGroup.createImplementation({\n implementation: AppearanceGroupImpl,\n dependencies: [[CmsFieldRenderer, { multiple: true }]]\n});\n"],"names":["getOptionalValue","form","path","AppearanceGroupImpl","allRenderers","context","settingsBuilds","fields","rendererChildren","list","Boolean","predefined","settingsType","liveField","r","build","notSelected","field","f","merged","fn","Object","layout","innerLayout","inner","nodes","settingsInner","renderer","rendererName","settings","result","formData","settingsKey","renderers","builds","fieldsFns","layoutFns","builder","AppearanceGroup","CmsFieldEditorGroup","CmsFieldRenderer"],"mappings":"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"}
|
|
@@ -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,
|
|
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(
|
|
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,
|
|
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":";;
|
|
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":";
|
|
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
|
-
|
|
6
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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 = "
|
|
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
|
|
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
|
-
|
|
6
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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 = "
|
|
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
|
|
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 {};
|