@defra/interactive-map 0.0.25-alpha → 0.0.26-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/docs/api/map-style-config.md +30 -0
- package/package.json +1 -1
- 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/appEvents.js +2 -2
- package/providers/beta/openlayers/src/appEvents.test.js +3 -2
- package/providers/beta/openlayers/src/mapEvents.js +2 -4
- package/providers/beta/openlayers/src/mapEvents.test.js +26 -0
- package/providers/beta/openlayers/src/openlayersProvider.js +2 -2
- package/providers/beta/openlayers/src/openlayersProvider.test.js +1 -1
- package/providers/beta/openlayers/src/utils/tileLayers.js +4 -4
- package/providers/beta/openlayers/src/utils/tileLayers.test.js +7 -2
|
@@ -8,10 +8,10 @@ export function attachAppEvents ({ mapProvider, layer, layerType, transformReque
|
|
|
8
8
|
const source = createTileSource(mapStyle.url, transformRequest)
|
|
9
9
|
layer.setSource(source)
|
|
10
10
|
} else if (mapStyle.type === 'ogc-vt') {
|
|
11
|
-
const { layer: newLayer } = await createOGCVectorTileLayer(mapStyle.url, transformRequest)
|
|
11
|
+
const { layer: newLayer } = await createOGCVectorTileLayer(mapStyle.url, transformRequest, mapStyle)
|
|
12
12
|
map.getLayers().setAt(0, newLayer)
|
|
13
13
|
} else {
|
|
14
|
-
const { layer: newLayer } = await createVectorTileLayer(mapStyle.url, transformRequest)
|
|
14
|
+
const { layer: newLayer } = await createVectorTileLayer(mapStyle.url, transformRequest, mapStyle)
|
|
15
15
|
map.getLayers().setAt(0, newLayer)
|
|
16
16
|
}
|
|
17
17
|
eventBus.emit(events.MAP_STYLE_CHANGE, { mapStyleId: mapStyle.id })
|
|
@@ -79,8 +79,9 @@ describe('attachAppEvents', () => {
|
|
|
79
79
|
|
|
80
80
|
it('on MAP_SET_STYLE: creates a vector tile layer and places it at index 0', async () => {
|
|
81
81
|
const { setAt, handlerFor } = makeSetup()
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
const mapStyle = { url: 'https://example.com/styles', id: 'newVts' }
|
|
83
|
+
await handlerFor(events.MAP_SET_STYLE)(mapStyle)
|
|
84
|
+
expect(createVectorTileLayer).toHaveBeenCalledWith(mapStyle.url, null, mapStyle)
|
|
84
85
|
expect(setAt).toHaveBeenCalledWith(0, mockVectorTileLayerInstance)
|
|
85
86
|
})
|
|
86
87
|
|
|
@@ -82,8 +82,6 @@ export function attachMapEvents ({
|
|
|
82
82
|
const debouncers = []
|
|
83
83
|
|
|
84
84
|
const view = map.getView()
|
|
85
|
-
const viewMinZoom = view.getMinZoom()
|
|
86
|
-
const viewMaxZoom = view.getMaxZoom()
|
|
87
85
|
|
|
88
86
|
const getMapState = () => {
|
|
89
87
|
if (destroyed) {
|
|
@@ -95,8 +93,8 @@ export function attachMapEvents ({
|
|
|
95
93
|
bounds: getBounds(),
|
|
96
94
|
resolution: getResolution(),
|
|
97
95
|
zoom,
|
|
98
|
-
isAtMaxZoom: zoom + ZOOM_TOLERANCE >=
|
|
99
|
-
isAtMinZoom: zoom - ZOOM_TOLERANCE <=
|
|
96
|
+
isAtMaxZoom: zoom + ZOOM_TOLERANCE >= view.getMaxZoom(),
|
|
97
|
+
isAtMinZoom: zoom - ZOOM_TOLERANCE <= view.getMinZoom()
|
|
100
98
|
}
|
|
101
99
|
}
|
|
102
100
|
|
|
@@ -173,6 +173,32 @@ describe('attachMapEvents — render and data events', () => {
|
|
|
173
173
|
})
|
|
174
174
|
})
|
|
175
175
|
|
|
176
|
+
describe('attachMapEvents — dynamic zoom bounds', () => {
|
|
177
|
+
it('isAtMaxZoom is updated in emitted event when view max zoom changes', () => {
|
|
178
|
+
const { view, eventBus } = setup()
|
|
179
|
+
view.trigger('change')
|
|
180
|
+
mockDebounceFns[0].fn()
|
|
181
|
+
expect(eventBus.emit).toHaveBeenCalledWith(events.MAP_MOVE_END, expect.objectContaining({ isAtMaxZoom: false }))
|
|
182
|
+
|
|
183
|
+
eventBus.emit.mockClear()
|
|
184
|
+
view.getMaxZoom.mockReturnValue(7)
|
|
185
|
+
mockDebounceFns[0].fn()
|
|
186
|
+
expect(eventBus.emit).toHaveBeenCalledWith(events.MAP_MOVE_END, expect.objectContaining({ isAtMaxZoom: true }))
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
it('isAtMinZoom is updated in emitted event when view min zoom changes', () => {
|
|
190
|
+
const { view, eventBus } = setup()
|
|
191
|
+
view.trigger('change')
|
|
192
|
+
mockDebounceFns[0].fn()
|
|
193
|
+
expect(eventBus.emit).toHaveBeenCalledWith(events.MAP_MOVE_END, expect.objectContaining({ isAtMinZoom: false }))
|
|
194
|
+
|
|
195
|
+
eventBus.emit.mockClear()
|
|
196
|
+
view.getMinZoom.mockReturnValue(7)
|
|
197
|
+
mockDebounceFns[0].fn()
|
|
198
|
+
expect(eventBus.emit).toHaveBeenCalledWith(events.MAP_MOVE_END, expect.objectContaining({ isAtMinZoom: true }))
|
|
199
|
+
})
|
|
200
|
+
})
|
|
201
|
+
|
|
176
202
|
describe('attachMapEvents — remove', () => {
|
|
177
203
|
it('calls cancel on all debouncers', () => {
|
|
178
204
|
const { handles } = setup()
|
|
@@ -47,11 +47,11 @@ export default class OpenLayersProvider {
|
|
|
47
47
|
source = createTileSource(mapStyle.url, transformRequest)
|
|
48
48
|
tileLayer = new TileLayer({ source })
|
|
49
49
|
} else if (mapStyle.type === 'ogc-vt') {
|
|
50
|
-
const vectorTile = await createOGCVectorTileLayer(mapStyle.url, transformRequest)
|
|
50
|
+
const vectorTile = await createOGCVectorTileLayer(mapStyle.url, transformRequest, mapStyle)
|
|
51
51
|
tileLayer = vectorTile.layer
|
|
52
52
|
source = vectorTile.source
|
|
53
53
|
} else {
|
|
54
|
-
const vectorTile = await createVectorTileLayer(mapStyle.url, transformRequest)
|
|
54
|
+
const vectorTile = await createVectorTileLayer(mapStyle.url, transformRequest, mapStyle)
|
|
55
55
|
tileLayer = vectorTile.layer
|
|
56
56
|
source = vectorTile.source
|
|
57
57
|
}
|
|
@@ -125,7 +125,7 @@ describe('OpenLayersProvider', () => {
|
|
|
125
125
|
it('creates vector tile layer, OL objects, and emits MAP_READY by default', async () => {
|
|
126
126
|
const { provider, eventBus } = makeProvider()
|
|
127
127
|
await provider.initMap(defaultInitConfig)
|
|
128
|
-
expect(createVectorTileLayer).toHaveBeenCalledWith(defaultInitConfig.mapStyle.url, null)
|
|
128
|
+
expect(createVectorTileLayer).toHaveBeenCalledWith(defaultInitConfig.mapStyle.url, null, defaultInitConfig.mapStyle)
|
|
129
129
|
expect(attachMapEvents).toHaveBeenCalled()
|
|
130
130
|
expect(attachAppEvents).toHaveBeenCalled()
|
|
131
131
|
expect(eventBus.emit).toHaveBeenCalledWith(events.MAP_READY, expect.objectContaining({
|
|
@@ -66,7 +66,7 @@ function fixIconOpacity (styleJson) {
|
|
|
66
66
|
})
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
export async function createVectorTileLayer (url, transformRequest) {
|
|
69
|
+
export async function createVectorTileLayer (url, transformRequest, { renderMode } = {}) {
|
|
70
70
|
const styleJson = await fetchWithTransform(url, 'Style', transformRequest).then(r => r.json())
|
|
71
71
|
|
|
72
72
|
const sourceId = Object.keys(styleJson.sources)[0]
|
|
@@ -93,14 +93,14 @@ export async function createVectorTileLayer (url, transformRequest) {
|
|
|
93
93
|
projection: CRS,
|
|
94
94
|
tileGrid
|
|
95
95
|
})
|
|
96
|
-
const layer = new VectorTileLayer({ source, declutter: true, renderMode
|
|
96
|
+
const layer = new VectorTileLayer({ source, declutter: true, ...(renderMode && { renderMode }) })
|
|
97
97
|
|
|
98
98
|
stylefunction(layer, styleJson, sourceId, resolutions, spritesJson, sprite.pngUrl)
|
|
99
99
|
|
|
100
100
|
return { layer, source }
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
export async function createOGCVectorTileLayer (url, transformRequest) {
|
|
103
|
+
export async function createOGCVectorTileLayer (url, transformRequest, { renderMode } = {}) {
|
|
104
104
|
const styleJson = await fetchWithTransform(url, 'Style', transformRequest).then(r => r.json())
|
|
105
105
|
|
|
106
106
|
const sourceId = Object.keys(styleJson.sources)[0]
|
|
@@ -125,7 +125,7 @@ export async function createOGCVectorTileLayer (url, transformRequest) {
|
|
|
125
125
|
|
|
126
126
|
const tileGrid = new TileGrid({ resolutions, origin, tileSize })
|
|
127
127
|
const source = new OGCVectorTile({ url: tilesUrl, format, tileGrid, projection: CRS })
|
|
128
|
-
const layer = new VectorTileLayer({ source, declutter: true, renderMode
|
|
128
|
+
const layer = new VectorTileLayer({ source, declutter: true, ...(renderMode && { renderMode }) })
|
|
129
129
|
|
|
130
130
|
stylefunction(layer, styleJson, sourceId, resolutions, spritesJson, sprite.pngUrl)
|
|
131
131
|
|
|
@@ -201,9 +201,14 @@ describe('createVectorTileLayer', () => {
|
|
|
201
201
|
expect(tileLoadFunction).toBeUndefined()
|
|
202
202
|
})
|
|
203
203
|
|
|
204
|
-
it('creates VectorTileLayer with source
|
|
204
|
+
it('creates VectorTileLayer with source and declutter true', async () => {
|
|
205
205
|
await createVectorTileLayer(styleUrl, null)
|
|
206
|
-
expect(VectorTileLayer).toHaveBeenCalledWith({ source: mockVectorTileSourceInstance, declutter: true
|
|
206
|
+
expect(VectorTileLayer).toHaveBeenCalledWith({ source: mockVectorTileSourceInstance, declutter: true })
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
it('passes renderMode to VectorTileLayer when provided', async () => {
|
|
210
|
+
await createVectorTileLayer(styleUrl, null, { renderMode: 'vector' })
|
|
211
|
+
expect(VectorTileLayer).toHaveBeenCalledWith(expect.objectContaining({ renderMode: 'vector' }))
|
|
207
212
|
})
|
|
208
213
|
|
|
209
214
|
it('applies stylefunction with layer, styleJson, sourceId, resolutions, spritesJson, spritesPngUrl', async () => {
|