From 9973e7a61cf72752807d0e42ecae44dd4905d4fd Mon Sep 17 00:00:00 2001 From: Mark Fee Date: Wed, 20 May 2026 15:39:23 +0100 Subject: [PATCH 1/6] IM-291 Key components now use the datasetsReducer --- .../beta/datasets/src/components/KeySvg.jsx | 24 --------- .../datasets/src/components/KeySvgLine.jsx | 19 ------- .../datasets/src/components/KeySvgRect.jsx | 22 -------- .../src/components/{ => key}/EmptyKey.jsx | 0 .../components/{ => key}/EmptyKey.test.jsx | 0 .../datasets/src/components/key/KeyItem.jsx | 0 .../datasets/src/components/key/KeySvg.jsx | 22 ++++++++ .../src/components/{ => key}/KeySvg.test.jsx | 6 +-- .../src/components/key/KeySvgLine.jsx | 19 +++++++ .../components/{ => key}/KeySvgLine.test.jsx | 2 +- .../components/{ => key}/KeySvgPattern.jsx | 9 ++-- .../{ => key}/KeySvgPattern.test.jsx | 2 +- .../src/components/key/KeySvgRect.jsx | 22 ++++++++ .../components/{ => key}/KeySvgRect.test.jsx | 2 +- .../src/components/{ => key}/KeySvgSymbol.jsx | 12 ++--- .../{ => key}/KeySvgSymbol.test.jsx | 2 +- plugins/beta/datasets/src/panels/Key.jsx | 50 +++++++------------ 17 files changed, 98 insertions(+), 115 deletions(-) delete mode 100644 plugins/beta/datasets/src/components/KeySvg.jsx delete mode 100644 plugins/beta/datasets/src/components/KeySvgLine.jsx delete mode 100644 plugins/beta/datasets/src/components/KeySvgRect.jsx rename plugins/beta/datasets/src/components/{ => key}/EmptyKey.jsx (100%) rename plugins/beta/datasets/src/components/{ => key}/EmptyKey.test.jsx (100%) create mode 100644 plugins/beta/datasets/src/components/key/KeyItem.jsx create mode 100644 plugins/beta/datasets/src/components/key/KeySvg.jsx rename plugins/beta/datasets/src/components/{ => key}/KeySvg.test.jsx (93%) create mode 100644 plugins/beta/datasets/src/components/key/KeySvgLine.jsx rename plugins/beta/datasets/src/components/{ => key}/KeySvgLine.test.jsx (96%) rename plugins/beta/datasets/src/components/{ => key}/KeySvgPattern.jsx (54%) rename plugins/beta/datasets/src/components/{ => key}/KeySvgPattern.test.jsx (95%) create mode 100644 plugins/beta/datasets/src/components/key/KeySvgRect.jsx rename plugins/beta/datasets/src/components/{ => key}/KeySvgRect.test.jsx (97%) rename plugins/beta/datasets/src/components/{ => key}/KeySvgSymbol.jsx (55%) rename plugins/beta/datasets/src/components/{ => key}/KeySvgSymbol.test.jsx (98%) diff --git a/plugins/beta/datasets/src/components/KeySvg.jsx b/plugins/beta/datasets/src/components/KeySvg.jsx deleted file mode 100644 index 3a46fe7f..00000000 --- a/plugins/beta/datasets/src/components/KeySvg.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import { hasSymbol } from '../../../../../src/utils/symbolUtils.js' -import { hasPattern } from '../../../../../src/utils/patternUtils.js' -import { KeySvgPattern } from './KeySvgPattern.jsx' -import { KeySvgSymbol } from './KeySvgSymbol.jsx' -import { KeySvgLine } from './KeySvgLine.jsx' -import { KeySvgRect } from './KeySvgRect.jsx' - -export const KeySvg = (props) => { - const { symbolRegistry } = props - const symbolDef = hasSymbol(props) && symbolRegistry.getSymbolDef(props) - if (symbolDef) { - return - } - - if (hasPattern(props)) { - return - } - - if (props.keySymbolShape === 'line') { - return - } - - return -} diff --git a/plugins/beta/datasets/src/components/KeySvgLine.jsx b/plugins/beta/datasets/src/components/KeySvgLine.jsx deleted file mode 100644 index d1015383..00000000 --- a/plugins/beta/datasets/src/components/KeySvgLine.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import { svgProps, SVG_SIZE, SVG_CENTER } from './svgProperties.js' -import { getValueForStyle } from '../../../../../src/utils/getValueForStyle' - -export const KeySvgLine = (props) => { - const { mapStyle } = props - return ( - - - - ) -} diff --git a/plugins/beta/datasets/src/components/KeySvgRect.jsx b/plugins/beta/datasets/src/components/KeySvgRect.jsx deleted file mode 100644 index 0207d561..00000000 --- a/plugins/beta/datasets/src/components/KeySvgRect.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import { getValueForStyle } from '../../../../../src/utils/getValueForStyle' -import { svgProps, SVG_SIZE } from './svgProperties.js' - -export const KeySvgRect = (props) => { - const { mapStyle } = props - return ( - - - - ) -} diff --git a/plugins/beta/datasets/src/components/EmptyKey.jsx b/plugins/beta/datasets/src/components/key/EmptyKey.jsx similarity index 100% rename from plugins/beta/datasets/src/components/EmptyKey.jsx rename to plugins/beta/datasets/src/components/key/EmptyKey.jsx diff --git a/plugins/beta/datasets/src/components/EmptyKey.test.jsx b/plugins/beta/datasets/src/components/key/EmptyKey.test.jsx similarity index 100% rename from plugins/beta/datasets/src/components/EmptyKey.test.jsx rename to plugins/beta/datasets/src/components/key/EmptyKey.test.jsx diff --git a/plugins/beta/datasets/src/components/key/KeyItem.jsx b/plugins/beta/datasets/src/components/key/KeyItem.jsx new file mode 100644 index 00000000..e69de29b diff --git a/plugins/beta/datasets/src/components/key/KeySvg.jsx b/plugins/beta/datasets/src/components/key/KeySvg.jsx new file mode 100644 index 00000000..264369ac --- /dev/null +++ b/plugins/beta/datasets/src/components/key/KeySvg.jsx @@ -0,0 +1,22 @@ +import { KeySvgPattern } from './KeySvgPattern.jsx' +import { KeySvgSymbol } from './KeySvgSymbol.jsx' +import { KeySvgLine } from './KeySvgLine.jsx' +import { KeySvgRect } from './KeySvgRect.jsx' + +export const KeySvg = ({ symbolRegistry, registryDataset, mapStyle, patternRegistry }) => { + const { hasSymbol, hasPattern, style } = registryDataset + const symbolDef = hasSymbol && symbolRegistry.getSymbolDef(style) + if (symbolDef) { + return + } + + if (hasPattern) { + return + } + + if (style.keySymbolShape === 'line') { + return + } + + return +} diff --git a/plugins/beta/datasets/src/components/KeySvg.test.jsx b/plugins/beta/datasets/src/components/key/KeySvg.test.jsx similarity index 93% rename from plugins/beta/datasets/src/components/KeySvg.test.jsx rename to plugins/beta/datasets/src/components/key/KeySvg.test.jsx index 84b02b7a..4109bd30 100644 --- a/plugins/beta/datasets/src/components/KeySvg.test.jsx +++ b/plugins/beta/datasets/src/components/key/KeySvg.test.jsx @@ -1,9 +1,9 @@ import { render } from '@testing-library/react' import { KeySvg } from './KeySvg' -import { hasSymbol } from '../../../../../src/utils/symbolUtils.js' -import { hasPattern } from '../../../../../src/utils/patternUtils.js' -import { symbolRegistry } from '../../../../../src/services/symbolRegistry.js' +import { hasSymbol } from '../../../../../../src/utils/symbolUtils.js' +import { hasPattern } from '../../../../../../src/utils/patternUtils.js' +import { symbolRegistry } from '../../../../../../src/services/symbolRegistry.js' // import { patternRegistry } from '../../../../../src/services/patternRegistry.js' const getSymbolDef = jest.spyOn(symbolRegistry, 'getSymbolDef') diff --git a/plugins/beta/datasets/src/components/key/KeySvgLine.jsx b/plugins/beta/datasets/src/components/key/KeySvgLine.jsx new file mode 100644 index 00000000..5d156550 --- /dev/null +++ b/plugins/beta/datasets/src/components/key/KeySvgLine.jsx @@ -0,0 +1,19 @@ +import { svgProps, SVG_SIZE, SVG_CENTER } from '../svgProperties.js' +import { getValueForStyle } from '../../../../../../src/utils/getValueForStyle.js' + +export const KeySvgLine = ({ mapStyle, registryDataset }) => { + const { style } = registryDataset + return ( + + + + ) +} diff --git a/plugins/beta/datasets/src/components/KeySvgLine.test.jsx b/plugins/beta/datasets/src/components/key/KeySvgLine.test.jsx similarity index 96% rename from plugins/beta/datasets/src/components/KeySvgLine.test.jsx rename to plugins/beta/datasets/src/components/key/KeySvgLine.test.jsx index 26711623..71af2bd5 100644 --- a/plugins/beta/datasets/src/components/KeySvgLine.test.jsx +++ b/plugins/beta/datasets/src/components/key/KeySvgLine.test.jsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react' import { KeySvgLine } from './KeySvgLine' -import { getValueForStyle } from '../../../../../src/utils/getValueForStyle' +import { getValueForStyle } from '../../../../../../src/utils/getValueForStyle' jest.mock('../../../../../src/utils/getValueForStyle', () => ({ getValueForStyle: jest.fn((value) => value) diff --git a/plugins/beta/datasets/src/components/KeySvgPattern.jsx b/plugins/beta/datasets/src/components/key/KeySvgPattern.jsx similarity index 54% rename from plugins/beta/datasets/src/components/KeySvgPattern.jsx rename to plugins/beta/datasets/src/components/key/KeySvgPattern.jsx index 9fdb4d93..cd5c2286 100644 --- a/plugins/beta/datasets/src/components/KeySvgPattern.jsx +++ b/plugins/beta/datasets/src/components/key/KeySvgPattern.jsx @@ -1,10 +1,9 @@ -import { svgProps } from './svgProperties.js' +import { svgProps } from '../svgProperties.js' const PATTERN_INSET = 2 -export const KeySvgPattern = (props) => { - const { patternRegistry, mapStyle } = props - - const paths = patternRegistry.getKeyPatternPaths(props, mapStyle.id) +export const KeySvgPattern = ({ patternRegistry, registryDataset, mapStyle }) => { + const { style } = registryDataset + const paths = patternRegistry.getKeyPatternPaths(style, mapStyle.id) return ( diff --git a/plugins/beta/datasets/src/components/KeySvgPattern.test.jsx b/plugins/beta/datasets/src/components/key/KeySvgPattern.test.jsx similarity index 95% rename from plugins/beta/datasets/src/components/KeySvgPattern.test.jsx rename to plugins/beta/datasets/src/components/key/KeySvgPattern.test.jsx index f17b73b4..aaf005ff 100644 --- a/plugins/beta/datasets/src/components/KeySvgPattern.test.jsx +++ b/plugins/beta/datasets/src/components/key/KeySvgPattern.test.jsx @@ -1,6 +1,6 @@ import { render } from '@testing-library/react' import { KeySvgPattern } from './KeySvgPattern' -import { patternRegistry } from '../../../../../src/services/patternRegistry.js' +import { patternRegistry } from '../../../../../../src/services/patternRegistry.js' const getKeyPatternPaths = jest.spyOn(patternRegistry, 'getKeyPatternPaths') const defaultProps = { diff --git a/plugins/beta/datasets/src/components/key/KeySvgRect.jsx b/plugins/beta/datasets/src/components/key/KeySvgRect.jsx new file mode 100644 index 00000000..d3ef8d86 --- /dev/null +++ b/plugins/beta/datasets/src/components/key/KeySvgRect.jsx @@ -0,0 +1,22 @@ +import { getValueForStyle } from '../../../../../../src/utils/getValueForStyle.js' +import { svgProps, SVG_SIZE } from '../svgProperties.js' + +export const KeySvgRect = ({ mapStyle, registryDataset }) => { + const { style } = registryDataset + return ( + + + + ) +} diff --git a/plugins/beta/datasets/src/components/KeySvgRect.test.jsx b/plugins/beta/datasets/src/components/key/KeySvgRect.test.jsx similarity index 97% rename from plugins/beta/datasets/src/components/KeySvgRect.test.jsx rename to plugins/beta/datasets/src/components/key/KeySvgRect.test.jsx index bb911330..158926af 100644 --- a/plugins/beta/datasets/src/components/KeySvgRect.test.jsx +++ b/plugins/beta/datasets/src/components/key/KeySvgRect.test.jsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react' import { KeySvgRect } from './KeySvgRect' -import { getValueForStyle } from '../../../../../src/utils/getValueForStyle' +import { getValueForStyle } from '../../../../../../src/utils/getValueForStyle' jest.mock('../../../../../src/utils/getValueForStyle', () => ({ getValueForStyle: jest.fn((value) => value) diff --git a/plugins/beta/datasets/src/components/KeySvgSymbol.jsx b/plugins/beta/datasets/src/components/key/KeySvgSymbol.jsx similarity index 55% rename from plugins/beta/datasets/src/components/KeySvgSymbol.jsx rename to plugins/beta/datasets/src/components/key/KeySvgSymbol.jsx index 4b62e46b..fdb41dcc 100644 --- a/plugins/beta/datasets/src/components/KeySvgSymbol.jsx +++ b/plugins/beta/datasets/src/components/key/KeySvgSymbol.jsx @@ -1,13 +1,13 @@ -import { getSymbolStyleColors, getSymbolViewBox } from '../../../../../src/utils/symbolUtils.js' -import { svgSymbolProps } from './svgProperties.js' +import { getSymbolStyleColors, getSymbolViewBox } from '../../../../../../src/utils/symbolUtils.js' +import { svgSymbolProps } from '../svgProperties.js' -export const KeySvgSymbol = (props) => { - const { symbolRegistry, mapStyle, symbolDef } = props +export const KeySvgSymbol = ({ symbolRegistry, registryDataset, mapStyle, symbolDef }) => { + const { style } = registryDataset const mapColorScheme = mapStyle?.appColorScheme ?? 'light' const keyMapStyle = { ...mapStyle, mapColorScheme } - const resolvedSvg = symbolRegistry.resolve(symbolDef, getSymbolStyleColors(props), keyMapStyle) - const viewBox = getSymbolViewBox(props, symbolDef) + const resolvedSvg = symbolRegistry.resolve(symbolDef, getSymbolStyleColors(style), keyMapStyle) + const viewBox = getSymbolViewBox(style, symbolDef) return ( diff --git a/plugins/beta/datasets/src/components/KeySvgSymbol.test.jsx b/plugins/beta/datasets/src/components/key/KeySvgSymbol.test.jsx similarity index 98% rename from plugins/beta/datasets/src/components/KeySvgSymbol.test.jsx rename to plugins/beta/datasets/src/components/key/KeySvgSymbol.test.jsx index 2adfcd22..6f151fff 100644 --- a/plugins/beta/datasets/src/components/KeySvgSymbol.test.jsx +++ b/plugins/beta/datasets/src/components/key/KeySvgSymbol.test.jsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react' import { KeySvgSymbol } from './KeySvgSymbol' -import { getSymbolStyleColors, getSymbolViewBox } from '../../../../../src/utils/symbolUtils.js' +import { getSymbolStyleColors, getSymbolViewBox } from '../../../../../../src/utils/symbolUtils.js' jest.mock('../../../../../src/utils/symbolUtils.js', () => ({ getSymbolStyleColors: jest.fn(() => ({ foreground: '#000', background: '#fff' })), diff --git a/plugins/beta/datasets/src/panels/Key.jsx b/plugins/beta/datasets/src/panels/Key.jsx index 5e9a1080..67d96b21 100755 --- a/plugins/beta/datasets/src/panels/Key.jsx +++ b/plugins/beta/datasets/src/panels/Key.jsx @@ -1,35 +1,21 @@ import React from 'react' -import { getValueForStyle } from '../../../../../src/utils/getValueForStyle' -import { mergeSublayer } from '../utils/mergeSublayer.js' -import { EmptyKey } from '../components/EmptyKey.jsx' -import { KeySvg } from '../components/KeySvg.jsx' +import { EmptyKey } from '../components/key/EmptyKey.jsx' +import { KeyItem } from './key/KeyItem.jsx' +import { datasetRegistry } from '../registry/datasetRegistry.js' -export const Key = ({ pluginConfig, mapState, pluginState, services }) => { - if (!pluginState?.key?.items?.length) { - return () - } - const { mapStyle } = mapState - const { symbolRegistry, patternRegistry } = services +export const Key = ({ + pluginConfig: { noKeyItemText }, + mapState: { mapStyle }, + pluginState: { mappedDatasets }, + services: { symbolRegistry, patternRegistry } +}) => { + const { items: keyGroups, hasGroups } = datasetRegistry.keyItems() - const renderEntry = (key, config) => ( -
-
- -
-
- {config.label} - {config.symbolDescription && ( - - ({getValueForStyle(config.symbolDescription, mapStyle.id)}) - - )} -
-
- ) + if (!keyGroups?.length) { + return () + } - const { items: keyGroups, hasGroups } = pluginState.key const containerClass = `im-c-datasets-key${hasGroups ? ' im-c-datasets-key--has-groups' : ''}` - return (
{keyGroups.map(item => { @@ -38,9 +24,9 @@ export const Key = ({ pluginConfig, mapState, pluginState, services }) => { return (

{item.dataset.label}

- {item.dataset.sublayers - .filter(sublayer => item.dataset.sublayerVisibility?.[sublayer.id] !== 'hidden') - .map(sublayer => renderEntry(`${item.dataset.id}-${sublayer.id}`, mergeSublayer(item.dataset, sublayer)))} + {item.sublayers.map(sublayer => + + )}
) } @@ -50,12 +36,12 @@ export const Key = ({ pluginConfig, mapState, pluginState, services }) => { return (

{item.groupLabel}

- {item.datasets.map(dataset => renderEntry(dataset.id, dataset))} + {item.datasets.map(dataset => )}
) } - return renderEntry(item.dataset.id, item.dataset) + return })}
) From 15a43aea12171a87b03a2c8e5de7e1dc886bbba9 Mon Sep 17 00:00:00 2001 From: Mark Fee Date: Wed, 20 May 2026 15:42:19 +0100 Subject: [PATCH 2/6] IM-291 replaced visibility with visible Boolean --- plugins/beta/datasets/src/DatasetsInit.jsx | 6 ++- .../maplibre/datasets/mapLibreDataset.js | 6 +-- .../adapters/maplibre/maplibreLayerAdapter.js | 3 +- plugins/beta/datasets/src/panels/Layers.jsx | 10 ++-- .../beta/datasets/src/panels/key/KeyItem.jsx | 20 ++++++++ .../datasets/src/reducers/datasetsToMenu.js | 4 +- .../beta/datasets/src/reducers/keyReducer.js | 2 +- plugins/beta/datasets/src/registry/dataset.js | 6 ++- .../datasets/src/registry/datasetRegistry.js | 50 ++++++++++++++++++- 9 files changed, 90 insertions(+), 17 deletions(-) create mode 100644 plugins/beta/datasets/src/panels/key/KeyItem.jsx diff --git a/plugins/beta/datasets/src/DatasetsInit.jsx b/plugins/beta/datasets/src/DatasetsInit.jsx index 19fcd3e9..9490828b 100755 --- a/plugins/beta/datasets/src/DatasetsInit.jsx +++ b/plugins/beta/datasets/src/DatasetsInit.jsx @@ -78,8 +78,12 @@ export function DatasetsInit ({ pluginConfig, pluginState, appState, mapState, m }, [pluginState.datasets]) const datasetsRef = useRef(pluginState.mappedDatasets) + const orderedDatasetsRef = useRef(pluginState.orderedDatasets) datasetsRef.current = pluginState.mappedDatasets - useEffect(() => datasetRegistry.attach(datasetsRef.current), [pluginState.mappedDatasets]) + orderedDatasetsRef.current = pluginState.orderedDatasets + useEffect(() => { + datasetRegistry.attach(datasetsRef.current, pluginState.orderedDatasets) + }, [pluginState.mappedDatasets, pluginState.orderedDatasets]) useLayerAdapterActions('setStyle', dispatch, pluginState, [pluginState.layerAdapterActions.setStyle]) useLayerAdapterActions('setDatasetVisibility', dispatch, pluginState, [pluginState.layerAdapterActions.setDatasetVisibility]) diff --git a/plugins/beta/datasets/src/adapters/maplibre/datasets/mapLibreDataset.js b/plugins/beta/datasets/src/adapters/maplibre/datasets/mapLibreDataset.js index 30e8532b..5a4ff2c1 100644 --- a/plugins/beta/datasets/src/adapters/maplibre/datasets/mapLibreDataset.js +++ b/plugins/beta/datasets/src/adapters/maplibre/datasets/mapLibreDataset.js @@ -89,7 +89,7 @@ export class MapLibreDataset extends Dataset { minzoom: this.minZoom, maxzoom: this.maxZoom, layout: { - visibility: this.visibility === 'hidden' ? 'none' : 'visible', + visibility: this.visibility, 'icon-image': imageId, 'icon-anchor': anchorToMaplibre(anchor || symbolDef?.anchor || [0.5, 0.5]), 'icon-allow-overlap': true @@ -106,7 +106,7 @@ export class MapLibreDataset extends Dataset { 'source-layer': this.sourceLayer, minzoom: this.minZoom, maxzoom: this.maxZoom, - layout: { visibility: this.visibility === 'hidden' ? 'none' : 'visible' }, + layout: { visibility: this.visibility }, paint, ...(this.filter ? { filter: this.filter } : {}) } @@ -120,7 +120,7 @@ export class MapLibreDataset extends Dataset { 'source-layer': this.sourceLayer, minzoom: this.minZoom, maxzoom: this.maxZoom, - layout: { visibility: this.visibility === 'hidden' ? 'none' : 'visible' }, + layout: { visibility: this.visibility }, paint, ...(this.filter ? { filter: this.filter } : {}) } diff --git a/plugins/beta/datasets/src/adapters/maplibre/maplibreLayerAdapter.js b/plugins/beta/datasets/src/adapters/maplibre/maplibreLayerAdapter.js index 275bb1b5..e59d88c0 100644 --- a/plugins/beta/datasets/src/adapters/maplibre/maplibreLayerAdapter.js +++ b/plugins/beta/datasets/src/adapters/maplibre/maplibreLayerAdapter.js @@ -356,12 +356,11 @@ export default class MaplibreLayerAdapter { const { sublayerIds } = registryDataset sublayerIds.forEach(sublayerId => { this.setDatasetVisibility(sublayerId) }) } else { - const { visible } = registryDataset + const { visibility } = registryDataset const datasetId = registryDataset.id style.layers.filter(layer => layer.id === datasetId || layer.id.startsWith(`${datasetId}-`) ).forEach(layer => { - const visibility = visible ? 'visible' : 'none' this._map.setLayoutProperty(layer.id, 'visibility', visibility) }) } diff --git a/plugins/beta/datasets/src/panels/Layers.jsx b/plugins/beta/datasets/src/panels/Layers.jsx index 8ba604fa..4aca8a7a 100755 --- a/plugins/beta/datasets/src/panels/Layers.jsx +++ b/plugins/beta/datasets/src/panels/Layers.jsx @@ -50,7 +50,7 @@ export const Layers = ({ pluginState }) => { } const renderDatasetItem = (dataset) => { - const itemClass = `im-c-datasets-layers__item govuk-checkboxes govuk-checkboxes--small${dataset.visibility === 'hidden' ? '' : ' im-c-datasets-layers__item--checked'}` + const itemClass = `im-c-datasets-layers__item govuk-checkboxes govuk-checkboxes--small${dataset.visible ? '' : ' im-c-datasets-layers__item--checked'}` return (
@@ -60,7 +60,7 @@ export const Layers = ({ pluginState }) => { name='layers' type='checkbox' value={dataset.id} - checked={dataset.visibility !== 'hidden'} + checked={dataset.visible} onChange={handleDatasetChange} />