@defra/interactive-map 0.0.30-alpha → 0.0.32-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/README.md +2 -2
- package/assets/images/bright-ofm-thumb.jpg +0 -0
- package/assets/images/dark-ofm-thumb.jpg +0 -0
- package/assets/images/road-ofm-thumb.jpg +0 -0
- package/assets/templates/add-polygons.njk +143 -0
- package/assets/templates/add-symbols.njk +119 -0
- package/assets/templates/{map.njk → basic-map.njk} +9 -17
- package/assets/templates/button-map.njk +56 -0
- package/assets/templates/draw-tools.njk +161 -0
- package/assets/templates/marker-panel.njk +91 -0
- package/assets/templates/place-marker.njk +104 -0
- package/assets/templates/search-control.njk +98 -0
- package/assets/templates/select-feature.njk +101 -0
- package/assets/templates/style-switcher.njk +87 -0
- package/assets/templates/toggle-marker-label.njk +74 -0
- 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/context.md +4 -4
- package/docs/api.md +166 -37
- package/docs/assets/css/docusaurus.scss +36 -4
- package/docs/assets/images/add-polygons.jpg +0 -0
- package/docs/assets/images/add-symbols.jpg +0 -0
- package/docs/assets/images/basic-map.jpg +0 -0
- package/docs/assets/images/button-first.jpg +0 -0
- package/docs/assets/images/deuteranopia-ozs-map-thumb.jpg +0 -0
- package/docs/assets/images/draw.jpg +0 -0
- package/docs/assets/images/marker-panel.jpg +0 -0
- package/docs/assets/images/night-ozs-map-thumb.jpg +0 -0
- package/docs/assets/images/outdoor-ozs-map-thumb.jpg +0 -0
- package/docs/assets/images/place-marker.jpg +0 -0
- package/docs/assets/images/screenshot.jpg +0 -0
- package/docs/assets/images/search.jpg +0 -0
- package/docs/assets/images/select-feature.jpg +0 -0
- package/docs/assets/images/style-switcher.jpg +0 -0
- package/docs/assets/images/toggle-marker-label.jpg +0 -0
- package/docs/assets/images/tritanopia-ozs-map-thumb.jpg +0 -0
- package/docs/examples/add-marker-with-panel.mdx +3 -3
- package/docs/examples/add-polygons.mdx +225 -0
- package/docs/examples/add-symbols.mdx +177 -0
- package/docs/examples/basic-map.mdx +2 -2
- package/docs/examples/draw-tools.mdx +271 -0
- package/docs/examples/index.mdx +95 -11
- package/docs/examples/place-marker.mdx +151 -0
- package/docs/examples/search-control.mdx +71 -0
- package/docs/examples/select-feature.mdx +146 -0
- package/docs/examples/style-switcher.mdx +135 -0
- package/docs/examples/toggle-marker-label.mdx +3 -3
- package/docs/plugins/datasets.md +157 -122
- package/docs/plugins/interact.md +1 -4
- package/docusaurus.config.cjs +9 -2
- package/govuk-prototype-kit.config.json +52 -2
- package/package.json +1 -1
- package/plugins/beta/datasets/dist/css/index.css +5 -2
- package/plugins/beta/datasets/dist/esm/im-datasets-ml-adapter.js +1 -0
- package/plugins/beta/datasets/dist/esm/im-datasets-plugin.js +1 -1
- package/plugins/beta/datasets/dist/esm/index.js +1 -1
- package/plugins/beta/datasets/dist/umd/im-datasets-ml-adapter.js +2 -0
- package/plugins/beta/datasets/dist/umd/im-datasets-plugin.js +2 -0
- package/plugins/beta/datasets/dist/umd/index.js +2 -0
- package/plugins/beta/datasets/src/adapters/loadLayerAdapter.js +33 -0
- package/plugins/beta/datasets/src/adapters/maplibre/layerBuilders.js +44 -120
- package/plugins/beta/datasets/src/adapters/maplibre/maplibreLayerAdapter.js +145 -245
- package/plugins/beta/datasets/src/adapters/maplibre/maplibreLayerAdapter.test.js +516 -0
- package/plugins/beta/datasets/src/adapters/maplibre/registry/mapLibreDataset.js +209 -0
- package/plugins/beta/datasets/src/adapters/maplibre/registry/mapLibreDataset.test.js +483 -0
- package/plugins/beta/datasets/src/api/addDataset.js +2 -5
- package/plugins/beta/datasets/src/api/addDataset.test.js +16 -0
- package/plugins/beta/datasets/src/api/getOpacity.js +14 -14
- package/plugins/beta/datasets/src/api/getOpacity.test.js +72 -0
- package/plugins/beta/datasets/src/api/getStyle.js +8 -9
- package/plugins/beta/datasets/src/api/getStyle.test.js +42 -0
- package/plugins/beta/datasets/src/api/removeDataset.js +7 -7
- package/plugins/beta/datasets/src/api/removeDataset.test.js +45 -0
- package/plugins/beta/datasets/src/api/setData.js +9 -3
- package/plugins/beta/datasets/src/api/setData.test.js +62 -0
- package/plugins/beta/datasets/src/api/setDatasetVisibility.js +5 -30
- package/plugins/beta/datasets/src/api/setDatasetVisibility.test.js +31 -0
- package/plugins/beta/datasets/src/api/setFeatureVisibility.js +9 -18
- package/plugins/beta/datasets/src/api/setFeatureVisibility.test.js +74 -0
- package/plugins/beta/datasets/src/api/setGlobals.js +20 -0
- package/plugins/beta/datasets/src/api/setGlobals.test.js +63 -0
- package/plugins/beta/datasets/src/api/setOpacity.js +8 -27
- package/plugins/beta/datasets/src/api/setOpacity.test.js +31 -0
- package/plugins/beta/datasets/src/api/setStyle.js +5 -21
- package/plugins/beta/datasets/src/api/setStyle.test.js +53 -0
- package/plugins/beta/datasets/src/components/Key/Key.jsx +51 -0
- package/plugins/beta/datasets/src/components/Key/KeyGroupItem.jsx +18 -0
- package/plugins/beta/datasets/src/components/Key/KeyItem.jsx +20 -0
- package/plugins/beta/datasets/src/components/Key/KeySvg.jsx +22 -0
- package/plugins/beta/datasets/src/components/Key/KeySvg.test.jsx +87 -0
- package/plugins/beta/datasets/src/components/Key/KeySvgLine.jsx +19 -0
- package/plugins/beta/datasets/src/components/Key/KeySvgLine.test.jsx +71 -0
- package/plugins/beta/datasets/src/components/{KeySvgPattern.jsx → Key/KeySvgPattern.jsx} +3 -4
- package/plugins/beta/datasets/src/components/Key/KeySvgPattern.test.jsx +55 -0
- package/plugins/beta/datasets/src/components/Key/KeySvgRect.jsx +22 -0
- package/plugins/beta/datasets/src/components/Key/KeySvgRect.test.jsx +85 -0
- package/plugins/beta/datasets/src/components/{KeySvgSymbol.jsx → Key/KeySvgSymbol.jsx} +5 -5
- package/plugins/beta/datasets/src/components/Key/KeySvgSymbol.test.jsx +80 -0
- package/plugins/beta/datasets/src/components/Key/svgProperties.test.js +61 -0
- package/plugins/beta/datasets/src/{panels → components/LayersMenu}/Layers.module.scss +15 -11
- package/plugins/beta/datasets/src/components/LayersMenu/LayersMenu.jsx +33 -0
- package/plugins/beta/datasets/src/components/LayersMenu/LayersMenuCheckbox.jsx +31 -0
- package/plugins/beta/datasets/src/components/LayersMenu/LayersMenuGroupWrapper.jsx +19 -0
- package/plugins/beta/datasets/src/datasets.scss +2 -2
- package/plugins/beta/datasets/src/fetch/createDynamicSource.js +8 -8
- package/plugins/beta/datasets/src/{DatasetsInit.jsx → initialise/DatasetsInit.jsx} +19 -21
- package/plugins/beta/datasets/src/{defaults.js → initialise/defaults.js} +17 -2
- package/plugins/beta/datasets/src/initialise/defaults.test.js +127 -0
- package/plugins/beta/datasets/src/{datasets.js → initialise/initialiseDatasets.js} +30 -26
- package/plugins/beta/datasets/src/initialise/initialiseDatasets.test.js +273 -0
- package/plugins/beta/datasets/src/manifest.js +8 -6
- package/plugins/beta/datasets/src/reducers/__data__/demoDatasets.js +253 -0
- package/plugins/beta/datasets/src/reducers/datasetsToMenu.js +83 -0
- package/plugins/beta/datasets/src/reducers/datasetsToMenu.test.js +84 -0
- package/plugins/beta/datasets/src/reducers/mappedDatasetsReducer.js +41 -0
- package/plugins/beta/datasets/src/reducers/mappedDatasetsReducer.test.js +117 -0
- package/plugins/beta/datasets/src/reducers/pluginState.js +206 -0
- package/plugins/beta/datasets/src/reducers/pluginState.test.js +386 -0
- package/plugins/beta/datasets/src/registry/__mocks__/datasetRegistry.js +29 -0
- package/plugins/beta/datasets/src/registry/createDataset.js +5 -0
- package/plugins/beta/datasets/src/registry/dataset.js +176 -0
- package/plugins/beta/datasets/src/registry/dataset.test.js +497 -0
- package/plugins/beta/datasets/src/registry/datasetDefinitionCache.js +35 -0
- package/plugins/beta/datasets/src/registry/datasetRegistry.js +116 -0
- package/plugins/beta/datasets/src/registry/datasetRegistry.test.js +335 -0
- package/plugins/beta/datasets/src/registry/dynamicGeoJson.js +17 -0
- package/plugins/beta/datasets/src/registry/globalDataset.js +36 -0
- package/plugins/beta/draw-es/dist/esm/im-draw-es-plugin.js +1 -1
- package/plugins/beta/draw-es/src/api/addFeature.js +12 -3
- package/plugins/beta/draw-es/src/events.js +8 -3
- package/plugins/beta/draw-es/src/events.test.js +2 -0
- package/plugins/beta/draw-es/src/graphic.js +26 -2
- 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-ml/src/DrawInit.jsx +8 -0
- package/plugins/beta/draw-ml/src/api/newLine.js +1 -0
- package/plugins/beta/draw-ml/src/api/newPolygon.js +1 -0
- package/plugins/beta/draw-ml/src/events.js +13 -1
- package/plugins/beta/draw-ml/src/index.js +1 -1
- package/plugins/beta/draw-ml/src/manifest.js +3 -0
- package/plugins/beta/draw-ml/src/modes/createDrawMode.js +21 -12
- package/plugins/beta/draw-ml/src/modes/editVertexMode.js +4 -0
- package/plugins/beta/draw-ol/dist/esm/EditMode.js +1 -1
- package/plugins/beta/draw-ol/dist/esm/im-draw-ol-plugin.js +1 -1
- package/plugins/beta/draw-ol/src/edit/keyboardHandler.js +4 -2
- package/plugins/beta/map-styles/src/mapStyles.scss +41 -41
- 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/InteractInit.jsx +3 -5
- package/plugins/interact/src/InteractInit.test.js +1 -3
- package/plugins/interact/src/events.js +2 -29
- package/plugins/interact/src/events.test.js +4 -102
- package/plugins/interact/src/hooks/useAttachEvents.js +3 -4
- package/plugins/interact/src/hooks/useAttachEvents.test.js +1 -3
- package/plugins/interact/src/hooks/useCrossHairVisibility.js +4 -10
- package/plugins/interact/src/hooks/useCrossHairVisibility.test.js +5 -10
- package/plugins/interact/src/hooks/useHighlightSync.js +1 -10
- package/plugins/interact/src/hooks/useHighlightSync.test.js +2 -21
- package/plugins/interact/src/hooks/useInteractionHandlers.js +15 -12
- package/plugins/interact/src/hooks/useInteractionHandlers.test.js +28 -29
- package/plugins/interact/src/manifest.js +0 -35
- package/plugins/interact/src/manifest.test.js +3 -43
- package/plugins/interact/src/reducer.js +4 -22
- package/plugins/interact/src/reducer.test.js +11 -39
- package/plugins/search/dist/css/index.css +5 -2
- package/plugins/search/src/components/Form/Form.module.scss +5 -2
- package/plugins/search/src/search.scss +4 -4
- package/providers/beta/esri/dist/esm/im-esri-provider.js +1 -1
- package/providers/beta/esri/src/esriProvider.js +4 -0
- 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/src/openlayersProvider.js +4 -0
- package/providers/beta/openlayers/src/openlayersProvider.test.js +5 -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/src/maplibreProvider.js +6 -4
- package/providers/maplibre/src/maplibreProvider.test.js +5 -0
- package/providers/maplibre/src/utils/highlightFeatures.js +74 -25
- package/providers/maplibre/src/utils/highlightFeatures.test.js +132 -0
- package/providers/maplibre/src/utils/patternImages.js +2 -4
- package/providers/maplibre/src/utils/symbolImages.js +1 -4
- package/rollup.esm.mjs +2 -8
- package/src/App/components/CrossHair/CrossHair.module.scss +8 -8
- package/src/App/components/MapButton/MapButton.jsx +16 -1
- package/src/App/components/MapButton/MapButton.module.scss +12 -1
- package/src/App/components/MapButton/MapButton.test.jsx +40 -1
- package/src/App/hooks/useContinueEnabledEvaluator.js +31 -0
- package/src/App/hooks/useContinueEnabledEvaluator.test.js +118 -0
- package/src/App/hooks/useEvaluateProp.js +15 -15
- package/src/App/hooks/useEvaluateProp.test.js +80 -76
- package/src/App/hooks/useLayoutMeasurements.js +11 -5
- package/src/App/hooks/useResizeObserver.js +15 -2
- package/src/App/hooks/useResizeObserver.test.js +1 -0
- package/src/App/renderer/PluginInits.jsx +2 -0
- package/src/App/renderer/mapButtons.js +21 -1
- package/src/App/renderer/mapButtons.test.js +46 -1
- package/src/App/store/appReducer.js +1 -1
- package/src/App/store/appReducer.test.js +37 -0
- package/src/InteractiveMap/InteractiveMap.js +14 -4
- package/src/InteractiveMap/InteractiveMap.test.js +11 -3
- package/src/InteractiveMap/behaviourController.js +3 -1
- package/src/InteractiveMap/behaviourController.test.js +6 -3
- package/src/InteractiveMap/domStateManager.js +2 -0
- package/src/config/appConfig.js +25 -0
- package/src/config/appConfig.test.js +50 -0
- package/src/config/defaults.js +1 -0
- package/src/config/events.js +21 -3
- package/src/scss/settings/_dimensions.scss +1 -0
- package/src/services/patternRegistry.js +8 -4
- package/src/types.js +7 -0
- package/src/utils/patternUtils.js +1 -2
- package/src/utils/patternUtils.test.js +9 -0
- package/webpack.dev.mjs +10 -0
- package/webpack.umd.mjs +1 -1
- package/docs/assets/images/screens-blue.jpg +0 -0
- package/docs/assets/images/screens-white.jpg +0 -0
- package/plugins/beta/datasets/dist/adapters/maplibre/esm/im-datasets-ml-adapter.js +0 -1
- package/plugins/beta/datasets/dist/adapters/maplibre/esm/index.js +0 -1
- package/plugins/beta/datasets/dist/umd/maplibre/im-datasets-maplibre-adapter.js +0 -2
- package/plugins/beta/datasets/dist/umd/maplibre/im-datasets-plugin.js +0 -2
- package/plugins/beta/datasets/dist/umd/maplibre/index.js +0 -2
- package/plugins/beta/datasets/src/adapters/maplibre/index.js +0 -18
- package/plugins/beta/datasets/src/adapters/maplibre/layerIds.js +0 -75
- package/plugins/beta/datasets/src/adapters/maplibre/patternImages.js +0 -27
- package/plugins/beta/datasets/src/adapters/maplibre/symbolImages.js +0 -31
- package/plugins/beta/datasets/src/components/KeySvg.jsx +0 -24
- package/plugins/beta/datasets/src/components/KeySvgLine.jsx +0 -19
- package/plugins/beta/datasets/src/components/KeySvgRect.jsx +0 -22
- package/plugins/beta/datasets/src/index.maplibre.umd.js +0 -23
- package/plugins/beta/datasets/src/panels/Key.jsx +0 -62
- package/plugins/beta/datasets/src/panels/Layers.jsx +0 -141
- package/plugins/beta/datasets/src/reducer.js +0 -219
- package/plugins/beta/datasets/src/reducers/keyReducer.js +0 -34
- package/plugins/beta/datasets/src/utils/filters.js +0 -34
- package/plugins/beta/datasets/src/utils/mergeSublayer.js +0 -86
- package/plugins/beta/draw-ml/dist/css/index.css +0 -21
- /package/plugins/beta/datasets/dist/umd/{maplibre/im-datasets-maplibre-adapter.js.LICENSE.txt → im-datasets-ml-adapter.js.LICENSE.txt} +0 -0
- /package/plugins/beta/datasets/dist/umd/{maplibre/im-datasets-plugin.js.LICENSE.txt → im-datasets-plugin.js.LICENSE.txt} +0 -0
- /package/plugins/beta/datasets/dist/umd/{maplibre/index.js.LICENSE.txt → index.js.LICENSE.txt} +0 -0
- /package/plugins/beta/datasets/src/components/{EmptyKey.jsx → Key/EmptyKey.jsx} +0 -0
- /package/plugins/beta/datasets/src/components/{EmptyKey.test.jsx → Key/EmptyKey.test.jsx} +0 -0
- /package/plugins/beta/datasets/src/{panels → components/Key}/Key.module.scss +0 -0
- /package/plugins/beta/datasets/src/components/{svgProperties.js → Key/svgProperties.js} +0 -0
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
import MaplibreLayerAdapter from './maplibreLayerAdapter.js'
|
|
2
|
+
import { MapLibreDataset } from './registry/mapLibreDataset.js'
|
|
3
|
+
import { datasetRegistry } from '../../registry/datasetRegistry.js'
|
|
4
|
+
import { symbolRegistry } from '../../../../../../src/services/symbolRegistry.js'
|
|
5
|
+
import { patternRegistry } from '../../../../../../src/services/patternRegistry.js'
|
|
6
|
+
|
|
7
|
+
jest.mock('../../registry/datasetRegistry.js')
|
|
8
|
+
|
|
9
|
+
// ─── helpers ─────────────────────────────────────────────────────────────────
|
|
10
|
+
|
|
11
|
+
const makeMap = () => {
|
|
12
|
+
const layers = new Map()
|
|
13
|
+
const sources = new Map()
|
|
14
|
+
return {
|
|
15
|
+
_layers: layers,
|
|
16
|
+
_sources: sources,
|
|
17
|
+
addLayer: jest.fn(layer => { layers.set(layer.id, { ...layer }) }),
|
|
18
|
+
addSource: jest.fn((id, spec) => { sources.set(id, { ...spec, setData: jest.fn() }) }),
|
|
19
|
+
getLayer: jest.fn(id => layers.get(id) ?? null),
|
|
20
|
+
getSource: jest.fn(id => sources.get(id) ?? null),
|
|
21
|
+
removeLayer: jest.fn(id => { layers.delete(id) }),
|
|
22
|
+
removeSource: jest.fn(id => { sources.delete(id) }),
|
|
23
|
+
setLayoutProperty: jest.fn((id, prop, val) => {
|
|
24
|
+
const layer = layers.get(id)
|
|
25
|
+
if (layer) { layer.layout = { ...(layer.layout || {}), [prop]: val } }
|
|
26
|
+
}),
|
|
27
|
+
setPaintProperty: jest.fn(),
|
|
28
|
+
setFilter: jest.fn(),
|
|
29
|
+
moveLayer: jest.fn(),
|
|
30
|
+
getStyle: jest.fn(() => ({ layers: [...layers.values()] })),
|
|
31
|
+
getPixelRatio: jest.fn(() => 1),
|
|
32
|
+
once: jest.fn((event, cb) => { if (event === 'idle') cb() })
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const makeMapProvider = (map) => ({
|
|
37
|
+
map,
|
|
38
|
+
addPatternsToMap: jest.fn().mockResolvedValue(undefined),
|
|
39
|
+
addSymbolsToMap: jest.fn().mockResolvedValue(undefined)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
const MAP_STYLE = { id: 'outdoor', layers: [] }
|
|
43
|
+
|
|
44
|
+
let map, mapProvider, adapter
|
|
45
|
+
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
datasetRegistry.attachCreateDataset(def => new MapLibreDataset(def))
|
|
48
|
+
symbolRegistry.clear()
|
|
49
|
+
symbolRegistry.initialise()
|
|
50
|
+
patternRegistry.clear()
|
|
51
|
+
patternRegistry.initialise()
|
|
52
|
+
|
|
53
|
+
map = makeMap()
|
|
54
|
+
mapProvider = makeMapProvider(map)
|
|
55
|
+
adapter = new MaplibreLayerAdapter(mapProvider, symbolRegistry, patternRegistry)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
// ─── init ─────────────────────────────────────────────────────────────────────
|
|
59
|
+
|
|
60
|
+
describe('init', () => {
|
|
61
|
+
it('calls addPatternsAndSymbolsToMap before adding layers', async () => {
|
|
62
|
+
await adapter.init(MAP_STYLE)
|
|
63
|
+
expect(mapProvider.addPatternsToMap).toHaveBeenCalled()
|
|
64
|
+
expect(mapProvider.addSymbolsToMap).toHaveBeenCalled()
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('adds fill + stroke layers for existing-fields', async () => {
|
|
68
|
+
await adapter.init(MAP_STYLE)
|
|
69
|
+
expect(map.getLayer('existing-fields')).toMatchObject({ type: 'fill' })
|
|
70
|
+
expect(map.getLayer('existing-fields-stroke')).toMatchObject({ type: 'line' })
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('adds symbol layers for all historic-monuments sublayers', async () => {
|
|
74
|
+
await adapter.init(MAP_STYLE)
|
|
75
|
+
expect(map.getLayer('historic-monuments-prehistoric')).toMatchObject({ type: 'symbol' })
|
|
76
|
+
expect(map.getLayer('historic-monuments-roman')).toMatchObject({ type: 'symbol' })
|
|
77
|
+
expect(map.getLayer('historic-monuments-medieval')).toMatchObject({ type: 'symbol' })
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it('adds fill + stroke layers for land-covers sublayers', async () => {
|
|
81
|
+
await adapter.init(MAP_STYLE)
|
|
82
|
+
expect(map.getLayer('land-covers-130-131')).toMatchObject({ type: 'fill' })
|
|
83
|
+
expect(map.getLayer('land-covers-130-131-stroke')).toMatchObject({ type: 'line' })
|
|
84
|
+
expect(map.getLayer('land-covers-332')).toMatchObject({ type: 'fill' })
|
|
85
|
+
expect(map.getLayer('land-covers-110')).toMatchObject({ type: 'fill' })
|
|
86
|
+
expect(map.getLayer('land-covers-other')).toMatchObject({ type: 'fill' })
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
it('adds a stroke-only layer for hedge-control', async () => {
|
|
90
|
+
await adapter.init(MAP_STYLE)
|
|
91
|
+
expect(map.getLayer('hedge-control')).toMatchObject({ type: 'line' })
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
it('adds a vector source for existing-fields', async () => {
|
|
95
|
+
await adapter.init(MAP_STYLE)
|
|
96
|
+
const ds = datasetRegistry.getDataset('existing-fields')
|
|
97
|
+
expect(map.addSource).toHaveBeenCalledWith(ds.sourceId, expect.objectContaining({ type: 'vector' }))
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
it('adds a geojson source for historic-monuments', async () => {
|
|
101
|
+
await adapter.init(MAP_STYLE)
|
|
102
|
+
const ds = datasetRegistry.getDataset('historic-monuments')
|
|
103
|
+
expect(map.addSource).toHaveBeenCalledWith(ds.sourceId, expect.objectContaining({ type: 'geojson' }))
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
it('adds a dynamic geojson source for land-covers', async () => {
|
|
107
|
+
await adapter.init(MAP_STYLE)
|
|
108
|
+
const ds = datasetRegistry.getDataset('land-covers')
|
|
109
|
+
expect(map.addSource).toHaveBeenCalledWith(ds.sourceId, expect.objectContaining({ type: 'geojson' }))
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
it('adds each source only once even when multiple sublayers share it', async () => {
|
|
113
|
+
await adapter.init(MAP_STYLE)
|
|
114
|
+
const ds = datasetRegistry.getDataset('historic-monuments')
|
|
115
|
+
const calls = map.addSource.mock.calls.filter(([id]) => id === ds.sourceId)
|
|
116
|
+
expect(calls).toHaveLength(1)
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
it('waits for map idle before resolving', async () => {
|
|
120
|
+
await adapter.init(MAP_STYLE)
|
|
121
|
+
expect(map.once).toHaveBeenCalledWith('idle', expect.any(Function))
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
it('tracks symbol layers in _symbolLayerIds', async () => {
|
|
125
|
+
await adapter.init(MAP_STYLE)
|
|
126
|
+
expect(adapter._symbolLayerIds.has('historic-monuments-prehistoric')).toBe(true)
|
|
127
|
+
expect(adapter._symbolLayerIds.has('historic-monuments-roman')).toBe(true)
|
|
128
|
+
expect(adapter._symbolLayerIds.has('historic-monuments-medieval')).toBe(true)
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
it('does not track fill/line layers in _symbolLayerIds', async () => {
|
|
132
|
+
await adapter.init(MAP_STYLE)
|
|
133
|
+
expect(adapter._symbolLayerIds.has('existing-fields')).toBe(false)
|
|
134
|
+
expect(adapter._symbolLayerIds.has('land-covers-130-131')).toBe(false)
|
|
135
|
+
expect(adapter._symbolLayerIds.has('hedge-control')).toBe(false)
|
|
136
|
+
})
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
// ─── removeLayer ──────────────────────────────────────────────────────────────
|
|
140
|
+
|
|
141
|
+
describe('removeLayer', () => {
|
|
142
|
+
it('removes an existing layer from the map', async () => {
|
|
143
|
+
await adapter.init(MAP_STYLE)
|
|
144
|
+
adapter.removeLayer('existing-fields')
|
|
145
|
+
expect(map.removeLayer).toHaveBeenCalledWith('existing-fields')
|
|
146
|
+
expect(map.getLayer('existing-fields')).toBeNull()
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
it('does not call map.removeLayer when the layer does not exist', () => {
|
|
150
|
+
adapter.removeLayer('nonexistent-layer')
|
|
151
|
+
expect(map.removeLayer).not.toHaveBeenCalled()
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
it('removes the layer id from _symbolLayerIds', async () => {
|
|
155
|
+
await adapter.init(MAP_STYLE)
|
|
156
|
+
expect(adapter._symbolLayerIds.has('historic-monuments-prehistoric')).toBe(true)
|
|
157
|
+
adapter.removeLayer('historic-monuments-prehistoric')
|
|
158
|
+
expect(adapter._symbolLayerIds.has('historic-monuments-prehistoric')).toBe(false)
|
|
159
|
+
})
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
// ─── destroy ──────────────────────────────────────────────────────────────────
|
|
163
|
+
|
|
164
|
+
describe('destroy', () => {
|
|
165
|
+
beforeEach(async () => { await adapter.init(MAP_STYLE) })
|
|
166
|
+
|
|
167
|
+
it('removes all layers from the map', () => {
|
|
168
|
+
adapter.destroy()
|
|
169
|
+
expect(map._layers.size).toBe(0)
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
it('removes all sources from the map', () => {
|
|
173
|
+
adapter.destroy()
|
|
174
|
+
expect(map._sources.size).toBe(0)
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
it('clears _datasetSourceMap', () => {
|
|
178
|
+
adapter.destroy()
|
|
179
|
+
expect(adapter._datasetSourceMap.size).toBe(0)
|
|
180
|
+
})
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
// ─── addDataset ───────────────────────────────────────────────────────────────
|
|
184
|
+
|
|
185
|
+
describe('addDataset', () => {
|
|
186
|
+
it('adds source and layers for a dataset not yet on the map', async () => {
|
|
187
|
+
await adapter.addDataset('existing-fields', MAP_STYLE)
|
|
188
|
+
expect(map.getLayer('existing-fields')).toBeTruthy()
|
|
189
|
+
expect(map.getLayer('existing-fields-stroke')).toBeTruthy()
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
it('adds symbol layers for all historic-monuments sublayers', async () => {
|
|
193
|
+
await adapter.addDataset('historic-monuments', MAP_STYLE)
|
|
194
|
+
expect(map.getLayer('historic-monuments-prehistoric')).toBeTruthy()
|
|
195
|
+
expect(map.getLayer('historic-monuments-roman')).toBeTruthy()
|
|
196
|
+
expect(map.getLayer('historic-monuments-medieval')).toBeTruthy()
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
it('calls addPatternsAndSymbolsToMap for the specific dataset', async () => {
|
|
200
|
+
await adapter.addDataset('historic-monuments', MAP_STYLE)
|
|
201
|
+
expect(mapProvider.addPatternsToMap).toHaveBeenCalled()
|
|
202
|
+
expect(mapProvider.addSymbolsToMap).toHaveBeenCalled()
|
|
203
|
+
})
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
// ─── removeDataset ────────────────────────────────────────────────────────────
|
|
207
|
+
|
|
208
|
+
describe('removeDataset', () => {
|
|
209
|
+
beforeEach(async () => { await adapter.init(MAP_STYLE) })
|
|
210
|
+
|
|
211
|
+
it('removes all layers for existing-fields', () => {
|
|
212
|
+
adapter.removeDataset('existing-fields')
|
|
213
|
+
expect(map.getLayer('existing-fields')).toBeNull()
|
|
214
|
+
expect(map.getLayer('existing-fields-stroke')).toBeNull()
|
|
215
|
+
})
|
|
216
|
+
|
|
217
|
+
it('does not remove source for existing-fields because it shares its tiles URL with hedge-control', () => {
|
|
218
|
+
const ds = datasetRegistry.getDataset('existing-fields')
|
|
219
|
+
adapter.removeDataset('existing-fields')
|
|
220
|
+
expect(map.getSource(ds.sourceId)).toBeTruthy()
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
it('removes all sublayer symbol layers for historic-monuments', () => {
|
|
224
|
+
adapter.removeDataset('historic-monuments')
|
|
225
|
+
expect(map.getLayer('historic-monuments-prehistoric')).toBeNull()
|
|
226
|
+
expect(map.getLayer('historic-monuments-roman')).toBeNull()
|
|
227
|
+
expect(map.getLayer('historic-monuments-medieval')).toBeNull()
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
it('removes the source when removing historic-monuments (unique source)', () => {
|
|
231
|
+
const ds = datasetRegistry.getDataset('historic-monuments')
|
|
232
|
+
adapter.removeDataset('historic-monuments')
|
|
233
|
+
expect(map.getSource(ds.sourceId)).toBeNull()
|
|
234
|
+
})
|
|
235
|
+
|
|
236
|
+
it('does not remove source shared by remaining land-covers sublayers', () => {
|
|
237
|
+
const parentDs = datasetRegistry.getDataset('land-covers')
|
|
238
|
+
adapter.removeDataset('land-covers-130-131')
|
|
239
|
+
expect(map.getSource(parentDs.sourceId)).toBeTruthy()
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
it('deletes the dataset from _datasetSourceMap', () => {
|
|
243
|
+
adapter.removeDataset('hedge-control')
|
|
244
|
+
expect(adapter._datasetSourceMap.has('hedge-control')).toBe(false)
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
it('does nothing when the dataset is not in the registry', () => {
|
|
248
|
+
const removeBefore = map.removeLayer.mock.calls.length
|
|
249
|
+
adapter.removeDataset('nonexistent')
|
|
250
|
+
expect(map.removeLayer.mock.calls.length).toBe(removeBefore)
|
|
251
|
+
})
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
// ─── setData ──────────────────────────────────────────────────────────────────
|
|
255
|
+
|
|
256
|
+
describe('setData', () => {
|
|
257
|
+
beforeEach(async () => { await adapter.init(MAP_STYLE) })
|
|
258
|
+
|
|
259
|
+
it('calls source.setData for a dynamic dataset (land-covers)', () => {
|
|
260
|
+
const ds = datasetRegistry.getDataset('land-covers')
|
|
261
|
+
const geojson = { type: 'FeatureCollection', features: [] }
|
|
262
|
+
adapter.setData('land-covers', geojson)
|
|
263
|
+
expect(map.getSource(ds.sourceId).setData).toHaveBeenCalledWith(geojson)
|
|
264
|
+
})
|
|
265
|
+
|
|
266
|
+
it('does nothing when the dataset is not in _datasetSourceMap', () => {
|
|
267
|
+
expect(() => adapter.setData('unknown-dataset', {})).not.toThrow()
|
|
268
|
+
})
|
|
269
|
+
|
|
270
|
+
it('does nothing when the source does not have a setData method', () => {
|
|
271
|
+
adapter._datasetSourceMap.set('bare-ds', 'bare-source')
|
|
272
|
+
map._sources.set('bare-source', { type: 'vector' })
|
|
273
|
+
expect(() => adapter.setData('bare-ds', {})).not.toThrow()
|
|
274
|
+
})
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
// ─── applyDatasetVisibility ───────────────────────────────────────────────────
|
|
278
|
+
|
|
279
|
+
describe('applyDatasetVisibility', () => {
|
|
280
|
+
beforeEach(async () => { await adapter.init(MAP_STYLE) })
|
|
281
|
+
|
|
282
|
+
it('sets visibility to "visible" for existing-fields layers', () => {
|
|
283
|
+
adapter.applyDatasetVisibility('existing-fields')
|
|
284
|
+
expect(map.setLayoutProperty).toHaveBeenCalledWith('existing-fields', 'visibility', 'visible')
|
|
285
|
+
expect(map.setLayoutProperty).toHaveBeenCalledWith('existing-fields-stroke', 'visibility', 'visible')
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
it('sets visibility to "none" for hedge-control (visible: false)', () => {
|
|
289
|
+
adapter.applyDatasetVisibility('hedge-control')
|
|
290
|
+
expect(map.setLayoutProperty).toHaveBeenCalledWith('hedge-control', 'visibility', 'none')
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
it('sets visibility on all sublayer symbol layers for historic-monuments', () => {
|
|
294
|
+
adapter.applyDatasetVisibility('historic-monuments')
|
|
295
|
+
expect(map.setLayoutProperty).toHaveBeenCalledWith('historic-monuments-prehistoric', 'visibility', 'visible')
|
|
296
|
+
expect(map.setLayoutProperty).toHaveBeenCalledWith('historic-monuments-roman', 'visibility', 'visible')
|
|
297
|
+
expect(map.setLayoutProperty).toHaveBeenCalledWith('historic-monuments-medieval', 'visibility', 'visible')
|
|
298
|
+
})
|
|
299
|
+
|
|
300
|
+
it('does nothing for an unknown dataset', () => {
|
|
301
|
+
const before = map.setLayoutProperty.mock.calls.length
|
|
302
|
+
adapter.applyDatasetVisibility('unknown')
|
|
303
|
+
expect(map.setLayoutProperty.mock.calls.length).toBe(before)
|
|
304
|
+
})
|
|
305
|
+
})
|
|
306
|
+
|
|
307
|
+
// ─── applyGlobalVisibility ────────────────────────────────────────────────────
|
|
308
|
+
|
|
309
|
+
describe('applyGlobalVisibility', () => {
|
|
310
|
+
beforeEach(async () => { await adapter.init(MAP_STYLE) })
|
|
311
|
+
|
|
312
|
+
it('sets visibility on layers for all top-level datasets', () => {
|
|
313
|
+
map.setLayoutProperty.mockClear()
|
|
314
|
+
adapter.applyGlobalVisibility()
|
|
315
|
+
const ids = map.setLayoutProperty.mock.calls.map(([id]) => id)
|
|
316
|
+
expect(ids).toContain('existing-fields')
|
|
317
|
+
expect(ids).toContain('existing-fields-stroke')
|
|
318
|
+
expect(ids).toContain('historic-monuments-prehistoric')
|
|
319
|
+
expect(ids).toContain('hedge-control')
|
|
320
|
+
expect(ids).toContain('land-covers-130-131')
|
|
321
|
+
})
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
// ─── applyFeatureFilter ───────────────────────────────────────────────────────
|
|
325
|
+
|
|
326
|
+
describe('applyFeatureFilter', () => {
|
|
327
|
+
beforeEach(async () => { await adapter.init(MAP_STYLE) })
|
|
328
|
+
|
|
329
|
+
it('sets filter on all land-covers sublayers (parent has hiddenFeatures: [42])', () => {
|
|
330
|
+
adapter.applyFeatureFilter('land-covers')
|
|
331
|
+
const ids = map.setFilter.mock.calls.map(([id]) => id)
|
|
332
|
+
expect(ids).toContain('land-covers-130-131')
|
|
333
|
+
expect(ids).toContain('land-covers-332')
|
|
334
|
+
expect(ids).toContain('land-covers-110')
|
|
335
|
+
expect(ids).toContain('land-covers-other')
|
|
336
|
+
})
|
|
337
|
+
|
|
338
|
+
it('passes a non-null filter expression for land-covers sublayers', () => {
|
|
339
|
+
adapter.applyFeatureFilter('land-covers')
|
|
340
|
+
const [, filter] = map.setFilter.mock.calls.find(([id]) => id === 'land-covers-332')
|
|
341
|
+
expect(filter).not.toBeNull()
|
|
342
|
+
})
|
|
343
|
+
|
|
344
|
+
it('does not call setFilter when dataset has no hidden features (historic-monuments)', () => {
|
|
345
|
+
map.setFilter.mockClear()
|
|
346
|
+
adapter.applyFeatureFilter('historic-monuments')
|
|
347
|
+
expect(map.setFilter).not.toHaveBeenCalled()
|
|
348
|
+
})
|
|
349
|
+
|
|
350
|
+
it('does not call setFilter for existing-fields (no hidden features)', () => {
|
|
351
|
+
map.setFilter.mockClear()
|
|
352
|
+
adapter.applyFeatureFilter('existing-fields')
|
|
353
|
+
expect(map.setFilter).not.toHaveBeenCalled()
|
|
354
|
+
})
|
|
355
|
+
|
|
356
|
+
it('does nothing for an unknown dataset', () => {
|
|
357
|
+
map.setFilter.mockClear()
|
|
358
|
+
adapter.applyFeatureFilter('unknown')
|
|
359
|
+
expect(map.setFilter).not.toHaveBeenCalled()
|
|
360
|
+
})
|
|
361
|
+
})
|
|
362
|
+
|
|
363
|
+
// ─── applyDatasetOpacity ──────────────────────────────────────────────────────
|
|
364
|
+
|
|
365
|
+
describe('applyDatasetOpacity', () => {
|
|
366
|
+
beforeEach(async () => { await adapter.init(MAP_STYLE) })
|
|
367
|
+
|
|
368
|
+
it('sets fill-opacity on the fill layer for existing-fields', () => {
|
|
369
|
+
adapter.applyDatasetOpacity('existing-fields')
|
|
370
|
+
expect(map.setPaintProperty).toHaveBeenCalledWith('existing-fields', 'fill-opacity', expect.any(Number))
|
|
371
|
+
})
|
|
372
|
+
|
|
373
|
+
it('sets line-opacity on the stroke layer for existing-fields', () => {
|
|
374
|
+
adapter.applyDatasetOpacity('existing-fields')
|
|
375
|
+
expect(map.setPaintProperty).toHaveBeenCalledWith('existing-fields-stroke', 'line-opacity', expect.any(Number))
|
|
376
|
+
})
|
|
377
|
+
|
|
378
|
+
it('sets icon-opacity on symbol layers for historic-monuments sublayers', () => {
|
|
379
|
+
adapter.applyDatasetOpacity('historic-monuments')
|
|
380
|
+
expect(map.setPaintProperty).toHaveBeenCalledWith('historic-monuments-prehistoric', 'icon-opacity', expect.any(Number))
|
|
381
|
+
expect(map.setPaintProperty).toHaveBeenCalledWith('historic-monuments-roman', 'icon-opacity', expect.any(Number))
|
|
382
|
+
expect(map.setPaintProperty).toHaveBeenCalledWith('historic-monuments-medieval', 'icon-opacity', expect.any(Number))
|
|
383
|
+
})
|
|
384
|
+
|
|
385
|
+
it('sets fill-opacity on land-covers sublayer fill layers', () => {
|
|
386
|
+
adapter.applyDatasetOpacity('land-covers')
|
|
387
|
+
expect(map.setPaintProperty).toHaveBeenCalledWith('land-covers-130-131', 'fill-opacity', expect.any(Number))
|
|
388
|
+
expect(map.setPaintProperty).toHaveBeenCalledWith('land-covers-332', 'fill-opacity', expect.any(Number))
|
|
389
|
+
})
|
|
390
|
+
|
|
391
|
+
it('does nothing for an unknown dataset', () => {
|
|
392
|
+
const before = map.setPaintProperty.mock.calls.length
|
|
393
|
+
adapter.applyDatasetOpacity('unknown')
|
|
394
|
+
expect(map.setPaintProperty.mock.calls.length).toBe(before)
|
|
395
|
+
})
|
|
396
|
+
})
|
|
397
|
+
|
|
398
|
+
// ─── applyGlobalOpacity ───────────────────────────────────────────────────────
|
|
399
|
+
|
|
400
|
+
describe('applyGlobalOpacity', () => {
|
|
401
|
+
beforeEach(async () => { await adapter.init(MAP_STYLE) })
|
|
402
|
+
|
|
403
|
+
it('sets paint opacity on layers for all datasets', () => {
|
|
404
|
+
map.setPaintProperty.mockClear()
|
|
405
|
+
adapter.applyGlobalOpacity()
|
|
406
|
+
const ids = map.setPaintProperty.mock.calls.map(([id]) => id)
|
|
407
|
+
expect(ids).toContain('existing-fields')
|
|
408
|
+
expect(ids).toContain('existing-fields-stroke')
|
|
409
|
+
expect(ids).toContain('historic-monuments-prehistoric')
|
|
410
|
+
expect(ids).toContain('hedge-control')
|
|
411
|
+
expect(ids).toContain('land-covers-130-131')
|
|
412
|
+
})
|
|
413
|
+
})
|
|
414
|
+
|
|
415
|
+
// ─── applyStyle ───────────────────────────────────────────────────────────────
|
|
416
|
+
|
|
417
|
+
describe('applyStyle', () => {
|
|
418
|
+
beforeEach(async () => { await adapter.init(MAP_STYLE) })
|
|
419
|
+
|
|
420
|
+
it('removes old fill + stroke layers then re-adds them for existing-fields', async () => {
|
|
421
|
+
await adapter.applyStyle('existing-fields', MAP_STYLE)
|
|
422
|
+
expect(map.removeLayer).toHaveBeenCalledWith('existing-fields')
|
|
423
|
+
expect(map.removeLayer).toHaveBeenCalledWith('existing-fields-stroke')
|
|
424
|
+
expect(map.getLayer('existing-fields')).toBeTruthy()
|
|
425
|
+
expect(map.getLayer('existing-fields-stroke')).toBeTruthy()
|
|
426
|
+
})
|
|
427
|
+
|
|
428
|
+
it('removes and re-adds the symbol layer for a historic-monuments sublayer', async () => {
|
|
429
|
+
await adapter.applyStyle('historic-monuments-prehistoric', MAP_STYLE)
|
|
430
|
+
expect(map.removeLayer).toHaveBeenCalledWith('historic-monuments-prehistoric')
|
|
431
|
+
expect(map.getLayer('historic-monuments-prehistoric')).toBeTruthy()
|
|
432
|
+
})
|
|
433
|
+
|
|
434
|
+
it('calls addPatternsAndSymbolsToMap for the specific dataset', async () => {
|
|
435
|
+
mapProvider.addPatternsToMap.mockClear()
|
|
436
|
+
await adapter.applyStyle('existing-fields', MAP_STYLE)
|
|
437
|
+
expect(mapProvider.addPatternsToMap).toHaveBeenCalled()
|
|
438
|
+
})
|
|
439
|
+
})
|
|
440
|
+
|
|
441
|
+
// ─── onMapStyleChange ─────────────────────────────────────────────────────────
|
|
442
|
+
|
|
443
|
+
describe('onMapStyleChange', () => {
|
|
444
|
+
beforeEach(async () => { await adapter.init(MAP_STYLE) })
|
|
445
|
+
|
|
446
|
+
it('waits for map idle before proceeding', async () => {
|
|
447
|
+
let idleCb
|
|
448
|
+
map.once.mockImplementation((event, cb) => { if (event === 'idle') idleCb = cb })
|
|
449
|
+
const promise = adapter.onMapStyleChange(MAP_STYLE, new Map())
|
|
450
|
+
expect(idleCb).toBeDefined()
|
|
451
|
+
idleCb()
|
|
452
|
+
await promise
|
|
453
|
+
})
|
|
454
|
+
|
|
455
|
+
it('calls addPatternsAndSymbolsToMap with the new style', async () => {
|
|
456
|
+
const newStyle = { id: 'dark', layers: [] }
|
|
457
|
+
mapProvider.addPatternsToMap.mockClear()
|
|
458
|
+
await adapter.onMapStyleChange(newStyle, new Map())
|
|
459
|
+
expect(mapProvider.addPatternsToMap).toHaveBeenCalled()
|
|
460
|
+
})
|
|
461
|
+
|
|
462
|
+
it('re-adds all dataset layers after a style wipe', async () => {
|
|
463
|
+
map._layers.clear()
|
|
464
|
+
map._sources.clear()
|
|
465
|
+
await adapter.onMapStyleChange(MAP_STYLE, new Map())
|
|
466
|
+
expect(map.getLayer('existing-fields')).toBeTruthy()
|
|
467
|
+
expect(map.getLayer('historic-monuments-prehistoric')).toBeTruthy()
|
|
468
|
+
expect(map.getLayer('land-covers-130-131')).toBeTruthy()
|
|
469
|
+
expect(map.getLayer('hedge-control')).toBeTruthy()
|
|
470
|
+
})
|
|
471
|
+
|
|
472
|
+
it('reapplies feature filters for datasets with hidden features', async () => {
|
|
473
|
+
map.setFilter.mockClear()
|
|
474
|
+
await adapter.onMapStyleChange(MAP_STYLE, new Map())
|
|
475
|
+
const ids = map.setFilter.mock.calls.map(([id]) => id)
|
|
476
|
+
expect(ids).toContain('land-covers-130-131')
|
|
477
|
+
})
|
|
478
|
+
})
|
|
479
|
+
|
|
480
|
+
// ─── onMapSizeChange ──────────────────────────────────────────────────────────
|
|
481
|
+
|
|
482
|
+
describe('onMapSizeChange', () => {
|
|
483
|
+
beforeEach(async () => { await adapter.init(MAP_STYLE) })
|
|
484
|
+
|
|
485
|
+
it('updates icon-image layout property for historic-monuments symbol layers', async () => {
|
|
486
|
+
map.setLayoutProperty.mockClear()
|
|
487
|
+
await adapter.onMapSizeChange(MAP_STYLE)
|
|
488
|
+
const symbolUpdates = map.setLayoutProperty.mock.calls.filter(([, prop]) => prop === 'icon-image')
|
|
489
|
+
const ids = symbolUpdates.map(([id]) => id)
|
|
490
|
+
expect(ids).toContain('historic-monuments-prehistoric')
|
|
491
|
+
expect(ids).toContain('historic-monuments-roman')
|
|
492
|
+
expect(ids).toContain('historic-monuments-medieval')
|
|
493
|
+
})
|
|
494
|
+
|
|
495
|
+
it('updates fill-pattern paint property for land-covers sublayers', async () => {
|
|
496
|
+
map.setPaintProperty.mockClear()
|
|
497
|
+
await adapter.onMapSizeChange(MAP_STYLE)
|
|
498
|
+
const patternUpdates = map.setPaintProperty.mock.calls.filter(([, prop]) => prop === 'fill-pattern')
|
|
499
|
+
const ids = patternUpdates.map(([id]) => id)
|
|
500
|
+
expect(ids).toContain('land-covers-130-131')
|
|
501
|
+
expect(ids).toContain('land-covers-332')
|
|
502
|
+
})
|
|
503
|
+
|
|
504
|
+
it('does not update fill-pattern for existing-fields (no fillPattern style)', async () => {
|
|
505
|
+
map.setPaintProperty.mockClear()
|
|
506
|
+
await adapter.onMapSizeChange(MAP_STYLE)
|
|
507
|
+
const patternUpdates = map.setPaintProperty.mock.calls.filter(([, prop]) => prop === 'fill-pattern')
|
|
508
|
+
expect(patternUpdates.map(([id]) => id)).not.toContain('existing-fields')
|
|
509
|
+
})
|
|
510
|
+
|
|
511
|
+
it('calls addPatternsAndSymbolsToMap', async () => {
|
|
512
|
+
mapProvider.addPatternsToMap.mockClear()
|
|
513
|
+
await adapter.onMapSizeChange(MAP_STYLE)
|
|
514
|
+
expect(mapProvider.addPatternsToMap).toHaveBeenCalled()
|
|
515
|
+
})
|
|
516
|
+
})
|