@defra/interactive-map 0.0.40-alpha → 0.0.42-alpha
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/dist/css/index.css +1 -1
- package/dist/esm/im-core.js +1 -1
- package/dist/esm/im-shell.js +1 -1
- package/dist/umd/im-core.js +1 -1
- package/dist/umd/index.js +1 -1
- package/docs/api/button-definition.md +7 -8
- package/docs/api/control-definition.md +17 -1
- package/docs/api/panel-definition.md +5 -0
- package/docs/api/slots.md +50 -6
- package/docs/assets/images/slot-map.svg +61 -262
- package/docs/examples/add-polygons.mdx +8 -2
- package/docs/examples/add-symbols.mdx +8 -2
- package/docs/examples/draw-tools.mdx +3 -3
- package/docs/plugins/datasets.md +23 -15
- package/docs/plugins/draw.md +79 -16
- package/docs/plugins/map-key.md +147 -0
- package/docs/plugins/search.md +1 -1
- package/docs/plugins.md +5 -1
- package/govuk-prototype-kit.config.json +2 -0
- package/jest.setup.js +5 -0
- package/package.json +9 -1
- package/plugins/beta/draw-es/dist/esm/im-draw-es-plugin.js +1 -1
- package/plugins/beta/draw-ml/dist/esm/im-draw-ml-plugin.js +1 -1
- package/plugins/beta/draw-ml/dist/umd/im-draw-ml-plugin.js +1 -1
- package/plugins/beta/draw-ol/dist/esm/im-draw-ol-plugin.js +1 -1
- package/plugins/beta/map-styles/dist/umd/im-map-styles-plugin.js +1 -1
- package/plugins/beta/map-styles/dist/umd/index.js +1 -1
- package/plugins/beta/use-location/dist/esm/im-use-location-plugin.js +1 -1
- package/plugins/beta/use-location/dist/umd/im-use-location-plugin.js +1 -1
- package/plugins/beta/use-location/src/manifest.js +1 -1
- package/plugins/datasets/dist/css/index.css +1 -1
- package/plugins/datasets/dist/esm/esriLayerAdapter.js +1 -1
- package/plugins/datasets/dist/esm/im-datasets-ml-adapter.js +1 -1
- package/plugins/datasets/dist/esm/im-datasets-plugin.js +1 -1
- package/plugins/datasets/dist/umd/im-datasets-esri-adapter.js +1 -1
- package/plugins/datasets/dist/umd/im-datasets-ml-adapter.js +1 -1
- package/plugins/datasets/dist/umd/im-datasets-plugin.js +1 -1
- package/plugins/datasets/dist/umd/index.js +1 -1
- package/plugins/datasets/src/adapters/esri/esriLayerAdapter.test.js +175 -0
- package/plugins/datasets/src/adapters/esri/registry/esriDataset.test.js +55 -0
- package/plugins/datasets/src/adapters/loadLayerAdapter.test.js +61 -0
- package/plugins/datasets/src/adapters/maplibre/maplibreLayerAdapter.test.js +14 -0
- package/plugins/datasets/src/api/setOpacity.test.js +9 -0
- package/plugins/datasets/src/components/LayersMenu/LayersMenu.jsx +10 -25
- package/plugins/datasets/src/components/LayersMenu/LayersMenu.test.jsx +0 -42
- package/plugins/datasets/src/datasets.scss +0 -1
- package/plugins/datasets/src/fetch/createDynamicSource.js +135 -129
- package/plugins/datasets/src/fetch/createDynamicSource.test.js +318 -0
- package/plugins/datasets/src/fetch/fetchGeoJSON.test.js +83 -0
- package/plugins/datasets/src/index.test.js +36 -0
- package/plugins/datasets/src/initialise/DatasetsInit.jsx +17 -7
- package/plugins/datasets/src/initialise/DatasetsInit.test.jsx +262 -0
- package/plugins/datasets/src/initialise/initialiseDatasets.js +16 -4
- package/plugins/datasets/src/initialise/initialiseDatasets.test.js +42 -0
- package/plugins/datasets/src/manifest.js +0 -38
- package/plugins/datasets/src/manifest.test.js +49 -0
- package/plugins/datasets/src/reducers/datasetsToMenu.test.js +54 -1
- package/plugins/datasets/src/reducers/pluginState.js +3 -16
- package/plugins/datasets/src/reducers/pluginState.test.js +23 -0
- package/plugins/datasets/src/registry/dataset.js +13 -1
- package/plugins/datasets/src/registry/dataset.test.js +61 -0
- package/plugins/datasets/src/registry/datasetRegistry.js +12 -6
- package/plugins/datasets/src/registry/datasetRegistry.test.js +16 -4
- package/plugins/datasets/src/registry/isVisibleWhen.js +6 -3
- package/plugins/datasets/src/registry/isVisibleWhen.test.js +11 -1
- package/plugins/datasets/src/utils/bbox.test.js +125 -0
- package/plugins/draw/dist/esm/im-draw-ml-adapter.js +1 -1
- package/plugins/draw/dist/esm/im-draw-ol-adapter.js +1 -1
- package/plugins/draw/dist/esm/im-draw-plugin.js +1 -1
- package/plugins/draw/dist/esm/index.js +1 -1
- package/plugins/draw/dist/umd/im-draw-ml-adapter.js +2 -1
- package/plugins/draw/dist/umd/im-draw-ml-adapter.js.LICENSE.txt +1 -0
- package/plugins/draw/dist/umd/im-draw-ol-adapter.js +1 -1
- package/plugins/draw/dist/umd/im-draw-plugin.js +1 -1
- package/plugins/draw/dist/umd/index.js +1 -1
- package/plugins/draw/src/DrawInit.jsx +10 -2
- package/plugins/draw/src/DrawInit.test.jsx +51 -10
- package/plugins/draw/src/adapters/maplibre/MaplibreDrawAdapter.js +91 -11
- package/plugins/draw/src/adapters/maplibre/MaplibreDrawAdapter.test.js +246 -4
- package/plugins/draw/src/adapters/maplibre/mapboxDraw.js +109 -14
- package/plugins/draw/src/adapters/maplibre/mapboxDraw.test.js +174 -11
- package/plugins/draw/src/adapters/maplibre/modes/drawMode/clickHandlers.test.js +12 -0
- package/plugins/draw/src/adapters/maplibre/modes/drawMode/lifecycle.js +9 -1
- package/plugins/draw/src/adapters/maplibre/modes/drawMode/lifecycle.test.js +24 -3
- package/plugins/draw/src/adapters/maplibre/modes/drawPointMode.js +194 -0
- package/plugins/draw/src/adapters/maplibre/modes/drawPointMode.test.js +457 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode/__helpers__/harness.js +102 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode/keyboardHandlers.js +82 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode/keyboardHandlers.test.js +83 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode/pointOperations.js +55 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode/pointOperations.test.js +62 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode/pointerHandlers.js +138 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode/pointerHandlers.test.js +197 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode/touchHandlers.js +92 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode/touchHandlers.test.js +101 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode/undoHandlers.js +46 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode/undoHandlers.test.js +42 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode.js +151 -0
- package/plugins/draw/src/adapters/maplibre/modes/editPointMode.test.js +156 -0
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/keyboardHandlers.js +4 -27
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/keyboardHandlers.test.js +24 -39
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/pointerHandlers.js +4 -5
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/touchHandlers.js +20 -23
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/touchHandlers.test.js +25 -5
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/undoHandlers.js +6 -36
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/undoHandlers.test.js +7 -49
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/vertexOperations.js +3 -53
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/vertexOperations.test.js +8 -33
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode.js +29 -72
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode.test.js +10 -3
- package/plugins/draw/src/adapters/maplibre/pointSymbolImages.js +158 -0
- package/plugins/draw/src/adapters/maplibre/pointSymbolImages.test.js +314 -0
- package/plugins/draw/src/adapters/maplibre/snap/prototypePatches.js +6 -1
- package/plugins/draw/src/adapters/maplibre/snap/prototypePatches.test.js +21 -0
- package/plugins/draw/src/adapters/maplibre/snap/snapInstance.js +6 -2
- package/plugins/draw/src/adapters/maplibre/snap/snapInstance.test.js +12 -0
- package/plugins/draw/src/adapters/maplibre/styles.js +38 -11
- package/plugins/draw/src/adapters/maplibre/styles.test.js +39 -0
- package/plugins/draw/src/adapters/maplibre/utils/editModeEvents.js +79 -0
- package/plugins/draw/src/adapters/maplibre/utils/editModeEvents.test.js +135 -0
- package/plugins/draw/src/adapters/maplibre/utils/geometryValidation.js +42 -0
- package/plugins/draw/src/adapters/maplibre/utils/geometryValidation.test.js +85 -0
- package/plugins/draw/src/adapters/maplibre/utils/keyboardShortcuts.js +34 -0
- package/plugins/draw/src/adapters/maplibre/utils/keyboardShortcuts.test.js +78 -0
- package/plugins/draw/src/adapters/maplibre/utils/snapHelpers.js +16 -3
- package/plugins/draw/src/adapters/maplibre/utils/snapHelpers.test.js +21 -3
- package/plugins/draw/src/adapters/maplibre/utils/snapMovement.js +59 -0
- package/plugins/draw/src/adapters/maplibre/utils/snapMovement.test.js +73 -0
- package/plugins/draw/src/adapters/maplibre/utils/touchDragMath.js +33 -0
- package/plugins/draw/src/adapters/maplibre/utils/touchDragMath.test.js +70 -0
- package/plugins/draw/src/adapters/openlayers/OLDrawAdapter.js +27 -2
- package/plugins/draw/src/adapters/openlayers/OLDrawAdapter.test.js +93 -0
- package/plugins/draw/src/adapters/openlayers/__helpers__/harness.js +9 -0
- package/plugins/draw/src/adapters/openlayers/core/OLDrawManager.js +19 -1
- package/plugins/draw/src/adapters/openlayers/core/OLDrawManager.test.js +34 -1
- package/plugins/draw/src/adapters/openlayers/core/styles.js +73 -1
- package/plugins/draw/src/adapters/openlayers/core/styles.test.js +122 -3
- package/plugins/draw/src/adapters/openlayers/draw/DrawMode.test.js +12 -0
- package/plugins/draw/src/adapters/openlayers/draw/drawInput.js +8 -2
- package/plugins/draw/src/adapters/openlayers/edit/EditMode.test.js +31 -0
- package/plugins/draw/src/adapters/openlayers/edit/keyboardHandler.js +9 -5
- package/plugins/draw/src/adapters/openlayers/edit/keyboardHandler.test.js +33 -0
- package/plugins/draw/src/adapters/openlayers/edit/modifyInteraction.js +5 -3
- package/plugins/draw/src/adapters/openlayers/edit/modifyInteraction.test.js +11 -0
- package/plugins/draw/src/adapters/openlayers/edit/nudge.js +10 -3
- package/plugins/draw/src/adapters/openlayers/edit/nudge.test.js +24 -1
- package/plugins/draw/src/adapters/openlayers/edit/touchHandler.js +18 -13
- package/plugins/draw/src/adapters/openlayers/edit/touchHandler.test.js +46 -1
- package/plugins/draw/src/adapters/openlayers/olDraw.js +11 -4
- package/plugins/draw/src/adapters/openlayers/olDraw.test.js +48 -6
- package/plugins/draw/src/adapters/openlayers/point/drawPointMode.js +156 -0
- package/plugins/draw/src/adapters/openlayers/point/drawPointMode.test.js +246 -0
- package/plugins/draw/src/adapters/openlayers/point/editPointMode.js +267 -0
- package/plugins/draw/src/adapters/openlayers/point/editPointMode.test.js +327 -0
- package/plugins/draw/src/adapters/openlayers/point/pointDragInteraction.js +71 -0
- package/plugins/draw/src/adapters/openlayers/point/pointOps.js +34 -0
- package/plugins/draw/src/adapters/openlayers/point/pointOps.test.js +32 -0
- package/plugins/draw/src/adapters/openlayers/point/pointSelectionState.js +82 -0
- package/plugins/draw/src/adapters/openlayers/point/pointSelectionState.test.js +107 -0
- package/plugins/draw/src/adapters/openlayers/point/pointSymbolImages.js +83 -0
- package/plugins/draw/src/adapters/openlayers/point/pointSymbolImages.test.js +214 -0
- package/plugins/draw/src/adapters/openlayers/snap/snapIndicator.js +3 -1
- package/plugins/draw/src/adapters/openlayers/snap/snapInteraction.js +6 -9
- package/plugins/draw/src/adapters/openlayers/snap/snapInteraction.test.js +15 -4
- package/plugins/draw/src/adapters/openlayers/utils/olCoords.js +1 -1
- package/plugins/draw/src/api/addFeature.js +16 -1
- package/plugins/draw/src/api/addFeature.test.js +62 -5
- package/plugins/draw/src/api/createNewShape.js +41 -0
- package/plugins/draw/src/api/createNewShape.test.js +63 -0
- package/plugins/draw/src/api/editFeature.js +7 -4
- package/plugins/draw/src/api/editFeature.test.js +16 -0
- package/plugins/draw/src/api/newLine.js +2 -40
- package/plugins/draw/src/api/newPoint.js +42 -0
- package/plugins/draw/src/api/newPoint.test.js +117 -0
- package/plugins/draw/src/api/newPolygon.js +2 -40
- package/plugins/draw/src/api/setStyle.js +43 -0
- package/plugins/draw/src/api/setStyle.test.js +75 -0
- package/plugins/draw/src/events.js +17 -10
- package/plugins/draw/src/events.test.js +14 -0
- package/plugins/draw/src/manifest.js +18 -6
- package/plugins/draw/src/manifest.test.js +32 -1
- package/plugins/draw/src/reducer.test.js +7 -0
- package/plugins/draw/src/utils/stripInternalProperties.js +19 -0
- package/plugins/draw/src/utils/stripInternalProperties.test.js +50 -0
- package/plugins/draw/src/utils/symbolKeys.js +5 -0
- package/plugins/draw/src/validation/liveDrawChecks.test.js +54 -0
- package/plugins/draw/src/validation/liveStroke.test.js +64 -1
- package/plugins/interact/dist/esm/im-interact-plugin.js +1 -1
- package/plugins/interact/dist/umd/im-interact-plugin.js +1 -1
- package/plugins/interact/dist/umd/index.js +1 -1
- package/plugins/interact/src/hooks/useHighlightSync.js +33 -12
- package/plugins/interact/src/hooks/useHighlightSync.test.js +96 -25
- package/plugins/interact/src/manifest.js +1 -1
- package/plugins/interact/src/utils/featureQueries.js +18 -0
- package/plugins/interact/src/utils/featureQueries.test.js +15 -0
- package/plugins/interact/src/utils/spatial.js +9 -3
- package/plugins/interact/src/utils/spatial.test.js +12 -1
- package/plugins/map-key/dist/css/index.css +68 -0
- package/plugins/map-key/dist/esm/im-map-key-plugin.js +1 -0
- package/plugins/map-key/dist/esm/index.js +1 -0
- package/plugins/map-key/dist/umd/im-map-key-plugin.js +2 -0
- package/plugins/map-key/dist/umd/im-map-key-plugin.js.LICENSE.txt +1 -0
- package/plugins/map-key/dist/umd/index.js +2 -0
- package/plugins/map-key/dist/umd/index.js.LICENSE.txt +1 -0
- package/plugins/map-key/package.json +28 -0
- package/plugins/map-key/src/components/Key/EmptyKey.jsx +7 -0
- package/plugins/{datasets → map-key}/src/components/Key/EmptyKey.test.jsx +2 -2
- package/plugins/map-key/src/components/Key/Key.jsx +43 -0
- package/plugins/{datasets → map-key}/src/components/Key/Key.module.scss +21 -14
- package/plugins/map-key/src/components/Key/Key.test.jsx +73 -0
- package/plugins/map-key/src/components/Key/KeyGroupItem.jsx +16 -0
- package/plugins/map-key/src/components/Key/KeyGroupItem.test.jsx +53 -0
- package/plugins/map-key/src/components/Key/KeyItem.jsx +26 -0
- package/plugins/map-key/src/components/Key/KeyItem.test.jsx +67 -0
- package/plugins/map-key/src/components/Key/KeySvg.jsx +41 -0
- package/plugins/{datasets → map-key}/src/components/Key/KeySvg.test.jsx +14 -12
- package/plugins/map-key/src/components/Key/KeySvgLine.jsx +22 -0
- package/plugins/{datasets → map-key}/src/components/Key/KeySvgLine.test.jsx +1 -1
- package/plugins/{datasets → map-key}/src/components/Key/KeySvgPattern.jsx +7 -2
- package/plugins/{datasets → map-key}/src/components/Key/KeySvgPattern.test.jsx +8 -2
- package/plugins/map-key/src/components/Key/KeySvgRect.jsx +26 -0
- package/plugins/{datasets → map-key}/src/components/Key/KeySvgRect.test.jsx +1 -1
- package/plugins/{datasets → map-key}/src/components/Key/KeySvgSymbol.jsx +8 -3
- package/plugins/{datasets → map-key}/src/components/Key/KeySvgSymbol.test.jsx +17 -6
- package/plugins/map-key/src/components/Key/MapKey.jsx +53 -0
- package/plugins/map-key/src/components/Key/MapKey.test.jsx +147 -0
- package/plugins/{datasets → map-key}/src/components/Key/svgProperties.js +2 -2
- package/plugins/{datasets → map-key}/src/components/Key/svgProperties.test.js +2 -2
- package/plugins/map-key/src/index.js +13 -0
- package/plugins/map-key/src/index.test.js +31 -0
- package/plugins/map-key/src/initialise/MapKeyInit.jsx +15 -0
- package/plugins/map-key/src/initialise/MapKeyInit.test.jsx +39 -0
- package/plugins/map-key/src/manifest.js +30 -0
- package/plugins/map-key/src/manifest.test.js +63 -0
- package/plugins/map-key/src/mapKey.scss +4 -0
- package/plugins/map-key/src/registry/getDatasetRegistry.js +6 -0
- package/plugins/map-key/src/registry/getDatasetRegistry.test.js +23 -0
- package/plugins/map-key/src/registry/index.js +3 -0
- package/plugins/map-key/src/registry/index.test.js +15 -0
- package/plugins/menu/dist/css/index.css +80 -0
- package/plugins/menu/dist/esm/im-menu-plugin.js +1 -0
- package/plugins/menu/dist/esm/index.js +1 -0
- package/plugins/menu/dist/umd/im-menu-plugin.js +1 -0
- package/plugins/menu/dist/umd/index.js +2 -0
- package/plugins/menu/dist/umd/index.js.LICENSE.txt +1 -0
- package/plugins/menu/package.json +28 -0
- package/plugins/menu/src/components/Menu/CheckboxGroupWrapper.jsx +21 -0
- package/plugins/menu/src/components/Menu/GroupLegend.jsx +17 -0
- package/plugins/menu/src/components/Menu/GroupLegend.test.jsx +68 -0
- package/plugins/menu/src/components/Menu/Menu.jsx +19 -0
- package/plugins/menu/src/components/Menu/Menu.module.scss +90 -0
- package/plugins/menu/src/components/Menu/Menu.test.jsx +161 -0
- package/plugins/menu/src/components/Menu/MenuCheckbox.jsx +35 -0
- package/plugins/menu/src/components/Menu/MenuCheckbox.test.jsx +93 -0
- package/plugins/menu/src/components/Menu/MenuGroup.jsx +11 -0
- package/plugins/{datasets/src/components/LayersMenu/LayersMenuRadio.jsx → menu/src/components/Menu/MenuRadio.jsx} +6 -4
- package/plugins/{datasets/src/components/LayersMenu/LayersMenuRadio.test.jsx → menu/src/components/Menu/MenuRadio.test.jsx} +18 -18
- package/plugins/menu/src/components/Menu/RadioGroupWrapper.jsx +32 -0
- package/plugins/{datasets/src/components/LayersMenu/LayersRadioGroupWrapper.test.jsx → menu/src/components/Menu/RadioGroupWrapper.test.jsx} +21 -21
- package/plugins/menu/src/components/Menu/useIdPrefix.jsx +4 -0
- package/plugins/menu/src/index.js +13 -0
- package/plugins/menu/src/index.test.js +31 -0
- package/plugins/menu/src/initialise/MenuInit.jsx +24 -0
- package/plugins/menu/src/initialise/MenuInit.test.jsx +50 -0
- package/plugins/menu/src/initialise/createMenu.js +10 -0
- package/plugins/menu/src/initialise/createMenu.test.js +37 -0
- package/plugins/menu/src/manifest.js +35 -0
- package/plugins/menu/src/manifest.test.js +63 -0
- package/plugins/menu/src/menu.scss +4 -0
- package/plugins/menu/src/reducers/menuStateReducer.test.js +38 -0
- package/plugins/menu/src/reducers/pluginState.js +35 -0
- package/plugins/menu/src/reducers/pluginState.test.js +57 -0
- package/plugins/menu/src/registry/getDatasetRegistry.js +9 -0
- package/plugins/menu/src/registry/getDatasetRegistry.test.js +23 -0
- package/plugins/menu/src/registry/index.js +3 -0
- package/plugins/menu/src/registry/index.test.js +15 -0
- package/plugins/menu/src/registry/isVisibleWhen.js +43 -0
- package/plugins/menu/src/registry/isVisibleWhen.test.js +48 -0
- package/plugins/search/dist/css/index.css +1 -1
- package/plugins/search/dist/esm/im-search-plugin.js +1 -1
- package/plugins/search/dist/esm/index.js +1 -1
- package/plugins/search/dist/umd/im-search-plugin.js +1 -1
- package/plugins/search/dist/umd/index.js +1 -1
- package/plugins/search/src/Search.jsx +2 -3
- package/plugins/search/src/components/Form/Form.module.scss +9 -20
- package/plugins/search/src/index.js +0 -1
- package/plugins/search/src/index.test.js +2 -4
- package/plugins/search/src/manifest.js +1 -1
- package/plugins/search/src/search.scss +17 -16
- package/providers/beta/openlayers/dist/esm/im-openlayers-provider.js +1 -1
- package/providers/beta/openlayers/dist/umd/im-openlayers-provider.js +1 -1
- package/providers/beta/openlayers/dist/umd/index.js +1 -1
- package/providers/beta/openlayers/src/openlayersProvider.js +4 -1
- package/providers/beta/openlayers/src/openlayersProvider.test.js +18 -0
- package/providers/beta/openlayers/src/utils/highlightFeatures.js +52 -5
- package/providers/beta/openlayers/src/utils/highlightFeatures.test.js +176 -0
- package/providers/beta/openlayers/src/utils/symbolImages.js +40 -0
- package/providers/beta/openlayers/src/utils/symbolImages.test.js +58 -0
- package/providers/maplibre/dist/esm/im-maplibre-provider.js +1 -1
- package/providers/maplibre/dist/umd/im-maplibre-provider.js +1 -1
- package/providers/maplibre/dist/umd/index.js +1 -1
- package/providers/maplibre/src/utils/drawLayerBuckets.js +14 -0
- package/providers/maplibre/src/utils/drawLayerBuckets.test.js +18 -0
- package/providers/maplibre/src/utils/highlightFeatures.js +80 -55
- package/providers/maplibre/src/utils/highlightFeatures.test.js +156 -17
- package/providers/maplibre/src/utils/hoverCursor.js +30 -14
- package/providers/maplibre/src/utils/hoverCursor.test.js +35 -0
- package/providers/maplibre/src/utils/patternImages.js +1 -1
- package/providers/maplibre/src/utils/symbolImages.js +41 -3
- package/providers/maplibre/src/utils/symbolImages.test.js +40 -6
- package/rollup.esm.mjs +11 -1
- package/src/App/components/Actions/Actions.test.jsx +47 -0
- package/src/App/components/Hints/Hints.test.jsx +13 -0
- package/src/App/components/KeyboardHelp/KeyboardHelp.jsx +25 -23
- package/src/App/components/KeyboardHelp/KeyboardHelp.test.jsx +22 -5
- package/src/App/components/MoveControls/MoveControls.module.scss +41 -10
- package/src/App/components/Panel/Panel.jsx +65 -8
- package/src/App/components/Panel/Panel.module.scss +49 -15
- package/src/App/components/Panel/Panel.test.jsx +114 -1
- package/src/App/components/Tabs/Tabs.jsx +43 -17
- package/src/App/components/Tabs/Tabs.module.scss +32 -5
- package/src/App/components/Tabs/Tabs.test.jsx +40 -10
- package/src/App/components/Tooltip/Tooltip.test.jsx +12 -14
- package/src/App/hooks/useFeatureItems.js +16 -7
- package/src/App/hooks/useFeatureItems.test.js +57 -0
- package/src/App/hooks/useLayoutMeasurements.js +95 -84
- package/src/App/hooks/useLayoutMeasurements.test.js +61 -1
- package/src/App/layout/Layout.jsx +9 -10
- package/src/App/layout/Layout.test.jsx +2 -0
- package/src/App/layout/layout.module.scss +31 -17
- package/src/App/registry/pluginRegistry.js +1 -1
- package/src/App/registry/pluginRegistry.test.js +12 -0
- package/src/App/renderer/HtmlElementHost.jsx +18 -5
- package/src/App/renderer/HtmlElementHost.test.jsx +54 -0
- package/src/App/renderer/groupByKey.js +28 -0
- package/src/App/renderer/groupByKey.test.js +39 -0
- package/src/App/renderer/groupIntoTabs.js +42 -0
- package/src/App/renderer/groupIntoTabs.test.js +95 -0
- package/src/App/renderer/mapButtons.js +97 -129
- package/src/App/renderer/mapButtons.test.js +67 -83
- package/src/App/renderer/mapControls.js +4 -1
- package/src/App/renderer/mapControls.test.js +32 -0
- package/src/App/renderer/mapPanels.js +53 -11
- package/src/App/renderer/mapPanels.test.js +95 -2
- package/src/App/renderer/orderItems.js +28 -0
- package/src/App/renderer/orderItems.test.js +50 -0
- package/src/App/renderer/slotAggregator.js +2 -18
- package/src/App/renderer/slotHelpers.js +3 -1
- package/src/App/renderer/slotHelpers.test.js +5 -0
- package/src/App/renderer/slots.js +3 -0
- package/src/App/store/AppProvider.jsx +1 -0
- package/src/App/store/appDispatchMiddleware.js +1 -1
- package/src/App/store/appDispatchMiddleware.test.js +8 -0
- package/src/config/appConfig.js +2 -2
- package/src/config/events.js +2 -0
- package/src/scss/settings/_colors.scss +1 -0
- package/src/scss/settings/_dimensions.scss +2 -3
- package/src/scss/settings/_transition.scss +1 -1
- package/src/services/eventBus.js +44 -0
- package/src/services/eventBus.test.js +83 -0
- package/src/services/symbolRegistry.js +1 -1
- package/src/types.js +31 -3
- package/webpack.umd.mjs +2 -0
- package/plugins/datasets/src/components/Key/EmptyKey.jsx +0 -7
- package/plugins/datasets/src/components/Key/Key.jsx +0 -50
- package/plugins/datasets/src/components/Key/KeyGroupItem.jsx +0 -18
- package/plugins/datasets/src/components/Key/KeyItem.jsx +0 -23
- package/plugins/datasets/src/components/Key/KeySvg.jsx +0 -22
- package/plugins/datasets/src/components/Key/KeySvgLine.jsx +0 -19
- package/plugins/datasets/src/components/Key/KeySvgRect.jsx +0 -22
- package/plugins/datasets/src/components/LayersMenu/LayersRadioGroupWrapper.jsx +0 -41
- /package/plugins/{datasets → menu}/src/reducers/menuStateReducer.js +0 -0
- /package/{providers/maplibre/src → src}/utils/rasteriseToImageData.js +0 -0
- /package/{providers/maplibre/src → src}/utils/rasteriseToImageData.test.js +0 -0
|
@@ -101,7 +101,7 @@ export function handleActionSideEffects (action, previousState, panelConfig, eve
|
|
|
101
101
|
const mergedConfig = deepMerge(defaultControlConfig, config)
|
|
102
102
|
BREAKPOINTS.forEach(bp => {
|
|
103
103
|
const slot = mergedConfig[bp]?.slot
|
|
104
|
-
if (slot && !allowedSlots.control.includes(slot)) {
|
|
104
|
+
if (slot && !allowedSlots.control.includes(slot) && !slot.endsWith('-panel')) {
|
|
105
105
|
logger.warn(`control "${id}" has invalid slot "${slot}" at breakpoint "${bp}". Allowed slots: ${allowedSlots.control.join(', ')}.`)
|
|
106
106
|
}
|
|
107
107
|
})
|
|
@@ -185,6 +185,14 @@ describe('ADD_CONTROL', () => {
|
|
|
185
185
|
)
|
|
186
186
|
expect(console.warn).not.toHaveBeenCalled()
|
|
187
187
|
})
|
|
188
|
+
|
|
189
|
+
it('does not warn for a control targeting a panel-body slot', () => {
|
|
190
|
+
run(
|
|
191
|
+
{ type: 'ADD_CONTROL', payload: { id: 'myCtrl', config: { desktop: { slot: 'map-styles-panel' } } } },
|
|
192
|
+
{ breakpoint: 'desktop' }
|
|
193
|
+
)
|
|
194
|
+
expect(console.warn).not.toHaveBeenCalled()
|
|
195
|
+
})
|
|
188
196
|
})
|
|
189
197
|
|
|
190
198
|
describe('ADD_PANEL', () => {
|
package/src/config/appConfig.js
CHANGED
|
@@ -74,7 +74,7 @@ export const defaultAppConfig = {
|
|
|
74
74
|
desktop: buttonSlots
|
|
75
75
|
}, {
|
|
76
76
|
id: 'zoomIn',
|
|
77
|
-
group: {
|
|
77
|
+
group: { label: 'Zoom controls', slotOrder: 0 },
|
|
78
78
|
label: 'Zoom in',
|
|
79
79
|
iconId: 'plus',
|
|
80
80
|
keepFocus: true,
|
|
@@ -86,7 +86,7 @@ export const defaultAppConfig = {
|
|
|
86
86
|
desktop: buttonSlots
|
|
87
87
|
}, {
|
|
88
88
|
id: 'zoomOut',
|
|
89
|
-
group: {
|
|
89
|
+
group: { label: 'Zoom controls', slotOrder: 0 },
|
|
90
90
|
label: 'Zoom out',
|
|
91
91
|
iconId: 'minus',
|
|
92
92
|
keepFocus: true,
|
package/src/config/events.js
CHANGED
|
@@ -147,6 +147,8 @@ export const EVENTS = {
|
|
|
147
147
|
MAP_SET_SIZE: 'map:setsize',
|
|
148
148
|
/** @internal Set the accessible features list. Payload: { items: { id: string, label: string }[] } */
|
|
149
149
|
MAP_SET_FEATURES: 'map:setfeatures',
|
|
150
|
+
/** @internal Suppress/restore the accessible features list. Payload: { suppressed: boolean } */
|
|
151
|
+
MAP_SET_FEATURES_SUPPRESSED: 'map:setfeaturessuppressed',
|
|
150
152
|
/** @internal Set the active feature in the accessible features list. Payload: { id: string | null } */
|
|
151
153
|
MAP_SET_ACTIVE_FEATURE: 'map:setactivefeature',
|
|
152
154
|
/** @internal Select the active listbox feature as the real selection (Enter key). Payload: none */
|
|
@@ -39,9 +39,8 @@
|
|
|
39
39
|
--panel-close-button-gap: 4px;
|
|
40
40
|
--panel-heading-margin-top: 12px;
|
|
41
41
|
--panel-margin: 15px;
|
|
42
|
-
--banner-
|
|
43
|
-
--banner-
|
|
44
|
-
--banner-collapse-margin: 14px;
|
|
42
|
+
--banner-preferred-width: 280px; // Docked max-width, and the gutter threshold JS docks/stacks against
|
|
43
|
+
--banner-border-radius: 0px; // Styled like a hint, not a panel
|
|
45
44
|
|
|
46
45
|
// Popup menu
|
|
47
46
|
--popup-menu-min-width: 200px;
|
package/src/services/eventBus.js
CHANGED
|
@@ -108,6 +108,50 @@ class EventBus {
|
|
|
108
108
|
return this.emit(eventName, ...args)
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
/**
|
|
112
|
+
* Like `emit`, but also registers a listener for the corresponding `Required` event.
|
|
113
|
+
*
|
|
114
|
+
* Use this for events that may be requested before or after the emitter side is ready
|
|
115
|
+
* e.g. called from plugins that require a state reference from a different plugin like this:
|
|
116
|
+
* const removeRegistryListener = eventBus.emitWhenRequested('datasets:registry', datasetRegistry)
|
|
117
|
+
*
|
|
118
|
+
* @param {string} eventName
|
|
119
|
+
* @param {...*} args
|
|
120
|
+
* @returns {Function} A function to remove the listener for the `Required` event.
|
|
121
|
+
*/
|
|
122
|
+
emitWhenRequested (eventName, ...args) {
|
|
123
|
+
const eventRequestedName = `${eventName}Requested`
|
|
124
|
+
const eventReadyName = `${eventName}Ready`
|
|
125
|
+
const handleOnRequired = () => this.emit(eventReadyName, ...args)
|
|
126
|
+
// Add a listener that will emit the event whenever requested
|
|
127
|
+
this.on(eventRequestedName, handleOnRequired)
|
|
128
|
+
// Also emit the event immediately, in case a listener is already waiting for it
|
|
129
|
+
handleOnRequired()
|
|
130
|
+
return () => this.off(eventRequestedName, handleOnRequired)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Like `emit`, but appends `Requested` to the event.
|
|
135
|
+
* used for events that require a response from another plugin,
|
|
136
|
+
* e.g. `datasets:registryRequested` will be emitted by the menu plugin,
|
|
137
|
+
* via `eventBus.requestOnce('datasets:registry')`, and the datasets plugin will respond with `datasets:registryReady`.
|
|
138
|
+
* and the datasets plugin will respond with `datasets:registryReady`.
|
|
139
|
+
* via `eventBus.emitWhenRequested('datasets:registry', datasetRegistry)`.
|
|
140
|
+
*
|
|
141
|
+
* @param {string} eventName
|
|
142
|
+
* @param {Function} eventHandler
|
|
143
|
+
* @returns {this}
|
|
144
|
+
*/
|
|
145
|
+
requestOnce (eventName, eventHandler) {
|
|
146
|
+
const eventRequestedName = `${eventName}Requested`
|
|
147
|
+
const eventReadyName = `${eventName}Ready`
|
|
148
|
+
// Note - must register the once listener before emitting the requested event,
|
|
149
|
+
// otherwise the event won't emit, as there are no listeners yet.
|
|
150
|
+
this.once(eventReadyName, eventHandler)
|
|
151
|
+
this.emit(eventRequestedName, eventName)
|
|
152
|
+
return this
|
|
153
|
+
}
|
|
154
|
+
|
|
111
155
|
/**
|
|
112
156
|
* Remove all handlers and clear any queued events.
|
|
113
157
|
*/
|
|
@@ -175,6 +175,89 @@ describe('emitWhenReady', () => {
|
|
|
175
175
|
})
|
|
176
176
|
})
|
|
177
177
|
|
|
178
|
+
describe('emitWhenRequested', () => {
|
|
179
|
+
let bus
|
|
180
|
+
beforeEach(() => { bus = createEventBus() })
|
|
181
|
+
|
|
182
|
+
it('immediately emits eventNameReady so an already-waiting listener receives the args', () => {
|
|
183
|
+
const handler = jest.fn()
|
|
184
|
+
bus.on('datasets:registryReady', handler)
|
|
185
|
+
bus.emitWhenRequested('datasets:registry', 'registryValue')
|
|
186
|
+
expect(handler).toHaveBeenCalledWith('registryValue')
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
it('emits eventNameReady with args whenever eventNameRequested fires after registration', () => {
|
|
190
|
+
const handler = jest.fn()
|
|
191
|
+
bus.on('datasets:registryReady', handler)
|
|
192
|
+
bus.emitWhenRequested('datasets:registry', 'registryValue')
|
|
193
|
+
handler.mockClear()
|
|
194
|
+
bus.emit('datasets:registryRequested')
|
|
195
|
+
expect(handler).toHaveBeenCalledWith('registryValue')
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
it('forwards multiple args to the Ready event', () => {
|
|
199
|
+
const handler = jest.fn()
|
|
200
|
+
bus.on('datasets:registryReady', handler)
|
|
201
|
+
bus.emitWhenRequested('datasets:registry', 'a', 'b')
|
|
202
|
+
expect(handler).toHaveBeenCalledWith('a', 'b')
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
it('returns a cleanup function that stops responding to future Requested events', () => {
|
|
206
|
+
const handler = jest.fn()
|
|
207
|
+
bus.on('datasets:registryReady', handler)
|
|
208
|
+
const remove = bus.emitWhenRequested('datasets:registry', 'registryValue')
|
|
209
|
+
handler.mockClear()
|
|
210
|
+
remove()
|
|
211
|
+
bus.emit('datasets:registryRequested')
|
|
212
|
+
expect(handler).not.toHaveBeenCalled()
|
|
213
|
+
})
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
describe('requestOnce', () => {
|
|
217
|
+
let bus
|
|
218
|
+
beforeEach(() => { bus = createEventBus() })
|
|
219
|
+
|
|
220
|
+
it('calls the handler when eventNameReady fires', () => {
|
|
221
|
+
const handler = jest.fn()
|
|
222
|
+
bus.requestOnce('datasets:registry', handler)
|
|
223
|
+
bus.emit('datasets:registryReady', 'registryValue')
|
|
224
|
+
expect(handler).toHaveBeenCalledWith('registryValue')
|
|
225
|
+
})
|
|
226
|
+
|
|
227
|
+
it('calls the handler only once even if eventNameReady fires multiple times', () => {
|
|
228
|
+
const handler = jest.fn()
|
|
229
|
+
bus.requestOnce('datasets:registry', handler)
|
|
230
|
+
bus.emit('datasets:registryReady', 'first')
|
|
231
|
+
bus.emit('datasets:registryReady', 'second')
|
|
232
|
+
expect(handler).toHaveBeenCalledTimes(1)
|
|
233
|
+
})
|
|
234
|
+
|
|
235
|
+
it('emits eventNameRequested so the provider side knows it is needed', () => {
|
|
236
|
+
const requestedHandler = jest.fn()
|
|
237
|
+
bus.on('datasets:registryRequested', requestedHandler)
|
|
238
|
+
bus.requestOnce('datasets:registry', jest.fn())
|
|
239
|
+
expect(requestedHandler).toHaveBeenCalled()
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
it('returns this for chaining', () => {
|
|
243
|
+
expect(bus.requestOnce('datasets:registry', jest.fn())).toBe(bus)
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
it('works with emitWhenRequested when requestOnce is called first', () => {
|
|
247
|
+
const handler = jest.fn()
|
|
248
|
+
bus.requestOnce('datasets:registry', handler)
|
|
249
|
+
bus.emitWhenRequested('datasets:registry', 'registryValue')
|
|
250
|
+
expect(handler).toHaveBeenCalledWith('registryValue')
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
it('works with emitWhenRequested when emitWhenRequested is called first', () => {
|
|
254
|
+
const handler = jest.fn()
|
|
255
|
+
bus.emitWhenRequested('datasets:registry', 'registryValue')
|
|
256
|
+
bus.requestOnce('datasets:registry', handler)
|
|
257
|
+
expect(handler).toHaveBeenCalledWith('registryValue')
|
|
258
|
+
})
|
|
259
|
+
})
|
|
260
|
+
|
|
178
261
|
describe('createEventBus factory', () => {
|
|
179
262
|
/**
|
|
180
263
|
* Test to ensure coverage for the factory function (Line 50).
|
|
@@ -2,7 +2,7 @@ import { getValueForStyle } from '../utils/getValueForStyle.js'
|
|
|
2
2
|
import { symbolDefaults, pin, circle, square, graphics } from '../config/symbolConfig.js'
|
|
3
3
|
import { getSymbolStyleColors, getSymbolViewBox } from '../utils/symbolUtils.js'
|
|
4
4
|
import { THEME_COLORS } from '../config/mapTheme.js'
|
|
5
|
-
import { rasteriseToImageData } from '
|
|
5
|
+
import { rasteriseToImageData } from '../utils/rasteriseToImageData.js'
|
|
6
6
|
|
|
7
7
|
const symbols = new Map()
|
|
8
8
|
// Module-level cache: imageId → ImageData. Avoids re-rasterising identical symbols.
|
package/src/types.js
CHANGED
|
@@ -28,8 +28,27 @@
|
|
|
28
28
|
*
|
|
29
29
|
* @typedef {Object} ControlBreakpointConfig
|
|
30
30
|
*
|
|
31
|
+
* @property {number} [order]
|
|
32
|
+
* The order the control appears within its slot (or, when targeting a panel, within that
|
|
33
|
+
* panel's body — see `slot` below).
|
|
34
|
+
*
|
|
31
35
|
* @property {string} slot
|
|
32
|
-
* Slot identifier.
|
|
36
|
+
* Slot identifier. In addition to the standard layout slots, a control may target a panel's
|
|
37
|
+
* body directly by setting this to `'<panelId>-panel'` (the panel id in kebab-case, suffixed
|
|
38
|
+
* with `-panel` — mirrors the `'<buttonId>-button'` convention panels use to render next to a
|
|
39
|
+
* specific button). Any plugin may target any panel this way, including one registered by a
|
|
40
|
+
* different plugin. The panel's own content and every control targeting it are ordered together
|
|
41
|
+
* via `order`. Only supported by panels with a `render` component — a panel using static `html`
|
|
42
|
+
* can't host injected controls, since `dangerouslySetInnerHTML` owns its body's children.
|
|
43
|
+
*
|
|
44
|
+
* @property {string} [tab]
|
|
45
|
+
* Groups this item into a tab within its target panel. Two items share a tab by giving it the
|
|
46
|
+
* same `tab` string (case/whitespace-insensitive — compared kebab-cased); items with no `tab`
|
|
47
|
+
* share one implicit tab, labelled with the panel's own `label`. Tabs only render once this
|
|
48
|
+
* produces more than one distinct group — a panel with zero or one tab renders flat, with no
|
|
49
|
+
* tab UI at all. A tab's position and displayed label both come from whichever member ends up
|
|
50
|
+
* first once its own members are ordered by `order`, so there's no separate tab-order property
|
|
51
|
+
* to set. Like `order`, only respected for controls with a `render` component.
|
|
33
52
|
*/
|
|
34
53
|
|
|
35
54
|
/**
|
|
@@ -57,6 +76,11 @@
|
|
|
57
76
|
* @property {string} slot
|
|
58
77
|
* Slot identifier.
|
|
59
78
|
*
|
|
79
|
+
* @property {string} [tab]
|
|
80
|
+
* Groups the panel's own content into a tab alongside any controls injected into it — see
|
|
81
|
+
* `ControlBreakpointConfig.tab`. Optional even once tabs are active: the panel's own content
|
|
82
|
+
* falls back to an implicit tab labelled with the panel's `label` when omitted.
|
|
83
|
+
*
|
|
60
84
|
* @property {string} [width]
|
|
61
85
|
* Panel width.
|
|
62
86
|
*/
|
|
@@ -146,8 +170,12 @@
|
|
|
146
170
|
* @property {(context: PluginContext) => boolean} [excludeWhen]
|
|
147
171
|
* Callback to determine if the button should be excluded from rendering.
|
|
148
172
|
*
|
|
149
|
-
* @property {string} [group]
|
|
150
|
-
*
|
|
173
|
+
* @property {{ label: string, slotOrder?: number }} [group]
|
|
174
|
+
* Groups this button with any other button sharing the same `label` (kebab-cased) into one
|
|
175
|
+
* `role="group"` container, rendered as a single item in the slot. `label` is also the
|
|
176
|
+
* group's accessible name (aria-label) — buttons whose labels differ only by case/whitespace
|
|
177
|
+
* still merge into one group. `slotOrder` positions the group itself within the slot (defaults
|
|
178
|
+
* to 0); each button's own breakpoint `order` controls its position *within* the group.
|
|
151
179
|
*
|
|
152
180
|
* @property {(context: PluginContext) => boolean} [hiddenWhen]
|
|
153
181
|
* Callback to determine if the button should be hidden. Sets display: none if true.
|
package/webpack.umd.mjs
CHANGED
|
@@ -145,6 +145,8 @@ const ALL_BUILDS = [
|
|
|
145
145
|
{ entryPath: './plugins/search/src/index.js', libraryPath: 'searchPlugin', outDir: 'plugins/search/dist/umd' },
|
|
146
146
|
{ entryPath: './plugins/interact/src/index.js', libraryPath: 'interactPlugin', outDir: 'plugins/interact/dist/umd' },
|
|
147
147
|
{ entryPath: './plugins/datasets/src/index.js', libraryPath: 'datasetsPlugin', outDir: 'plugins/datasets/dist/umd', cssOutDir: 'plugins/datasets/dist' },
|
|
148
|
+
{ entryPath: './plugins/map-key/src/index.js', libraryPath: 'mapKeyPlugin', outDir: 'plugins/map-key/dist/umd', cssOutDir: 'plugins/map-key/dist' },
|
|
149
|
+
{ entryPath: './plugins/menu/src/index.js', libraryPath: 'menuPlugin', outDir: 'plugins/menu/dist/umd', cssOutDir: 'plugins/menu/dist' },
|
|
148
150
|
{ entryPath: './plugins/beta/map-styles/src/index.js', libraryPath: 'mapStylesPlugin', outDir: 'plugins/beta/map-styles/dist/umd' },
|
|
149
151
|
{ entryPath: './plugins/draw/src/index.js', libraryPath: 'drawPlugin', outDir: 'plugins/draw/dist/umd' },
|
|
150
152
|
{ entryPath: './plugins/beta/draw-ml/src/index.js', libraryPath: 'drawMLPlugin', outDir: 'plugins/beta/draw-ml/dist/umd' },
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { EmptyKey } from './EmptyKey.jsx'
|
|
3
|
-
import { KeyItem } from './KeyItem.jsx'
|
|
4
|
-
import { KeyGroupItem } from './KeyGroupItem.jsx'
|
|
5
|
-
import { datasetRegistry } from '../../registry/datasetRegistry.js'
|
|
6
|
-
|
|
7
|
-
export const Key = ({
|
|
8
|
-
pluginConfig: { noKeyItemText },
|
|
9
|
-
mapState: { mapStyle },
|
|
10
|
-
services: { symbolRegistry, patternRegistry }
|
|
11
|
-
}) => {
|
|
12
|
-
const { items: keyGroups, hasGroups } = datasetRegistry.keyItems()
|
|
13
|
-
|
|
14
|
-
if (!keyGroups?.length) {
|
|
15
|
-
return (<EmptyKey text={noKeyItemText} />)
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const containerClass = `im-c-datasets-key${hasGroups ? ' im-c-datasets-key--has-groups' : ''}`
|
|
19
|
-
return (
|
|
20
|
-
<div className={containerClass}>{keyGroups.map(item => {
|
|
21
|
-
const key = item.type === 'group' ? item.groupLabel.toLowerCase().replaceAll(/\s+/g, '-') : item.dataset.id
|
|
22
|
-
|
|
23
|
-
if (item.type === 'sublayers' || item.type === 'group') {
|
|
24
|
-
const datasets = item.type === 'sublayers' ? item.sublayers : item.datasets
|
|
25
|
-
const label = item.type === 'sublayers' ? item.dataset.label : item.groupLabel
|
|
26
|
-
return (
|
|
27
|
-
<KeyGroupItem
|
|
28
|
-
key={key}
|
|
29
|
-
headingId={`key-heading-${key}`}
|
|
30
|
-
label={label}
|
|
31
|
-
datasets={datasets}
|
|
32
|
-
symbolRegistry={symbolRegistry}
|
|
33
|
-
patternRegistry={patternRegistry}
|
|
34
|
-
mapStyle={mapStyle}
|
|
35
|
-
/>
|
|
36
|
-
)
|
|
37
|
-
}
|
|
38
|
-
return (
|
|
39
|
-
<KeyItem
|
|
40
|
-
key={key}
|
|
41
|
-
registryDataset={item.dataset}
|
|
42
|
-
symbolRegistry={symbolRegistry}
|
|
43
|
-
patternRegistry={patternRegistry}
|
|
44
|
-
mapStyle={mapStyle}
|
|
45
|
-
/>
|
|
46
|
-
)
|
|
47
|
-
})}
|
|
48
|
-
</div>
|
|
49
|
-
)
|
|
50
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { KeyItem } from './KeyItem.jsx'
|
|
2
|
-
|
|
3
|
-
export const KeyGroupItem = ({ headingId, label, datasets, symbolRegistry, patternRegistry, mapStyle }) => {
|
|
4
|
-
return (
|
|
5
|
-
<section className='im-c-datasets-key__group' aria-labelledby={headingId}>
|
|
6
|
-
<h3 id={headingId} className='im-c-datasets-key__group-heading'>{label}</h3>
|
|
7
|
-
{datasets.map(dataset =>
|
|
8
|
-
<KeyItem
|
|
9
|
-
key={`${dataset.id}`}
|
|
10
|
-
registryDataset={dataset}
|
|
11
|
-
symbolRegistry={symbolRegistry}
|
|
12
|
-
patternRegistry={patternRegistry}
|
|
13
|
-
mapStyle={mapStyle}
|
|
14
|
-
/>
|
|
15
|
-
)}
|
|
16
|
-
</section>
|
|
17
|
-
)
|
|
18
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { getValueForStyle } from '../../../../../src/utils/getValueForStyle.js'
|
|
2
|
-
import { KeySvg } from './KeySvg.jsx'
|
|
3
|
-
|
|
4
|
-
export const KeyItem = ({ registryDataset, symbolRegistry, patternRegistry, mapStyle }) => {
|
|
5
|
-
if (!registryDataset.showInKey) {
|
|
6
|
-
return null
|
|
7
|
-
}
|
|
8
|
-
return (
|
|
9
|
-
<dl className='im-c-datasets-key__item'>
|
|
10
|
-
<dt className='im-c-datasets-key__item-symbol'>
|
|
11
|
-
<KeySvg registryDataset={registryDataset} symbolRegistry={symbolRegistry} patternRegistry={patternRegistry} mapStyle={mapStyle} />
|
|
12
|
-
</dt>
|
|
13
|
-
<dd className='im-c-datasets-key__item-label'>
|
|
14
|
-
{registryDataset.label}
|
|
15
|
-
{registryDataset.symbolDescription && (
|
|
16
|
-
<span className='govuk-visually-hidden'>
|
|
17
|
-
({getValueForStyle(registryDataset.symbolDescription, mapStyle.id)})
|
|
18
|
-
</span>
|
|
19
|
-
)}
|
|
20
|
-
</dd>
|
|
21
|
-
</dl>
|
|
22
|
-
)
|
|
23
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { KeySvgPattern } from './KeySvgPattern.jsx'
|
|
2
|
-
import { KeySvgSymbol } from './KeySvgSymbol.jsx'
|
|
3
|
-
import { KeySvgLine } from './KeySvgLine.jsx'
|
|
4
|
-
import { KeySvgRect } from './KeySvgRect.jsx'
|
|
5
|
-
|
|
6
|
-
export const KeySvg = ({ symbolRegistry, registryDataset, mapStyle, patternRegistry }) => {
|
|
7
|
-
const { hasSymbol, hasPattern, style } = registryDataset
|
|
8
|
-
const symbolDef = hasSymbol && symbolRegistry.getSymbolDef(style)
|
|
9
|
-
if (symbolDef) {
|
|
10
|
-
return <KeySvgSymbol mapStyle={mapStyle} registryDataset={registryDataset} symbolRegistry={symbolRegistry} symbolDef={symbolDef} />
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
if (hasPattern) {
|
|
14
|
-
return <KeySvgPattern mapStyle={mapStyle} registryDataset={registryDataset} patternRegistry={patternRegistry} />
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (style.keySymbolShape === 'line') {
|
|
18
|
-
return <KeySvgLine mapStyle={mapStyle} registryDataset={registryDataset} />
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return <KeySvgRect mapStyle={mapStyle} registryDataset={registryDataset} />
|
|
22
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { svgProps, SVG_SIZE, SVG_CENTER } from './svgProperties.js'
|
|
2
|
-
import { getValueForStyle } from '../../../../../src/utils/getValueForStyle.js'
|
|
3
|
-
|
|
4
|
-
export const KeySvgLine = ({ mapStyle, registryDataset }) => {
|
|
5
|
-
const { style } = registryDataset
|
|
6
|
-
return (
|
|
7
|
-
<svg {...svgProps}>
|
|
8
|
-
<line
|
|
9
|
-
x1={style.strokeWidth / 2}
|
|
10
|
-
y1={SVG_CENTER}
|
|
11
|
-
x2={SVG_SIZE - style.strokeWidth / 2}
|
|
12
|
-
y2={SVG_CENTER}
|
|
13
|
-
stroke={getValueForStyle(style.stroke, mapStyle.id)}
|
|
14
|
-
strokeWidth={style.strokeWidth}
|
|
15
|
-
strokeLinecap='round'
|
|
16
|
-
/>
|
|
17
|
-
</svg>
|
|
18
|
-
)
|
|
19
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { getValueForStyle } from '../../../../../src/utils/getValueForStyle.js'
|
|
2
|
-
import { svgProps, SVG_SIZE } from './svgProperties.js'
|
|
3
|
-
|
|
4
|
-
export const KeySvgRect = ({ mapStyle, registryDataset }) => {
|
|
5
|
-
const { style } = registryDataset
|
|
6
|
-
return (
|
|
7
|
-
<svg {...svgProps}>
|
|
8
|
-
<rect
|
|
9
|
-
x={style.strokeWidth / 2}
|
|
10
|
-
y={style.strokeWidth / 2}
|
|
11
|
-
width={SVG_SIZE - style.strokeWidth}
|
|
12
|
-
height={SVG_SIZE - style.strokeWidth}
|
|
13
|
-
rx={style.strokeWidth}
|
|
14
|
-
ry={style.strokeWidth}
|
|
15
|
-
fill={getValueForStyle(style.fill, mapStyle.id)}
|
|
16
|
-
stroke={getValueForStyle(style.stroke, mapStyle.id)}
|
|
17
|
-
strokeWidth={style.strokeWidth}
|
|
18
|
-
strokeLinejoin='round'
|
|
19
|
-
/>
|
|
20
|
-
</svg>
|
|
21
|
-
)
|
|
22
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { isVisibleWhen } from '../../registry/isVisibleWhen.js'
|
|
3
|
-
import { LayersMenuRadio } from './LayersMenuRadio.jsx'
|
|
4
|
-
|
|
5
|
-
export const LayersRadioGroupWrapper = ({ pluginState, menuGroup }) => {
|
|
6
|
-
const { id, items, visibleWhen } = menuGroup
|
|
7
|
-
const visible = visibleWhen ? isVisibleWhen(visibleWhen) : true
|
|
8
|
-
if (!visible) {
|
|
9
|
-
return null
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const { menuState, dispatch } = pluginState
|
|
13
|
-
const value = menuState[id]
|
|
14
|
-
const handleChange = (event) => {
|
|
15
|
-
dispatch({ type: 'UPDATE_MENU_STATE', payload: { [id]: event.target.value } })
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const wrapperClass = 'govuk-form-group im-c-datasets-layers-group'
|
|
19
|
-
return (
|
|
20
|
-
<div key={menuGroup.id} className={wrapperClass}>
|
|
21
|
-
<fieldset className='im-c-datasets-layers-group__fieldset'>
|
|
22
|
-
<legend className='im-c-datasets-layers-group__legend'>
|
|
23
|
-
<h3>
|
|
24
|
-
{menuGroup.label}
|
|
25
|
-
</h3>
|
|
26
|
-
</legend>
|
|
27
|
-
<div className='govuk-radios govuk-radios--small' data-module='govuk-radios'>
|
|
28
|
-
{items.map((menuGroupItem) =>
|
|
29
|
-
<LayersMenuRadio
|
|
30
|
-
key={menuGroupItem.id}
|
|
31
|
-
menuGroupItem={menuGroupItem}
|
|
32
|
-
name={id}
|
|
33
|
-
checked={menuGroupItem.id === value}
|
|
34
|
-
onChange={handleChange}
|
|
35
|
-
/>
|
|
36
|
-
)}
|
|
37
|
-
</div>
|
|
38
|
-
</fieldset>
|
|
39
|
-
</div>
|
|
40
|
-
)
|
|
41
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|