@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.
@@ -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
- await handlerFor(events.MAP_SET_STYLE)({ url: 'https://example.com/styles', id: 'newVts' })
83
- expect(createVectorTileLayer).toHaveBeenCalledWith('https://example.com/styles', null)
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 >= viewMaxZoom,
99
- isAtMinZoom: zoom - ZOOM_TOLERANCE <= viewMinZoom
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: 'vector' })
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: 'vector' })
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, declutter true, and vector renderMode', async () => {
204
+ it('creates VectorTileLayer with source and declutter true', async () => {
205
205
  await createVectorTileLayer(styleUrl, null)
206
- expect(VectorTileLayer).toHaveBeenCalledWith({ source: mockVectorTileSourceInstance, declutter: true, renderMode: 'vector' })
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 () => {