From e9e117b12205f83e293b7d7d1d3664151603cf92 Mon Sep 17 00:00:00 2001 From: Mark Fee Date: Tue, 7 Apr 2026 14:25:08 +0100 Subject: [PATCH 1/2] Moved the keyGroups builder to pluginState to reduce data builds --- plugins/beta/datasets/src/DatasetsInit.jsx | 3 +++ plugins/beta/datasets/src/panels/Key.jsx | 8 ++------ plugins/beta/datasets/src/reducer.js | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/plugins/beta/datasets/src/DatasetsInit.jsx b/plugins/beta/datasets/src/DatasetsInit.jsx index e2a8a4cc..975866bc 100755 --- a/plugins/beta/datasets/src/DatasetsInit.jsx +++ b/plugins/beta/datasets/src/DatasetsInit.jsx @@ -59,6 +59,9 @@ export function DatasetsInit ({ pluginConfig, pluginState, appState, mapState, m initDatasets() }, [isMapStyleReady, appState.mode]) + useEffect(() => { + dispatch({ type: 'SET_KEY_GROUPS', payload: null }) + }, [pluginState.datasets]) // Cleanup only on unmount useEffect(() => { return () => { diff --git a/plugins/beta/datasets/src/panels/Key.jsx b/plugins/beta/datasets/src/panels/Key.jsx index 26bcf9de..74389705 100755 --- a/plugins/beta/datasets/src/panels/Key.jsx +++ b/plugins/beta/datasets/src/panels/Key.jsx @@ -9,7 +9,7 @@ const SVG_SYMBOL_SIZE = 38 const SVG_CENTER = SVG_SIZE / 2 const PATTERN_INSET = 2 -const buildKeyGroups = (datasets) => { +export const buildKeyGroups = (datasets) => { const seenGroups = new Set() const items = [] datasets.forEach(dataset => { @@ -123,11 +123,7 @@ export const Key = ({ mapState, pluginState, services }) => { ) - const visibleDatasets = (pluginState.datasets || []) - .filter(dataset => dataset.showInKey && dataset.visibility !== 'hidden') - - const keyGroups = buildKeyGroups(visibleDatasets) - const hasGroups = keyGroups.some(item => item.type === 'sublayers' || item.type === 'group') + const { items: keyGroups, hasGroups } = pluginState.key const containerClass = `im-c-datasets-key${hasGroups ? ' im-c-datasets-key--has-groups' : ''}` return ( diff --git a/plugins/beta/datasets/src/reducer.js b/plugins/beta/datasets/src/reducer.js index abe59162..0e985119 100755 --- a/plugins/beta/datasets/src/reducer.js +++ b/plugins/beta/datasets/src/reducer.js @@ -1,7 +1,12 @@ import { applyDatasetDefaults } from './defaults.js' +import { buildKeyGroups } from './panels/Key.jsx' const initialState = { datasets: null, + key: { + items: [], + hasGroups: false + }, hiddenFeatures: {}, // { [layerId]: { idProperty: string, ids: string[] } } layerAdapter: null } @@ -190,7 +195,17 @@ const setSublayerOpacity = (state, payload) => { const setLayerAdapter = (state, payload) => ({ ...state, layerAdapter: payload }) +const setKeyGroups = (state) => { + const visibleDatasets = state.datasets + ? state.datasets.filter(dataset => dataset.showInKey && dataset.visibility !== 'hidden') + : [] + const items = buildKeyGroups(visibleDatasets) + const hasGroups = items.some(item => item.type === 'sublayers' || item.type === 'group') + return { ...state, key: { items, hasGroups } } +} + const actions = { + SET_KEY_GROUPS: setKeyGroups, SET_DATASETS: setDatasets, ADD_DATASET: addDataset, REMOVE_DATASET: removeDataset, From d2f018951bc53b4dd2ad6ac1f660ed4d2056911e Mon Sep 17 00:00:00 2001 From: Mark Fee Date: Tue, 7 Apr 2026 16:06:34 +0100 Subject: [PATCH 2/2] moved setKeyGroups to utils/buildKeyState --- plugins/beta/datasets/src/DatasetsInit.jsx | 3 ++- plugins/beta/datasets/src/panels/Key.jsx | 25 ------------------- plugins/beta/datasets/src/reducer.js | 8 +++--- .../beta/datasets/src/utils/buildKeyState.js | 24 ++++++++++++++++++ 4 files changed, 30 insertions(+), 30 deletions(-) create mode 100644 plugins/beta/datasets/src/utils/buildKeyState.js diff --git a/plugins/beta/datasets/src/DatasetsInit.jsx b/plugins/beta/datasets/src/DatasetsInit.jsx index 975866bc..1a15f4d8 100755 --- a/plugins/beta/datasets/src/DatasetsInit.jsx +++ b/plugins/beta/datasets/src/DatasetsInit.jsx @@ -60,8 +60,9 @@ export function DatasetsInit ({ pluginConfig, pluginState, appState, mapState, m }, [isMapStyleReady, appState.mode]) useEffect(() => { - dispatch({ type: 'SET_KEY_GROUPS', payload: null }) + dispatch({ type: 'BUILD_KEY_GROUPS', payload: null }) }, [pluginState.datasets]) + // Cleanup only on unmount useEffect(() => { return () => { diff --git a/plugins/beta/datasets/src/panels/Key.jsx b/plugins/beta/datasets/src/panels/Key.jsx index 74389705..f450bd33 100755 --- a/plugins/beta/datasets/src/panels/Key.jsx +++ b/plugins/beta/datasets/src/panels/Key.jsx @@ -9,31 +9,6 @@ const SVG_SYMBOL_SIZE = 38 const SVG_CENTER = SVG_SIZE / 2 const PATTERN_INSET = 2 -export const buildKeyGroups = (datasets) => { - const seenGroups = new Set() - const items = [] - datasets.forEach(dataset => { - if (dataset.sublayers?.length) { - items.push({ type: 'sublayers', dataset }) - return - } - if (dataset.groupLabel) { - if (seenGroups.has(dataset.groupLabel)) { - return - } - seenGroups.add(dataset.groupLabel) - items.push({ - type: 'group', - groupLabel: dataset.groupLabel, - datasets: datasets.filter(d => !d.sublayers?.length && d.groupLabel === dataset.groupLabel) - }) - return - } - items.push({ type: 'flat', dataset }) - }) - return items -} - export const Key = ({ mapState, pluginState, services }) => { const { mapStyle } = mapState const { symbolRegistry, patternRegistry } = services diff --git a/plugins/beta/datasets/src/reducer.js b/plugins/beta/datasets/src/reducer.js index 0e985119..1409e86f 100755 --- a/plugins/beta/datasets/src/reducer.js +++ b/plugins/beta/datasets/src/reducer.js @@ -1,5 +1,5 @@ import { applyDatasetDefaults } from './defaults.js' -import { buildKeyGroups } from './panels/Key.jsx' +import { buildKeyState } from './utils/buildKeyState.js' const initialState = { datasets: null, @@ -195,17 +195,17 @@ const setSublayerOpacity = (state, payload) => { const setLayerAdapter = (state, payload) => ({ ...state, layerAdapter: payload }) -const setKeyGroups = (state) => { +const buildKeyGroups = (state) => { const visibleDatasets = state.datasets ? state.datasets.filter(dataset => dataset.showInKey && dataset.visibility !== 'hidden') : [] - const items = buildKeyGroups(visibleDatasets) + const items = buildKeyState(visibleDatasets) const hasGroups = items.some(item => item.type === 'sublayers' || item.type === 'group') return { ...state, key: { items, hasGroups } } } const actions = { - SET_KEY_GROUPS: setKeyGroups, + BUILD_KEY_GROUPS: buildKeyGroups, SET_DATASETS: setDatasets, ADD_DATASET: addDataset, REMOVE_DATASET: removeDataset, diff --git a/plugins/beta/datasets/src/utils/buildKeyState.js b/plugins/beta/datasets/src/utils/buildKeyState.js new file mode 100644 index 00000000..5acef328 --- /dev/null +++ b/plugins/beta/datasets/src/utils/buildKeyState.js @@ -0,0 +1,24 @@ +export const buildKeyState = (datasets) => { + const seenGroups = new Set() + const items = [] + datasets.forEach(dataset => { + if (dataset.sublayers?.length) { + items.push({ type: 'sublayers', dataset }) + return + } + if (dataset.groupLabel) { + if (seenGroups.has(dataset.groupLabel)) { + return + } + seenGroups.add(dataset.groupLabel) + items.push({ + type: 'group', + groupLabel: dataset.groupLabel, + datasets: datasets.filter(d => !d.sublayers?.length && d.groupLabel === dataset.groupLabel) + }) + return + } + items.push({ type: 'flat', dataset }) + }) + return items +}