@defra/forms-engine-plugin 5.0.0-alpha.11 → 5.0.0-alpha.12
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/.server/server/plugins/engine/components/CheckboxesField.d.ts +20 -2
- package/.server/server/plugins/engine/components/CheckboxesField.js +24 -12
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +2 -0
- package/.server/server/plugins/engine/components/EastingNorthingField.js +1 -1
- package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +10 -1
- package/.server/server/plugins/engine/components/FileUploadField.js +18 -6
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
- package/.server/server/plugins/engine/components/GeospatialField.d.ts +21 -0
- package/.server/server/plugins/engine/components/GeospatialField.js +32 -9
- package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
- package/.server/server/plugins/engine/components/LatLongField.d.ts +2 -0
- package/.server/server/plugins/engine/components/LocationFieldBase.js +4 -1
- package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +2 -0
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +7 -1
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +5 -0
- package/.server/server/plugins/engine/components/helpers/geospatial.js +25 -16
- package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
- package/.server/server/plugins/engine/form-availability.d.ts +3 -2
- package/.server/server/plugins/engine/form-availability.js +3 -2
- package/.server/server/plugins/engine/form-availability.js.map +1 -1
- package/.server/server/plugins/engine/form-context.js +2 -2
- package/.server/server/plugins/engine/form-context.js.map +1 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +1 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js +30 -9
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
- package/.server/server/plugins/engine/i18n/translations/cy.json +66 -10
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +29 -10
- package/.server/server/plugins/engine/i18n/types.d.ts +1 -0
- package/.server/server/plugins/engine/i18n/types.js.map +1 -1
- package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
- package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
- package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
- package/.server/server/plugins/engine/unavailable-response.js +5 -2
- package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
- package/.server/server/plugins/engine/views/components/_location-field-base.html +1 -1
- package/.server/server/plugins/engine/views/unavailable.html +14 -11
- package/package.json +1 -1
- package/src/server/plugins/engine/components/CheckboxesField.ts +34 -13
- package/src/server/plugins/engine/components/EastingNorthingField.ts +1 -1
- package/src/server/plugins/engine/components/FileUploadField.ts +26 -6
- package/src/server/plugins/engine/components/GeospatialField.ts +43 -11
- package/src/server/plugins/engine/components/LocationFieldBase.ts +3 -1
- package/src/server/plugins/engine/components/LocationFieldHelpers.ts +7 -1
- package/src/server/plugins/engine/components/helpers/geospatial.ts +32 -22
- package/src/server/plugins/engine/form-availability.ts +8 -2
- package/src/server/plugins/engine/form-context.ts +4 -2
- package/src/server/plugins/engine/i18n/buildValidationMessages.ts +15 -10
- package/src/server/plugins/engine/i18n/translations/cy.json +66 -10
- package/src/server/plugins/engine/i18n/translations/en-GB.json +29 -10
- package/src/server/plugins/engine/i18n/types.ts +1 -0
- package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +2 -2
- package/src/server/plugins/engine/unavailable-response.ts +6 -2
- package/src/server/plugins/engine/views/components/_location-field-base.html +1 -1
- package/src/server/plugins/engine/views/unavailable.html +14 -11
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model';
|
|
2
|
-
import
|
|
2
|
+
import { type ArraySchema } from 'joi';
|
|
3
3
|
import { SelectionControlField } from '../../../../server/plugins/engine/components/SelectionControlField.js';
|
|
4
4
|
import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
|
|
5
5
|
import { type ErrorMessageTemplateList, type FormState, type FormStateValue, type FormSubmissionState } from '../../../../server/plugins/engine/types.js';
|
|
@@ -8,6 +8,11 @@ export declare class CheckboxesField extends SelectionControlField {
|
|
|
8
8
|
schema: CheckboxesFieldComponent['schema'];
|
|
9
9
|
formSchema: ArraySchema<string> | ArraySchema<number>;
|
|
10
10
|
stateSchema: ArraySchema<string> | ArraySchema<number>;
|
|
11
|
+
limits: {
|
|
12
|
+
min?: number;
|
|
13
|
+
max?: number;
|
|
14
|
+
length?: number;
|
|
15
|
+
};
|
|
11
16
|
constructor(def: CheckboxesFieldComponent, props: ConstructorParameters<typeof SelectionControlField>[1]);
|
|
12
17
|
getFormValueFromState(state: FormSubmissionState): (string | number | boolean)[] | undefined;
|
|
13
18
|
getFormValue(value?: FormStateValue | FormState): (string | number | boolean)[] | undefined;
|
|
@@ -16,7 +21,11 @@ export declare class CheckboxesField extends SelectionControlField {
|
|
|
16
21
|
getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
|
|
17
22
|
getContextValueFromState(state: FormSubmissionState): (string | number | boolean)[];
|
|
18
23
|
getValidationMessagesOverride(translator: Translator): {
|
|
19
|
-
[x: string]:
|
|
24
|
+
[x: string]: {
|
|
25
|
+
'array.min': string;
|
|
26
|
+
'array.max': string;
|
|
27
|
+
'array.length': string;
|
|
28
|
+
};
|
|
20
29
|
};
|
|
21
30
|
/**
|
|
22
31
|
* For error preview page that shows all possible errors on a component
|
|
@@ -27,4 +36,13 @@ export declare class CheckboxesField extends SelectionControlField {
|
|
|
27
36
|
*/
|
|
28
37
|
static getAllPossibleErrors(): ErrorMessageTemplateList;
|
|
29
38
|
isValue(value?: FormStateValue | FormState): value is Item['value'][];
|
|
39
|
+
static buildErrorMessages(language: string, limits?: {
|
|
40
|
+
min?: number;
|
|
41
|
+
max?: number;
|
|
42
|
+
length?: number;
|
|
43
|
+
}): {
|
|
44
|
+
'array.min': string;
|
|
45
|
+
'array.max': string;
|
|
46
|
+
'array.length': string;
|
|
47
|
+
};
|
|
30
48
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import joi from 'joi';
|
|
2
|
+
import { EN_GB } from "../../../constants.js";
|
|
2
3
|
import { isFormValue } from "./FormComponent.js";
|
|
3
4
|
import { SelectionControlField } from "./SelectionControlField.js";
|
|
4
|
-
import {
|
|
5
|
+
import { t as tPlugin } from "../i18n/index.js";
|
|
5
6
|
import { messageTemplate } from "../pageControllers/validationOptions.js";
|
|
6
7
|
export class CheckboxesField extends SelectionControlField {
|
|
7
8
|
constructor(def, props) {
|
|
@@ -15,24 +16,26 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
15
16
|
} = def;
|
|
16
17
|
let formSchema = type === 'string' ? joi.array() : joi.array();
|
|
17
18
|
const itemsSchema = joi[type]().valid(...this.values).label(this.label);
|
|
18
|
-
formSchema = formSchema.items(itemsSchema).single().label(this.label).required()
|
|
19
|
-
|
|
20
|
-
'array.max': messageTemplate.arrayMax,
|
|
21
|
-
'array.length': messageTemplate.arrayLength
|
|
22
|
-
});
|
|
19
|
+
formSchema = formSchema.items(itemsSchema).single().label(this.label).required();
|
|
20
|
+
const limits = {};
|
|
23
21
|
if (options.required === false) {
|
|
24
22
|
formSchema = formSchema.optional();
|
|
25
23
|
}
|
|
26
24
|
if (typeof schema?.length === 'number') {
|
|
27
25
|
formSchema = formSchema.length(schema.length);
|
|
26
|
+
limits.length = schema.length;
|
|
28
27
|
} else {
|
|
29
28
|
if (typeof schema?.min === 'number') {
|
|
30
29
|
formSchema = formSchema.min(schema.min);
|
|
30
|
+
limits.min = schema.min;
|
|
31
31
|
}
|
|
32
32
|
if (typeof schema?.max === 'number') {
|
|
33
33
|
formSchema = formSchema.max(schema.max);
|
|
34
|
+
limits.max = schema.max;
|
|
34
35
|
}
|
|
35
36
|
}
|
|
37
|
+
this.limits = limits;
|
|
38
|
+
formSchema = formSchema.messages(CheckboxesField.buildErrorMessages(EN_GB, limits));
|
|
36
39
|
this.formSchema = formSchema.default([]);
|
|
37
40
|
this.stateSchema = formSchema.default(null).allow(null);
|
|
38
41
|
this.options = options;
|
|
@@ -86,14 +89,10 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
86
89
|
}
|
|
87
90
|
getValidationMessagesOverride(translator) {
|
|
88
91
|
const {
|
|
89
|
-
|
|
92
|
+
language
|
|
90
93
|
} = translator;
|
|
91
94
|
return {
|
|
92
|
-
[this.name]:
|
|
93
|
-
'array.min': buildValidationMessages(t).arrayMin,
|
|
94
|
-
'array.max': buildValidationMessages(t).arrayMax,
|
|
95
|
-
'array.length': buildValidationMessages(t).arrayLength
|
|
96
|
-
}
|
|
95
|
+
[this.name]: CheckboxesField.buildErrorMessages(language, this.limits)
|
|
97
96
|
};
|
|
98
97
|
}
|
|
99
98
|
|
|
@@ -134,5 +133,18 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
134
133
|
}
|
|
135
134
|
return value.every(isFormValue);
|
|
136
135
|
}
|
|
136
|
+
static buildErrorMessages(language, limits = {}) {
|
|
137
|
+
return {
|
|
138
|
+
'array.min': tPlugin('validation.arrayMin', language, {
|
|
139
|
+
count: limits.min ?? 1
|
|
140
|
+
}),
|
|
141
|
+
'array.max': tPlugin('validation.arrayMax', language, {
|
|
142
|
+
count: limits.max ?? 1
|
|
143
|
+
}),
|
|
144
|
+
'array.length': tPlugin('validation.arrayLength', language, {
|
|
145
|
+
count: limits.length ?? 1
|
|
146
|
+
})
|
|
147
|
+
};
|
|
148
|
+
}
|
|
137
149
|
}
|
|
138
150
|
//# sourceMappingURL=CheckboxesField.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckboxesField.js","names":["joi","isFormValue","SelectionControlField","buildValidationMessages","messageTemplate","CheckboxesField","constructor","def","props","listType","type","options","schema","formSchema","array","itemsSchema","valid","values","label","items","single","required","messages","arrayMin","arrayMax","arrayLength","optional","length","min","max","default","stateSchema","allow","getFormValueFromState","state","name","getFormValue","selected","filter","item","includes","value","map","undefined","isValue","getDisplayStringFromFormValue","translator","tListItem","text","join","getContextValueFromFormValue","getDisplayStringFromState","getContextValueFromState","getValidationMessagesOverride","t","getAllPossibleErrors","parentErrors","advancedSettingsErrors","template","Array","isArray","every"],"sources":["../../../../../src/server/plugins/engine/components/CheckboxesField.ts"],"sourcesContent":["import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model'\nimport joi, { type ArraySchema, type LanguageMessages } from 'joi'\n\nimport { isFormValue } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { SelectionControlField } from '~/src/server/plugins/engine/components/SelectionControlField.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'\nimport { type QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class CheckboxesField extends SelectionControlField {\n declare options: CheckboxesFieldComponent['options']\n declare schema: CheckboxesFieldComponent['schema']\n declare formSchema: ArraySchema<string> | ArraySchema<number>\n declare stateSchema: ArraySchema<string> | ArraySchema<number>\n\n constructor(\n def: CheckboxesFieldComponent,\n props: ConstructorParameters<typeof SelectionControlField>[1]\n ) {\n super(def, props)\n\n const { listType: type } = this\n const { options, schema } = def\n\n let formSchema =\n type === 'string' ? joi.array<string>() : joi.array<number>()\n\n const itemsSchema = joi[type]()\n .valid(...this.values)\n .label(this.label)\n\n formSchema = formSchema\n .items(itemsSchema)\n .single()\n .label(this.label)\n .required()\n .messages({\n 'array.min': messageTemplate.arrayMin,\n 'array.max': messageTemplate.arrayMax,\n 'array.length': messageTemplate.arrayLength\n })\n\n if (options.required === false) {\n formSchema = formSchema.optional()\n }\n\n if (typeof schema?.length === 'number') {\n formSchema = formSchema.length(schema.length)\n } else {\n if (typeof schema?.min === 'number') {\n formSchema = formSchema.min(schema.min)\n }\n\n if (typeof schema?.max === 'number') {\n formSchema = formSchema.max(schema.max)\n }\n }\n\n this.formSchema = formSchema.default([])\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { items, name } = this\n\n // State checkbox values\n const values = this.getFormValue(state[name]) ?? []\n\n // Map (or discard) state values to item values\n const selected = items\n .filter((item) => values.includes(item.value))\n .map((item) => item.value)\n\n return selected.length ? selected : undefined\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n selected: (string | number | boolean)[] | undefined,\n translator: Translator\n ) {\n const { items } = this\n\n if (!selected) {\n return ''\n }\n\n return items\n .filter((item) => selected.includes(item.value))\n .map((item) => translator.tListItem(item, 'text') || item.text)\n .join(', ')\n }\n\n getContextValueFromFormValue(\n values: (string | number | boolean)[] | undefined\n ): (string | number | boolean)[] {\n /**\n * For evaluation context purposes, optional {@link CheckboxesField}\n * with an undefined value (i.e. nothing selected) should default to [].\n * This way conditions are not evaluated against `undefined` which throws errors.\n * Currently these errors are caught and the evaluation returns default `false`.\n * @see {@link QuestionPageController.getNextPath} for `undefined` return value\n * @see {@link FormModel.makeCondition} for try/catch block with default `false`\n * For negative conditions this is a problem because E.g.\n * The condition: 'selectedchecks' does not contain 'someval'\n * should return true IF 'selectedchecks' is undefined, not throw and return false.\n */\n return values ?? []\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const selected = this.getFormValueFromState(state) ?? []\n return this.getDisplayStringFromFormValue(selected, translator)\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const values = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(values)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { t } = translator\n return {\n [this.name]: {\n 'array.min': buildValidationMessages(t).arrayMin,\n 'array.max': buildValidationMessages(t).arrayMax,\n 'array.length': buildValidationMessages(t).arrayLength\n } as LanguageMessages\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return CheckboxesField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n const parentErrors = SelectionControlField.getAllPossibleErrors()\n\n return {\n ...parentErrors,\n advancedSettingsErrors: [\n ...parentErrors.advancedSettingsErrors,\n { type: 'array.min', template: messageTemplate.arrayMin },\n { type: 'array.max', template: messageTemplate.arrayMax },\n { type: 'array.length', template: messageTemplate.arrayLength }\n ]\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isFormValue)\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"CheckboxesField.js","names":["joi","EN_GB","isFormValue","SelectionControlField","t","tPlugin","messageTemplate","CheckboxesField","constructor","def","props","listType","type","options","schema","formSchema","array","itemsSchema","valid","values","label","items","single","required","limits","optional","length","min","max","messages","buildErrorMessages","default","stateSchema","allow","getFormValueFromState","state","name","getFormValue","selected","filter","item","includes","value","map","undefined","isValue","getDisplayStringFromFormValue","translator","tListItem","text","join","getContextValueFromFormValue","getDisplayStringFromState","getContextValueFromState","getValidationMessagesOverride","language","getAllPossibleErrors","parentErrors","advancedSettingsErrors","template","arrayMin","arrayMax","arrayLength","Array","isArray","every","count"],"sources":["../../../../../src/server/plugins/engine/components/CheckboxesField.ts"],"sourcesContent":["import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model'\nimport joi, { type ArraySchema } from 'joi'\n\nimport { EN_GB } from '~/src/server/constants.js'\nimport { isFormValue } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { SelectionControlField } from '~/src/server/plugins/engine/components/SelectionControlField.js'\nimport { t as tPlugin } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'\nimport { type QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class CheckboxesField extends SelectionControlField {\n declare options: CheckboxesFieldComponent['options']\n declare schema: CheckboxesFieldComponent['schema']\n declare formSchema: ArraySchema<string> | ArraySchema<number>\n declare stateSchema: ArraySchema<string> | ArraySchema<number>\n declare limits: { min?: number; max?: number; length?: number }\n\n constructor(\n def: CheckboxesFieldComponent,\n props: ConstructorParameters<typeof SelectionControlField>[1]\n ) {\n super(def, props)\n\n const { listType: type } = this\n const { options, schema } = def\n\n let formSchema =\n type === 'string' ? joi.array<string>() : joi.array<number>()\n\n const itemsSchema = joi[type]()\n .valid(...this.values)\n .label(this.label)\n\n formSchema = formSchema\n .items(itemsSchema)\n .single()\n .label(this.label)\n .required()\n\n const limits: { min?: number; max?: number; length?: number } = {}\n\n if (options.required === false) {\n formSchema = formSchema.optional()\n }\n\n if (typeof schema?.length === 'number') {\n formSchema = formSchema.length(schema.length)\n limits.length = schema.length\n } else {\n if (typeof schema?.min === 'number') {\n formSchema = formSchema.min(schema.min)\n limits.min = schema.min\n }\n\n if (typeof schema?.max === 'number') {\n formSchema = formSchema.max(schema.max)\n limits.max = schema.max\n }\n }\n\n this.limits = limits\n\n formSchema = formSchema.messages(\n CheckboxesField.buildErrorMessages(EN_GB, limits)\n )\n\n this.formSchema = formSchema.default([])\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { items, name } = this\n\n // State checkbox values\n const values = this.getFormValue(state[name]) ?? []\n\n // Map (or discard) state values to item values\n const selected = items\n .filter((item) => values.includes(item.value))\n .map((item) => item.value)\n\n return selected.length ? selected : undefined\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n selected: (string | number | boolean)[] | undefined,\n translator: Translator\n ) {\n const { items } = this\n\n if (!selected) {\n return ''\n }\n\n return items\n .filter((item) => selected.includes(item.value))\n .map((item) => translator.tListItem(item, 'text') || item.text)\n .join(', ')\n }\n\n getContextValueFromFormValue(\n values: (string | number | boolean)[] | undefined\n ): (string | number | boolean)[] {\n /**\n * For evaluation context purposes, optional {@link CheckboxesField}\n * with an undefined value (i.e. nothing selected) should default to [].\n * This way conditions are not evaluated against `undefined` which throws errors.\n * Currently these errors are caught and the evaluation returns default `false`.\n * @see {@link QuestionPageController.getNextPath} for `undefined` return value\n * @see {@link FormModel.makeCondition} for try/catch block with default `false`\n * For negative conditions this is a problem because E.g.\n * The condition: 'selectedchecks' does not contain 'someval'\n * should return true IF 'selectedchecks' is undefined, not throw and return false.\n */\n return values ?? []\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const selected = this.getFormValueFromState(state) ?? []\n return this.getDisplayStringFromFormValue(selected, translator)\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const values = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(values)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { language } = translator\n return {\n [this.name]: CheckboxesField.buildErrorMessages(language, this.limits)\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return CheckboxesField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n const parentErrors = SelectionControlField.getAllPossibleErrors()\n\n return {\n ...parentErrors,\n advancedSettingsErrors: [\n ...parentErrors.advancedSettingsErrors,\n { type: 'array.min', template: messageTemplate.arrayMin },\n { type: 'array.max', template: messageTemplate.arrayMax },\n { type: 'array.length', template: messageTemplate.arrayLength }\n ]\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isFormValue)\n }\n\n static buildErrorMessages(\n language: string,\n limits: { min?: number; max?: number; length?: number } = {}\n ) {\n return {\n 'array.min': tPlugin('validation.arrayMin', language, {\n count: limits.min ?? 1\n }),\n 'array.max': tPlugin('validation.arrayMax', language, {\n count: limits.max ?? 1\n }),\n 'array.length': tPlugin('validation.arrayLength', language, {\n count: limits.length ?? 1\n })\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -66,7 +66,9 @@ export declare class EastingNorthingField extends FormComponent {
|
|
|
66
66
|
uploadingLabel?: string;
|
|
67
67
|
};
|
|
68
68
|
} | {
|
|
69
|
+
instructionSummary: string;
|
|
69
70
|
instructionText: string;
|
|
71
|
+
t: (key: string, opts?: Record<string, unknown>) => string;
|
|
70
72
|
fieldset: {
|
|
71
73
|
attributes?: string | Record<string, string>;
|
|
72
74
|
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
@@ -113,7 +113,7 @@ export class EastingNorthingField extends FormComponent {
|
|
|
113
113
|
fieldErrors?.forEach(err => {
|
|
114
114
|
if (err.context?.country) {
|
|
115
115
|
err.text = translator.t('components.eastingNorthingField.wrongCountry', {
|
|
116
|
-
country: err.context.country
|
|
116
|
+
country: translator.t(`common.${err.context.country}`)
|
|
117
117
|
});
|
|
118
118
|
}
|
|
119
119
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EastingNorthingField.js","names":["ComponentType","lowerFirst","ComponentCollection","FormComponent","isFormState","deduplicateErrorsByHref","getLocationFieldViewModel","NumberField","getEastingNorthingCountryValidator","createLowerFirstExpression","getTranslatedLabel","t","tPlugin","messageTemplate","DEFAULT_EASTING_MIN","DEFAULT_EASTING_MAX","DEFAULT_NORTHING_MIN","DEFAULT_NORTHING_MAX","EastingNorthingField","constructor","def","props","name","options","schema","isRequired","required","eastingMin","eastingMax","northingMin","northingMax","getMinMax","eastingValidationMessages","northingValidationMessages","buildErrorMessages","label","collection","type","title","min","max","precision","optionalText","classes","customValidationMessages","parent","peers","country","countries","at","formSchema","custom","stateSchema","getFormValueFromState","state","value","isEastingNorthing","undefined","getDisplayStringFromFormValue","translator","easting","northing","getDisplayStringFromState","getContextValueFromFormValue","getContextValueFromState","getViewModel","context","viewModel","getErrors","errors","fieldErrors","forEach","err","text","getViewErrors","allErrors","isState","getValidationMessagesOverride","translatedLabel","language","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isNumber","fieldLabel","eastingDigitsMessage","northingDigitsMessage"],"sources":["../../../../../src/server/plugins/engine/components/EastingNorthingField.ts"],"sourcesContent":["import {\n ComponentType,\n type EastingNorthingFieldComponent\n} from '@defra/forms-model'\nimport { type LanguageMessages, type ObjectSchema } from 'joi'\nimport lowerFirst from 'lodash/lowerFirst.js'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n deduplicateErrorsByHref,\n getLocationFieldViewModel\n} from '~/src/server/plugins/engine/components/LocationFieldHelpers.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport { getEastingNorthingCountryValidator } from '~/src/server/plugins/engine/components/helpers/geospatial.js'\nimport {\n createLowerFirstExpression,\n getTranslatedLabel\n} from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n type EastingNorthingState,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { t as tPlugin } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\n// British National Grid coordinate limits\nconst DEFAULT_EASTING_MIN = 0\nconst DEFAULT_EASTING_MAX = 700000\nconst DEFAULT_NORTHING_MIN = 0\nconst DEFAULT_NORTHING_MAX = 1300000\n\nexport class EastingNorthingField extends FormComponent {\n declare options: EastingNorthingFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: EastingNorthingFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options, schema } = def\n\n const isRequired = options.required !== false\n\n const { eastingMin, eastingMax, northingMin, northingMax } =\n EastingNorthingField.getMinMax(schema)\n\n const { eastingValidationMessages, northingValidationMessages } =\n EastingNorthingField.buildErrorMessages(\n this.label,\n eastingMin,\n eastingMax,\n northingMin,\n northingMax,\n 'en-GB'\n )\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__easting`,\n title: 'components.eastingNorthingField.easting',\n schema: {\n min: eastingMin,\n max: eastingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages: eastingValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__northing`,\n title: 'components.eastingNorthingField.northing',\n schema: {\n min: northingMin,\n max: northingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages: northingValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n peers: [`${name}__easting`, `${name}__northing`]\n }\n )\n\n this.options = options\n\n const country = options.countries?.at(0)\n\n if (country) {\n this.collection.formSchema = this.collection.formSchema.custom(\n getEastingNorthingCountryValidator(this, country)\n )\n this.collection.stateSchema = this.collection.stateSchema.custom(\n getEastingNorthingCountryValidator(this, country)\n )\n }\n\n this.formSchema = this.collection.formSchema\n this.stateSchema = this.collection.stateSchema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const value = super.getFormValueFromState(state)\n return EastingNorthingField.isEastingNorthing(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: EastingNorthingState | undefined,\n translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n const { t } = translator\n\n return `${t('components.eastingNorthingField.easting')}: ${value.easting}\\n${t('components.eastingNorthingField.northing')}: ${value.northing}`\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: EastingNorthingState | undefined\n ): string | null {\n if (!value) {\n return null\n }\n\n return `${value.easting}, ${value.northing}`\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n return getLocationFieldViewModel(this, viewModel, context)\n }\n\n getErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const fieldErrors = super.getErrors(translator, errors)\n\n fieldErrors?.forEach((err) => {\n if (err.context?.country) {\n err.text = translator.t(\n 'components.eastingNorthingField.wrongCountry',\n { country: err.context.country }\n )\n }\n })\n\n return fieldErrors\n }\n\n getViewErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const allErrors = this.getErrors(translator, errors)\n return deduplicateErrorsByHref(allErrors)\n }\n\n isState(value?: FormStateValue | FormState) {\n return EastingNorthingField.isEastingNorthing(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const def = this.def as EastingNorthingFieldComponent\n const translatedLabel = getTranslatedLabel(def, translator)\n const { eastingMin, eastingMax, northingMin, northingMax } =\n EastingNorthingField.getMinMax(def.schema)\n const { eastingValidationMessages, northingValidationMessages } =\n EastingNorthingField.buildErrorMessages(\n translatedLabel,\n eastingMin,\n eastingMax,\n northingMin,\n northingMax,\n translator.language\n )\n return {\n [`${this.name}__easting`]: eastingValidationMessages,\n [`${this.name}__northing`]: northingValidationMessages\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return EastingNorthingField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n {\n type: 'eastingFormat',\n template: createLowerFirstExpression(\n 'Easting for {{lowerFirst(#title)}} must be between 1 and 6 digits'\n )\n },\n {\n type: 'northingFormat',\n template: createLowerFirstExpression(\n 'Northing for {{lowerFirst(#title)}} must be between 1 and 7 digits'\n )\n }\n ],\n advancedSettingsErrors: [\n {\n type: 'eastingMin',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'eastingMax',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'northingMin',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n },\n {\n type: 'northingMax',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n }\n ]\n }\n }\n\n static isEastingNorthing(\n value?: FormStateValue | FormState\n ): value is EastingNorthingState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.easting) &&\n NumberField.isNumber(value.northing)\n )\n }\n\n static buildErrorMessages(\n label: string,\n eastingMin: number,\n eastingMax: number,\n northingMin: number,\n northingMax: number,\n language: string\n ) {\n const fieldLabel = lowerFirst(label)\n\n const eastingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.eastingDigits',\n language,\n { fieldLabel }\n )\n const northingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.northingDigits',\n language,\n { fieldLabel }\n )\n\n const eastingValidationMessages: LanguageMessages = {\n 'any.required': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n language\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n language\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n language,\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n language,\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.precision': eastingDigitsMessage,\n 'number.integer': eastingDigitsMessage,\n 'number.unsafe': eastingDigitsMessage\n }\n\n const northingValidationMessages: LanguageMessages = {\n 'any.required': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n language\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n language\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.northingRange',\n language,\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.northingRange',\n language,\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.precision': northingDigitsMessage,\n 'number.integer': northingDigitsMessage,\n 'number.unsafe': northingDigitsMessage\n }\n return {\n eastingValidationMessages,\n northingValidationMessages\n }\n }\n\n // Read schema values from def.schema with fallback defaults\n static getMinMax(\n schema:\n | {\n easting?: {\n min?: number\n max?: number\n }\n northing?: {\n min?: number\n max?: number\n }\n }\n | undefined\n ) {\n return {\n eastingMin: schema?.easting?.min ?? DEFAULT_EASTING_MIN,\n eastingMax: schema?.easting?.max ?? DEFAULT_EASTING_MAX,\n northingMin: schema?.northing?.min ?? DEFAULT_NORTHING_MIN,\n northingMax: schema?.northing?.max ?? DEFAULT_NORTHING_MAX\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"EastingNorthingField.js","names":["ComponentType","lowerFirst","ComponentCollection","FormComponent","isFormState","deduplicateErrorsByHref","getLocationFieldViewModel","NumberField","getEastingNorthingCountryValidator","createLowerFirstExpression","getTranslatedLabel","t","tPlugin","messageTemplate","DEFAULT_EASTING_MIN","DEFAULT_EASTING_MAX","DEFAULT_NORTHING_MIN","DEFAULT_NORTHING_MAX","EastingNorthingField","constructor","def","props","name","options","schema","isRequired","required","eastingMin","eastingMax","northingMin","northingMax","getMinMax","eastingValidationMessages","northingValidationMessages","buildErrorMessages","label","collection","type","title","min","max","precision","optionalText","classes","customValidationMessages","parent","peers","country","countries","at","formSchema","custom","stateSchema","getFormValueFromState","state","value","isEastingNorthing","undefined","getDisplayStringFromFormValue","translator","easting","northing","getDisplayStringFromState","getContextValueFromFormValue","getContextValueFromState","getViewModel","context","viewModel","getErrors","errors","fieldErrors","forEach","err","text","getViewErrors","allErrors","isState","getValidationMessagesOverride","translatedLabel","language","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isNumber","fieldLabel","eastingDigitsMessage","northingDigitsMessage"],"sources":["../../../../../src/server/plugins/engine/components/EastingNorthingField.ts"],"sourcesContent":["import {\n ComponentType,\n type EastingNorthingFieldComponent\n} from '@defra/forms-model'\nimport { type LanguageMessages, type ObjectSchema } from 'joi'\nimport lowerFirst from 'lodash/lowerFirst.js'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n deduplicateErrorsByHref,\n getLocationFieldViewModel\n} from '~/src/server/plugins/engine/components/LocationFieldHelpers.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport { getEastingNorthingCountryValidator } from '~/src/server/plugins/engine/components/helpers/geospatial.js'\nimport {\n createLowerFirstExpression,\n getTranslatedLabel\n} from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n type EastingNorthingState,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { t as tPlugin } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\n// British National Grid coordinate limits\nconst DEFAULT_EASTING_MIN = 0\nconst DEFAULT_EASTING_MAX = 700000\nconst DEFAULT_NORTHING_MIN = 0\nconst DEFAULT_NORTHING_MAX = 1300000\n\nexport class EastingNorthingField extends FormComponent {\n declare options: EastingNorthingFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: EastingNorthingFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options, schema } = def\n\n const isRequired = options.required !== false\n\n const { eastingMin, eastingMax, northingMin, northingMax } =\n EastingNorthingField.getMinMax(schema)\n\n const { eastingValidationMessages, northingValidationMessages } =\n EastingNorthingField.buildErrorMessages(\n this.label,\n eastingMin,\n eastingMax,\n northingMin,\n northingMax,\n 'en-GB'\n )\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__easting`,\n title: 'components.eastingNorthingField.easting',\n schema: {\n min: eastingMin,\n max: eastingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages: eastingValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__northing`,\n title: 'components.eastingNorthingField.northing',\n schema: {\n min: northingMin,\n max: northingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages: northingValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n peers: [`${name}__easting`, `${name}__northing`]\n }\n )\n\n this.options = options\n\n const country = options.countries?.at(0)\n\n if (country) {\n this.collection.formSchema = this.collection.formSchema.custom(\n getEastingNorthingCountryValidator(this, country)\n )\n this.collection.stateSchema = this.collection.stateSchema.custom(\n getEastingNorthingCountryValidator(this, country)\n )\n }\n\n this.formSchema = this.collection.formSchema\n this.stateSchema = this.collection.stateSchema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const value = super.getFormValueFromState(state)\n return EastingNorthingField.isEastingNorthing(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: EastingNorthingState | undefined,\n translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n const { t } = translator\n\n return `${t('components.eastingNorthingField.easting')}: ${value.easting}\\n${t('components.eastingNorthingField.northing')}: ${value.northing}`\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: EastingNorthingState | undefined\n ): string | null {\n if (!value) {\n return null\n }\n\n return `${value.easting}, ${value.northing}`\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n return getLocationFieldViewModel(this, viewModel, context)\n }\n\n getErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const fieldErrors = super.getErrors(translator, errors)\n\n fieldErrors?.forEach((err) => {\n if (err.context?.country) {\n err.text = translator.t(\n 'components.eastingNorthingField.wrongCountry',\n { country: translator.t(`common.${err.context.country}`) }\n )\n }\n })\n\n return fieldErrors\n }\n\n getViewErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const allErrors = this.getErrors(translator, errors)\n return deduplicateErrorsByHref(allErrors)\n }\n\n isState(value?: FormStateValue | FormState) {\n return EastingNorthingField.isEastingNorthing(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const def = this.def as EastingNorthingFieldComponent\n const translatedLabel = getTranslatedLabel(def, translator)\n const { eastingMin, eastingMax, northingMin, northingMax } =\n EastingNorthingField.getMinMax(def.schema)\n const { eastingValidationMessages, northingValidationMessages } =\n EastingNorthingField.buildErrorMessages(\n translatedLabel,\n eastingMin,\n eastingMax,\n northingMin,\n northingMax,\n translator.language\n )\n return {\n [`${this.name}__easting`]: eastingValidationMessages,\n [`${this.name}__northing`]: northingValidationMessages\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return EastingNorthingField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n {\n type: 'eastingFormat',\n template: createLowerFirstExpression(\n 'Easting for {{lowerFirst(#title)}} must be between 1 and 6 digits'\n )\n },\n {\n type: 'northingFormat',\n template: createLowerFirstExpression(\n 'Northing for {{lowerFirst(#title)}} must be between 1 and 7 digits'\n )\n }\n ],\n advancedSettingsErrors: [\n {\n type: 'eastingMin',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'eastingMax',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'northingMin',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n },\n {\n type: 'northingMax',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n }\n ]\n }\n }\n\n static isEastingNorthing(\n value?: FormStateValue | FormState\n ): value is EastingNorthingState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.easting) &&\n NumberField.isNumber(value.northing)\n )\n }\n\n static buildErrorMessages(\n label: string,\n eastingMin: number,\n eastingMax: number,\n northingMin: number,\n northingMax: number,\n language: string\n ) {\n const fieldLabel = lowerFirst(label)\n\n const eastingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.eastingDigits',\n language,\n { fieldLabel }\n )\n const northingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.northingDigits',\n language,\n { fieldLabel }\n )\n\n const eastingValidationMessages: LanguageMessages = {\n 'any.required': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n language\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n language\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n language,\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n language,\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.precision': eastingDigitsMessage,\n 'number.integer': eastingDigitsMessage,\n 'number.unsafe': eastingDigitsMessage\n }\n\n const northingValidationMessages: LanguageMessages = {\n 'any.required': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n language\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n language\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.northingRange',\n language,\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.northingRange',\n language,\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.precision': northingDigitsMessage,\n 'number.integer': northingDigitsMessage,\n 'number.unsafe': northingDigitsMessage\n }\n return {\n eastingValidationMessages,\n northingValidationMessages\n }\n }\n\n // Read schema values from def.schema with fallback defaults\n static getMinMax(\n schema:\n | {\n easting?: {\n min?: number\n max?: number\n }\n northing?: {\n min?: number\n max?: number\n }\n }\n | undefined\n ) {\n return {\n eastingMin: schema?.easting?.min ?? DEFAULT_EASTING_MIN,\n eastingMax: schema?.easting?.max ?? DEFAULT_EASTING_MAX,\n northingMin: schema?.northing?.min ?? DEFAULT_NORTHING_MIN,\n northingMax: schema?.northing?.max ?? DEFAULT_NORTHING_MAX\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -20,6 +20,11 @@ export declare class FileUploadField extends FormComponent {
|
|
|
20
20
|
schema: FileUploadFieldComponent['schema'];
|
|
21
21
|
formSchema: ArraySchema<FileState>;
|
|
22
22
|
stateSchema: ArraySchema<FileState>;
|
|
23
|
+
limits: {
|
|
24
|
+
min?: number;
|
|
25
|
+
max?: number;
|
|
26
|
+
length?: number;
|
|
27
|
+
};
|
|
23
28
|
constructor(def: FileUploadFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
|
|
24
29
|
getFormValueFromState(state: FormSubmissionState): UploadState | undefined;
|
|
25
30
|
getFormValue(value?: FormStateValue | FormState): UploadState | undefined;
|
|
@@ -94,7 +99,11 @@ export declare class FileUploadField extends FormComponent {
|
|
|
94
99
|
* Static version of getAllPossibleErrors that doesn't require a component instance.
|
|
95
100
|
*/
|
|
96
101
|
static getAllPossibleErrors(): ErrorMessageTemplateList;
|
|
97
|
-
static buildErrorMessages(language: string
|
|
102
|
+
static buildErrorMessages(language: string, limits?: {
|
|
103
|
+
min?: number;
|
|
104
|
+
max?: number;
|
|
105
|
+
length?: number;
|
|
106
|
+
}): {
|
|
98
107
|
'array.min': string;
|
|
99
108
|
'array.max': string;
|
|
100
109
|
'array.length': string;
|
|
@@ -62,19 +62,25 @@ export class FileUploadField extends FormComponent {
|
|
|
62
62
|
if (options.required === false) {
|
|
63
63
|
formSchema = formSchema.optional();
|
|
64
64
|
}
|
|
65
|
+
const limits = {};
|
|
65
66
|
if (typeof schema.length !== 'number') {
|
|
66
67
|
if (typeof schema.max === 'number') {
|
|
67
68
|
formSchema = formSchema.max(schema.max);
|
|
69
|
+
limits.max = schema.max;
|
|
68
70
|
}
|
|
69
71
|
if (typeof schema.min === 'number') {
|
|
70
72
|
formSchema = formSchema.min(schema.min);
|
|
73
|
+
limits.min = schema.min;
|
|
71
74
|
} else if (options.required !== false) {
|
|
72
75
|
formSchema = formSchema.min(1);
|
|
76
|
+
limits.min = 1;
|
|
73
77
|
}
|
|
74
78
|
} else {
|
|
75
79
|
formSchema = formSchema.length(schema.length);
|
|
80
|
+
limits.length = schema.length;
|
|
76
81
|
}
|
|
77
|
-
|
|
82
|
+
this.limits = limits;
|
|
83
|
+
formSchema = formSchema.messages(FileUploadField.buildErrorMessages(EN_GB, limits));
|
|
78
84
|
this.formSchema = formSchema.items(formItemSchema);
|
|
79
85
|
this.stateSchema = formSchema.items(formItemSchema).default(null).allow(null);
|
|
80
86
|
this.options = options;
|
|
@@ -225,7 +231,7 @@ export class FileUploadField extends FormComponent {
|
|
|
225
231
|
language
|
|
226
232
|
} = translator;
|
|
227
233
|
return {
|
|
228
|
-
[this.name]: FileUploadField.buildErrorMessages(language)
|
|
234
|
+
[this.name]: FileUploadField.buildErrorMessages(language, this.limits)
|
|
229
235
|
};
|
|
230
236
|
}
|
|
231
237
|
|
|
@@ -317,11 +323,17 @@ export class FileUploadField extends FormComponent {
|
|
|
317
323
|
}]
|
|
318
324
|
};
|
|
319
325
|
}
|
|
320
|
-
static buildErrorMessages(language) {
|
|
326
|
+
static buildErrorMessages(language, limits = {}) {
|
|
321
327
|
return {
|
|
322
|
-
'array.min': tPlugin('validation.filesMin', language
|
|
323
|
-
|
|
324
|
-
|
|
328
|
+
'array.min': tPlugin('validation.filesMin', language, {
|
|
329
|
+
count: limits.min ?? 1
|
|
330
|
+
}),
|
|
331
|
+
'array.max': tPlugin('validation.filesMax', language, {
|
|
332
|
+
count: limits.max ?? 1
|
|
333
|
+
}),
|
|
334
|
+
'array.length': tPlugin('validation.filesLength', language, {
|
|
335
|
+
count: limits.length ?? 1
|
|
336
|
+
})
|
|
325
337
|
};
|
|
326
338
|
}
|
|
327
339
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileUploadField.js","names":["Boom","joi","EN_GB","FormComponent","isUploadState","t","tPlugin","InvalidComponentStateError","messageTemplate","FileStatus","UploadStatus","render","resolveLanguage","uploadIdSchema","string","uuid","required","fileSchema","object","fileId","filename","contentLength","number","tempFileSchema","append","fileStatus","valid","complete","rejected","pending","errorMessage","optional","errorCode","errorParams","any","formFileSchema","metadataSchema","keys","retrievalKey","email","tempStatusSchema","uploadStatus","ready","metadata","form","file","array","items","single","numberOfRejectedFiles","formStatusSchema","itemSchema","uploadId","tempItemSchema","status","formItemSchema","FileUploadField","constructor","def","props","options","schema","formSchema","label","length","max","min","messages","buildErrorMessages","stateSchema","default","allow","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","getDisplayStringFromFormValue","files","translator","count","getDisplayStringFromState","getContextValueFromFormValue","map","getContextValueFromState","getViewModel","context","errors","isForceAccess","page","viewModel","attributes","id","filtered","filter","rows","item","index","tag","classes","text","valueHtml","view","params","trim","keyHtml","path","href","getHref","push","visuallyHiddenText","key","html","actions","accept","allowsMultiple","summaryList","multiple","upload","getValidationMessagesOverride","language","getAllPossibleErrors","onSubmit","request","model","createTranslator","notificationEmail","Error","app","services","formSubmissionService","values","initiatedRetrievalKey","persistFiles","error","isBoom","output","statusCode","baseErrors","type","template","selectRequired","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/FileUploadField.ts"],"sourcesContent":["import {\n type FileUploadFieldComponent,\n type FormMetadata\n} from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport joi, { type ArraySchema } from 'joi'\n\nimport { EN_GB } from '~/src/server/constants.js'\nimport {\n FormComponent,\n isUploadState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { t as tPlugin } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { InvalidComponentStateError } from '~/src/server/plugins/engine/pageControllers/errors.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n FileStatus,\n UploadStatus,\n type ErrorMessageTemplateList,\n type FileState,\n type FileUpload,\n type FileUploadMetadata,\n type FormContext,\n type FormState,\n type FormStateValue,\n type FormSubmissionState,\n type SummaryList,\n type SummaryListAction,\n type SummaryListRow,\n type UploadState,\n type UploadStatusFileResponse,\n type UploadStatusResponse\n} from '~/src/server/plugins/engine/types.js'\nimport { render } from '~/src/server/plugins/nunjucks/index.js'\nimport { type FormRequestPayload } from '~/src/server/routes/types.js'\nimport { resolveLanguage } from '~/src/server/utils/utils.js'\n\nexport const uploadIdSchema = joi.string().uuid().required()\n\nexport const fileSchema = joi\n .object<FileUpload>({\n fileId: joi.string().uuid().required(),\n filename: joi.string().required(),\n contentLength: joi.number().required()\n })\n .required()\n\nexport const tempFileSchema = fileSchema.append({\n fileStatus: joi\n .string()\n .valid(FileStatus.complete, FileStatus.rejected, FileStatus.pending)\n .required(),\n errorMessage: joi.string().optional(),\n errorCode: joi.string().optional(),\n errorParams: joi.any().optional()\n})\n\nexport const formFileSchema = fileSchema.append({\n fileStatus: joi.string().valid(FileStatus.complete).required()\n})\n\nexport const metadataSchema = joi\n .object<FileUploadMetadata>()\n .keys({\n retrievalKey: joi.string().email().required()\n })\n .required()\n\nexport const tempStatusSchema = joi\n .object<UploadStatusFileResponse>({\n uploadStatus: joi\n .string()\n .valid(UploadStatus.ready, UploadStatus.pending)\n .required(),\n metadata: metadataSchema,\n form: joi\n .object()\n .required()\n .keys({\n file: joi.array().items(tempFileSchema).single().required()\n }),\n numberOfRejectedFiles: joi.number().optional()\n })\n .required()\n\nexport const formStatusSchema = joi\n .object<UploadStatusResponse>({\n uploadStatus: joi.string().valid(UploadStatus.ready).required(),\n metadata: metadataSchema,\n form: joi.object().required().keys({\n file: formFileSchema\n }),\n numberOfRejectedFiles: joi.number().required()\n })\n .required()\n\nexport const itemSchema = joi.object<FileState>({\n uploadId: uploadIdSchema\n})\n\nexport const tempItemSchema = itemSchema.append({\n status: tempStatusSchema\n})\n\nexport const formItemSchema = itemSchema.append({\n status: formStatusSchema\n})\n\nexport class FileUploadField extends FormComponent {\n declare options: FileUploadFieldComponent['options']\n declare schema: FileUploadFieldComponent['schema']\n declare formSchema: ArraySchema<FileState>\n declare stateSchema: ArraySchema<FileState>\n\n constructor(\n def: FileUploadFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, schema } = def\n\n let formSchema = joi\n .array<FileState>()\n .label(this.label)\n .single()\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.optional()\n }\n\n if (typeof schema.length !== 'number') {\n if (typeof schema.max === 'number') {\n formSchema = formSchema.max(schema.max)\n }\n\n if (typeof schema.min === 'number') {\n formSchema = formSchema.min(schema.min)\n } else if (options.required !== false) {\n formSchema = formSchema.min(1)\n }\n } else {\n formSchema = formSchema.length(schema.length)\n }\n\n formSchema = formSchema.messages(FileUploadField.buildErrorMessages(EN_GB))\n\n this.formSchema = formSchema.items(formItemSchema)\n this.stateSchema = formSchema\n .items(formItemSchema)\n .default(null)\n .allow(null)\n\n this.options = options\n this.schema = schema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return this.getFormValue(state[name])\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n files: FileState[] | undefined,\n translator: Translator\n ): string {\n if (!files?.length) {\n return ''\n }\n\n return translator.t('pages.summary.fileUpload', {\n count: files.length\n })\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const files = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(files, translator)\n }\n\n getContextValueFromFormValue(\n files: UploadState | undefined\n ): string[] | null {\n return files?.map(({ status }) => status.form.file.fileId) ?? null\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const files = this.getFormValueFromState(state)\n return this.getContextValueFromFormValue(files)\n }\n\n getViewModel(context: RenderContext) {\n const { errors, isForceAccess = false } = context\n const { t } = context.translator\n const { options, page, schema } = this\n\n const viewModel = super.getViewModel(context)\n const { attributes, id, value } = viewModel\n\n const files = this.getFormValue(value) ?? []\n const filtered = files.filter(\n (file) => file.status.form.file.fileStatus === FileStatus.complete\n )\n const count = filtered.length\n\n const rows: SummaryListRow[] = filtered.map((item, index) => {\n const { status } = item\n const { form } = status\n const { file } = form\n\n const tag = {\n classes: 'govuk-tag--green',\n text: t('components.fileUploadField.uploaded')\n }\n\n const valueHtml = render\n .view('components/fileuploadfield-value.html', {\n context: { params: { tag } }\n })\n .trim()\n\n const keyHtml = render\n .view('components/fileuploadfield-key.html', {\n context: {\n params: {\n name: file.filename,\n errorMessage: errors && file.errorMessage\n }\n }\n })\n .trim()\n\n const items: SummaryListAction[] = []\n\n // Remove summary list actions from previews\n if (!isForceAccess) {\n const path = `/${file.fileId}/confirm-delete`\n const href = page?.getHref(`${page.path}${path}`) ?? '#'\n\n items.push({\n href,\n text: t('pages.fileUpload.remove'),\n classes: 'govuk-link--no-visited-state',\n attributes: { id: `${id}__${index}` },\n visuallyHiddenText: file.filename\n })\n }\n\n return {\n key: {\n html: keyHtml\n },\n value: {\n html: valueHtml\n },\n actions: {\n items\n }\n } satisfies SummaryListRow\n })\n\n // Set up the `accept` attribute\n if ('accept' in options && options.accept) {\n attributes.accept = options.accept\n }\n\n // Allow multiple file selection when schema permits more than 1 file\n const allowsMultiple = schema.max !== 1 && schema.length !== 1\n\n const summaryList: SummaryList = {\n classes: 'govuk-summary-list--long-key',\n rows\n }\n\n return {\n ...viewModel,\n\n // File input can't have a initial value\n value: '',\n\n // Override the component name we send to CDP\n name: 'file',\n\n // Enable multi-file selection in the file picker\n ...(allowsMultiple && { multiple: true }),\n\n upload: {\n count,\n summaryList\n }\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is UploadState {\n return isUploadState(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { language } = translator\n return {\n [this.name]: FileUploadField.buildErrorMessages(language)\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return FileUploadField.getAllPossibleErrors()\n }\n\n async onSubmit(\n request: FormRequestPayload,\n metadata: FormMetadata,\n context: FormContext\n ) {\n const language = resolveLanguage(request)\n const { t } = this.model.createTranslator(language)\n\n const notificationEmail = metadata.notificationEmail\n\n if (!notificationEmail) {\n // this should not happen because notificationEmail is checked further up\n // the chain in SummaryPageController before submitForm is called.\n throw new Error('Unexpected missing notificationEmail in metadata')\n }\n\n if (!request.app.model?.services.formSubmissionService) {\n throw new Error('No form submission service available in app model')\n }\n\n const { formSubmissionService } = request.app.model.services\n const values = this.getFormValueFromState(context.state) ?? []\n\n const files = values.map((value) => ({\n fileId: value.status.form.file.fileId,\n initiatedRetrievalKey: value.status.metadata.retrievalKey\n }))\n\n if (!files.length) {\n return\n }\n\n try {\n await formSubmissionService.persistFiles(files, notificationEmail)\n } catch (error) {\n if (\n Boom.isBoom(error) &&\n (error.output.statusCode === 403 || // Forbidden - retrieval key invalid\n error.output.statusCode === 404 || // Not Found - file not found\n error.output.statusCode === 410) // Gone - file expired (took to long to submit, etc)\n ) {\n // Failed to persist files. We can't recover from this, the only real way we can recover the submissions is\n // by resetting the problematic components and letting the user re-try.\n // Scenarios: file missing from S3, invalid retrieval key (timing problem), etc.\n throw new InvalidComponentStateError(\n this,\n t('components.fileUploadField.uploadFailed')\n )\n }\n\n throw error\n }\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'selectRequired', template: messageTemplate.selectRequired },\n {\n type: 'filesMimes',\n template: 'The selected file must be a {{#limit}}'\n },\n {\n type: 'filesSize',\n template: 'The selected file must be smaller than 100MB'\n },\n { type: 'filesEmpty', template: 'The selected file is empty' },\n { type: 'filesVirus', template: 'The selected file contains a virus' },\n {\n type: 'filesPartial',\n template: 'The selected file has not fully uploaded'\n },\n {\n type: 'filesError',\n template: 'The selected file could not be uploaded – try again'\n }\n ],\n advancedSettingsErrors: [\n {\n type: 'filesMin',\n template: 'You must upload {{#limit}} files or more'\n },\n {\n type: 'filesMax',\n template: 'You can only upload {{#limit}} files or less'\n },\n {\n type: 'filesExact',\n template: 'You must upload exactly {{#limit}} files'\n }\n ]\n }\n }\n\n static buildErrorMessages(language: string) {\n return {\n 'array.min': tPlugin('validation.filesMin', language),\n 'array.max': tPlugin('validation.filesMax', language),\n 'array.length': tPlugin('validation.filesLength', language)\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FileUploadField.js","names":["Boom","joi","EN_GB","FormComponent","isUploadState","t","tPlugin","InvalidComponentStateError","messageTemplate","FileStatus","UploadStatus","render","resolveLanguage","uploadIdSchema","string","uuid","required","fileSchema","object","fileId","filename","contentLength","number","tempFileSchema","append","fileStatus","valid","complete","rejected","pending","errorMessage","optional","errorCode","errorParams","any","formFileSchema","metadataSchema","keys","retrievalKey","email","tempStatusSchema","uploadStatus","ready","metadata","form","file","array","items","single","numberOfRejectedFiles","formStatusSchema","itemSchema","uploadId","tempItemSchema","status","formItemSchema","FileUploadField","constructor","def","props","options","schema","formSchema","label","limits","length","max","min","messages","buildErrorMessages","stateSchema","default","allow","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","getDisplayStringFromFormValue","files","translator","count","getDisplayStringFromState","getContextValueFromFormValue","map","getContextValueFromState","getViewModel","context","errors","isForceAccess","page","viewModel","attributes","id","filtered","filter","rows","item","index","tag","classes","text","valueHtml","view","params","trim","keyHtml","path","href","getHref","push","visuallyHiddenText","key","html","actions","accept","allowsMultiple","summaryList","multiple","upload","getValidationMessagesOverride","language","getAllPossibleErrors","onSubmit","request","model","createTranslator","notificationEmail","Error","app","services","formSubmissionService","values","initiatedRetrievalKey","persistFiles","error","isBoom","output","statusCode","baseErrors","type","template","selectRequired","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/FileUploadField.ts"],"sourcesContent":["import {\n type FileUploadFieldComponent,\n type FormMetadata\n} from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport joi, { type ArraySchema } from 'joi'\n\nimport { EN_GB } from '~/src/server/constants.js'\nimport {\n FormComponent,\n isUploadState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { t as tPlugin } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { InvalidComponentStateError } from '~/src/server/plugins/engine/pageControllers/errors.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n FileStatus,\n UploadStatus,\n type ErrorMessageTemplateList,\n type FileState,\n type FileUpload,\n type FileUploadMetadata,\n type FormContext,\n type FormState,\n type FormStateValue,\n type FormSubmissionState,\n type SummaryList,\n type SummaryListAction,\n type SummaryListRow,\n type UploadState,\n type UploadStatusFileResponse,\n type UploadStatusResponse\n} from '~/src/server/plugins/engine/types.js'\nimport { render } from '~/src/server/plugins/nunjucks/index.js'\nimport { type FormRequestPayload } from '~/src/server/routes/types.js'\nimport { resolveLanguage } from '~/src/server/utils/utils.js'\n\nexport const uploadIdSchema = joi.string().uuid().required()\n\nexport const fileSchema = joi\n .object<FileUpload>({\n fileId: joi.string().uuid().required(),\n filename: joi.string().required(),\n contentLength: joi.number().required()\n })\n .required()\n\nexport const tempFileSchema = fileSchema.append({\n fileStatus: joi\n .string()\n .valid(FileStatus.complete, FileStatus.rejected, FileStatus.pending)\n .required(),\n errorMessage: joi.string().optional(),\n errorCode: joi.string().optional(),\n errorParams: joi.any().optional()\n})\n\nexport const formFileSchema = fileSchema.append({\n fileStatus: joi.string().valid(FileStatus.complete).required()\n})\n\nexport const metadataSchema = joi\n .object<FileUploadMetadata>()\n .keys({\n retrievalKey: joi.string().email().required()\n })\n .required()\n\nexport const tempStatusSchema = joi\n .object<UploadStatusFileResponse>({\n uploadStatus: joi\n .string()\n .valid(UploadStatus.ready, UploadStatus.pending)\n .required(),\n metadata: metadataSchema,\n form: joi\n .object()\n .required()\n .keys({\n file: joi.array().items(tempFileSchema).single().required()\n }),\n numberOfRejectedFiles: joi.number().optional()\n })\n .required()\n\nexport const formStatusSchema = joi\n .object<UploadStatusResponse>({\n uploadStatus: joi.string().valid(UploadStatus.ready).required(),\n metadata: metadataSchema,\n form: joi.object().required().keys({\n file: formFileSchema\n }),\n numberOfRejectedFiles: joi.number().required()\n })\n .required()\n\nexport const itemSchema = joi.object<FileState>({\n uploadId: uploadIdSchema\n})\n\nexport const tempItemSchema = itemSchema.append({\n status: tempStatusSchema\n})\n\nexport const formItemSchema = itemSchema.append({\n status: formStatusSchema\n})\n\nexport class FileUploadField extends FormComponent {\n declare options: FileUploadFieldComponent['options']\n declare schema: FileUploadFieldComponent['schema']\n declare formSchema: ArraySchema<FileState>\n declare stateSchema: ArraySchema<FileState>\n declare limits: { min?: number; max?: number; length?: number }\n\n constructor(\n def: FileUploadFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, schema } = def\n\n let formSchema = joi\n .array<FileState>()\n .label(this.label)\n .single()\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.optional()\n }\n\n const limits: { min?: number; max?: number; length?: number } = {}\n\n if (typeof schema.length !== 'number') {\n if (typeof schema.max === 'number') {\n formSchema = formSchema.max(schema.max)\n limits.max = schema.max\n }\n\n if (typeof schema.min === 'number') {\n formSchema = formSchema.min(schema.min)\n limits.min = schema.min\n } else if (options.required !== false) {\n formSchema = formSchema.min(1)\n limits.min = 1\n }\n } else {\n formSchema = formSchema.length(schema.length)\n limits.length = schema.length\n }\n\n this.limits = limits\n\n formSchema = formSchema.messages(\n FileUploadField.buildErrorMessages(EN_GB, limits)\n )\n\n this.formSchema = formSchema.items(formItemSchema)\n this.stateSchema = formSchema\n .items(formItemSchema)\n .default(null)\n .allow(null)\n\n this.options = options\n this.schema = schema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return this.getFormValue(state[name])\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n files: FileState[] | undefined,\n translator: Translator\n ): string {\n if (!files?.length) {\n return ''\n }\n\n return translator.t('pages.summary.fileUpload', {\n count: files.length\n })\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const files = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(files, translator)\n }\n\n getContextValueFromFormValue(\n files: UploadState | undefined\n ): string[] | null {\n return files?.map(({ status }) => status.form.file.fileId) ?? null\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const files = this.getFormValueFromState(state)\n return this.getContextValueFromFormValue(files)\n }\n\n getViewModel(context: RenderContext) {\n const { errors, isForceAccess = false } = context\n const { t } = context.translator\n const { options, page, schema } = this\n\n const viewModel = super.getViewModel(context)\n const { attributes, id, value } = viewModel\n\n const files = this.getFormValue(value) ?? []\n const filtered = files.filter(\n (file) => file.status.form.file.fileStatus === FileStatus.complete\n )\n const count = filtered.length\n\n const rows: SummaryListRow[] = filtered.map((item, index) => {\n const { status } = item\n const { form } = status\n const { file } = form\n\n const tag = {\n classes: 'govuk-tag--green',\n text: t('components.fileUploadField.uploaded')\n }\n\n const valueHtml = render\n .view('components/fileuploadfield-value.html', {\n context: { params: { tag } }\n })\n .trim()\n\n const keyHtml = render\n .view('components/fileuploadfield-key.html', {\n context: {\n params: {\n name: file.filename,\n errorMessage: errors && file.errorMessage\n }\n }\n })\n .trim()\n\n const items: SummaryListAction[] = []\n\n // Remove summary list actions from previews\n if (!isForceAccess) {\n const path = `/${file.fileId}/confirm-delete`\n const href = page?.getHref(`${page.path}${path}`) ?? '#'\n\n items.push({\n href,\n text: t('pages.fileUpload.remove'),\n classes: 'govuk-link--no-visited-state',\n attributes: { id: `${id}__${index}` },\n visuallyHiddenText: file.filename\n })\n }\n\n return {\n key: {\n html: keyHtml\n },\n value: {\n html: valueHtml\n },\n actions: {\n items\n }\n } satisfies SummaryListRow\n })\n\n // Set up the `accept` attribute\n if ('accept' in options && options.accept) {\n attributes.accept = options.accept\n }\n\n // Allow multiple file selection when schema permits more than 1 file\n const allowsMultiple = schema.max !== 1 && schema.length !== 1\n\n const summaryList: SummaryList = {\n classes: 'govuk-summary-list--long-key',\n rows\n }\n\n return {\n ...viewModel,\n\n // File input can't have a initial value\n value: '',\n\n // Override the component name we send to CDP\n name: 'file',\n\n // Enable multi-file selection in the file picker\n ...(allowsMultiple && { multiple: true }),\n\n upload: {\n count,\n summaryList\n }\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is UploadState {\n return isUploadState(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { language } = translator\n return {\n [this.name]: FileUploadField.buildErrorMessages(language, this.limits)\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return FileUploadField.getAllPossibleErrors()\n }\n\n async onSubmit(\n request: FormRequestPayload,\n metadata: FormMetadata,\n context: FormContext\n ) {\n const language = resolveLanguage(request)\n const { t } = this.model.createTranslator(language)\n\n const notificationEmail = metadata.notificationEmail\n\n if (!notificationEmail) {\n // this should not happen because notificationEmail is checked further up\n // the chain in SummaryPageController before submitForm is called.\n throw new Error('Unexpected missing notificationEmail in metadata')\n }\n\n if (!request.app.model?.services.formSubmissionService) {\n throw new Error('No form submission service available in app model')\n }\n\n const { formSubmissionService } = request.app.model.services\n const values = this.getFormValueFromState(context.state) ?? []\n\n const files = values.map((value) => ({\n fileId: value.status.form.file.fileId,\n initiatedRetrievalKey: value.status.metadata.retrievalKey\n }))\n\n if (!files.length) {\n return\n }\n\n try {\n await formSubmissionService.persistFiles(files, notificationEmail)\n } catch (error) {\n if (\n Boom.isBoom(error) &&\n (error.output.statusCode === 403 || // Forbidden - retrieval key invalid\n error.output.statusCode === 404 || // Not Found - file not found\n error.output.statusCode === 410) // Gone - file expired (took to long to submit, etc)\n ) {\n // Failed to persist files. We can't recover from this, the only real way we can recover the submissions is\n // by resetting the problematic components and letting the user re-try.\n // Scenarios: file missing from S3, invalid retrieval key (timing problem), etc.\n throw new InvalidComponentStateError(\n this,\n t('components.fileUploadField.uploadFailed')\n )\n }\n\n throw error\n }\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'selectRequired', template: messageTemplate.selectRequired },\n {\n type: 'filesMimes',\n template: 'The selected file must be a {{#limit}}'\n },\n {\n type: 'filesSize',\n template: 'The selected file must be smaller than 100MB'\n },\n { type: 'filesEmpty', template: 'The selected file is empty' },\n { type: 'filesVirus', template: 'The selected file contains a virus' },\n {\n type: 'filesPartial',\n template: 'The selected file has not fully uploaded'\n },\n {\n type: 'filesError',\n template: 'The selected file could not be uploaded – try again'\n }\n ],\n advancedSettingsErrors: [\n {\n type: 'filesMin',\n template: 'You must upload {{#limit}} files or more'\n },\n {\n type: 'filesMax',\n template: 'You can only upload {{#limit}} files or less'\n },\n {\n type: 'filesExact',\n template: 'You must upload exactly {{#limit}} files'\n }\n ]\n }\n }\n\n static buildErrorMessages(\n language: string,\n limits: { min?: number; max?: number; length?: number } = {}\n ) {\n return {\n 'array.min': tPlugin('validation.filesMin', language, {\n count: limits.min ?? 1\n }),\n 'array.max': tPlugin('validation.filesMax', language, {\n count: limits.max ?? 1\n }),\n 'array.length': tPlugin('validation.filesLength', language, {\n count: limits.length ?? 1\n })\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,6 +9,11 @@ export declare class GeospatialField extends FormComponent {
|
|
|
9
9
|
options: GeospatialFieldComponent['options'];
|
|
10
10
|
formSchema: ArraySchema<GeospatialState>;
|
|
11
11
|
stateSchema: ArraySchema<GeospatialState>;
|
|
12
|
+
limits: {
|
|
13
|
+
min?: number;
|
|
14
|
+
max?: number;
|
|
15
|
+
length?: number;
|
|
16
|
+
};
|
|
12
17
|
constructor(def: GeospatialFieldComponent, props: ConstructorParameters<typeof ComponentBase>[1]);
|
|
13
18
|
getFormValueFromState(state: FormSubmissionState): import("../../../../server/plugins/engine/types.js").FeatureCollection | undefined;
|
|
14
19
|
getFormValue(value?: FormStateValue | FormState): import("../../../../server/plugins/engine/types.js").FeatureCollection | undefined;
|
|
@@ -72,6 +77,13 @@ export declare class GeospatialField extends FormComponent {
|
|
|
72
77
|
getErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
73
78
|
getViewErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
74
79
|
isValue(value?: FormStateValue | FormState): value is GeospatialState;
|
|
80
|
+
getValidationMessagesOverride(translator: Translator): {
|
|
81
|
+
[x: string]: {
|
|
82
|
+
'array.min': string;
|
|
83
|
+
'array.max': string;
|
|
84
|
+
'array.length': string;
|
|
85
|
+
};
|
|
86
|
+
};
|
|
75
87
|
/**
|
|
76
88
|
* For error preview page that shows all possible errors on a component
|
|
77
89
|
*/
|
|
@@ -80,4 +92,13 @@ export declare class GeospatialField extends FormComponent {
|
|
|
80
92
|
* Static version of getAllPossibleErrors that doesn't require a component instance.
|
|
81
93
|
*/
|
|
82
94
|
static getAllPossibleErrors(): ErrorMessageTemplateList;
|
|
95
|
+
static buildErrorMessages(language: string, limits?: {
|
|
96
|
+
min?: number;
|
|
97
|
+
max?: number;
|
|
98
|
+
length?: number;
|
|
99
|
+
}): {
|
|
100
|
+
'array.min': string;
|
|
101
|
+
'array.max': string;
|
|
102
|
+
'array.length': string;
|
|
103
|
+
};
|
|
83
104
|
}
|