@defra/interactive-map 0.0.30-alpha → 0.0.31-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/css/index.css +1 -1
- package/dist/esm/im-core.js +1 -1
- package/dist/esm/im-shell.js +1 -1
- package/dist/umd/im-core.js +1 -1
- package/dist/umd/index.js +1 -1
- package/docs/api/context.md +4 -4
- package/docs/api.md +111 -37
- package/docs/assets/css/docusaurus.scss +20 -4
- 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/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 +2 -2
- package/docs/examples/basic-map.mdx +2 -2
- package/docs/examples/draw.mdx +271 -0
- package/docs/examples/index.mdx +58 -10
- 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 +15 -28
- package/docusaurus.config.cjs +5 -1
- package/package.json +1 -1
- package/plugins/beta/datasets/dist/css/index.css +4 -0
- 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 +191 -0
- package/plugins/beta/datasets/src/adapters/maplibre/registry/mapLibreDataset.test.js +441 -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 +3 -21
- package/plugins/beta/datasets/src/api/setFeatureVisibility.test.js +32 -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 +4 -0
- 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 +78 -0
- package/plugins/beta/datasets/src/reducers/datasetsToMenu.test.js +35 -0
- package/plugins/beta/datasets/src/reducers/mappedDatasetsReducer.js +34 -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 +172 -0
- package/plugins/beta/datasets/src/registry/dataset.test.js +483 -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-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/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/interact/dist/esm/im-interact-plugin.js +1 -1
- package/plugins/interact/dist/umd/im-interact-plugin.js +1 -1
- package/plugins/interact/src/InteractInit.jsx +2 -2
- package/plugins/interact/src/InteractInit.test.js +1 -1
- 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/useInteractionHandlers.js +10 -1
- package/plugins/interact/src/hooks/useInteractionHandlers.test.js +23 -4
- package/plugins/interact/src/manifest.js +0 -35
- package/plugins/interact/src/manifest.test.js +3 -43
- 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/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 +1 -3
- package/src/App/hooks/useResizeObserver.js +12 -1
- 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 +10 -0
- package/src/InteractiveMap/InteractiveMap.test.js +8 -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/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/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,53 @@
|
|
|
1
|
+
import { setStyle } from './setStyle.js'
|
|
2
|
+
|
|
3
|
+
describe('setStyle', () => {
|
|
4
|
+
it('dispatches SET_DATASET_STYLE with datasetId, styleChanges, and mapStyle', () => {
|
|
5
|
+
const dispatch = jest.fn()
|
|
6
|
+
const mapStyle = { version: 8, layers: [] }
|
|
7
|
+
const styleChanges = { fill: 'blue' }
|
|
8
|
+
|
|
9
|
+
setStyle({ pluginState: { dispatch }, mapState: { mapStyle } }, styleChanges, { datasetId: 'my-dataset' })
|
|
10
|
+
|
|
11
|
+
expect(dispatch).toHaveBeenCalledWith({
|
|
12
|
+
type: 'SET_DATASET_STYLE',
|
|
13
|
+
payload: { datasetId: 'my-dataset', styleChanges, mapStyle }
|
|
14
|
+
})
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
it('combines datasetId and sublayerId for the dispatched datasetId', () => {
|
|
18
|
+
const dispatch = jest.fn()
|
|
19
|
+
const mapStyle = { version: 8, layers: [] }
|
|
20
|
+
const styleChanges = { stroke: 'red' }
|
|
21
|
+
|
|
22
|
+
setStyle({ pluginState: { dispatch }, mapState: { mapStyle } }, styleChanges, { datasetId: 'parent', sublayerId: 'child' })
|
|
23
|
+
|
|
24
|
+
expect(dispatch).toHaveBeenCalledWith({
|
|
25
|
+
type: 'SET_DATASET_STYLE',
|
|
26
|
+
payload: { datasetId: 'parent-child', styleChanges, mapStyle }
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('passes mapState.mapStyle in the payload', () => {
|
|
31
|
+
const dispatch = jest.fn()
|
|
32
|
+
const mapStyle = { version: 8, sources: { s: {} }, layers: [{ id: 'base' }] }
|
|
33
|
+
|
|
34
|
+
setStyle({ pluginState: { dispatch }, mapState: { mapStyle } }, {}, { datasetId: 'ds' })
|
|
35
|
+
|
|
36
|
+
expect(dispatch).toHaveBeenCalledWith(
|
|
37
|
+
expect.objectContaining({ payload: expect.objectContaining({ mapStyle }) })
|
|
38
|
+
)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('uses undefined datasetId when options are not provided', () => {
|
|
42
|
+
const dispatch = jest.fn()
|
|
43
|
+
const mapStyle = { version: 8, layers: [] }
|
|
44
|
+
const styleChanges = { fill: 'green' }
|
|
45
|
+
|
|
46
|
+
setStyle({ pluginState: { dispatch }, mapState: { mapStyle } }, styleChanges)
|
|
47
|
+
|
|
48
|
+
expect(dispatch).toHaveBeenCalledWith({
|
|
49
|
+
type: 'SET_DATASET_STYLE',
|
|
50
|
+
payload: { datasetId: undefined, styleChanges, mapStyle }
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
})
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { EmptyKey } from './EmptyKey.jsx'
|
|
3
|
+
import { KeyItem } from './KeyItem.jsx'
|
|
4
|
+
import { KeyGroupItem } from './KeyGroupItem.jsx'
|
|
5
|
+
import { datasetRegistry } from '../../registry/datasetRegistry.js'
|
|
6
|
+
|
|
7
|
+
export const Key = ({
|
|
8
|
+
pluginConfig: { noKeyItemText },
|
|
9
|
+
mapState: { mapStyle },
|
|
10
|
+
pluginState: { mappedDatasets },
|
|
11
|
+
services: { symbolRegistry, patternRegistry }
|
|
12
|
+
}) => {
|
|
13
|
+
const { items: keyGroups, hasGroups } = datasetRegistry.keyItems()
|
|
14
|
+
|
|
15
|
+
if (!keyGroups?.length) {
|
|
16
|
+
return (<EmptyKey text={noKeyItemText} />)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const containerClass = `im-c-datasets-key${hasGroups ? ' im-c-datasets-key--has-groups' : ''}`
|
|
20
|
+
return (
|
|
21
|
+
<div className={containerClass}>{keyGroups.map(item => {
|
|
22
|
+
const key = item.type === 'group' ? item.groupLabel.toLowerCase().replaceAll(/\s+/g, '-') : item.dataset.id
|
|
23
|
+
|
|
24
|
+
if (item.type === 'sublayers' || item.type === 'group') {
|
|
25
|
+
const datasets = item.type === 'sublayers' ? item.sublayers : item.datasets
|
|
26
|
+
const label = item.type === 'sublayers' ? item.dataset.label : item.groupLabel
|
|
27
|
+
return (
|
|
28
|
+
<KeyGroupItem
|
|
29
|
+
key={key}
|
|
30
|
+
headingId={`key-heading-${key}`}
|
|
31
|
+
label={label}
|
|
32
|
+
datasets={datasets}
|
|
33
|
+
symbolRegistry={symbolRegistry}
|
|
34
|
+
patternRegistry={patternRegistry}
|
|
35
|
+
mapStyle={mapStyle}
|
|
36
|
+
/>
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
return (
|
|
40
|
+
<KeyItem
|
|
41
|
+
key={key}
|
|
42
|
+
registryDataset={item.dataset}
|
|
43
|
+
symbolRegistry={symbolRegistry}
|
|
44
|
+
patternRegistry={patternRegistry}
|
|
45
|
+
mapStyle={mapStyle}
|
|
46
|
+
/>
|
|
47
|
+
)
|
|
48
|
+
})}
|
|
49
|
+
</div>
|
|
50
|
+
)
|
|
51
|
+
}
|
|
@@ -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
|
+
})
|