Skip to content

Commit b472c21

Browse files
committed
Update message in map-extent.whenReady rejection handler
Condition layer.disconnectedCallback execution on presence of _layer Use Promise.allSettled on array of layer.whenReady() promises to resolve issue with map zoom after changeprojection event, having reconnected all layers. Reset mapml-viewer/web-map history after changeprojection update test to work for custom projection
1 parent c427084 commit b472c21

File tree

6 files changed

+45
-14
lines changed

6 files changed

+45
-14
lines changed

src/map-extent.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export class MapExtent extends HTMLElement {
8484
this._layer = parentLayer._layer;
8585
})
8686
.catch(() => {
87-
throw new Error('Map never became ready');
87+
throw new Error('Layer never became ready');
8888
});
8989
}
9090
disconnectedCallback() {}

src/map-feature.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ export class MapFeature extends HTMLElement {
134134
}
135135

136136
disconnectedCallback() {
137+
if (!this._layer) return;
137138
if (this._layer._layerEl.hasAttribute('data-moving')) return;
138139
this._removeFeature();
139140
this._observer.disconnect();

src/mapml-viewer.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,13 +350,23 @@ export class MapViewer extends HTMLElement {
350350
case 'projection':
351351
const reconnectLayers = () => {
352352
if (this._map && this._map.options.projection !== newValue) {
353+
// save map location and zoom
354+
let lat = this.lat;
355+
let lon = this.lon;
356+
let zoom = this.zoom;
353357
this._map.options.crs = M[newValue];
354358
this._map.options.projection = newValue;
359+
let layersReady = [];
355360
for (let layer of this.querySelectorAll('layer-')) {
356361
layer.removeAttribute('disabled');
357362
let reAttach = this.removeChild(layer);
358363
this.appendChild(reAttach);
364+
layersReady.push(reAttach.whenReady());
359365
}
366+
Promise.allSettled(layersReady).then(() => {
367+
this.zoomTo(lat, lon, zoom);
368+
this._resetHistory();
369+
});
360370
}
361371
};
362372
if (newValue) {
@@ -943,7 +953,13 @@ export class MapViewer extends HTMLElement {
943953
this.lon = this._map.getCenter().lng;
944954
this.zoom = this._map.getZoom();
945955
}
946-
956+
_resetHistory() {
957+
this._history = [];
958+
this._historyIndex = -1;
959+
this._traversalCall = false;
960+
// weird but ok
961+
this._addToHistory();
962+
}
947963
/**
948964
* Adds to the maps history on moveends
949965
* @private

src/web-map.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,13 +395,23 @@ export class WebMap extends HTMLMapElement {
395395
case 'projection':
396396
const reconnectLayers = () => {
397397
if (this._map && this._map.options.projection !== newValue) {
398+
// save map location and zoom
399+
let lat = this.lat;
400+
let lon = this.lon;
401+
let zoom = this.zoom;
398402
this._map.options.crs = M[newValue];
399403
this._map.options.projection = newValue;
404+
let layersReady = [];
400405
for (let layer of this.querySelectorAll('layer-')) {
401406
layer.removeAttribute('disabled');
402407
let reAttach = this.removeChild(layer);
403408
this.appendChild(reAttach);
409+
layersReady.push(reAttach.whenReady());
404410
}
411+
Promise.allSettled(layersReady).then(() => {
412+
this.zoomTo(lat, lon, zoom);
413+
this._resetHistory();
414+
});
405415
}
406416
};
407417
if (newValue) {

test/e2e/api/domApi-mapml-viewer.test.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,20 +1105,22 @@ test.describe('mapml-viewer DOM API Tests', () => {
11051105
(viewer) => viewer.setAttribute('height', '600'),
11061106
viewerHandle
11071107
);
1108+
1109+
// Adding custom projection
1110+
const custProj = await page.evaluate((viewer) => {
1111+
return viewer.defineCustomProjection(template);
1112+
}, viewerHandle);
1113+
expect(custProj).toEqual('basic');
1114+
11081115
await page.evaluateHandle(
1109-
(viewer) => viewer.setAttribute('projection', 'other'),
1116+
(viewer) => viewer.setAttribute('projection', 'basic'),
11101117
viewerHandle
11111118
);
11121119
await page.evaluateHandle(
11131120
(viewer) => document.body.appendChild(viewer),
11141121
viewerHandle
11151122
);
11161123

1117-
// Adding custom projection
1118-
const custProj = await page.evaluate((viewer) => {
1119-
return viewer.defineCustomProjection(template);
1120-
}, viewerHandle);
1121-
expect(custProj).toEqual('basic');
11221124
await page.evaluate((viewer) => {
11231125
viewer.projection = 'basic';
11241126
}, viewerHandle);

test/e2e/api/domApi-web-map.test.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,20 +1087,22 @@ test.describe('web-map DOM API Tests', () => {
10871087
(viewer) => viewer.setAttribute('height', '600'),
10881088
mapHandle
10891089
);
1090+
1091+
// Adding custom projection
1092+
const custProj = await page.evaluate((viewer) => {
1093+
return viewer.defineCustomProjection(template);
1094+
}, mapHandle);
1095+
expect(custProj).toEqual('basic');
1096+
10901097
await page.evaluateHandle(
1091-
(viewer) => viewer.setAttribute('projection', 'other'),
1098+
(viewer) => viewer.setAttribute('projection', 'basic'),
10921099
mapHandle
10931100
);
10941101
await page.evaluateHandle(
10951102
(viewer) => document.body.appendChild(viewer),
10961103
mapHandle
10971104
);
10981105

1099-
// Adding custom projection
1100-
const custProj = await page.evaluate((viewer) => {
1101-
return viewer.defineCustomProjection(template);
1102-
}, mapHandle);
1103-
expect(custProj).toEqual('basic');
11041106
await page.evaluate((viewer) => {
11051107
viewer.projection = 'basic';
11061108
}, mapHandle);

0 commit comments

Comments
 (0)