@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,18 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { getValueForStyle } from '../../../../../../src/utils/getValueForStyle.js'
|
|
2
|
+
import { KeySvg } from './KeySvg.jsx'
|
|
3
|
+
|
|
4
|
+
export const KeyItem = ({ registryDataset, symbolRegistry, patternRegistry, mapStyle }) => {
|
|
5
|
+
return (
|
|
6
|
+
<dl className='im-c-datasets-key__item'>
|
|
7
|
+
<dt className='im-c-datasets-key__item-symbol'>
|
|
8
|
+
<KeySvg registryDataset={registryDataset} symbolRegistry={symbolRegistry} patternRegistry={patternRegistry} mapStyle={mapStyle} />
|
|
9
|
+
</dt>
|
|
10
|
+
<dd className='im-c-datasets-key__item-label'>
|
|
11
|
+
{registryDataset.label}
|
|
12
|
+
{registryDataset.symbolDescription && (
|
|
13
|
+
<span className='govuk-visually-hidden'>
|
|
14
|
+
({getValueForStyle(registryDataset.symbolDescription, mapStyle.id)})
|
|
15
|
+
</span>
|
|
16
|
+
)}
|
|
17
|
+
</dd>
|
|
18
|
+
</dl>
|
|
19
|
+
)
|
|
20
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { render } from '@testing-library/react'
|
|
2
|
+
import { KeySvg } from './KeySvg'
|
|
3
|
+
|
|
4
|
+
import { symbolRegistry } from '../../../../../../src/services/symbolRegistry.js'
|
|
5
|
+
import { patternRegistry } from '../../../../../../src/services/patternRegistry.js'
|
|
6
|
+
|
|
7
|
+
const getSymbolDef = jest.spyOn(symbolRegistry, 'getSymbolDef')
|
|
8
|
+
|
|
9
|
+
jest.mock('./KeySvgPattern.jsx', () => ({
|
|
10
|
+
KeySvgPattern: () => <svg data-testid='key-svg-pattern' />
|
|
11
|
+
}))
|
|
12
|
+
|
|
13
|
+
jest.mock('./KeySvgSymbol.jsx', () => ({
|
|
14
|
+
KeySvgSymbol: () => <svg data-testid='key-svg-symbol' />
|
|
15
|
+
}))
|
|
16
|
+
|
|
17
|
+
jest.mock('./KeySvgLine.jsx', () => ({
|
|
18
|
+
KeySvgLine: () => <svg data-testid='key-svg-line' />
|
|
19
|
+
}))
|
|
20
|
+
|
|
21
|
+
jest.mock('./KeySvgRect.jsx', () => ({
|
|
22
|
+
KeySvgRect: () => <svg data-testid='key-svg-rect' />
|
|
23
|
+
}))
|
|
24
|
+
|
|
25
|
+
const baseRegistryDataset = {
|
|
26
|
+
hasSymbol: false,
|
|
27
|
+
hasPattern: false,
|
|
28
|
+
style: {}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const baseProps = {
|
|
32
|
+
symbolRegistry,
|
|
33
|
+
patternRegistry,
|
|
34
|
+
mapStyle: { id: 'default' },
|
|
35
|
+
registryDataset: baseRegistryDataset
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
beforeEach(() => {
|
|
39
|
+
getSymbolDef.mockReturnValue(null)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
describe('KeySvg', () => {
|
|
43
|
+
it('renders KeySvgSymbol when a symbolDef is resolved', () => {
|
|
44
|
+
getSymbolDef.mockReturnValue({ id: 'marker' })
|
|
45
|
+
const { getByTestId } = render(<KeySvg {...baseProps} registryDataset={{ ...baseRegistryDataset, hasSymbol: true }} />)
|
|
46
|
+
expect(getByTestId('key-svg-symbol')).toBeTruthy()
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('renders KeySvgPattern when hasPattern is true and no symbol', () => {
|
|
50
|
+
const { getByTestId } = render(<KeySvg {...baseProps} registryDataset={{ ...baseRegistryDataset, hasPattern: true }} />)
|
|
51
|
+
expect(getByTestId('key-svg-pattern')).toBeTruthy()
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
it('renders KeySvgLine when keySymbolShape is line and no symbol or pattern', () => {
|
|
55
|
+
const { getByTestId } = render(<KeySvg {...baseProps} registryDataset={{ ...baseRegistryDataset, style: { keySymbolShape: 'line' } }} />)
|
|
56
|
+
expect(getByTestId('key-svg-line')).toBeTruthy()
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('renders KeySvgRect as the default fallback', () => {
|
|
60
|
+
const { getByTestId } = render(<KeySvg {...baseProps} />)
|
|
61
|
+
expect(getByTestId('key-svg-rect')).toBeTruthy()
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('prefers symbol over pattern when both are present', () => {
|
|
65
|
+
getSymbolDef.mockReturnValue({ id: 'marker' })
|
|
66
|
+
const { getByTestId, queryByTestId } = render(<KeySvg {...baseProps} registryDataset={{ ...baseRegistryDataset, hasSymbol: true, hasPattern: true }} />)
|
|
67
|
+
expect(getByTestId('key-svg-symbol')).toBeTruthy()
|
|
68
|
+
expect(queryByTestId('key-svg-pattern')).toBeNull()
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
it('prefers pattern over line when both conditions are met', () => {
|
|
72
|
+
const { getByTestId, queryByTestId } = render(<KeySvg {...baseProps} registryDataset={{ ...baseRegistryDataset, hasPattern: true, style: { keySymbolShape: 'line' } }} />)
|
|
73
|
+
expect(getByTestId('key-svg-pattern')).toBeTruthy()
|
|
74
|
+
expect(queryByTestId('key-svg-line')).toBeNull()
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
it('renders KeySvgRect when keySymbolShape is not line and no symbol or pattern', () => {
|
|
78
|
+
const { getByTestId } = render(<KeySvg {...baseProps} registryDataset={{ ...baseRegistryDataset, style: { keySymbolShape: 'polygon' } }} />)
|
|
79
|
+
expect(getByTestId('key-svg-rect')).toBeTruthy()
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
it('does not render KeySvgSymbol when hasSymbol is true but getSymbolDef returns null', () => {
|
|
83
|
+
getSymbolDef.mockReturnValue(null)
|
|
84
|
+
const { getByTestId } = render(<KeySvg {...baseProps} registryDataset={{ ...baseRegistryDataset, hasSymbol: true }} />)
|
|
85
|
+
expect(getByTestId('key-svg-rect')).toBeTruthy()
|
|
86
|
+
})
|
|
87
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { render } from '@testing-library/react'
|
|
2
|
+
import { KeySvgLine } from './KeySvgLine'
|
|
3
|
+
|
|
4
|
+
import { getValueForStyle } from '../../../../../../src/utils/getValueForStyle'
|
|
5
|
+
|
|
6
|
+
jest.mock('../../../../../../src/utils/getValueForStyle', () => ({
|
|
7
|
+
getValueForStyle: jest.fn((value) => value)
|
|
8
|
+
}))
|
|
9
|
+
|
|
10
|
+
const defaultProps = {
|
|
11
|
+
registryDataset: {
|
|
12
|
+
style: {
|
|
13
|
+
stroke: '#ff0000',
|
|
14
|
+
strokeWidth: 2
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
mapStyle: { id: 'default' }
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
getValueForStyle.mockImplementation((value) => value)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
describe('KeySvgLine', () => {
|
|
25
|
+
it('renders an svg element', () => {
|
|
26
|
+
const { container } = render(<KeySvgLine {...defaultProps} />)
|
|
27
|
+
expect(container.querySelector('svg')).toBeTruthy()
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('renders a line element', () => {
|
|
31
|
+
const { container } = render(<KeySvgLine {...defaultProps} />)
|
|
32
|
+
expect(container.querySelector('line')).toBeTruthy()
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('applies the stroke color via getValueForStyle', () => {
|
|
36
|
+
render(<KeySvgLine {...defaultProps} />)
|
|
37
|
+
expect(getValueForStyle).toHaveBeenCalledWith('#ff0000', 'default')
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
it('sets stroke attribute on the line', () => {
|
|
41
|
+
const { container } = render(<KeySvgLine {...defaultProps} />)
|
|
42
|
+
const line = container.querySelector('line')
|
|
43
|
+
expect(line.getAttribute('stroke')).toBe('#ff0000')
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('sets strokeWidth attribute on the line', () => {
|
|
47
|
+
const { container } = render(<KeySvgLine {...defaultProps} />)
|
|
48
|
+
const line = container.querySelector('line')
|
|
49
|
+
expect(line.getAttribute('stroke-width')).toBe('2')
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('centres the line vertically', () => {
|
|
53
|
+
const { container } = render(<KeySvgLine {...defaultProps} />)
|
|
54
|
+
const line = container.querySelector('line')
|
|
55
|
+
expect(line.getAttribute('y1')).toBe('10')
|
|
56
|
+
expect(line.getAttribute('y2')).toBe('10')
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('insets the line horizontally by half the strokeWidth', () => {
|
|
60
|
+
const { container } = render(<KeySvgLine {...defaultProps} />)
|
|
61
|
+
const line = container.querySelector('line')
|
|
62
|
+
expect(line.getAttribute('x1')).toBe('1') // strokeWidth/2 = 1
|
|
63
|
+
expect(line.getAttribute('x2')).toBe('19') // 20 - 1
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
it('has round stroke linecap', () => {
|
|
67
|
+
const { container } = render(<KeySvgLine {...defaultProps} />)
|
|
68
|
+
const line = container.querySelector('line')
|
|
69
|
+
expect(line.getAttribute('stroke-linecap')).toBe('round')
|
|
70
|
+
})
|
|
71
|
+
})
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { svgProps } from './svgProperties.js'
|
|
2
2
|
const PATTERN_INSET = 2
|
|
3
3
|
|
|
4
|
-
export const KeySvgPattern = (
|
|
5
|
-
const {
|
|
6
|
-
|
|
7
|
-
const paths = patternRegistry.getKeyPatternPaths(props, mapStyle.id)
|
|
4
|
+
export const KeySvgPattern = ({ patternRegistry, registryDataset, mapStyle }) => {
|
|
5
|
+
const { style } = registryDataset
|
|
6
|
+
const paths = patternRegistry.getKeyPatternPaths(style, mapStyle.id)
|
|
8
7
|
return (
|
|
9
8
|
<svg {...svgProps}>
|
|
10
9
|
<g dangerouslySetInnerHTML={{ __html: paths.border }} />
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { render } from '@testing-library/react'
|
|
2
|
+
import { KeySvgPattern } from './KeySvgPattern'
|
|
3
|
+
import { patternRegistry } from '../../../../../../src/services/patternRegistry.js'
|
|
4
|
+
|
|
5
|
+
const getKeyPatternPaths = jest.spyOn(patternRegistry, 'getKeyPatternPaths')
|
|
6
|
+
const defaultProps = {
|
|
7
|
+
registryDataset: {
|
|
8
|
+
style: {
|
|
9
|
+
fillPattern: 'dots'
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
patternRegistry,
|
|
13
|
+
mapStyle: { id: 'default' }
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
getKeyPatternPaths.mockReturnValue({ border: '<rect/>', content: '<path/>' })
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
describe('KeySvgPattern', () => {
|
|
21
|
+
it('renders an svg element', () => {
|
|
22
|
+
const { container } = render(<KeySvgPattern {...defaultProps} />)
|
|
23
|
+
expect(container.querySelector('svg')).toBeTruthy()
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('calls getKeyPatternPaths with props, the mapStyle id, and the patternRegistry', () => {
|
|
27
|
+
render(<KeySvgPattern {...defaultProps} />)
|
|
28
|
+
expect(getKeyPatternPaths).toHaveBeenCalledWith(defaultProps.registryDataset.style, 'default')
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('renders two g elements for border and content', () => {
|
|
32
|
+
const { container } = render(<KeySvgPattern {...defaultProps} />)
|
|
33
|
+
const groups = container.querySelectorAll('g')
|
|
34
|
+
expect(groups.length).toBe(2)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('applies a translate transform to the content group', () => {
|
|
38
|
+
const { container } = render(<KeySvgPattern {...defaultProps} />)
|
|
39
|
+
const groups = container.querySelectorAll('g')
|
|
40
|
+
const contentGroup = groups[1]
|
|
41
|
+
expect(contentGroup.getAttribute('transform')).toMatch(/^translate\(/)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('injects the border html into the first g element', () => {
|
|
45
|
+
getKeyPatternPaths.mockReturnValue({ border: '<circle id="border-el"/>', content: '' })
|
|
46
|
+
const { container } = render(<KeySvgPattern {...defaultProps} />)
|
|
47
|
+
expect(container.querySelector('#border-el')).toBeTruthy()
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it('injects the content html into the second g element', () => {
|
|
51
|
+
getKeyPatternPaths.mockReturnValue({ border: '', content: '<circle id="content-el"/>' })
|
|
52
|
+
const { container } = render(<KeySvgPattern {...defaultProps} />)
|
|
53
|
+
expect(container.querySelector('#content-el')).toBeTruthy()
|
|
54
|
+
})
|
|
55
|
+
})
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { render } from '@testing-library/react'
|
|
2
|
+
import { KeySvgRect } from './KeySvgRect'
|
|
3
|
+
|
|
4
|
+
import { getValueForStyle } from '../../../../../../src/utils/getValueForStyle'
|
|
5
|
+
|
|
6
|
+
jest.mock('../../../../../../src/utils/getValueForStyle', () => ({
|
|
7
|
+
getValueForStyle: jest.fn((value) => value)
|
|
8
|
+
}))
|
|
9
|
+
|
|
10
|
+
const defaultProps = {
|
|
11
|
+
registryDataset: {
|
|
12
|
+
style: {
|
|
13
|
+
fill: '#0000ff',
|
|
14
|
+
stroke: '#ff0000',
|
|
15
|
+
strokeWidth: 2
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
mapStyle: { id: 'default' }
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
getValueForStyle.mockImplementation((value) => value)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
describe('KeySvgRect', () => {
|
|
26
|
+
it('renders an svg element', () => {
|
|
27
|
+
const { container } = render(<KeySvgRect {...defaultProps} />)
|
|
28
|
+
expect(container.querySelector('svg')).toBeTruthy()
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('renders a rect element', () => {
|
|
32
|
+
const { container } = render(<KeySvgRect {...defaultProps} />)
|
|
33
|
+
expect(container.querySelector('rect')).toBeTruthy()
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('resolves fill color via getValueForStyle', () => {
|
|
37
|
+
render(<KeySvgRect {...defaultProps} />)
|
|
38
|
+
expect(getValueForStyle).toHaveBeenCalledWith('#0000ff', 'default')
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('resolves stroke color via getValueForStyle', () => {
|
|
42
|
+
render(<KeySvgRect {...defaultProps} />)
|
|
43
|
+
expect(getValueForStyle).toHaveBeenCalledWith('#ff0000', 'default')
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('sets fill attribute on the rect', () => {
|
|
47
|
+
const { container } = render(<KeySvgRect {...defaultProps} />)
|
|
48
|
+
const rect = container.querySelector('rect')
|
|
49
|
+
expect(rect.getAttribute('fill')).toBe('#0000ff')
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('sets stroke attribute on the rect', () => {
|
|
53
|
+
const { container } = render(<KeySvgRect {...defaultProps} />)
|
|
54
|
+
const rect = container.querySelector('rect')
|
|
55
|
+
expect(rect.getAttribute('stroke')).toBe('#ff0000')
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it('sets strokeWidth attribute on the rect', () => {
|
|
59
|
+
const { container } = render(<KeySvgRect {...defaultProps} />)
|
|
60
|
+
const rect = container.querySelector('rect')
|
|
61
|
+
expect(rect.getAttribute('stroke-width')).toBe('2')
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('insets the rect by half the strokeWidth', () => {
|
|
65
|
+
const { container } = render(<KeySvgRect {...defaultProps} />)
|
|
66
|
+
const rect = container.querySelector('rect')
|
|
67
|
+
expect(rect.getAttribute('x')).toBe('1') // strokeWidth / 2
|
|
68
|
+
expect(rect.getAttribute('y')).toBe('1')
|
|
69
|
+
expect(rect.getAttribute('width')).toBe('18') // SVG_SIZE - strokeWidth
|
|
70
|
+
expect(rect.getAttribute('height')).toBe('18')
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('uses strokeWidth as the rx and ry for rounded corners', () => {
|
|
74
|
+
const { container } = render(<KeySvgRect {...defaultProps} />)
|
|
75
|
+
const rect = container.querySelector('rect')
|
|
76
|
+
expect(rect.getAttribute('rx')).toBe('2')
|
|
77
|
+
expect(rect.getAttribute('ry')).toBe('2')
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it('has round stroke linejoin', () => {
|
|
81
|
+
const { container } = render(<KeySvgRect {...defaultProps} />)
|
|
82
|
+
const rect = container.querySelector('rect')
|
|
83
|
+
expect(rect.getAttribute('stroke-linejoin')).toBe('round')
|
|
84
|
+
})
|
|
85
|
+
})
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { getSymbolStyleColors, getSymbolViewBox } from '
|
|
1
|
+
import { getSymbolStyleColors, getSymbolViewBox } from '../../../../../../src/utils/symbolUtils.js'
|
|
2
2
|
import { svgSymbolProps } from './svgProperties.js'
|
|
3
3
|
|
|
4
|
-
export const KeySvgSymbol = (
|
|
5
|
-
const {
|
|
4
|
+
export const KeySvgSymbol = ({ symbolRegistry, registryDataset, mapStyle, symbolDef }) => {
|
|
5
|
+
const { style } = registryDataset
|
|
6
6
|
const mapColorScheme = mapStyle?.appColorScheme ?? 'light'
|
|
7
7
|
const keyMapStyle = { ...mapStyle, mapColorScheme }
|
|
8
8
|
|
|
9
|
-
const resolvedSvg = symbolRegistry.resolve(symbolDef, getSymbolStyleColors(
|
|
10
|
-
const viewBox = getSymbolViewBox(
|
|
9
|
+
const resolvedSvg = symbolRegistry.resolve(symbolDef, getSymbolStyleColors(style), keyMapStyle)
|
|
10
|
+
const viewBox = getSymbolViewBox(style, symbolDef)
|
|
11
11
|
return (
|
|
12
12
|
<svg {...svgSymbolProps} viewBox={viewBox}>
|
|
13
13
|
<g dangerouslySetInnerHTML={{ __html: resolvedSvg }} />
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { render } from '@testing-library/react'
|
|
2
|
+
import { KeySvgSymbol } from './KeySvgSymbol'
|
|
3
|
+
|
|
4
|
+
import { getSymbolStyleColors, getSymbolViewBox } from '../../../../../../src/utils/symbolUtils.js'
|
|
5
|
+
|
|
6
|
+
jest.mock('../../../../../../src/utils/symbolUtils.js', () => ({
|
|
7
|
+
getSymbolStyleColors: jest.fn(() => ({ foreground: '#000', background: '#fff' })),
|
|
8
|
+
getSymbolViewBox: jest.fn(() => '0 0 38 38')
|
|
9
|
+
}))
|
|
10
|
+
|
|
11
|
+
const mockResolve = jest.fn(() => '<path d="M0 0"/>')
|
|
12
|
+
|
|
13
|
+
const defaultProps = {
|
|
14
|
+
symbolDef: { id: 'marker' },
|
|
15
|
+
registryDataset: {
|
|
16
|
+
style: {
|
|
17
|
+
stroke: '#000000'
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
symbolRegistry: { resolve: mockResolve },
|
|
21
|
+
mapStyle: { id: 'default' }
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
mockResolve.mockClear()
|
|
26
|
+
mockResolve.mockReturnValue('<path d="M0 0"/>')
|
|
27
|
+
getSymbolStyleColors.mockReturnValue({ foreground: '#000', background: '#fff' })
|
|
28
|
+
getSymbolViewBox.mockReturnValue('0 0 38 38')
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
describe('KeySvgSymbol', () => {
|
|
32
|
+
it('renders an svg element', () => {
|
|
33
|
+
const { container } = render(<KeySvgSymbol {...defaultProps} />)
|
|
34
|
+
expect(container.querySelector('svg')).toBeTruthy()
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('calls symbolRegistry.resolve with the symbolDef, style colors, and mapStyle', () => {
|
|
38
|
+
render(<KeySvgSymbol {...defaultProps} />)
|
|
39
|
+
expect(mockResolve).toHaveBeenCalledWith(
|
|
40
|
+
defaultProps.symbolDef,
|
|
41
|
+
{ foreground: '#000', background: '#fff' },
|
|
42
|
+
expect.objectContaining({ id: 'default' })
|
|
43
|
+
)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('calls getSymbolStyleColors with the dataset props', () => {
|
|
47
|
+
render(<KeySvgSymbol {...defaultProps} />)
|
|
48
|
+
expect(getSymbolStyleColors).toHaveBeenCalledWith(defaultProps.registryDataset.style)
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('calls getSymbolViewBox with the dataset props and symbolDef', () => {
|
|
52
|
+
render(<KeySvgSymbol {...defaultProps} />)
|
|
53
|
+
expect(getSymbolViewBox).toHaveBeenCalledWith(defaultProps.registryDataset.style, defaultProps.symbolDef)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
it('sets the viewBox from getSymbolViewBox', () => {
|
|
57
|
+
getSymbolViewBox.mockReturnValue('0 0 64 64')
|
|
58
|
+
const { container } = render(<KeySvgSymbol {...defaultProps} />)
|
|
59
|
+
expect(container.querySelector('svg').getAttribute('viewBox')).toBe('0 0 64 64')
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
it('renders the resolved svg html inside a g element', () => {
|
|
63
|
+
mockResolve.mockReturnValue('<circle id="sym-el"/>')
|
|
64
|
+
const { container } = render(<KeySvgSymbol {...defaultProps} />)
|
|
65
|
+
expect(container.querySelector('#sym-el')).toBeTruthy()
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
it('defaults mapColorScheme to light when appColorScheme is not set', () => {
|
|
69
|
+
render(<KeySvgSymbol {...defaultProps} />)
|
|
70
|
+
const callArg = mockResolve.mock.calls[0][2]
|
|
71
|
+
expect(callArg.mapColorScheme).toBe('light')
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
it('uses the mapStyle appColorScheme when provided', () => {
|
|
75
|
+
const props = { ...defaultProps, mapStyle: { id: 'dark', appColorScheme: 'dark' } }
|
|
76
|
+
render(<KeySvgSymbol {...props} />)
|
|
77
|
+
const callArg = mockResolve.mock.calls[0][2]
|
|
78
|
+
expect(callArg.mapColorScheme).toBe('dark')
|
|
79
|
+
})
|
|
80
|
+
})
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { SVG_SIZE, SVG_CENTER, svgProps, svgSymbolProps } from './svgProperties'
|
|
2
|
+
|
|
3
|
+
describe('svgProperties constants', () => {
|
|
4
|
+
it('SVG_SIZE is 20', () => {
|
|
5
|
+
expect(SVG_SIZE).toBe(20)
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
it('SVG_CENTER is half of SVG_SIZE', () => {
|
|
9
|
+
expect(SVG_CENTER).toBe(SVG_SIZE / 2)
|
|
10
|
+
})
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
describe('svgProps', () => {
|
|
14
|
+
it('has the correct xmlns', () => {
|
|
15
|
+
expect(svgProps.xmlns).toBe('http://www.w3.org/2000/svg')
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it('has width and height equal to SVG_SIZE', () => {
|
|
19
|
+
expect(svgProps.width).toBe(SVG_SIZE)
|
|
20
|
+
expect(svgProps.height).toBe(SVG_SIZE)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('has viewBox covering the full SVG_SIZE', () => {
|
|
24
|
+
expect(svgProps.viewBox).toBe(`0 0 ${SVG_SIZE} ${SVG_SIZE}`)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it('has the correct className', () => {
|
|
28
|
+
expect(svgProps.className).toBe('am-c-datasets-key-symbol')
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('is aria-hidden', () => {
|
|
32
|
+
expect(svgProps['aria-hidden']).toBe('true')
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('is not focusable', () => {
|
|
36
|
+
expect(svgProps.focusable).toBe('false')
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
describe('svgSymbolProps', () => {
|
|
41
|
+
it('inherits xmlns from svgProps', () => {
|
|
42
|
+
expect(svgSymbolProps.xmlns).toBe(svgProps.xmlns)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('has a larger width than svgProps', () => {
|
|
46
|
+
expect(svgSymbolProps.width).toBeGreaterThan(svgProps.width)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('has a larger height than svgProps', () => {
|
|
50
|
+
expect(svgSymbolProps.height).toBeGreaterThan(svgProps.height)
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('width and height are equal', () => {
|
|
54
|
+
expect(svgSymbolProps.width).toBe(svgSymbolProps.height)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('className includes the base class and a modifier', () => {
|
|
58
|
+
expect(svgSymbolProps.className).toContain('am-c-datasets-key-symbol')
|
|
59
|
+
expect(svgSymbolProps.className).toContain('--point')
|
|
60
|
+
})
|
|
61
|
+
})
|
|
@@ -35,19 +35,19 @@
|
|
|
35
35
|
margin-bottom: 0;
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
}
|
|
39
38
|
|
|
40
|
-
.im-c-datasets-layers__item-label {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
39
|
+
.im-c-datasets-layers__item-label {
|
|
40
|
+
width: 100%;
|
|
41
|
+
max-width: none;
|
|
42
|
+
align-items: start;
|
|
43
|
+
padding-top: 12px;
|
|
44
|
+
padding-bottom: 10px;
|
|
45
|
+
align-self: auto;
|
|
46
|
+
font-size: 1rem;
|
|
47
|
+
line-height: 1.2;
|
|
49
48
|
|
|
50
|
-
|
|
49
|
+
color: var(--foreground-color);
|
|
50
|
+
}
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
// GovUK style overide
|
|
@@ -79,3 +79,7 @@
|
|
|
79
79
|
.im-c-datasets-layers-group:first-child .im-c-datasets-layers-group__legend {
|
|
80
80
|
padding-top: 0;
|
|
81
81
|
}
|
|
82
|
+
|
|
83
|
+
.im-c-datasets-layers .govuk-checkboxes__input[aria-disabled="true"] + .govuk-checkboxes__label {
|
|
84
|
+
opacity: 0.5;
|
|
85
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { setDatasetVisibility } from '../../api/setDatasetVisibility.js'
|
|
3
|
+
import { LayersMenuCheckbox } from './LayersMenuCheckbox.jsx'
|
|
4
|
+
import { LayersMenuGroupWrapper } from './LayersMenuGroupWrapper.jsx'
|
|
5
|
+
|
|
6
|
+
export const LayersMenu = ({ pluginState }) => {
|
|
7
|
+
const { menu = [] } = pluginState
|
|
8
|
+
const handleDatasetChange = (e) => {
|
|
9
|
+
const { value, checked } = e.target
|
|
10
|
+
setDatasetVisibility({ pluginState }, checked, { datasetId: value })
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const hasGroups = menu.some(item => item.groupLabel)
|
|
14
|
+
const containerClass = `im-c-datasets-layers${hasGroups ? ' im-c-datasets-layers--has-groups' : ''}`
|
|
15
|
+
return (
|
|
16
|
+
<div className={containerClass}>
|
|
17
|
+
{// Each menuGroup
|
|
18
|
+
menu.map(menuGroup =>
|
|
19
|
+
<LayersMenuGroupWrapper key={menuGroup.id} menuGroup={menuGroup}>
|
|
20
|
+
{// Each menuGroupItem
|
|
21
|
+
menuGroup.items.map(menuGroupItem =>
|
|
22
|
+
<LayersMenuCheckbox
|
|
23
|
+
key={menuGroupItem.id}
|
|
24
|
+
menuGroupItem={menuGroupItem}
|
|
25
|
+
onChange={handleDatasetChange}
|
|
26
|
+
/>
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
</LayersMenuGroupWrapper>)
|
|
30
|
+
}
|
|
31
|
+
</div>
|
|
32
|
+
)
|
|
33
|
+
}
|