@defra/forms-engine-plugin 0.0.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/.browserslistrc +16 -0
- package/.editorconfig +9 -0
- package/.eslintrc.cjs +266 -0
- package/.github/dependabot.yml +85 -0
- package/.github/workflows/check-pull-request.yml +209 -0
- package/.github/workflows/pr-notifier.yml +98 -0
- package/.github/workflows/publish.yml +111 -0
- package/.husky/pre-commit +1 -0
- package/.lintstagedrc.js +4 -0
- package/.nvmrc +1 -0
- package/.prettierignore +8 -0
- package/.prettierrc.cjs +26 -0
- package/.server/client/javascripts/application.js +68 -0
- package/.server/client/javascripts/application.js.map +1 -0
- package/.server/client/javascripts/file-upload.js +292 -0
- package/.server/client/javascripts/file-upload.js.map +1 -0
- package/.server/client/stylesheets/_code.scss +33 -0
- package/.server/client/stylesheets/_govuk-frontend.scss +4 -0
- package/.server/client/stylesheets/_prose.scss +56 -0
- package/.server/client/stylesheets/_service-banner.scss +24 -0
- package/.server/client/stylesheets/_summary-list.scss +28 -0
- package/.server/client/stylesheets/_tag-env.scss +24 -0
- package/.server/client/stylesheets/application.scss +14 -0
- package/.server/common/cookies.js +55 -0
- package/.server/common/cookies.js.map +1 -0
- package/.server/common/cookies.test.js +15 -0
- package/.server/common/cookies.test.js.map +1 -0
- package/.server/common/types.js +6 -0
- package/.server/common/types.js.map +1 -0
- package/.server/config/index.js +241 -0
- package/.server/config/index.js.map +1 -0
- package/.server/index.js +25 -0
- package/.server/index.js.map +1 -0
- package/.server/server/common/helpers/logging/logger-options.js +44 -0
- package/.server/server/common/helpers/logging/logger-options.js.map +1 -0
- package/.server/server/common/helpers/logging/logger.js +6 -0
- package/.server/server/common/helpers/logging/logger.js.map +1 -0
- package/.server/server/common/helpers/logging/request-logger.js +7 -0
- package/.server/server/common/helpers/logging/request-logger.js.map +1 -0
- package/.server/server/common/helpers/logging/request-tracing.js +12 -0
- package/.server/server/common/helpers/logging/request-tracing.js.map +1 -0
- package/.server/server/common/helpers/redis-client.js +55 -0
- package/.server/server/common/helpers/redis-client.js.map +1 -0
- package/.server/server/constants.js +2 -0
- package/.server/server/constants.js.map +1 -0
- package/.server/server/forms/README.md +10 -0
- package/.server/server/forms/components.json +1015 -0
- package/.server/server/forms/report-a-terrorist.json +270 -0
- package/.server/server/forms/runner-components-test.json +365 -0
- package/.server/server/forms/test.json +581 -0
- package/.server/server/index.js +116 -0
- package/.server/server/index.js.map +1 -0
- package/.server/server/plugins/blankie.js +29 -0
- package/.server/server/plugins/blankie.js.map +1 -0
- package/.server/server/plugins/crumb.js +15 -0
- package/.server/server/plugins/crumb.js.map +1 -0
- package/.server/server/plugins/engine/README.md +87 -0
- package/.server/server/plugins/engine/components/AutocompleteField.js +37 -0
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -0
- package/.server/server/plugins/engine/components/CheckboxesField.js +79 -0
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -0
- package/.server/server/plugins/engine/components/ComponentBase.js +55 -0
- package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -0
- package/.server/server/plugins/engine/components/ComponentCollection.js +198 -0
- package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -0
- package/.server/server/plugins/engine/components/DatePartsField.js +208 -0
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -0
- package/.server/server/plugins/engine/components/Details.js +26 -0
- package/.server/server/plugins/engine/components/Details.js.map +1 -0
- package/.server/server/plugins/engine/components/EmailAddressField.js +40 -0
- package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -0
- package/.server/server/plugins/engine/components/FileUploadField.js +195 -0
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -0
- package/.server/server/plugins/engine/components/FormComponent.js +210 -0
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -0
- package/.server/server/plugins/engine/components/Html.js +24 -0
- package/.server/server/plugins/engine/components/Html.js.map +1 -0
- package/.server/server/plugins/engine/components/InsetText.js +22 -0
- package/.server/server/plugins/engine/components/InsetText.js.map +1 -0
- package/.server/server/plugins/engine/components/List.js +65 -0
- package/.server/server/plugins/engine/components/List.js.map +1 -0
- package/.server/server/plugins/engine/components/ListFormComponent.js +87 -0
- package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -0
- package/.server/server/plugins/engine/components/MonthYearField.js +172 -0
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -0
- package/.server/server/plugins/engine/components/MultilineTextField.js +115 -0
- package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -0
- package/.server/server/plugins/engine/components/NumberField.js +137 -0
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -0
- package/.server/server/plugins/engine/components/RadiosField.js +18 -0
- package/.server/server/plugins/engine/components/RadiosField.js.map +1 -0
- package/.server/server/plugins/engine/components/SelectField.js +33 -0
- package/.server/server/plugins/engine/components/SelectField.js.map +1 -0
- package/.server/server/plugins/engine/components/SelectionControlField.js +43 -0
- package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -0
- package/.server/server/plugins/engine/components/TelephoneNumberField.js +43 -0
- package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -0
- package/.server/server/plugins/engine/components/TextField.js +63 -0
- package/.server/server/plugins/engine/components/TextField.js.map +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.js +130 -0
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -0
- package/.server/server/plugins/engine/components/YesNoField.js +28 -0
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -0
- package/.server/server/plugins/engine/components/constants.js +2 -0
- package/.server/server/plugins/engine/components/constants.js.map +1 -0
- package/.server/server/plugins/engine/components/helpers.js +219 -0
- package/.server/server/plugins/engine/components/helpers.js.map +1 -0
- package/.server/server/plugins/engine/components/index.js +25 -0
- package/.server/server/plugins/engine/components/index.js.map +1 -0
- package/.server/server/plugins/engine/components/types.js +2 -0
- package/.server/server/plugins/engine/components/types.js.map +1 -0
- package/.server/server/plugins/engine/configureEnginePlugin.js +44 -0
- package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -0
- package/.server/server/plugins/engine/helpers.js +268 -0
- package/.server/server/plugins/engine/helpers.js.map +1 -0
- package/.server/server/plugins/engine/index.js +6 -0
- package/.server/server/plugins/engine/index.js.map +1 -0
- package/.server/server/plugins/engine/models/FormModel.js +363 -0
- package/.server/server/plugins/engine/models/FormModel.js.map +1 -0
- package/.server/server/plugins/engine/models/RepeatingSummaryViewModel.js +2 -0
- package/.server/server/plugins/engine/models/RepeatingSummaryViewModel.js.map +1 -0
- package/.server/server/plugins/engine/models/Section.js +2 -0
- package/.server/server/plugins/engine/models/Section.js.map +1 -0
- package/.server/server/plugins/engine/models/SummaryViewModel.js +183 -0
- package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -0
- package/.server/server/plugins/engine/models/index.js +3 -0
- package/.server/server/plugins/engine/models/index.js.map +1 -0
- package/.server/server/plugins/engine/models/types.js +2 -0
- package/.server/server/plugins/engine/models/types.js.map +1 -0
- package/.server/server/plugins/engine/outputFormatters/human/v1.js +44 -0
- package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -0
- package/.server/server/plugins/engine/outputFormatters/index.js +24 -0
- package/.server/server/plugins/engine/outputFormatters/index.js.map +1 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v1.js +104 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v1.js.map +1 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js +110 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +401 -0
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/PageController.js +133 -0
- package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +482 -0
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/README.md +28 -0
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +372 -0
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/StartPageController.js +16 -0
- package/.server/server/plugins/engine/pageControllers/StartPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/StatusPageController.js +43 -0
- package/.server/server/plugins/engine/pageControllers/StatusPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +195 -0
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/TerminalPageController.js +8 -0
- package/.server/server/plugins/engine/pageControllers/TerminalPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/helpers.js +69 -0
- package/.server/server/plugins/engine/pageControllers/helpers.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/index.js +10 -0
- package/.server/server/plugins/engine/pageControllers/index.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +78 -0
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -0
- package/.server/server/plugins/engine/plugin.js +562 -0
- package/.server/server/plugins/engine/plugin.js.map +1 -0
- package/.server/server/plugins/engine/services/formSubmissionService.js +39 -0
- package/.server/server/plugins/engine/services/formSubmissionService.js.map +1 -0
- package/.server/server/plugins/engine/services/formsService.js +41 -0
- package/.server/server/plugins/engine/services/formsService.js.map +1 -0
- package/.server/server/plugins/engine/services/formsService.test.js +71 -0
- package/.server/server/plugins/engine/services/formsService.test.js.map +1 -0
- package/.server/server/plugins/engine/services/index.js +4 -0
- package/.server/server/plugins/engine/services/index.js.map +1 -0
- package/.server/server/plugins/engine/services/notifyService.js +45 -0
- package/.server/server/plugins/engine/services/notifyService.js.map +1 -0
- package/.server/server/plugins/engine/services/uploadService.js +51 -0
- package/.server/server/plugins/engine/services/uploadService.js.map +1 -0
- package/.server/server/plugins/engine/types.js +53 -0
- package/.server/server/plugins/engine/types.js.map +1 -0
- package/.server/server/plugins/engine/views/components/autocompletefield.html +5 -0
- package/.server/server/plugins/engine/views/components/checkboxesfield.html +5 -0
- package/.server/server/plugins/engine/views/components/datepartsfield.html +5 -0
- package/.server/server/plugins/engine/views/components/details.html +6 -0
- package/.server/server/plugins/engine/views/components/emailaddressfield.html +5 -0
- package/.server/server/plugins/engine/views/components/fileuploadfield-key.html +8 -0
- package/.server/server/plugins/engine/views/components/fileuploadfield-value.html +3 -0
- package/.server/server/plugins/engine/views/components/fileuploadfield.html +24 -0
- package/.server/server/plugins/engine/views/components/html.html +3 -0
- package/.server/server/plugins/engine/views/components/insettext.html +7 -0
- package/.server/server/plugins/engine/views/components/list.html +36 -0
- package/.server/server/plugins/engine/views/components/monthyearfield.html +5 -0
- package/.server/server/plugins/engine/views/components/multilinetextfield.html +10 -0
- package/.server/server/plugins/engine/views/components/numberfield.html +5 -0
- package/.server/server/plugins/engine/views/components/radiosfield.html +5 -0
- package/.server/server/plugins/engine/views/components/selectfield.html +5 -0
- package/.server/server/plugins/engine/views/components/telephonenumberfield.html +5 -0
- package/.server/server/plugins/engine/views/components/textfield.html +5 -0
- package/.server/server/plugins/engine/views/components/ukaddressfield.html +25 -0
- package/.server/server/plugins/engine/views/components/yesnofield.html +5 -0
- package/.server/server/plugins/engine/views/file-upload.html +45 -0
- package/.server/server/plugins/engine/views/index.html +39 -0
- package/.server/server/plugins/engine/views/item-delete.html +56 -0
- package/.server/server/plugins/engine/views/partials/components.html +6 -0
- package/.server/server/plugins/engine/views/partials/conditional-components.html +3 -0
- package/.server/server/plugins/engine/views/partials/debug.html +44 -0
- package/.server/server/plugins/engine/views/partials/form.html +15 -0
- package/.server/server/plugins/engine/views/partials/heading.html +16 -0
- package/.server/server/plugins/engine/views/partials/preview-banner.html +32 -0
- package/.server/server/plugins/engine/views/partials/preview-banner.test.js +108 -0
- package/.server/server/plugins/engine/views/partials/preview-banner.test.js.map +1 -0
- package/.server/server/plugins/engine/views/partials/warn-missing-notification-email.html +10 -0
- package/.server/server/plugins/engine/views/repeat-list-summary.html +53 -0
- package/.server/server/plugins/errorPages.js +49 -0
- package/.server/server/plugins/errorPages.js.map +1 -0
- package/.server/server/plugins/nunjucks/context.js +79 -0
- package/.server/server/plugins/nunjucks/context.js.map +1 -0
- package/.server/server/plugins/nunjucks/context.test.js +134 -0
- package/.server/server/plugins/nunjucks/context.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/enviroment.test.js +166 -0
- package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/environment.js +95 -0
- package/.server/server/plugins/nunjucks/environment.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/answer.js +26 -0
- package/.server/server/plugins/nunjucks/filters/answer.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/answer.test.js +70 -0
- package/.server/server/plugins/nunjucks/filters/answer.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/evaluate.js +22 -0
- package/.server/server/plugins/nunjucks/filters/evaluate.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/field.js +26 -0
- package/.server/server/plugins/nunjucks/filters/field.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/field.test.js +64 -0
- package/.server/server/plugins/nunjucks/filters/field.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/highlight.js +14 -0
- package/.server/server/plugins/nunjucks/filters/highlight.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/href.js +28 -0
- package/.server/server/plugins/nunjucks/filters/href.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/href.test.js +63 -0
- package/.server/server/plugins/nunjucks/filters/href.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js +9 -0
- package/.server/server/plugins/nunjucks/filters/index.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/inspect.js +16 -0
- package/.server/server/plugins/nunjucks/filters/inspect.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/page.js +23 -0
- package/.server/server/plugins/nunjucks/filters/page.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/page.test.js +51 -0
- package/.server/server/plugins/nunjucks/filters/page.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/index.js +4 -0
- package/.server/server/plugins/nunjucks/index.js.map +1 -0
- package/.server/server/plugins/nunjucks/plugin.js +38 -0
- package/.server/server/plugins/nunjucks/plugin.js.map +1 -0
- package/.server/server/plugins/nunjucks/render.js +41 -0
- package/.server/server/plugins/nunjucks/render.js.map +1 -0
- package/.server/server/plugins/nunjucks/types.js +41 -0
- package/.server/server/plugins/nunjucks/types.js.map +1 -0
- package/.server/server/plugins/pulse.js +8 -0
- package/.server/server/plugins/pulse.js.map +1 -0
- package/.server/server/plugins/router.js +169 -0
- package/.server/server/plugins/router.js.map +1 -0
- package/.server/server/plugins/session.js +28 -0
- package/.server/server/plugins/session.js.map +1 -0
- package/.server/server/routes/health.js +15 -0
- package/.server/server/routes/health.js.map +1 -0
- package/.server/server/routes/health.test.js +32 -0
- package/.server/server/routes/health.test.js.map +1 -0
- package/.server/server/routes/index.js +3 -0
- package/.server/server/routes/index.js.map +1 -0
- package/.server/server/routes/public.js +37 -0
- package/.server/server/routes/public.js.map +1 -0
- package/.server/server/routes/types.js +14 -0
- package/.server/server/routes/types.js.map +1 -0
- package/.server/server/schemas/index.js +15 -0
- package/.server/server/schemas/index.js.map +1 -0
- package/.server/server/secure-context.js +36 -0
- package/.server/server/secure-context.js.map +1 -0
- package/.server/server/services/cacheService.js +85 -0
- package/.server/server/services/cacheService.js.map +1 -0
- package/.server/server/services/httpService.js +44 -0
- package/.server/server/services/httpService.js.map +1 -0
- package/.server/server/services/httpService.test.js +504 -0
- package/.server/server/services/httpService.test.js.map +1 -0
- package/.server/server/services/index.js +2 -0
- package/.server/server/services/index.js.map +1 -0
- package/.server/server/types.js +2 -0
- package/.server/server/types.js.map +1 -0
- package/.server/server/utils/notify.js +40 -0
- package/.server/server/utils/notify.js.map +1 -0
- package/.server/server/utils/secure-context/get-trust-store-certs.js +7 -0
- package/.server/server/utils/secure-context/get-trust-store-certs.js.map +1 -0
- package/.server/server/utils/secure-context/get-trust-store-certs.test.js +14 -0
- package/.server/server/utils/secure-context/get-trust-store-certs.test.js.map +1 -0
- package/.server/server/utils/utils.js +20 -0
- package/.server/server/utils/utils.js.map +1 -0
- package/.server/server/utils/utils.test.js +49 -0
- package/.server/server/utils/utils.test.js.map +1 -0
- package/.server/server/views/404.html +16 -0
- package/.server/server/views/500.html +19 -0
- package/.server/server/views/components/debug/macro.njk +3 -0
- package/.server/server/views/components/debug/template.njk +13 -0
- package/.server/server/views/components/service-banner/macro.njk +3 -0
- package/.server/server/views/components/service-banner/template.njk +20 -0
- package/.server/server/views/components/service-banner/template.test.js +36 -0
- package/.server/server/views/components/service-banner/template.test.js.map +1 -0
- package/.server/server/views/components/tag-env/macro.njk +3 -0
- package/.server/server/views/components/tag-env/template.njk +30 -0
- package/.server/server/views/components/tag-env/template.test.js +59 -0
- package/.server/server/views/components/tag-env/template.test.js.map +1 -0
- package/.server/server/views/confirmation.html +19 -0
- package/.server/server/views/help/accessibility-statement.html +58 -0
- package/.server/server/views/help/cookie-preferences.html +57 -0
- package/.server/server/views/help/cookies.html +71 -0
- package/.server/server/views/help/get-support.html +37 -0
- package/.server/server/views/help/privacy-notice.html +68 -0
- package/.server/server/views/help/terms-and-conditions.html +83 -0
- package/.server/server/views/layout.html +199 -0
- package/.server/server/views/summary.html +50 -0
- package/.server/typings/hapi/index.d.js +2 -0
- package/.server/typings/hapi/index.d.js.map +1 -0
- package/.server/typings/hapi-tracing/index.d.js +2 -0
- package/.server/typings/hapi-tracing/index.d.js.map +1 -0
- package/.server/typings/index.d.js +2 -0
- package/.server/typings/index.d.js.map +1 -0
- package/.server/typings/joi/index.d.js +2 -0
- package/.server/typings/joi/index.d.js.map +1 -0
- package/Dockerfile +61 -0
- package/LICENCE +8 -0
- package/Procfile +1 -0
- package/README.md +87 -0
- package/babel.config.cjs +55 -0
- package/compose/aws.env +4 -0
- package/compose/start-localstack.sh +26 -0
- package/docker-compose.yaml +86 -0
- package/globals.d.ts +1 -0
- package/jest.config.cjs +54 -0
- package/jest.environment.js +4 -0
- package/jest.setup.cjs +14 -0
- package/package.json +163 -0
- package/postcss.config.js +26 -0
- package/sonar-project.properties +17 -0
- package/src/client/javascripts/application.js +87 -0
- package/src/client/javascripts/file-upload.js +386 -0
- package/src/client/stylesheets/_code.scss +33 -0
- package/src/client/stylesheets/_govuk-frontend.scss +4 -0
- package/src/client/stylesheets/_prose.scss +56 -0
- package/src/client/stylesheets/_service-banner.scss +24 -0
- package/src/client/stylesheets/_summary-list.scss +28 -0
- package/src/client/stylesheets/_tag-env.scss +24 -0
- package/src/client/stylesheets/application.scss +14 -0
- package/src/common/cookies.js +58 -0
- package/src/common/cookies.test.js +23 -0
- package/src/common/types.js +5 -0
- package/src/config/index.ts +271 -0
- package/src/index.ts +31 -0
- package/src/server/common/helpers/logging/logger-options.test.ts +50 -0
- package/src/server/common/helpers/logging/logger-options.ts +46 -0
- package/src/server/common/helpers/logging/logger.ts +7 -0
- package/src/server/common/helpers/logging/request-logger.ts +9 -0
- package/src/server/common/helpers/logging/request-tracing.js +10 -0
- package/src/server/common/helpers/redis-client.js +70 -0
- package/src/server/constants.js +1 -0
- package/src/server/forms/README.md +10 -0
- package/src/server/forms/components.json +1015 -0
- package/src/server/forms/report-a-terrorist.json +270 -0
- package/src/server/forms/runner-components-test.json +365 -0
- package/src/server/forms/test.json +581 -0
- package/src/server/index.test.ts +582 -0
- package/src/server/index.ts +140 -0
- package/src/server/plugins/blankie.test.ts +73 -0
- package/src/server/plugins/blankie.ts +48 -0
- package/src/server/plugins/crumb.ts +20 -0
- package/src/server/plugins/engine/README.md +87 -0
- package/src/server/plugins/engine/components/AutocompleteField.test.ts +294 -0
- package/src/server/plugins/engine/components/AutocompleteField.ts +49 -0
- package/src/server/plugins/engine/components/CheckboxesField.test.ts +379 -0
- package/src/server/plugins/engine/components/CheckboxesField.ts +106 -0
- package/src/server/plugins/engine/components/ComponentBase.ts +97 -0
- package/src/server/plugins/engine/components/ComponentCollection.ts +278 -0
- package/src/server/plugins/engine/components/DatePartsField.test.ts +822 -0
- package/src/server/plugins/engine/components/DatePartsField.ts +264 -0
- package/src/server/plugins/engine/components/Details.test.ts +49 -0
- package/src/server/plugins/engine/components/Details.ts +30 -0
- package/src/server/plugins/engine/components/EmailAddressField.test.ts +395 -0
- package/src/server/plugins/engine/components/EmailAddressField.ts +55 -0
- package/src/server/plugins/engine/components/FileUploadField.test.ts +778 -0
- package/src/server/plugins/engine/components/FileUploadField.ts +262 -0
- package/src/server/plugins/engine/components/FormComponent.ts +249 -0
- package/src/server/plugins/engine/components/Html.test.ts +48 -0
- package/src/server/plugins/engine/components/Html.ts +29 -0
- package/src/server/plugins/engine/components/InsetText.test.ts +48 -0
- package/src/server/plugins/engine/components/InsetText.ts +27 -0
- package/src/server/plugins/engine/components/List.test.ts +76 -0
- package/src/server/plugins/engine/components/List.ts +72 -0
- package/src/server/plugins/engine/components/ListFormComponent.ts +140 -0
- package/src/server/plugins/engine/components/MonthYearField.test.ts +567 -0
- package/src/server/plugins/engine/components/MonthYearField.ts +222 -0
- package/src/server/plugins/engine/components/MultilineTextField.test.ts +558 -0
- package/src/server/plugins/engine/components/MultilineTextField.ts +138 -0
- package/src/server/plugins/engine/components/NumberField.test.ts +701 -0
- package/src/server/plugins/engine/components/NumberField.ts +163 -0
- package/src/server/plugins/engine/components/RadiosField.test.ts +288 -0
- package/src/server/plugins/engine/components/RadiosField.ts +24 -0
- package/src/server/plugins/engine/components/SelectField.test.ts +288 -0
- package/src/server/plugins/engine/components/SelectField.ts +47 -0
- package/src/server/plugins/engine/components/SelectionControlField.ts +43 -0
- package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +356 -0
- package/src/server/plugins/engine/components/TelephoneNumberField.ts +67 -0
- package/src/server/plugins/engine/components/TextField.test.ts +489 -0
- package/src/server/plugins/engine/components/TextField.ts +96 -0
- package/src/server/plugins/engine/components/UkAddressField.test.ts +623 -0
- package/src/server/plugins/engine/components/UkAddressField.ts +172 -0
- package/src/server/plugins/engine/components/YesNoField.test.ts +248 -0
- package/src/server/plugins/engine/components/YesNoField.ts +31 -0
- package/src/server/plugins/engine/components/constants.ts +1 -0
- package/src/server/plugins/engine/components/helpers.ts +330 -0
- package/src/server/plugins/engine/components/index.ts +24 -0
- package/src/server/plugins/engine/components/types.ts +117 -0
- package/src/server/plugins/engine/configureEnginePlugin.ts +47 -0
- package/src/server/plugins/engine/helpers.test.ts +791 -0
- package/src/server/plugins/engine/helpers.ts +379 -0
- package/src/server/plugins/engine/index.ts +7 -0
- package/src/server/plugins/engine/models/FormModel.test.ts +42 -0
- package/src/server/plugins/engine/models/FormModel.ts +443 -0
- package/src/server/plugins/engine/models/RepeatingSummaryViewModel.ts +0 -0
- package/src/server/plugins/engine/models/Section.ts +0 -0
- package/src/server/plugins/engine/models/SummaryViewModel.test.ts +209 -0
- package/src/server/plugins/engine/models/SummaryViewModel.ts +220 -0
- package/src/server/plugins/engine/models/index.ts +2 -0
- package/src/server/plugins/engine/models/types.ts +114 -0
- package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +143 -0
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +73 -0
- package/src/server/plugins/engine/outputFormatters/index.test.ts +17 -0
- package/src/server/plugins/engine/outputFormatters/index.ts +44 -0
- package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +229 -0
- package/src/server/plugins/engine/outputFormatters/machine/v1.ts +140 -0
- package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +229 -0
- package/src/server/plugins/engine/outputFormatters/machine/v2.ts +153 -0
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +1108 -0
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +446 -0
- package/src/server/plugins/engine/pageControllers/PageController.test.ts +205 -0
- package/src/server/plugins/engine/pageControllers/PageController.ts +176 -0
- package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +1264 -0
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +561 -0
- package/src/server/plugins/engine/pageControllers/README.md +28 -0
- package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +264 -0
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +458 -0
- package/src/server/plugins/engine/pageControllers/StartPageController.ts +18 -0
- package/src/server/plugins/engine/pageControllers/StatusPageController.ts +50 -0
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +261 -0
- package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +28 -0
- package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +19 -0
- package/src/server/plugins/engine/pageControllers/helpers.test.ts +198 -0
- package/src/server/plugins/engine/pageControllers/helpers.ts +101 -0
- package/src/server/plugins/engine/pageControllers/index.ts +10 -0
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +89 -0
- package/src/server/plugins/engine/plugin.ts +673 -0
- package/src/server/plugins/engine/services/formSubmissionService.js +46 -0
- package/src/server/plugins/engine/services/formsService.js +46 -0
- package/src/server/plugins/engine/services/formsService.test.js +90 -0
- package/src/server/plugins/engine/services/index.js +3 -0
- package/src/server/plugins/engine/services/notifyService.test.ts +132 -0
- package/src/server/plugins/engine/services/notifyService.ts +64 -0
- package/src/server/plugins/engine/services/uploadService.js +60 -0
- package/src/server/plugins/engine/types.ts +315 -0
- package/src/server/plugins/engine/views/components/autocompletefield.html +5 -0
- package/src/server/plugins/engine/views/components/checkboxesfield.html +5 -0
- package/src/server/plugins/engine/views/components/datepartsfield.html +5 -0
- package/src/server/plugins/engine/views/components/details.html +6 -0
- package/src/server/plugins/engine/views/components/emailaddressfield.html +5 -0
- package/src/server/plugins/engine/views/components/fileuploadfield-key.html +8 -0
- package/src/server/plugins/engine/views/components/fileuploadfield-value.html +3 -0
- package/src/server/plugins/engine/views/components/fileuploadfield.html +24 -0
- package/src/server/plugins/engine/views/components/html.html +3 -0
- package/src/server/plugins/engine/views/components/insettext.html +7 -0
- package/src/server/plugins/engine/views/components/list.html +36 -0
- package/src/server/plugins/engine/views/components/monthyearfield.html +5 -0
- package/src/server/plugins/engine/views/components/multilinetextfield.html +10 -0
- package/src/server/plugins/engine/views/components/numberfield.html +5 -0
- package/src/server/plugins/engine/views/components/radiosfield.html +5 -0
- package/src/server/plugins/engine/views/components/selectfield.html +5 -0
- package/src/server/plugins/engine/views/components/telephonenumberfield.html +5 -0
- package/src/server/plugins/engine/views/components/textfield.html +5 -0
- package/src/server/plugins/engine/views/components/ukaddressfield.html +25 -0
- package/src/server/plugins/engine/views/components/yesnofield.html +5 -0
- package/src/server/plugins/engine/views/file-upload.html +45 -0
- package/src/server/plugins/engine/views/index.html +39 -0
- package/src/server/plugins/engine/views/item-delete.html +56 -0
- package/src/server/plugins/engine/views/partials/components.html +6 -0
- package/src/server/plugins/engine/views/partials/conditional-components.html +3 -0
- package/src/server/plugins/engine/views/partials/debug.html +44 -0
- package/src/server/plugins/engine/views/partials/form.html +15 -0
- package/src/server/plugins/engine/views/partials/heading.html +16 -0
- package/src/server/plugins/engine/views/partials/preview-banner.html +32 -0
- package/src/server/plugins/engine/views/partials/preview-banner.test.js +122 -0
- package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +10 -0
- package/src/server/plugins/engine/views/repeat-list-summary.html +53 -0
- package/src/server/plugins/errorPages.ts +58 -0
- package/src/server/plugins/nunjucks/context.js +88 -0
- package/src/server/plugins/nunjucks/context.test.js +142 -0
- package/src/server/plugins/nunjucks/enviroment.test.js +201 -0
- package/src/server/plugins/nunjucks/environment.js +116 -0
- package/src/server/plugins/nunjucks/filters/answer.js +27 -0
- package/src/server/plugins/nunjucks/filters/answer.test.js +89 -0
- package/src/server/plugins/nunjucks/filters/evaluate.js +21 -0
- package/src/server/plugins/nunjucks/filters/field.js +28 -0
- package/src/server/plugins/nunjucks/filters/field.test.js +75 -0
- package/src/server/plugins/nunjucks/filters/highlight.js +11 -0
- package/src/server/plugins/nunjucks/filters/href.js +30 -0
- package/src/server/plugins/nunjucks/filters/href.test.js +80 -0
- package/src/server/plugins/nunjucks/filters/index.js +8 -0
- package/src/server/plugins/nunjucks/filters/inspect.js +15 -0
- package/src/server/plugins/nunjucks/filters/page.js +24 -0
- package/src/server/plugins/nunjucks/filters/page.test.js +65 -0
- package/src/server/plugins/nunjucks/index.js +3 -0
- package/src/server/plugins/nunjucks/plugin.js +40 -0
- package/src/server/plugins/nunjucks/render.js +42 -0
- package/src/server/plugins/nunjucks/types.js +40 -0
- package/src/server/plugins/pulse.ts +11 -0
- package/src/server/plugins/router.ts +201 -0
- package/src/server/plugins/session.ts +28 -0
- package/src/server/routes/health.js +13 -0
- package/src/server/routes/health.test.js +35 -0
- package/src/server/routes/index.test.ts +125 -0
- package/src/server/routes/index.ts +2 -0
- package/src/server/routes/public.ts +47 -0
- package/src/server/routes/types.ts +48 -0
- package/src/server/schemas/index.ts +34 -0
- package/src/server/secure-context.js +43 -0
- package/src/server/services/cacheService.test.ts +276 -0
- package/src/server/services/cacheService.ts +131 -0
- package/src/server/services/httpService.test.js +491 -0
- package/src/server/services/httpService.ts +50 -0
- package/src/server/services/index.ts +1 -0
- package/src/server/types.ts +54 -0
- package/src/server/utils/notify.test.ts +37 -0
- package/src/server/utils/notify.ts +50 -0
- package/src/server/utils/secure-context/get-trust-store-certs.js +11 -0
- package/src/server/utils/secure-context/get-trust-store-certs.test.js +19 -0
- package/src/server/utils/utils.js +24 -0
- package/src/server/utils/utils.test.js +54 -0
- package/src/server/views/404.html +16 -0
- package/src/server/views/500.html +19 -0
- package/src/server/views/components/debug/macro.njk +3 -0
- package/src/server/views/components/debug/template.njk +13 -0
- package/src/server/views/components/service-banner/macro.njk +3 -0
- package/src/server/views/components/service-banner/template.njk +20 -0
- package/src/server/views/components/service-banner/template.test.js +43 -0
- package/src/server/views/components/tag-env/macro.njk +3 -0
- package/src/server/views/components/tag-env/template.njk +30 -0
- package/src/server/views/components/tag-env/template.test.js +66 -0
- package/src/server/views/confirmation.html +19 -0
- package/src/server/views/help/accessibility-statement.html +58 -0
- package/src/server/views/help/cookie-preferences.html +57 -0
- package/src/server/views/help/cookies.html +71 -0
- package/src/server/views/help/get-support.html +37 -0
- package/src/server/views/help/privacy-notice.html +68 -0
- package/src/server/views/help/terms-and-conditions.html +83 -0
- package/src/server/views/layout.html +199 -0
- package/src/server/views/summary.html +50 -0
- package/src/typings/hapi/index.d.ts +95 -0
- package/src/typings/hapi-tracing/index.d.ts +6 -0
- package/src/typings/index.d.ts +3 -0
- package/src/typings/joi/index.d.ts +22 -0
- package/stylelint.config.js +10 -0
- package/test/client/javascripts/file-upload.test.js +1197 -0
- package/test/condition/checkboxes.test.js +112 -0
- package/test/condition/radios.test.js +112 -0
- package/test/condition/text.test.js +103 -0
- package/test/fixtures/assets-manifest.json +4 -0
- package/test/fixtures/form.js +86 -0
- package/test/fixtures/index.js +2 -0
- package/test/fixtures/list.js +92 -0
- package/test/form/cookies.test.js +338 -0
- package/test/form/csrf.test.js +87 -0
- package/test/form/definitions/basic.js +101 -0
- package/test/form/definitions/blank.js +10 -0
- package/test/form/definitions/checkboxes.json +88 -0
- package/test/form/definitions/components.json +452 -0
- package/test/form/definitions/conditional-reveal.js +140 -0
- package/test/form/definitions/conditions-basic.js +187 -0
- package/test/form/definitions/conditions-complex.js +338 -0
- package/test/form/definitions/conditions-dates.js +78 -0
- package/test/form/definitions/conditions-escaping.js +143 -0
- package/test/form/definitions/demo-cph-number.js +3099 -0
- package/test/form/definitions/feedback.json +45 -0
- package/test/form/definitions/fields-optional.js +402 -0
- package/test/form/definitions/fields-required.js +402 -0
- package/test/form/definitions/file-upload-basic.js +44 -0
- package/test/form/definitions/file-upload.js +66 -0
- package/test/form/definitions/minimal.js +39 -0
- package/test/form/definitions/phase-alpha.json +33 -0
- package/test/form/definitions/phase-default.json +26 -0
- package/test/form/definitions/radios.json +88 -0
- package/test/form/definitions/repeat-mixed.js +54 -0
- package/test/form/definitions/repeat.js +70 -0
- package/test/form/definitions/status.json +126 -0
- package/test/form/definitions/templates.js +183 -0
- package/test/form/definitions/test.json +581 -0
- package/test/form/definitions/text.json +75 -0
- package/test/form/definitions/titles.json +170 -0
- package/test/form/definitions.test.js +47 -0
- package/test/form/exit-page.test.js +210 -0
- package/test/form/feedback.test.js +68 -0
- package/test/form/fields-optional.test.js +237 -0
- package/test/form/fields-required.test.js +294 -0
- package/test/form/file-upload.test.js +313 -0
- package/test/form/govuk-notify.test.js +449 -0
- package/test/form/journey-basic.test.js +444 -0
- package/test/form/persist-files.test.js +227 -0
- package/test/form/phase-banner.test.js +71 -0
- package/test/form/repeat.test.js +628 -0
- package/test/form/summary-submission-email.test.js +95 -0
- package/test/form/template.test.js +288 -0
- package/test/form/titles.test.js +204 -0
- package/test/helpers/component-helpers.js +74 -0
- package/test/utils/get-cookie.js +42 -0
- package/test/utils/get-form-definitions.js +18 -0
- package/tmp.pdf +1 -0
- package/tsconfig.json +28 -0
- package/webpack.config.js +208 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { ComponentType } from '@defra/forms-model';
|
|
2
|
+
import { add, format, isValid, parse, startOfToday, sub } from 'date-fns';
|
|
3
|
+
import { ComponentCollection } from "./ComponentCollection.js";
|
|
4
|
+
import { FormComponent, isFormState, isFormValue } from "./FormComponent.js";
|
|
5
|
+
import { NumberField } from "./NumberField.js";
|
|
6
|
+
import { messageTemplate } from "../pageControllers/validationOptions.js";
|
|
7
|
+
export class DatePartsField extends FormComponent {
|
|
8
|
+
constructor(def, props) {
|
|
9
|
+
super(def, props);
|
|
10
|
+
const {
|
|
11
|
+
name,
|
|
12
|
+
options
|
|
13
|
+
} = def;
|
|
14
|
+
const isRequired = options.required !== false;
|
|
15
|
+
const customValidationMessages = {
|
|
16
|
+
'any.required': messageTemplate.objectMissing,
|
|
17
|
+
'number.base': messageTemplate.objectMissing,
|
|
18
|
+
'number.precision': messageTemplate.dateFormat,
|
|
19
|
+
'number.integer': messageTemplate.dateFormat,
|
|
20
|
+
'number.unsafe': messageTemplate.dateFormat,
|
|
21
|
+
'number.min': messageTemplate.dateFormat,
|
|
22
|
+
'number.max': messageTemplate.dateFormat
|
|
23
|
+
};
|
|
24
|
+
this.collection = new ComponentCollection([{
|
|
25
|
+
type: ComponentType.NumberField,
|
|
26
|
+
name: `${name}__day`,
|
|
27
|
+
title: 'Day',
|
|
28
|
+
schema: {
|
|
29
|
+
min: 1,
|
|
30
|
+
max: 31,
|
|
31
|
+
precision: 0
|
|
32
|
+
},
|
|
33
|
+
options: {
|
|
34
|
+
required: isRequired,
|
|
35
|
+
optionalText: true,
|
|
36
|
+
classes: 'govuk-input--width-2',
|
|
37
|
+
customValidationMessages
|
|
38
|
+
}
|
|
39
|
+
}, {
|
|
40
|
+
type: ComponentType.NumberField,
|
|
41
|
+
name: `${name}__month`,
|
|
42
|
+
title: 'Month',
|
|
43
|
+
schema: {
|
|
44
|
+
min: 1,
|
|
45
|
+
max: 12,
|
|
46
|
+
precision: 0
|
|
47
|
+
},
|
|
48
|
+
options: {
|
|
49
|
+
required: isRequired,
|
|
50
|
+
optionalText: true,
|
|
51
|
+
classes: 'govuk-input--width-2',
|
|
52
|
+
customValidationMessages
|
|
53
|
+
}
|
|
54
|
+
}, {
|
|
55
|
+
type: ComponentType.NumberField,
|
|
56
|
+
name: `${name}__year`,
|
|
57
|
+
title: 'Year',
|
|
58
|
+
schema: {
|
|
59
|
+
min: 1000,
|
|
60
|
+
max: 3000,
|
|
61
|
+
precision: 0
|
|
62
|
+
},
|
|
63
|
+
options: {
|
|
64
|
+
required: isRequired,
|
|
65
|
+
optionalText: true,
|
|
66
|
+
classes: 'govuk-input--width-4',
|
|
67
|
+
customValidationMessages
|
|
68
|
+
}
|
|
69
|
+
}], {
|
|
70
|
+
...props,
|
|
71
|
+
parent: this
|
|
72
|
+
}, {
|
|
73
|
+
custom: getValidatorDate(this),
|
|
74
|
+
peers: [`${name}__day`, `${name}__month`, `${name}__year`]
|
|
75
|
+
});
|
|
76
|
+
this.options = options;
|
|
77
|
+
this.formSchema = this.collection.formSchema;
|
|
78
|
+
this.stateSchema = this.collection.stateSchema;
|
|
79
|
+
}
|
|
80
|
+
getFormValueFromState(state) {
|
|
81
|
+
const value = super.getFormValueFromState(state);
|
|
82
|
+
return this.isState(value) ? value : undefined;
|
|
83
|
+
}
|
|
84
|
+
getDisplayStringFromState(state) {
|
|
85
|
+
const value = this.getFormValueFromState(state);
|
|
86
|
+
if (!value) {
|
|
87
|
+
return '';
|
|
88
|
+
}
|
|
89
|
+
return format(`${value.year}-${value.month}-${value.day}`, 'd MMMM yyyy');
|
|
90
|
+
}
|
|
91
|
+
getContextValueFromState(state) {
|
|
92
|
+
const value = this.getFormValueFromState(state);
|
|
93
|
+
if (!value || !isValid(parse(`${value.year}-${value.month}-${value.day}`, 'yyyy-MM-dd', new Date()))) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
return format(`${value.year}-${value.month}-${value.day}`, 'yyyy-MM-dd');
|
|
97
|
+
}
|
|
98
|
+
getViewModel(payload, errors) {
|
|
99
|
+
const {
|
|
100
|
+
collection,
|
|
101
|
+
name
|
|
102
|
+
} = this;
|
|
103
|
+
const viewModel = super.getViewModel(payload, errors);
|
|
104
|
+
let {
|
|
105
|
+
fieldset,
|
|
106
|
+
label
|
|
107
|
+
} = viewModel;
|
|
108
|
+
|
|
109
|
+
// Check for component errors only
|
|
110
|
+
const hasError = errors?.some(error => error.name === name);
|
|
111
|
+
|
|
112
|
+
// Use the component collection to generate the subitems
|
|
113
|
+
const items = collection.getViewModel(payload, errors).map(({
|
|
114
|
+
model
|
|
115
|
+
}) => {
|
|
116
|
+
let {
|
|
117
|
+
label,
|
|
118
|
+
type,
|
|
119
|
+
value,
|
|
120
|
+
classes,
|
|
121
|
+
errorMessage
|
|
122
|
+
} = model;
|
|
123
|
+
if (label) {
|
|
124
|
+
label.toString = () => label.text; // Date component uses string labels
|
|
125
|
+
}
|
|
126
|
+
if (hasError || errorMessage) {
|
|
127
|
+
classes = `${classes} govuk-input--error`.trim();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Allow any `toString()`-able value so non-numeric
|
|
131
|
+
// values are shown alongside their error messages
|
|
132
|
+
if (!isFormValue(value)) {
|
|
133
|
+
value = undefined;
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
label,
|
|
137
|
+
id: model.id,
|
|
138
|
+
name: model.name,
|
|
139
|
+
type,
|
|
140
|
+
value,
|
|
141
|
+
classes
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
fieldset ??= {
|
|
145
|
+
legend: {
|
|
146
|
+
text: label.text,
|
|
147
|
+
classes: 'govuk-fieldset__legend--m'
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
...viewModel,
|
|
152
|
+
fieldset,
|
|
153
|
+
items
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
isState(value) {
|
|
157
|
+
return DatePartsField.isDateParts(value);
|
|
158
|
+
}
|
|
159
|
+
static isDateParts(value) {
|
|
160
|
+
return isFormState(value) && NumberField.isNumber(value.day) && NumberField.isNumber(value.month) && NumberField.isNumber(value.year);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export function getValidatorDate(component) {
|
|
164
|
+
const validator = (payload, helpers) => {
|
|
165
|
+
const {
|
|
166
|
+
collection,
|
|
167
|
+
name,
|
|
168
|
+
options
|
|
169
|
+
} = component;
|
|
170
|
+
const values = component.getFormValueFromState(component.getStateFromValidForm(payload));
|
|
171
|
+
const context = {
|
|
172
|
+
missing: collection.keys,
|
|
173
|
+
key: name
|
|
174
|
+
};
|
|
175
|
+
if (!component.isState(values)) {
|
|
176
|
+
return options.required !== false ? helpers.error('object.required', context) : payload;
|
|
177
|
+
}
|
|
178
|
+
const date = parse(`${values.year}-${values.month}-${values.day}`, 'yyyy-MM-dd', new Date());
|
|
179
|
+
if (!isValid(date)) {
|
|
180
|
+
return helpers.error('date.format', context);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Minimum date from today
|
|
184
|
+
const dateMin = options.maxDaysInPast ? sub(startOfToday(), {
|
|
185
|
+
days: options.maxDaysInPast
|
|
186
|
+
}) : undefined;
|
|
187
|
+
|
|
188
|
+
// Maximum date from today
|
|
189
|
+
const dateMax = options.maxDaysInFuture ? add(startOfToday(), {
|
|
190
|
+
days: options.maxDaysInFuture
|
|
191
|
+
}) : undefined;
|
|
192
|
+
if (dateMin && date < dateMin) {
|
|
193
|
+
return helpers.error('date.min', {
|
|
194
|
+
...context,
|
|
195
|
+
limit: dateMin
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (dateMax && date > dateMax) {
|
|
199
|
+
return helpers.error('date.max', {
|
|
200
|
+
...context,
|
|
201
|
+
limit: dateMax
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return payload;
|
|
205
|
+
};
|
|
206
|
+
return validator;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=DatePartsField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePartsField.js","names":["ComponentType","add","format","isValid","parse","startOfToday","sub","ComponentCollection","FormComponent","isFormState","isFormValue","NumberField","messageTemplate","DatePartsField","constructor","def","props","name","options","isRequired","required","customValidationMessages","objectMissing","dateFormat","collection","type","title","schema","min","max","precision","optionalText","classes","parent","custom","getValidatorDate","peers","formSchema","stateSchema","getFormValueFromState","state","value","isState","undefined","getDisplayStringFromState","year","month","day","getContextValueFromState","Date","getViewModel","payload","errors","viewModel","fieldset","label","hasError","some","error","items","map","model","errorMessage","toString","text","trim","id","legend","isDateParts","isNumber","component","validator","helpers","values","getStateFromValidForm","context","missing","keys","key","date","dateMin","maxDaysInPast","days","dateMax","maxDaysInFuture","limit"],"sources":["../../../../../src/server/plugins/engine/components/DatePartsField.ts"],"sourcesContent":["import { ComponentType, type DatePartsFieldComponent } from '@defra/forms-model'\nimport { add, format, isValid, parse, startOfToday, sub } from 'date-fns'\nimport {\n type Context,\n type CustomValidator,\n type LanguageMessages,\n type ObjectSchema\n} from 'joi'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport { type DateInputItem } from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class DatePartsField extends FormComponent {\n declare options: DatePartsFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: DatePartsFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options } = def\n\n const isRequired = options.required !== false\n\n const customValidationMessages: LanguageMessages = {\n 'any.required': messageTemplate.objectMissing,\n 'number.base': messageTemplate.objectMissing,\n 'number.precision': messageTemplate.dateFormat,\n 'number.integer': messageTemplate.dateFormat,\n 'number.unsafe': messageTemplate.dateFormat,\n 'number.min': messageTemplate.dateFormat,\n 'number.max': messageTemplate.dateFormat\n }\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__day`,\n title: 'Day',\n schema: { min: 1, max: 31, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-2',\n customValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__month`,\n title: 'Month',\n schema: { min: 1, max: 12, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-2',\n customValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__year`,\n title: 'Year',\n schema: { min: 1000, max: 3000, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-4',\n customValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n custom: getValidatorDate(this),\n peers: [`${name}__day`, `${name}__month`, `${name}__year`]\n }\n )\n\n this.options = options\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 this.isState(value) ? value : undefined\n }\n\n getDisplayStringFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n if (!value) {\n return ''\n }\n\n return format(`${value.year}-${value.month}-${value.day}`, 'd MMMM yyyy')\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n if (\n !value ||\n !isValid(\n parse(\n `${value.year}-${value.month}-${value.day}`,\n 'yyyy-MM-dd',\n new Date()\n )\n )\n ) {\n return null\n }\n\n return format(`${value.year}-${value.month}-${value.day}`, 'yyyy-MM-dd')\n }\n\n getViewModel(payload: FormPayload, errors?: FormSubmissionError[]) {\n const { collection, name } = this\n\n const viewModel = super.getViewModel(payload, errors)\n let { fieldset, label } = viewModel\n\n // Check for component errors only\n const hasError = errors?.some((error) => error.name === name)\n\n // Use the component collection to generate the subitems\n const items: DateInputItem[] = collection\n .getViewModel(payload, errors)\n .map(({ model }) => {\n let { label, type, value, classes, errorMessage } = model\n\n if (label) {\n label.toString = () => label.text // Date component uses string labels\n }\n\n if (hasError || errorMessage) {\n classes = `${classes} govuk-input--error`.trim()\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n label,\n id: model.id,\n name: model.name,\n type,\n value,\n classes\n }\n })\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n return {\n ...viewModel,\n fieldset,\n items\n }\n }\n\n isState(value?: FormStateValue | FormState) {\n return DatePartsField.isDateParts(value)\n }\n\n static isDateParts(\n value?: FormStateValue | FormState\n ): value is DatePartsState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.day) &&\n NumberField.isNumber(value.month) &&\n NumberField.isNumber(value.year)\n )\n }\n}\n\nexport interface DatePartsState extends Record<string, number> {\n day: number\n month: number\n year: number\n}\n\nexport function getValidatorDate(component: DatePartsField) {\n const validator: CustomValidator = (payload: FormPayload, helpers) => {\n const { collection, name, options } = component\n\n const values = component.getFormValueFromState(\n component.getStateFromValidForm(payload)\n )\n\n const context: Context = {\n missing: collection.keys,\n key: name\n }\n\n if (!component.isState(values)) {\n return options.required !== false\n ? helpers.error('object.required', context)\n : payload\n }\n\n const date = parse(\n `${values.year}-${values.month}-${values.day}`,\n 'yyyy-MM-dd',\n new Date()\n )\n\n if (!isValid(date)) {\n return helpers.error('date.format', context)\n }\n\n // Minimum date from today\n const dateMin = options.maxDaysInPast\n ? sub(startOfToday(), { days: options.maxDaysInPast })\n : undefined\n\n // Maximum date from today\n const dateMax = options.maxDaysInFuture\n ? add(startOfToday(), { days: options.maxDaysInFuture })\n : undefined\n\n if (dateMin && date < dateMin) {\n return helpers.error('date.min', { ...context, limit: dateMin })\n }\n\n if (dateMax && date > dateMax) {\n return helpers.error('date.max', { ...context, limit: dateMax })\n }\n\n return payload\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ComponentBase } from "./ComponentBase.js";
|
|
2
|
+
export class Details extends ComponentBase {
|
|
3
|
+
content;
|
|
4
|
+
constructor(def, props) {
|
|
5
|
+
super(def, props);
|
|
6
|
+
const {
|
|
7
|
+
content,
|
|
8
|
+
options
|
|
9
|
+
} = def;
|
|
10
|
+
this.content = content;
|
|
11
|
+
this.options = options;
|
|
12
|
+
}
|
|
13
|
+
getViewModel() {
|
|
14
|
+
const {
|
|
15
|
+
content,
|
|
16
|
+
title,
|
|
17
|
+
viewModel
|
|
18
|
+
} = this;
|
|
19
|
+
return {
|
|
20
|
+
...viewModel,
|
|
21
|
+
html: content,
|
|
22
|
+
summaryHtml: title
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=Details.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Details.js","names":["ComponentBase","Details","content","constructor","def","props","options","getViewModel","title","viewModel","html","summaryHtml"],"sources":["../../../../../src/server/plugins/engine/components/Details.ts"],"sourcesContent":["import { type DetailsComponent } from '@defra/forms-model'\n\nimport { ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'\n\nexport class Details extends ComponentBase {\n declare options: DetailsComponent['options']\n content: DetailsComponent['content']\n\n constructor(\n def: DetailsComponent,\n props: ConstructorParameters<typeof ComponentBase>[1]\n ) {\n super(def, props)\n\n const { content, options } = def\n\n this.content = content\n this.options = options\n }\n\n getViewModel() {\n const { content, title, viewModel } = this\n\n return {\n ...viewModel,\n html: content,\n summaryHtml: title\n }\n }\n}\n"],"mappings":"AAEA,SAASA,aAAa;AAEtB,OAAO,MAAMC,OAAO,SAASD,aAAa,CAAC;EAEzCE,OAAO;EAEPC,WAAWA,CACTC,GAAqB,EACrBC,KAAqD,EACrD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEH,OAAO;MAAEI;IAAQ,CAAC,GAAGF,GAAG;IAEhC,IAAI,CAACF,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACI,OAAO,GAAGA,OAAO;EACxB;EAEAC,YAAYA,CAAA,EAAG;IACb,MAAM;MAAEL,OAAO;MAAEM,KAAK;MAAEC;IAAU,CAAC,GAAG,IAAI;IAE1C,OAAO;MACL,GAAGA,SAAS;MACZC,IAAI,EAAER,OAAO;MACbS,WAAW,EAAEH;IACf,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import joi from 'joi';
|
|
2
|
+
import { FormComponent } from "./FormComponent.js";
|
|
3
|
+
export class EmailAddressField extends FormComponent {
|
|
4
|
+
constructor(def, props) {
|
|
5
|
+
super(def, props);
|
|
6
|
+
const {
|
|
7
|
+
options,
|
|
8
|
+
title
|
|
9
|
+
} = def;
|
|
10
|
+
let formSchema = joi.string().email().trim().label(title).required();
|
|
11
|
+
if (options.required === false) {
|
|
12
|
+
formSchema = formSchema.allow('');
|
|
13
|
+
}
|
|
14
|
+
if (options.customValidationMessage) {
|
|
15
|
+
const message = options.customValidationMessage;
|
|
16
|
+
formSchema = formSchema.messages({
|
|
17
|
+
'any.required': message,
|
|
18
|
+
'string.empty': message,
|
|
19
|
+
'string.email': message
|
|
20
|
+
});
|
|
21
|
+
} else if (options.customValidationMessages) {
|
|
22
|
+
formSchema = formSchema.messages(options.customValidationMessages);
|
|
23
|
+
}
|
|
24
|
+
this.formSchema = formSchema.default('');
|
|
25
|
+
this.stateSchema = formSchema.default(null).allow(null);
|
|
26
|
+
this.options = options;
|
|
27
|
+
}
|
|
28
|
+
getViewModel(payload, errors) {
|
|
29
|
+
const viewModel = super.getViewModel(payload, errors);
|
|
30
|
+
const {
|
|
31
|
+
attributes
|
|
32
|
+
} = viewModel;
|
|
33
|
+
attributes.autocomplete = 'email';
|
|
34
|
+
return {
|
|
35
|
+
...viewModel,
|
|
36
|
+
type: 'email'
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=EmailAddressField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmailAddressField.js","names":["joi","FormComponent","EmailAddressField","constructor","def","props","options","title","formSchema","string","email","trim","label","required","allow","customValidationMessage","message","messages","customValidationMessages","default","stateSchema","getViewModel","payload","errors","viewModel","attributes","autocomplete","type"],"sources":["../../../../../src/server/plugins/engine/components/EmailAddressField.ts"],"sourcesContent":["import { type EmailAddressFieldComponent } from '@defra/forms-model'\nimport joi from 'joi'\n\nimport { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n type FormPayload,\n type FormSubmissionError\n} from '~/src/server/plugins/engine/types.js'\n\nexport class EmailAddressField extends FormComponent {\n declare options: EmailAddressFieldComponent['options']\n\n constructor(\n def: EmailAddressFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, title } = def\n\n let formSchema = joi.string().email().trim().label(title).required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'string.empty': message,\n 'string.email': message\n })\n } else if (options.customValidationMessages) {\n formSchema = formSchema.messages(options.customValidationMessages)\n }\n\n this.formSchema = formSchema.default('')\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getViewModel(payload: FormPayload, errors?: FormSubmissionError[]) {\n const viewModel = super.getViewModel(payload, errors)\n const { attributes } = viewModel\n\n attributes.autocomplete = 'email'\n\n return {\n ...viewModel,\n type: 'email'\n }\n }\n}\n"],"mappings":"AACA,OAAOA,GAAG,MAAM,KAAK;AAErB,SAASC,aAAa;AAMtB,OAAO,MAAMC,iBAAiB,SAASD,aAAa,CAAC;EAGnDE,WAAWA,CACTC,GAA+B,EAC/BC,KAAqD,EACrD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEC,OAAO;MAAEC;IAAM,CAAC,GAAGH,GAAG;IAE9B,IAAII,UAAU,GAAGR,GAAG,CAACS,MAAM,CAAC,CAAC,CAACC,KAAK,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,KAAK,CAACL,KAAK,CAAC,CAACM,QAAQ,CAAC,CAAC;IAEpE,IAAIP,OAAO,CAACO,QAAQ,KAAK,KAAK,EAAE;MAC9BL,UAAU,GAAGA,UAAU,CAACM,KAAK,CAAC,EAAE,CAAC;IACnC;IAEA,IAAIR,OAAO,CAACS,uBAAuB,EAAE;MACnC,MAAMC,OAAO,GAAGV,OAAO,CAACS,uBAAuB;MAE/CP,UAAU,GAAGA,UAAU,CAACS,QAAQ,CAAC;QAC/B,cAAc,EAAED,OAAO;QACvB,cAAc,EAAEA,OAAO;QACvB,cAAc,EAAEA;MAClB,CAAC,CAAC;IACJ,CAAC,MAAM,IAAIV,OAAO,CAACY,wBAAwB,EAAE;MAC3CV,UAAU,GAAGA,UAAU,CAACS,QAAQ,CAACX,OAAO,CAACY,wBAAwB,CAAC;IACpE;IAEA,IAAI,CAACV,UAAU,GAAGA,UAAU,CAACW,OAAO,CAAC,EAAE,CAAC;IACxC,IAAI,CAACC,WAAW,GAAGZ,UAAU,CAACW,OAAO,CAAC,IAAI,CAAC,CAACL,KAAK,CAAC,IAAI,CAAC;IACvD,IAAI,CAACR,OAAO,GAAGA,OAAO;EACxB;EAEAe,YAAYA,CAACC,OAAoB,EAAEC,MAA8B,EAAE;IACjE,MAAMC,SAAS,GAAG,KAAK,CAACH,YAAY,CAACC,OAAO,EAAEC,MAAM,CAAC;IACrD,MAAM;MAAEE;IAAW,CAAC,GAAGD,SAAS;IAEhCC,UAAU,CAACC,YAAY,GAAG,OAAO;IAEjC,OAAO;MACL,GAAGF,SAAS;MACZG,IAAI,EAAE;IACR,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import joi from 'joi';
|
|
2
|
+
import { FormComponent, isUploadState } from "./FormComponent.js";
|
|
3
|
+
import { FileStatus, UploadStatus } from "../types.js";
|
|
4
|
+
import { render } from "../../nunjucks/index.js";
|
|
5
|
+
export const uploadIdSchema = joi.string().uuid().required();
|
|
6
|
+
export const fileSchema = joi.object({
|
|
7
|
+
fileId: joi.string().uuid().required(),
|
|
8
|
+
filename: joi.string().required(),
|
|
9
|
+
contentLength: joi.number().required()
|
|
10
|
+
}).required();
|
|
11
|
+
export const tempFileSchema = fileSchema.append({
|
|
12
|
+
fileStatus: joi.string().valid(FileStatus.complete, FileStatus.rejected, FileStatus.pending).required(),
|
|
13
|
+
errorMessage: joi.string().optional()
|
|
14
|
+
});
|
|
15
|
+
export const formFileSchema = fileSchema.append({
|
|
16
|
+
fileStatus: joi.string().valid(FileStatus.complete).required()
|
|
17
|
+
});
|
|
18
|
+
export const metadataSchema = joi.object().keys({
|
|
19
|
+
retrievalKey: joi.string().email().required()
|
|
20
|
+
}).required();
|
|
21
|
+
export const tempStatusSchema = joi.object({
|
|
22
|
+
uploadStatus: joi.string().valid(UploadStatus.ready, UploadStatus.pending).required(),
|
|
23
|
+
metadata: metadataSchema,
|
|
24
|
+
form: joi.object().required().keys({
|
|
25
|
+
file: tempFileSchema
|
|
26
|
+
}),
|
|
27
|
+
numberOfRejectedFiles: joi.number().optional()
|
|
28
|
+
}).required();
|
|
29
|
+
export const formStatusSchema = joi.object({
|
|
30
|
+
uploadStatus: joi.string().valid(UploadStatus.ready).required(),
|
|
31
|
+
metadata: metadataSchema,
|
|
32
|
+
form: joi.object().required().keys({
|
|
33
|
+
file: formFileSchema
|
|
34
|
+
}),
|
|
35
|
+
numberOfRejectedFiles: joi.number().valid(0).required()
|
|
36
|
+
}).required();
|
|
37
|
+
export const itemSchema = joi.object({
|
|
38
|
+
uploadId: uploadIdSchema
|
|
39
|
+
});
|
|
40
|
+
export const tempItemSchema = itemSchema.append({
|
|
41
|
+
status: tempStatusSchema
|
|
42
|
+
});
|
|
43
|
+
export const formItemSchema = itemSchema.append({
|
|
44
|
+
status: formStatusSchema
|
|
45
|
+
});
|
|
46
|
+
export class FileUploadField extends FormComponent {
|
|
47
|
+
constructor(def, props) {
|
|
48
|
+
super(def, props);
|
|
49
|
+
const {
|
|
50
|
+
options,
|
|
51
|
+
schema,
|
|
52
|
+
title
|
|
53
|
+
} = def;
|
|
54
|
+
let formSchema = joi.array().label(title).single().required();
|
|
55
|
+
if (options.required === false) {
|
|
56
|
+
formSchema = formSchema.optional();
|
|
57
|
+
}
|
|
58
|
+
if (typeof schema.length !== 'number') {
|
|
59
|
+
if (typeof schema.max === 'number') {
|
|
60
|
+
formSchema = formSchema.max(schema.max);
|
|
61
|
+
}
|
|
62
|
+
if (typeof schema.min === 'number') {
|
|
63
|
+
formSchema = formSchema.min(schema.min);
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
formSchema = formSchema.length(schema.length);
|
|
67
|
+
}
|
|
68
|
+
this.formSchema = formSchema.items(formItemSchema);
|
|
69
|
+
this.stateSchema = formSchema.items(formItemSchema).default(null).allow(null);
|
|
70
|
+
this.options = options;
|
|
71
|
+
this.schema = schema;
|
|
72
|
+
}
|
|
73
|
+
getFormValueFromState(state) {
|
|
74
|
+
const {
|
|
75
|
+
name
|
|
76
|
+
} = this;
|
|
77
|
+
return this.getFormValue(state[name]);
|
|
78
|
+
}
|
|
79
|
+
getFormValue(value) {
|
|
80
|
+
return this.isValue(value) ? value : undefined;
|
|
81
|
+
}
|
|
82
|
+
getDisplayStringFromState(state) {
|
|
83
|
+
const files = this.getFormValueFromState(state);
|
|
84
|
+
if (!files?.length) {
|
|
85
|
+
return '';
|
|
86
|
+
}
|
|
87
|
+
const unit = files.length === 1 ? 'file' : 'files';
|
|
88
|
+
return `Uploaded ${files.length} ${unit}`;
|
|
89
|
+
}
|
|
90
|
+
getContextValueFromState(state) {
|
|
91
|
+
const files = this.getFormValueFromState(state);
|
|
92
|
+
return files?.map(({
|
|
93
|
+
status
|
|
94
|
+
}) => status.form.file.fileId) ?? null;
|
|
95
|
+
}
|
|
96
|
+
getViewModel(payload, errors, query = {}) {
|
|
97
|
+
const {
|
|
98
|
+
options,
|
|
99
|
+
page
|
|
100
|
+
} = this;
|
|
101
|
+
|
|
102
|
+
// Allow preview URL direct access
|
|
103
|
+
const isForceAccess = 'force' in query;
|
|
104
|
+
const viewModel = super.getViewModel(payload, errors);
|
|
105
|
+
const {
|
|
106
|
+
attributes,
|
|
107
|
+
id,
|
|
108
|
+
value
|
|
109
|
+
} = viewModel;
|
|
110
|
+
const files = this.getFormValue(value) ?? [];
|
|
111
|
+
const filtered = files.filter(file => file.status.form.file.fileStatus === FileStatus.complete);
|
|
112
|
+
const count = filtered.length;
|
|
113
|
+
const rows = filtered.map((item, index) => {
|
|
114
|
+
const {
|
|
115
|
+
status
|
|
116
|
+
} = item;
|
|
117
|
+
const {
|
|
118
|
+
form
|
|
119
|
+
} = status;
|
|
120
|
+
const {
|
|
121
|
+
file
|
|
122
|
+
} = form;
|
|
123
|
+
const tag = {
|
|
124
|
+
classes: 'govuk-tag--green',
|
|
125
|
+
text: 'Uploaded'
|
|
126
|
+
};
|
|
127
|
+
const valueHtml = render.view('components/fileuploadfield-value.html', {
|
|
128
|
+
context: {
|
|
129
|
+
params: {
|
|
130
|
+
tag
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}).trim();
|
|
134
|
+
const keyHtml = render.view('components/fileuploadfield-key.html', {
|
|
135
|
+
context: {
|
|
136
|
+
params: {
|
|
137
|
+
name: file.filename,
|
|
138
|
+
errorMessage: errors && file.errorMessage
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}).trim();
|
|
142
|
+
const items = [];
|
|
143
|
+
|
|
144
|
+
// Remove summary list actions from previews
|
|
145
|
+
if (!isForceAccess) {
|
|
146
|
+
const path = `/${item.uploadId}/confirm-delete`;
|
|
147
|
+
const href = page?.getHref(`${page.path}${path}`) ?? '#';
|
|
148
|
+
items.push({
|
|
149
|
+
href,
|
|
150
|
+
text: 'Remove',
|
|
151
|
+
classes: 'govuk-link--no-visited-state',
|
|
152
|
+
attributes: {
|
|
153
|
+
id: `${id}__${index}`
|
|
154
|
+
},
|
|
155
|
+
visuallyHiddenText: file.filename
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
key: {
|
|
160
|
+
html: keyHtml
|
|
161
|
+
},
|
|
162
|
+
value: {
|
|
163
|
+
html: valueHtml
|
|
164
|
+
},
|
|
165
|
+
actions: {
|
|
166
|
+
items
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// Set up the `accept` attribute
|
|
172
|
+
if ('accept' in options) {
|
|
173
|
+
attributes.accept = options.accept;
|
|
174
|
+
}
|
|
175
|
+
const summaryList = {
|
|
176
|
+
classes: 'govuk-summary-list--long-key',
|
|
177
|
+
rows
|
|
178
|
+
};
|
|
179
|
+
return {
|
|
180
|
+
...viewModel,
|
|
181
|
+
// File input can't have a initial value
|
|
182
|
+
value: '',
|
|
183
|
+
// Override the component name we send to CDP
|
|
184
|
+
name: 'file',
|
|
185
|
+
upload: {
|
|
186
|
+
count,
|
|
187
|
+
summaryList
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
isValue(value) {
|
|
192
|
+
return isUploadState(value);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=FileUploadField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileUploadField.js","names":["joi","FormComponent","isUploadState","FileStatus","UploadStatus","render","uploadIdSchema","string","uuid","required","fileSchema","object","fileId","filename","contentLength","number","tempFileSchema","append","fileStatus","valid","complete","rejected","pending","errorMessage","optional","formFileSchema","metadataSchema","keys","retrievalKey","email","tempStatusSchema","uploadStatus","ready","metadata","form","file","numberOfRejectedFiles","formStatusSchema","itemSchema","uploadId","tempItemSchema","status","formItemSchema","FileUploadField","constructor","def","props","options","schema","title","formSchema","array","label","single","length","max","min","items","stateSchema","default","allow","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","getDisplayStringFromState","files","unit","getContextValueFromState","map","getViewModel","payload","errors","query","page","isForceAccess","viewModel","attributes","id","filtered","filter","count","rows","item","index","tag","classes","text","valueHtml","view","context","params","trim","keyHtml","path","href","getHref","push","visuallyHiddenText","key","html","actions","accept","summaryList","upload"],"sources":["../../../../../src/server/plugins/engine/components/FileUploadField.ts"],"sourcesContent":["import { type FileUploadFieldComponent } from '@defra/forms-model'\nimport joi, { type ArraySchema } from 'joi'\n\nimport {\n FormComponent,\n isUploadState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n FileStatus,\n UploadStatus,\n type FileState,\n type FileUpload,\n type FileUploadMetadata,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionError,\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 FormQuery } from '~/src/server/routes/types.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})\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.object().required().keys({\n file: tempFileSchema\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().valid(0).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, title } = def\n\n let formSchema = joi.array<FileState>().label(title).single().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 }\n } else {\n formSchema = formSchema.length(schema.length)\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 getDisplayStringFromState(state: FormSubmissionState) {\n const files = this.getFormValueFromState(state)\n if (!files?.length) {\n return ''\n }\n\n const unit = files.length === 1 ? 'file' : 'files'\n return `Uploaded ${files.length} ${unit}`\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const files = this.getFormValueFromState(state)\n return files?.map(({ status }) => status.form.file.fileId) ?? null\n }\n\n getViewModel(\n payload: FormPayload,\n errors?: FormSubmissionError[],\n query: FormQuery = {}\n ) {\n const { options, page } = this\n\n // Allow preview URL direct access\n const isForceAccess = 'force' in query\n\n const viewModel = super.getViewModel(payload, errors)\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 = { classes: 'govuk-tag--green', text: 'Uploaded' }\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 = `/${item.uploadId}/confirm-delete`\n const href = page?.getHref(`${page.path}${path}`) ?? '#'\n\n items.push({\n href,\n text: '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) {\n attributes.accept = options.accept\n }\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 upload: {\n count,\n summaryList\n }\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is UploadState {\n return isUploadState(value)\n }\n}\n"],"mappings":"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","ignoreList":[]}
|