@defra/forms-engine-plugin 5.0.0-alpha.11 → 5.0.0-alpha.13
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/.public/javascripts/shared.min.js +1 -1
- package/.public/javascripts/shared.min.js.map +1 -1
- package/.server/client/javascripts/geospatial-map.d.ts +153 -5
- package/.server/client/javascripts/geospatial-map.js +147 -46
- package/.server/client/javascripts/geospatial-map.js.map +1 -1
- package/.server/client/javascripts/location-map.d.ts +38 -0
- package/.server/client/javascripts/location-map.js +42 -2
- package/.server/client/javascripts/location-map.js.map +1 -1
- package/.server/client/javascripts/map-constants.d.ts +3 -0
- package/.server/client/javascripts/map-constants.js +4 -0
- package/.server/client/javascripts/map-constants.js.map +1 -0
- package/.server/client/javascripts/map.d.ts +4 -0
- package/.server/client/javascripts/map.js +5 -0
- package/.server/client/javascripts/map.js.map +1 -1
- package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
- package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
- package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
- 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 +4 -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 +22 -0
- package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
- package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
- package/.server/server/plugins/engine/components/LatLongField.d.ts +4 -0
- package/.server/server/plugins/engine/components/LocationFieldBase.js +7 -1
- package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +4 -0
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +9 -2
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/components.js +2 -1
- package/.server/server/plugins/engine/components/helpers/components.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/errors.d.ts +49 -0
- package/.server/server/plugins/engine/errors.js +75 -0
- package/.server/server/plugins/engine/errors.js.map +1 -0
- 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 +117 -11
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +80 -11
- 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/FormModel.js +10 -2
- package/.server/server/plugins/engine/models/FormModel.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/helpers/pages.js +2 -1
- package/.server/server/plugins/engine/pageControllers/helpers/pages.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 +2 -1
- package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
- package/.server/server/plugins/engine/views/components/osgridreffield.html +3 -1
- package/.server/server/plugins/engine/views/unavailable.html +14 -11
- package/package.json +1 -1
- package/src/client/javascripts/geospatial-map.js +169 -47
- package/src/client/javascripts/location-map.js +50 -2
- package/src/client/javascripts/map-constants.js +3 -0
- package/src/client/javascripts/map.js +5 -0
- package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
- 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 +44 -11
- package/src/server/plugins/engine/components/LocationFieldBase.ts +7 -1
- package/src/server/plugins/engine/components/LocationFieldHelpers.ts +9 -2
- package/src/server/plugins/engine/components/helpers/components.ts +2 -1
- package/src/server/plugins/engine/components/helpers/geospatial.ts +32 -22
- package/src/server/plugins/engine/errors.ts +78 -0
- 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 +117 -11
- package/src/server/plugins/engine/i18n/translations/en-GB.json +80 -11
- package/src/server/plugins/engine/i18n/types.ts +1 -0
- package/src/server/plugins/engine/models/FormModel.ts +12 -2
- package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
- package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
- 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 +2 -1
- package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
- package/src/server/plugins/engine/views/components/osgridreffield.html +3 -1
- package/src/server/plugins/engine/views/unavailable.html +14 -11
|
@@ -449,4 +449,9 @@ export function getMapCountryLayers(apiPath, country) {
|
|
|
449
449
|
/**
|
|
450
450
|
* @import { Feature } from '../../server/plugins/engine/types.js'
|
|
451
451
|
*/
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* Supported language codes
|
|
455
|
+
* @typedef {('en-GB'|'cy')} LanguageCode
|
|
456
|
+
*/
|
|
452
457
|
//# sourceMappingURL=map.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.js","names":["InteractiveMap","createInteractPlugin","createMapStylesPlugin","createScaleBarPlugin","createSearchPlugin","maplibreProvider","centroid","OsGridRef","LatLon","processGeospatial","processLocation","DEFAULT_LAT","DEFAULT_LONG","COMPANY_SYMBOL_CODE","defaultData","VTS_OUTDOOR_URL","VTS_DARK_URL","VTS_BLACK_AND_WHITE_URL","VTS_AERIAL_URL","latLongToEastingNorthing","lat","long","point","toOsGrid","eastingNorthingToLatLong","easting","northing","latLong","toLatLon","latitude","longitude","latLongToOsGridRef","toString","osGridRefToLatLong","osGridRef","parse","getCoordinateGridRef","feature","geometry","type","coordinates","getCentroidGridRef","centre","defaultConfig","zoom","center","EVENTS","mapReady","interactMarkerChange","drawReady","drawCreated","drawEdited","drawCancelled","formSubmitFactory","buttons","onFormSubmit","e","submitter","HTMLButtonElement","includes","preventDefault","initMaps","config","assetPath","apiPath","data","locations","document","querySelectorAll","geospatials","length","form","closest","Array","from","addEventListener","forEach","location","index","geospatial","makeTileRequestTransformer","transformTileRequest","url","resourceType","startsWith","replace","window","origin","headers","encodeURIComponent","spritesPath","path","substring","createMap","mapId","initConfig","mapsConfig","logoAltText","interactPlugin","markerColor","outdoor","dark","interactionModes","multiSelect","map","enableFullscreen","autoColorScheme","mapProvider","behaviour","minZoom","maxZoom","containerHeight","enableZoomControls","transformRequest","plugins","mapStyles","id","label","thumbnail","logo","attribution","String","fromCodePoint","Date","getFullYear","backgroundColor","mapColorScheme","appColorScheme","osNamesURL","width","showMarker","units","centerMap","addMarker","flyTo","essential","getMapLayers","layers","trimmed","trim","split","getMapCountryLayers","country","datasets","push","geojson","showInKey","showInMenu","style","stroke","strokeWidth","fill"],"sources":["../../../src/client/javascripts/map.js"],"sourcesContent":["// @ts-expect-error - no types\nimport InteractiveMap from '@defra/interactive-map'\n// @ts-expect-error - no types\nimport createInteractPlugin from '@defra/interactive-map/plugins/interact'\n// @ts-expect-error - no types\nimport createMapStylesPlugin from '@defra/interactive-map/plugins/map-styles'\n// @ts-expect-error - no types\nimport createScaleBarPlugin from '@defra/interactive-map/plugins/scale-bar'\n// @ts-expect-error - no types\nimport createSearchPlugin from '@defra/interactive-map/plugins/search'\n// @ts-expect-error - no types\nimport maplibreProvider from '@defra/interactive-map/providers/maplibre'\nimport { centroid } from '@turf/centroid'\n// @ts-expect-error - no types\nimport OsGridRef, { LatLon } from 'geodesy/osgridref.js'\n\nimport { processGeospatial } from '~/src/client/javascripts/geospatial-map.js'\nimport { processLocation } from '~/src/client/javascripts/location-map.js'\n\n// Center of UK\nconst DEFAULT_LAT = 53.825564\nconst DEFAULT_LONG = -2.421975\nconst COMPANY_SYMBOL_CODE = 169\n\nconst defaultData = {\n VTS_OUTDOOR_URL: '/api/maps/vts/OS_VTS_3857_Outdoor.json',\n VTS_DARK_URL: '/api/maps/vts/OS_VTS_3857_Dark.json',\n VTS_BLACK_AND_WHITE_URL: '/api/maps/vts/OS_VTS_3857_Black_and_White.json',\n VTS_AERIAL_URL: '/api/maps/vts/esri-aerial.json'\n}\n\n/**\n * Converts lat long to easting and northing\n * @param {object} param\n * @param {number} param.lat\n * @param {number} param.long\n * @returns {{ easting: number, northing: number }}\n */\nexport function latLongToEastingNorthing({ lat, long }) {\n const point = new LatLon(lat, long)\n\n return point.toOsGrid()\n}\n\n/**\n * Converts easting and northing to lat long\n * @param {object} param\n * @param {number} param.easting\n * @param {number} param.northing\n * @returns {{ lat: number, long: number }}\n */\nexport function eastingNorthingToLatLong({ easting, northing }) {\n const point = new OsGridRef(easting, northing)\n const latLong = point.toLatLon()\n\n return { lat: latLong.latitude, long: latLong.longitude }\n}\n\n/**\n * Converts lat long to an ordnance survey grid reference\n * @param {object} param\n * @param {number} param.lat\n * @param {number} param.long\n * @returns {string}\n */\nexport function latLongToOsGridRef({ lat, long }) {\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n}\n\n/**\n * Converts an ordnance survey grid reference to lat long\n * @param {string} osGridRef\n * @returns {{ lat: number, long: number }}\n */\nexport function osGridRefToLatLong(osGridRef) {\n const point = OsGridRef.parse(osGridRef)\n const latLong = point.toLatLon()\n\n return { lat: latLong.latitude, long: latLong.longitude }\n}\n\n/**\n * Get the grid ref from the first coordinate of a long/lat feature\n * @param {Feature} feature\n */\nexport function getCoordinateGridRef(feature) {\n if (feature.geometry.type === 'Point') {\n const [long, lat] = feature.geometry.coordinates\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n } else if (feature.geometry.type === 'LineString') {\n const [long, lat] = feature.geometry.coordinates[0]\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n } else {\n const [long, lat] = feature.geometry.coordinates[0][0]\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n }\n}\n\n/**\n * Get the centroid grid ref from a long/lat feature\n * @param {Feature} feature\n */\nexport function getCentroidGridRef(feature) {\n if (feature.geometry.type === 'Point') {\n const [long, lat] = feature.geometry.coordinates\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n } else {\n const centre = centroid(feature)\n const [long, lat] = centre.geometry.coordinates\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n }\n}\n\n/** @type {InteractiveMapInitConfig} */\nexport const defaultConfig = {\n zoom: '6',\n center: [DEFAULT_LONG, DEFAULT_LAT]\n}\n\nexport const EVENTS = {\n mapReady: 'map:ready',\n interactMarkerChange: 'interact:markerchange',\n drawReady: 'draw:ready',\n drawCreated: 'draw:created',\n drawEdited: 'draw:edited',\n drawCancelled: 'draw:cancelled'\n}\n\n/**\n * Make a form submit handler that only allows submissions from allowed buttons\n * @param {HTMLButtonElement[]} buttons - the form buttons to allow submissions\n */\nexport function formSubmitFactory(buttons) {\n /**\n * The submit handler\n * @param {SubmitEvent} e\n */\n const onFormSubmit = function (e) {\n if (\n !(e.submitter instanceof HTMLButtonElement) ||\n !buttons.includes(e.submitter)\n ) {\n e.preventDefault()\n }\n }\n\n return onFormSubmit\n}\n\n/**\n * Initialise location maps\n * @param {Partial<MapsEnvironmentConfig>} config - the map configuration\n */\nexport function initMaps(config = {}) {\n const {\n assetPath = '/assets',\n apiPath = '/form/api',\n data = defaultData\n } = config\n const locations = document.querySelectorAll('.app-location-field')\n const geospatials = document.querySelectorAll('.app-geospatial-field')\n\n // TODO: Fix this in `interactive-map`\n // If there are location components on the page fix up the main form submit\n // handler so it doesn't fire when using the integrated map search feature\n if (locations.length) {\n const form = locations[0].closest('form')\n\n if (form === null) {\n return\n }\n\n const buttons = Array.from(form.querySelectorAll('button'))\n form.addEventListener('submit', formSubmitFactory(buttons), false)\n }\n\n if (geospatials.length) {\n const form = geospatials[0].closest('form')\n\n if (form === null) {\n return\n }\n\n const buttons = Array.from(form.querySelectorAll('button'))\n form.addEventListener('submit', formSubmitFactory(buttons), false)\n }\n\n locations.forEach((location, index) => {\n processLocation({ assetPath, apiPath, data }, location, index)\n })\n\n geospatials.forEach((geospatial, index) => {\n processGeospatial({ assetPath, apiPath, data }, geospatial, index)\n })\n}\n\n/**\n * OS API request proxy factory\n * @param {string} apiPath - the root API path\n */\nexport function makeTileRequestTransformer(apiPath) {\n /**\n * Proxy OS API requests via our server\n * @param {string} url - the request URL\n * @param {string} resourceType - the resource type\n */\n return function transformTileRequest(url, resourceType) {\n if (url.startsWith('https://api.os.uk')) {\n if (resourceType === 'Tile') {\n return {\n url: url.replace(\n 'https://api.os.uk/maps/vector/v1/vts',\n `${window.location.origin}${apiPath}`\n ),\n headers: {}\n }\n }\n\n if (resourceType !== 'Style') {\n return {\n url: `${apiPath}/map-proxy?url=${encodeURIComponent(url)}`,\n headers: {}\n }\n }\n }\n\n const spritesPath =\n 'https://raw.githubusercontent.com/OrdnanceSurvey/OS-Vector-Tile-API-Stylesheets/main'\n\n // Proxy sprite requests\n if (url.startsWith(spritesPath)) {\n const path = url.substring(spritesPath.length)\n return {\n url: `${apiPath}/maps/vts${path}`,\n headers: {}\n }\n }\n\n return { url, headers: {} }\n }\n}\n\n/**\n * Create a Defra map instance\n * @param {string} mapId - the map id\n * @param {InteractiveMapInitConfig} initConfig - the map initial configuration\n * @param {MapsEnvironmentConfig} mapsConfig - the map environment params\n */\nexport function createMap(mapId, initConfig, mapsConfig) {\n const { assetPath, apiPath, data = defaultData } = mapsConfig\n const logoAltText = 'Ordnance survey logo'\n const interactPlugin = createInteractPlugin({\n markerColor: { outdoor: '#ff0000', dark: '#00ff00' },\n interactionModes: ['placeMarker'],\n multiSelect: false\n })\n\n /** @type {InteractiveMap} */\n const map = new InteractiveMap(mapId, {\n enableFullscreen: true,\n autoColorScheme: false,\n mapProvider: maplibreProvider(),\n behaviour: 'inline',\n minZoom: 6,\n maxZoom: 18,\n containerHeight: '400px',\n enableZoomControls: true,\n transformRequest: makeTileRequestTransformer(apiPath),\n ...initConfig,\n plugins: [\n createMapStylesPlugin({\n mapStyles: [\n {\n id: 'outdoor',\n label: 'Outdoor',\n url: data.VTS_OUTDOOR_URL,\n thumbnail: `${assetPath}/interactive-map/assets/images/outdoor-map-thumb.jpg`,\n logo: `${assetPath}/interactive-map/assets/images/os-logo.svg`,\n logoAltText,\n attribution: `Contains OS data ${String.fromCodePoint(COMPANY_SYMBOL_CODE)} Crown copyright and database rights ${new Date().getFullYear()}`,\n backgroundColor: '#f5f5f0'\n },\n {\n id: 'dark',\n label: 'Dark',\n url: data.VTS_DARK_URL,\n mapColorScheme: 'dark',\n appColorScheme: 'dark',\n thumbnail: `${assetPath}/interactive-map/assets/images/dark-map-thumb.jpg`,\n logo: `${assetPath}/interactive-map/assets/images/os-logo-white.svg`,\n logoAltText,\n attribution: `Contains OS data ${String.fromCodePoint(COMPANY_SYMBOL_CODE)} Crown copyright and database rights ${new Date().getFullYear()}`\n },\n {\n id: 'black-and-white',\n label: 'Black/White',\n url: data.VTS_BLACK_AND_WHITE_URL,\n thumbnail: `${assetPath}/interactive-map/assets/images/black-and-white-map-thumb.jpg`,\n logo: `${assetPath}/interactive-map/assets/images/os-logo-black.svg`,\n logoAltText,\n attribution: `Contains OS data ${String.fromCodePoint(COMPANY_SYMBOL_CODE)} Crown copyright and database rights ${new Date().getFullYear()}`\n },\n {\n id: 'aerial',\n label: 'Aerial',\n url: data.VTS_AERIAL_URL,\n thumbnail: `${assetPath}/interactive-map/assets/images/aerial-map-thumb.jpg`,\n logo: `${assetPath}/interactive-map/assets/images/esri-logo.png`,\n logoAltText: 'Powered by Esri',\n attribution: `Tiles ${String.fromCodePoint(COMPANY_SYMBOL_CODE)} Esri — Source: Esri, Maxar, Earthstar Geographics, and the GIS User Community ${new Date().getFullYear()}`\n }\n ]\n }),\n interactPlugin,\n createSearchPlugin({\n osNamesURL: `${apiPath}/geocode-proxy?query={query}`,\n width: '300px',\n showMarker: false\n }),\n createScaleBarPlugin({\n units: 'metric'\n }),\n ...(initConfig.plugins ?? [])\n ]\n })\n\n return { map, interactPlugin }\n}\n\n/**\n * Updates the marker position and moves the map view port the new location\n * @param {InteractiveMap} map - the map component instance (of InteractiveMap)\n * @param {MapLibreMap} mapProvider - the map provider instance (of MapLibreMap)\n * @param {MapCenter} center - the point\n */\nexport function centerMap(map, mapProvider, center) {\n // Move the 'location' marker to the new point\n map.addMarker('location', center)\n\n // Pan & zoom the map to the new valid location\n mapProvider.flyTo({\n center,\n zoom: 14,\n essential: true\n })\n}\n\n/**\n * Parse CSV string layers\n * @param {string | undefined} layers\n * @returns {string[]}\n */\nexport function getMapLayers(layers) {\n const trimmed = layers?.trim()\n return trimmed ? trimmed.split(',') : []\n}\n\n/**\n * Adds the country layers to a datasets array\n * @param {string} apiPath\n * @param {string} [country]\n */\nexport function getMapCountryLayers(apiPath, country) {\n /** @type {any[]} */\n const datasets = []\n\n if (country) {\n // Add the country bounds to the datasets array to show the valid area on the map\n // and provide feedback to the user when they add features outside of the bounds.\n datasets.push(\n {\n id: 'invalid-area',\n label: 'Invalid areas',\n geojson: `${apiPath}/maps/countries.geojson?omit=${country}`,\n showInKey: false,\n showInMenu: false,\n style: {\n stroke: 'gray',\n strokeWidth: 1,\n fill: 'rgba(211,211,211,0.8)'\n }\n },\n {\n id: 'valid-area',\n label: 'Valid areas',\n geojson: `${apiPath}/maps/countries.geojson?only=${country}`,\n showInKey: false,\n showInMenu: false,\n style: {\n stroke: 'rgba(0,112,60,1)',\n strokeWidth: 1\n }\n }\n )\n }\n\n return datasets\n}\n\n/**\n * @typedef {object} InteractiveMap - an instance of a InteractiveMap\n * @property {Function} on - register callback listeners to map events\n * @property {Function} addPanel - adds a new panel to the map\n * @property {Function} addMarker - adds/updates a marker\n * @property {Function} removeMarker - removes a marker\n * @property {Function} addButton - adds/updates a button\n * @property {Function} toggleButtonState - toggle the state of a button\n */\n\n/**\n * @typedef {object} MapLibreMap\n * @property {Function} flyTo - pans/zooms to a new location\n * @property {Function} fitBounds - fits the my to the new bounds\n */\n\n/**\n * @typedef {[number, number]} MapCenter - Map center point as [long, lat]\n */\n\n/**\n * @typedef {object} InteractiveMapInitConfig - additional config that can be provided to InteractiveMap\n * @property {string} zoom - the zoom level of the map\n * @property {MapCenter} center - the center point of the map\n * @property {{ id: string, coords: MapCenter }[]} [markers] - the markers to add to the map\n * @property {any[]} [plugins] - additional plugins\n */\n\n/**\n * @typedef {object} TileData\n * @property {string} VTS_OUTDOOR_URL - the outdoor tile URL\n * @property {string} VTS_DARK_URL - the dark tile URL\n * @property {string} VTS_BLACK_AND_WHITE_URL - the black and white tile URL\n * @property {string} VTS_AERIAL_URL - the aerial tile URL\n */\n\n/**\n * @typedef {object} MapsEnvironmentConfig\n * @property {string} assetPath - the root asset path\n * @property {string} apiPath - the root API path\n * @property {TileData} data - the tile data config\n */\n\n/**\n * @typedef {object} UIManagerOptions\n * @property {string} [geometryTypes] - the CSV list of geometry types that a user can create\n */\n\n/**\n * @import { Feature } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"map.js","names":["InteractiveMap","createInteractPlugin","createMapStylesPlugin","createScaleBarPlugin","createSearchPlugin","maplibreProvider","centroid","OsGridRef","LatLon","processGeospatial","processLocation","DEFAULT_LAT","DEFAULT_LONG","COMPANY_SYMBOL_CODE","defaultData","VTS_OUTDOOR_URL","VTS_DARK_URL","VTS_BLACK_AND_WHITE_URL","VTS_AERIAL_URL","latLongToEastingNorthing","lat","long","point","toOsGrid","eastingNorthingToLatLong","easting","northing","latLong","toLatLon","latitude","longitude","latLongToOsGridRef","toString","osGridRefToLatLong","osGridRef","parse","getCoordinateGridRef","feature","geometry","type","coordinates","getCentroidGridRef","centre","defaultConfig","zoom","center","EVENTS","mapReady","interactMarkerChange","drawReady","drawCreated","drawEdited","drawCancelled","formSubmitFactory","buttons","onFormSubmit","e","submitter","HTMLButtonElement","includes","preventDefault","initMaps","config","assetPath","apiPath","data","locations","document","querySelectorAll","geospatials","length","form","closest","Array","from","addEventListener","forEach","location","index","geospatial","makeTileRequestTransformer","transformTileRequest","url","resourceType","startsWith","replace","window","origin","headers","encodeURIComponent","spritesPath","path","substring","createMap","mapId","initConfig","mapsConfig","logoAltText","interactPlugin","markerColor","outdoor","dark","interactionModes","multiSelect","map","enableFullscreen","autoColorScheme","mapProvider","behaviour","minZoom","maxZoom","containerHeight","enableZoomControls","transformRequest","plugins","mapStyles","id","label","thumbnail","logo","attribution","String","fromCodePoint","Date","getFullYear","backgroundColor","mapColorScheme","appColorScheme","osNamesURL","width","showMarker","units","centerMap","addMarker","flyTo","essential","getMapLayers","layers","trimmed","trim","split","getMapCountryLayers","country","datasets","push","geojson","showInKey","showInMenu","style","stroke","strokeWidth","fill"],"sources":["../../../src/client/javascripts/map.js"],"sourcesContent":["// @ts-expect-error - no types\nimport InteractiveMap from '@defra/interactive-map'\n// @ts-expect-error - no types\nimport createInteractPlugin from '@defra/interactive-map/plugins/interact'\n// @ts-expect-error - no types\nimport createMapStylesPlugin from '@defra/interactive-map/plugins/map-styles'\n// @ts-expect-error - no types\nimport createScaleBarPlugin from '@defra/interactive-map/plugins/scale-bar'\n// @ts-expect-error - no types\nimport createSearchPlugin from '@defra/interactive-map/plugins/search'\n// @ts-expect-error - no types\nimport maplibreProvider from '@defra/interactive-map/providers/maplibre'\nimport { centroid } from '@turf/centroid'\n// @ts-expect-error - no types\nimport OsGridRef, { LatLon } from 'geodesy/osgridref.js'\n\nimport { processGeospatial } from '~/src/client/javascripts/geospatial-map.js'\nimport { processLocation } from '~/src/client/javascripts/location-map.js'\n\n// Center of UK\nconst DEFAULT_LAT = 53.825564\nconst DEFAULT_LONG = -2.421975\nconst COMPANY_SYMBOL_CODE = 169\n\nconst defaultData = {\n VTS_OUTDOOR_URL: '/api/maps/vts/OS_VTS_3857_Outdoor.json',\n VTS_DARK_URL: '/api/maps/vts/OS_VTS_3857_Dark.json',\n VTS_BLACK_AND_WHITE_URL: '/api/maps/vts/OS_VTS_3857_Black_and_White.json',\n VTS_AERIAL_URL: '/api/maps/vts/esri-aerial.json'\n}\n\n/**\n * Converts lat long to easting and northing\n * @param {object} param\n * @param {number} param.lat\n * @param {number} param.long\n * @returns {{ easting: number, northing: number }}\n */\nexport function latLongToEastingNorthing({ lat, long }) {\n const point = new LatLon(lat, long)\n\n return point.toOsGrid()\n}\n\n/**\n * Converts easting and northing to lat long\n * @param {object} param\n * @param {number} param.easting\n * @param {number} param.northing\n * @returns {{ lat: number, long: number }}\n */\nexport function eastingNorthingToLatLong({ easting, northing }) {\n const point = new OsGridRef(easting, northing)\n const latLong = point.toLatLon()\n\n return { lat: latLong.latitude, long: latLong.longitude }\n}\n\n/**\n * Converts lat long to an ordnance survey grid reference\n * @param {object} param\n * @param {number} param.lat\n * @param {number} param.long\n * @returns {string}\n */\nexport function latLongToOsGridRef({ lat, long }) {\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n}\n\n/**\n * Converts an ordnance survey grid reference to lat long\n * @param {string} osGridRef\n * @returns {{ lat: number, long: number }}\n */\nexport function osGridRefToLatLong(osGridRef) {\n const point = OsGridRef.parse(osGridRef)\n const latLong = point.toLatLon()\n\n return { lat: latLong.latitude, long: latLong.longitude }\n}\n\n/**\n * Get the grid ref from the first coordinate of a long/lat feature\n * @param {Feature} feature\n */\nexport function getCoordinateGridRef(feature) {\n if (feature.geometry.type === 'Point') {\n const [long, lat] = feature.geometry.coordinates\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n } else if (feature.geometry.type === 'LineString') {\n const [long, lat] = feature.geometry.coordinates[0]\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n } else {\n const [long, lat] = feature.geometry.coordinates[0][0]\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n }\n}\n\n/**\n * Get the centroid grid ref from a long/lat feature\n * @param {Feature} feature\n */\nexport function getCentroidGridRef(feature) {\n if (feature.geometry.type === 'Point') {\n const [long, lat] = feature.geometry.coordinates\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n } else {\n const centre = centroid(feature)\n const [long, lat] = centre.geometry.coordinates\n const point = new LatLon(lat, long)\n\n return point.toOsGrid().toString()\n }\n}\n\n/** @type {InteractiveMapInitConfig} */\nexport const defaultConfig = {\n zoom: '6',\n center: [DEFAULT_LONG, DEFAULT_LAT]\n}\n\nexport const EVENTS = {\n mapReady: 'map:ready',\n interactMarkerChange: 'interact:markerchange',\n drawReady: 'draw:ready',\n drawCreated: 'draw:created',\n drawEdited: 'draw:edited',\n drawCancelled: 'draw:cancelled'\n}\n\n/**\n * Make a form submit handler that only allows submissions from allowed buttons\n * @param {HTMLButtonElement[]} buttons - the form buttons to allow submissions\n */\nexport function formSubmitFactory(buttons) {\n /**\n * The submit handler\n * @param {SubmitEvent} e\n */\n const onFormSubmit = function (e) {\n if (\n !(e.submitter instanceof HTMLButtonElement) ||\n !buttons.includes(e.submitter)\n ) {\n e.preventDefault()\n }\n }\n\n return onFormSubmit\n}\n\n/**\n * Initialise location maps\n * @param {Partial<MapsEnvironmentConfig>} config - the map configuration\n */\nexport function initMaps(config = {}) {\n const {\n assetPath = '/assets',\n apiPath = '/form/api',\n data = defaultData\n } = config\n const locations = document.querySelectorAll('.app-location-field')\n const geospatials = document.querySelectorAll('.app-geospatial-field')\n\n // TODO: Fix this in `interactive-map`\n // If there are location components on the page fix up the main form submit\n // handler so it doesn't fire when using the integrated map search feature\n if (locations.length) {\n const form = locations[0].closest('form')\n\n if (form === null) {\n return\n }\n\n const buttons = Array.from(form.querySelectorAll('button'))\n form.addEventListener('submit', formSubmitFactory(buttons), false)\n }\n\n if (geospatials.length) {\n const form = geospatials[0].closest('form')\n\n if (form === null) {\n return\n }\n\n const buttons = Array.from(form.querySelectorAll('button'))\n form.addEventListener('submit', formSubmitFactory(buttons), false)\n }\n\n locations.forEach((location, index) => {\n processLocation({ assetPath, apiPath, data }, location, index)\n })\n\n geospatials.forEach((geospatial, index) => {\n processGeospatial({ assetPath, apiPath, data }, geospatial, index)\n })\n}\n\n/**\n * OS API request proxy factory\n * @param {string} apiPath - the root API path\n */\nexport function makeTileRequestTransformer(apiPath) {\n /**\n * Proxy OS API requests via our server\n * @param {string} url - the request URL\n * @param {string} resourceType - the resource type\n */\n return function transformTileRequest(url, resourceType) {\n if (url.startsWith('https://api.os.uk')) {\n if (resourceType === 'Tile') {\n return {\n url: url.replace(\n 'https://api.os.uk/maps/vector/v1/vts',\n `${window.location.origin}${apiPath}`\n ),\n headers: {}\n }\n }\n\n if (resourceType !== 'Style') {\n return {\n url: `${apiPath}/map-proxy?url=${encodeURIComponent(url)}`,\n headers: {}\n }\n }\n }\n\n const spritesPath =\n 'https://raw.githubusercontent.com/OrdnanceSurvey/OS-Vector-Tile-API-Stylesheets/main'\n\n // Proxy sprite requests\n if (url.startsWith(spritesPath)) {\n const path = url.substring(spritesPath.length)\n return {\n url: `${apiPath}/maps/vts${path}`,\n headers: {}\n }\n }\n\n return { url, headers: {} }\n }\n}\n\n/**\n * Create a Defra map instance\n * @param {string} mapId - the map id\n * @param {InteractiveMapInitConfig} initConfig - the map initial configuration\n * @param {MapsEnvironmentConfig} mapsConfig - the map environment params\n */\nexport function createMap(mapId, initConfig, mapsConfig) {\n const { assetPath, apiPath, data = defaultData } = mapsConfig\n const logoAltText = 'Ordnance survey logo'\n const interactPlugin = createInteractPlugin({\n markerColor: { outdoor: '#ff0000', dark: '#00ff00' },\n interactionModes: ['placeMarker'],\n multiSelect: false\n })\n\n /** @type {InteractiveMap} */\n const map = new InteractiveMap(mapId, {\n enableFullscreen: true,\n autoColorScheme: false,\n mapProvider: maplibreProvider(),\n behaviour: 'inline',\n minZoom: 6,\n maxZoom: 18,\n containerHeight: '400px',\n enableZoomControls: true,\n transformRequest: makeTileRequestTransformer(apiPath),\n ...initConfig,\n plugins: [\n createMapStylesPlugin({\n mapStyles: [\n {\n id: 'outdoor',\n label: 'Outdoor',\n url: data.VTS_OUTDOOR_URL,\n thumbnail: `${assetPath}/interactive-map/assets/images/outdoor-map-thumb.jpg`,\n logo: `${assetPath}/interactive-map/assets/images/os-logo.svg`,\n logoAltText,\n attribution: `Contains OS data ${String.fromCodePoint(COMPANY_SYMBOL_CODE)} Crown copyright and database rights ${new Date().getFullYear()}`,\n backgroundColor: '#f5f5f0'\n },\n {\n id: 'dark',\n label: 'Dark',\n url: data.VTS_DARK_URL,\n mapColorScheme: 'dark',\n appColorScheme: 'dark',\n thumbnail: `${assetPath}/interactive-map/assets/images/dark-map-thumb.jpg`,\n logo: `${assetPath}/interactive-map/assets/images/os-logo-white.svg`,\n logoAltText,\n attribution: `Contains OS data ${String.fromCodePoint(COMPANY_SYMBOL_CODE)} Crown copyright and database rights ${new Date().getFullYear()}`\n },\n {\n id: 'black-and-white',\n label: 'Black/White',\n url: data.VTS_BLACK_AND_WHITE_URL,\n thumbnail: `${assetPath}/interactive-map/assets/images/black-and-white-map-thumb.jpg`,\n logo: `${assetPath}/interactive-map/assets/images/os-logo-black.svg`,\n logoAltText,\n attribution: `Contains OS data ${String.fromCodePoint(COMPANY_SYMBOL_CODE)} Crown copyright and database rights ${new Date().getFullYear()}`\n },\n {\n id: 'aerial',\n label: 'Aerial',\n url: data.VTS_AERIAL_URL,\n thumbnail: `${assetPath}/interactive-map/assets/images/aerial-map-thumb.jpg`,\n logo: `${assetPath}/interactive-map/assets/images/esri-logo.png`,\n logoAltText: 'Powered by Esri',\n attribution: `Tiles ${String.fromCodePoint(COMPANY_SYMBOL_CODE)} Esri — Source: Esri, Maxar, Earthstar Geographics, and the GIS User Community ${new Date().getFullYear()}`\n }\n ]\n }),\n interactPlugin,\n createSearchPlugin({\n osNamesURL: `${apiPath}/geocode-proxy?query={query}`,\n width: '300px',\n showMarker: false\n }),\n createScaleBarPlugin({\n units: 'metric'\n }),\n ...(initConfig.plugins ?? [])\n ]\n })\n\n return { map, interactPlugin }\n}\n\n/**\n * Updates the marker position and moves the map view port the new location\n * @param {InteractiveMap} map - the map component instance (of InteractiveMap)\n * @param {MapLibreMap} mapProvider - the map provider instance (of MapLibreMap)\n * @param {MapCenter} center - the point\n */\nexport function centerMap(map, mapProvider, center) {\n // Move the 'location' marker to the new point\n map.addMarker('location', center)\n\n // Pan & zoom the map to the new valid location\n mapProvider.flyTo({\n center,\n zoom: 14,\n essential: true\n })\n}\n\n/**\n * Parse CSV string layers\n * @param {string | undefined} layers\n * @returns {string[]}\n */\nexport function getMapLayers(layers) {\n const trimmed = layers?.trim()\n return trimmed ? trimmed.split(',') : []\n}\n\n/**\n * Adds the country layers to a datasets array\n * @param {string} apiPath\n * @param {string} [country]\n */\nexport function getMapCountryLayers(apiPath, country) {\n /** @type {any[]} */\n const datasets = []\n\n if (country) {\n // Add the country bounds to the datasets array to show the valid area on the map\n // and provide feedback to the user when they add features outside of the bounds.\n datasets.push(\n {\n id: 'invalid-area',\n label: 'Invalid areas',\n geojson: `${apiPath}/maps/countries.geojson?omit=${country}`,\n showInKey: false,\n showInMenu: false,\n style: {\n stroke: 'gray',\n strokeWidth: 1,\n fill: 'rgba(211,211,211,0.8)'\n }\n },\n {\n id: 'valid-area',\n label: 'Valid areas',\n geojson: `${apiPath}/maps/countries.geojson?only=${country}`,\n showInKey: false,\n showInMenu: false,\n style: {\n stroke: 'rgba(0,112,60,1)',\n strokeWidth: 1\n }\n }\n )\n }\n\n return datasets\n}\n\n/**\n * @typedef {object} InteractiveMap - an instance of a InteractiveMap\n * @property {Function} on - register callback listeners to map events\n * @property {Function} addPanel - adds a new panel to the map\n * @property {Function} addMarker - adds/updates a marker\n * @property {Function} removeMarker - removes a marker\n * @property {Function} addButton - adds/updates a button\n * @property {Function} toggleButtonState - toggle the state of a button\n */\n\n/**\n * @typedef {object} MapLibreMap\n * @property {Function} flyTo - pans/zooms to a new location\n * @property {Function} fitBounds - fits the my to the new bounds\n */\n\n/**\n * @typedef {[number, number]} MapCenter - Map center point as [long, lat]\n */\n\n/**\n * @typedef {object} InteractiveMapInitConfig - additional config that can be provided to InteractiveMap\n * @property {string} zoom - the zoom level of the map\n * @property {MapCenter} center - the center point of the map\n * @property {{ id: string, coords: MapCenter }[]} [markers] - the markers to add to the map\n * @property {any[]} [plugins] - additional plugins\n */\n\n/**\n * @typedef {object} TileData\n * @property {string} VTS_OUTDOOR_URL - the outdoor tile URL\n * @property {string} VTS_DARK_URL - the dark tile URL\n * @property {string} VTS_BLACK_AND_WHITE_URL - the black and white tile URL\n * @property {string} VTS_AERIAL_URL - the aerial tile URL\n */\n\n/**\n * @typedef {object} MapsEnvironmentConfig\n * @property {string} assetPath - the root asset path\n * @property {string} apiPath - the root API path\n * @property {TileData} data - the tile data config\n */\n\n/**\n * @typedef {object} UIManagerOptions\n * @property {string} [geometryTypes] - the CSV list of geometry types that a user can create\n */\n\n/**\n * @import { Feature } from '~/src/server/plugins/engine/types.js'\n */\n\n/**\n * Supported language codes\n * @typedef {('en-GB'|'cy')} LanguageCode\n */\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type FormDefinition } from '@defra/forms-model';
|
|
2
|
+
/**
|
|
3
|
+
* A minimal, schema-valid V2 definition: one YesNo question page and a
|
|
4
|
+
* summary page. Each call returns a fresh object, so tests can mutate their
|
|
5
|
+
* copy freely without affecting each other.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildDefinition(): FormDefinition;
|
|
8
|
+
/**
|
|
9
|
+
* A definition that passes schema validation but cannot be used by the
|
|
10
|
+
* engine: a ListItemRef condition points at the YesNoField (boolean), so the
|
|
11
|
+
* condition expression builder produces an unparseable expression. Distilled
|
|
12
|
+
* from a real production incident.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildBrokenConditionDefinition(): FormDefinition;
|
|
15
|
+
/**
|
|
16
|
+
* A schema-valid definition whose first page names a controller that is
|
|
17
|
+
* neither built in nor registered by the host application.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildUnknownControllerDefinition(): FormDefinition;
|
|
20
|
+
/**
|
|
21
|
+
* Schema-valid (component types are free strings in the schema), but the
|
|
22
|
+
* question uses a type the engine has no component class for.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildUnknownComponentDefinition(): FormDefinition;
|
|
25
|
+
/**
|
|
26
|
+
* A definition that fails schema validation: the question page appears
|
|
27
|
+
* twice, violating the pages uniqueness rule.
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildSchemaInvalidDefinition(): FormDefinition;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { ComponentType, ConditionType, ControllerType, Engine, OperatorName, SchemaVersion } from '@defra/forms-model';
|
|
2
|
+
const YES_NO_COMPONENT_ID = 'a7c0242f-2a31-45b2-8c71-ff2ac7f53288';
|
|
3
|
+
const USER_TYPE_LIST_ID = '4fa26e9c-07cf-47cd-a9dd-5cec0dd3f544';
|
|
4
|
+
const EXISTING_USER_ITEM_ID = '55fe0067-d011-4d33-886c-e1aa266637c3';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A minimal, schema-valid V2 definition: one YesNo question page and a
|
|
8
|
+
* summary page. Each call returns a fresh object, so tests can mutate their
|
|
9
|
+
* copy freely without affecting each other.
|
|
10
|
+
*/
|
|
11
|
+
export function buildDefinition() {
|
|
12
|
+
return {
|
|
13
|
+
name: 'Stub definition',
|
|
14
|
+
engine: Engine.V2,
|
|
15
|
+
schema: SchemaVersion.V2,
|
|
16
|
+
startPage: '/summary',
|
|
17
|
+
pages: [{
|
|
18
|
+
id: '449c053b-9201-4312-9a75-187afc6ba48b',
|
|
19
|
+
path: '/licence',
|
|
20
|
+
title: 'Licence',
|
|
21
|
+
components: [{
|
|
22
|
+
id: YES_NO_COMPONENT_ID,
|
|
23
|
+
name: 'xVrYaJ',
|
|
24
|
+
type: ComponentType.YesNoField,
|
|
25
|
+
title: 'Do you have a licence?',
|
|
26
|
+
shortDescription: 'Licence',
|
|
27
|
+
options: {
|
|
28
|
+
required: true
|
|
29
|
+
}
|
|
30
|
+
}],
|
|
31
|
+
next: []
|
|
32
|
+
}, {
|
|
33
|
+
id: '449c053b-9201-4312-9a75-187afc6ba48c',
|
|
34
|
+
path: '/summary',
|
|
35
|
+
title: 'Summary',
|
|
36
|
+
controller: ControllerType.Summary,
|
|
37
|
+
components: []
|
|
38
|
+
}],
|
|
39
|
+
lists: [],
|
|
40
|
+
sections: [],
|
|
41
|
+
conditions: []
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A definition that passes schema validation but cannot be used by the
|
|
47
|
+
* engine: a ListItemRef condition points at the YesNoField (boolean), so the
|
|
48
|
+
* condition expression builder produces an unparseable expression. Distilled
|
|
49
|
+
* from a real production incident.
|
|
50
|
+
*/
|
|
51
|
+
export function buildBrokenConditionDefinition() {
|
|
52
|
+
const definition = buildDefinition();
|
|
53
|
+
definition.name = 'Broken condition fixture';
|
|
54
|
+
const questionPage = definition.pages[0]
|
|
55
|
+
// A YesNoField cannot legitimately carry a custom list — that is the
|
|
56
|
+
// corruption this fixture models — so the TS component types (rightly)
|
|
57
|
+
// have no `list` property here and a cast is required.
|
|
58
|
+
;
|
|
59
|
+
questionPage.components[0].list = USER_TYPE_LIST_ID;
|
|
60
|
+
definition.lists = [{
|
|
61
|
+
id: USER_TYPE_LIST_ID,
|
|
62
|
+
name: 'XtfRYR',
|
|
63
|
+
title: 'User type list',
|
|
64
|
+
type: 'string',
|
|
65
|
+
items: [{
|
|
66
|
+
id: EXISTING_USER_ITEM_ID,
|
|
67
|
+
text: 'existing user',
|
|
68
|
+
value: 'existing user'
|
|
69
|
+
}, {
|
|
70
|
+
id: '2277c7e5-7fef-46c6-993b-d294116d6d6b',
|
|
71
|
+
text: 'new user',
|
|
72
|
+
value: 'new user'
|
|
73
|
+
}]
|
|
74
|
+
}];
|
|
75
|
+
definition.conditions = [{
|
|
76
|
+
id: '3f9d3a35-6dee-4706-806c-3f776129f631',
|
|
77
|
+
displayName: 'Existing user',
|
|
78
|
+
items: [{
|
|
79
|
+
id: '7d7f58ee-c860-4d24-8a13-de5cb9af53d8',
|
|
80
|
+
componentId: YES_NO_COMPONENT_ID,
|
|
81
|
+
operator: OperatorName.Is,
|
|
82
|
+
type: ConditionType.ListItemRef,
|
|
83
|
+
value: {
|
|
84
|
+
listId: USER_TYPE_LIST_ID,
|
|
85
|
+
itemId: [EXISTING_USER_ITEM_ID]
|
|
86
|
+
}
|
|
87
|
+
}]
|
|
88
|
+
}];
|
|
89
|
+
return definition;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* A schema-valid definition whose first page names a controller that is
|
|
94
|
+
* neither built in nor registered by the host application.
|
|
95
|
+
*/
|
|
96
|
+
export function buildUnknownControllerDefinition() {
|
|
97
|
+
const definition = buildDefinition();
|
|
98
|
+
definition.name = 'Unknown controller fixture';
|
|
99
|
+
definition.pages[0].controller = 'NoSuchPageController';
|
|
100
|
+
return definition;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Schema-valid (component types are free strings in the schema), but the
|
|
105
|
+
* question uses a type the engine has no component class for.
|
|
106
|
+
*/
|
|
107
|
+
export function buildUnknownComponentDefinition() {
|
|
108
|
+
const definition = buildDefinition();
|
|
109
|
+
definition.name = 'Unknown component fixture';
|
|
110
|
+
const questionPage = definition.pages[0];
|
|
111
|
+
questionPage.components[0].type = 'MyUnknownField';
|
|
112
|
+
return definition;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* A definition that fails schema validation: the question page appears
|
|
117
|
+
* twice, violating the pages uniqueness rule.
|
|
118
|
+
*/
|
|
119
|
+
export function buildSchemaInvalidDefinition() {
|
|
120
|
+
const definition = buildDefinition();
|
|
121
|
+
definition.name = 'Schema invalid fixture';
|
|
122
|
+
definition.pages.push(buildDefinition().pages[0]);
|
|
123
|
+
return definition;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=definitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.js","names":["ComponentType","ConditionType","ControllerType","Engine","OperatorName","SchemaVersion","YES_NO_COMPONENT_ID","USER_TYPE_LIST_ID","EXISTING_USER_ITEM_ID","buildDefinition","name","engine","V2","schema","startPage","pages","id","path","title","components","type","YesNoField","shortDescription","options","required","next","controller","Summary","lists","sections","conditions","buildBrokenConditionDefinition","definition","questionPage","list","items","text","value","displayName","componentId","operator","Is","ListItemRef","listId","itemId","buildUnknownControllerDefinition","buildUnknownComponentDefinition","buildSchemaInvalidDefinition","push"],"sources":["../../../../../src/server/plugins/engine/__stubs__/definitions.ts"],"sourcesContent":["import {\n ComponentType,\n ConditionType,\n ControllerType,\n Engine,\n OperatorName,\n SchemaVersion,\n type FormDefinition,\n type PageQuestion\n} from '@defra/forms-model'\n\nconst YES_NO_COMPONENT_ID = 'a7c0242f-2a31-45b2-8c71-ff2ac7f53288'\nconst USER_TYPE_LIST_ID = '4fa26e9c-07cf-47cd-a9dd-5cec0dd3f544'\nconst EXISTING_USER_ITEM_ID = '55fe0067-d011-4d33-886c-e1aa266637c3'\n\n/**\n * A minimal, schema-valid V2 definition: one YesNo question page and a\n * summary page. Each call returns a fresh object, so tests can mutate their\n * copy freely without affecting each other.\n */\nexport function buildDefinition(): FormDefinition {\n return {\n name: 'Stub definition',\n engine: Engine.V2,\n schema: SchemaVersion.V2,\n startPage: '/summary',\n pages: [\n {\n id: '449c053b-9201-4312-9a75-187afc6ba48b',\n path: '/licence',\n title: 'Licence',\n components: [\n {\n id: YES_NO_COMPONENT_ID,\n name: 'xVrYaJ',\n type: ComponentType.YesNoField,\n title: 'Do you have a licence?',\n shortDescription: 'Licence',\n options: { required: true }\n }\n ],\n next: []\n },\n {\n id: '449c053b-9201-4312-9a75-187afc6ba48c',\n path: '/summary',\n title: 'Summary',\n controller: ControllerType.Summary,\n components: []\n }\n ],\n lists: [],\n sections: [],\n conditions: []\n }\n}\n\n/**\n * A definition that passes schema validation but cannot be used by the\n * engine: a ListItemRef condition points at the YesNoField (boolean), so the\n * condition expression builder produces an unparseable expression. Distilled\n * from a real production incident.\n */\nexport function buildBrokenConditionDefinition(): FormDefinition {\n const definition = buildDefinition()\n\n definition.name = 'Broken condition fixture'\n\n const questionPage = definition.pages[0] as PageQuestion\n // A YesNoField cannot legitimately carry a custom list — that is the\n // corruption this fixture models — so the TS component types (rightly)\n // have no `list` property here and a cast is required.\n ;(questionPage.components[0] as { list?: string }).list = USER_TYPE_LIST_ID\n definition.lists = [\n {\n id: USER_TYPE_LIST_ID,\n name: 'XtfRYR',\n title: 'User type list',\n type: 'string',\n items: [\n {\n id: EXISTING_USER_ITEM_ID,\n text: 'existing user',\n value: 'existing user'\n },\n {\n id: '2277c7e5-7fef-46c6-993b-d294116d6d6b',\n text: 'new user',\n value: 'new user'\n }\n ]\n }\n ]\n definition.conditions = [\n {\n id: '3f9d3a35-6dee-4706-806c-3f776129f631',\n displayName: 'Existing user',\n items: [\n {\n id: '7d7f58ee-c860-4d24-8a13-de5cb9af53d8',\n componentId: YES_NO_COMPONENT_ID,\n operator: OperatorName.Is,\n type: ConditionType.ListItemRef,\n value: {\n listId: USER_TYPE_LIST_ID,\n itemId: [EXISTING_USER_ITEM_ID]\n }\n }\n ]\n }\n ]\n\n return definition\n}\n\n/**\n * A schema-valid definition whose first page names a controller that is\n * neither built in nor registered by the host application.\n */\nexport function buildUnknownControllerDefinition(): FormDefinition {\n const definition = buildDefinition()\n\n definition.name = 'Unknown controller fixture'\n definition.pages[0].controller =\n 'NoSuchPageController' as unknown as ControllerType\n\n return definition\n}\n\n/**\n * Schema-valid (component types are free strings in the schema), but the\n * question uses a type the engine has no component class for.\n */\nexport function buildUnknownComponentDefinition(): FormDefinition {\n const definition = buildDefinition()\n\n definition.name = 'Unknown component fixture'\n const questionPage = definition.pages[0] as PageQuestion\n questionPage.components[0].type = 'MyUnknownField' as unknown as ComponentType\n\n return definition\n}\n\n/**\n * A definition that fails schema validation: the question page appears\n * twice, violating the pages uniqueness rule.\n */\nexport function buildSchemaInvalidDefinition(): FormDefinition {\n const definition = buildDefinition()\n\n definition.name = 'Schema invalid fixture'\n definition.pages.push(buildDefinition().pages[0])\n\n return definition\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -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":[]}
|
|
@@ -24,6 +24,7 @@ export declare class EastingNorthingField extends FormComponent {
|
|
|
24
24
|
items: import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
25
25
|
mapLayers: string;
|
|
26
26
|
country: import("@defra/forms-model").GeospatialFieldOptionsCountry | undefined;
|
|
27
|
+
lang: string;
|
|
27
28
|
label: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
28
29
|
type?: string;
|
|
29
30
|
id: string;
|
|
@@ -66,7 +67,9 @@ export declare class EastingNorthingField extends FormComponent {
|
|
|
66
67
|
uploadingLabel?: string;
|
|
67
68
|
};
|
|
68
69
|
} | {
|
|
70
|
+
instructionSummary: string;
|
|
69
71
|
instructionText: string;
|
|
72
|
+
t: (key: string, opts?: Record<string, unknown>) => string;
|
|
70
73
|
fieldset: {
|
|
71
74
|
attributes?: string | Record<string, string>;
|
|
72
75
|
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
@@ -74,6 +77,7 @@ export declare class EastingNorthingField extends FormComponent {
|
|
|
74
77
|
items: import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
75
78
|
mapLayers: string;
|
|
76
79
|
country: import("@defra/forms-model").GeospatialFieldOptionsCountry | undefined;
|
|
80
|
+
lang: string;
|
|
77
81
|
label: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
78
82
|
type?: string;
|
|
79
83
|
id: string;
|
|
@@ -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
|
});
|