@panoramax/web-viewer 3.2.2-develop-43e56902 → 3.2.2-develop-e0cee138

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panoramax/web-viewer",
3
- "version": "3.2.2-develop-43e56902",
3
+ "version": "3.2.2-develop-e0cee138",
4
4
  "description": "Panoramax web viewer for geolocated pictures",
5
5
  "main": "build/index.js",
6
6
  "author": "Panoramax team",
@@ -33,10 +33,10 @@
33
33
  window.onload = () => {
34
34
  editor = new Panoramax.Editor(
35
35
  "editor",
36
- "https://api.panoramax.xyz/api",
36
+ "https://panoramax.openstreetmap.fr/api",
37
37
  {
38
- selectedSequence: "561a5056-78a4-499d-9138-26b259f0765c",
39
- selectedPicture: "b9c51504-b25c-40da-bb47-e696b93233fc",
38
+ selectedSequence: "ecfe4b2c-0acd-4d3a-a10d-c3e6818755c8",
39
+ selectedPicture: "329af5c6-4761-4a6d-9c1e-674fd6daa8b6",
40
40
  background: "aerial",
41
41
  raster: {
42
42
  type: "raster",
package/src/Editor.js CHANGED
@@ -59,14 +59,11 @@ export default class Editor extends CoreView {
59
59
  raster: options.raster,
60
60
  background: options.background,
61
61
  supplementaryStyle: this._createMapStyle(),
62
+ zoom: 15, // Hack to avoid _initMapPosition call
62
63
  });
63
64
  linkMapAndPhoto(this);
64
65
  this._loadSequence();
65
66
  this.map.once("load", () => {
66
- this.map.setPaintProperty("geovisio_editor_sequences", "line-color", this.map._getLayerColorStyle("sequences"));
67
- this.map.setPaintProperty("geovisio_editor_pictures", "circle-color", this.map._getLayerColorStyle("pictures"));
68
- this.map.setLayoutProperty("geovisio_editor_sequences", "visibility", "visible");
69
- this.map.setLayoutProperty("geovisio_editor_pictures", "visibility", "visible");
70
67
  if(options.raster) { this._addMapBackgroundWidget(); }
71
68
  this._bindPicturesEvents();
72
69
  });
@@ -153,6 +150,15 @@ export default class Editor extends CoreView {
153
150
  */
154
151
  _loadSequence() {
155
152
  return this._api.getSequenceItems(this._selectedSeqId).then(seq => {
153
+ // Hide loader after source load
154
+ this.map.once("sourcedata", () => {
155
+ this.map.setPaintProperty("geovisio_editor_sequences", "line-color", this.map._getLayerColorStyle("sequences"));
156
+ this.map.setPaintProperty("geovisio_editor_pictures", "circle-color", this.map._getLayerColorStyle("pictures"));
157
+ this.map.setLayoutProperty("geovisio_editor_sequences", "visibility", "visible");
158
+ this.map.setLayoutProperty("geovisio_editor_pictures", "visibility", "visible");
159
+ this.map.once("styledata", () => this._loader.dismiss());
160
+ });
161
+
156
162
  // Create data source
157
163
  this._sequenceData = seq.features;
158
164
  this.map.getSource("geovisio_editor_sequences").setData({
@@ -177,40 +183,34 @@ export default class Editor extends CoreView {
177
183
  ]
178
184
  });
179
185
 
180
- const onMapLoad = () => {
181
- // Select picture if any
182
- if(this._selectedPicId) {
183
- const pic = seq.features.find(p => p.id === this._selectedPicId);
184
- if(pic) {
185
- this.select(this._selectedSeqId, this._selectedPicId, true);
186
- this.map.jumpTo({ center: pic.geometry.coordinates, zoom: 18 });
187
- }
188
- else {
189
- console.log("Picture with ID", pic, "was not found");
190
- }
186
+ // Select picture if any
187
+ if(this._selectedPicId) {
188
+ const pic = seq.features.find(p => p.id === this._selectedPicId);
189
+ if(pic) {
190
+ this.select(this._selectedSeqId, this._selectedPicId, true);
191
+ this.map.jumpTo({ center: pic.geometry.coordinates, zoom: 18 });
191
192
  }
192
- // Show area of sequence otherwise
193
193
  else {
194
- const bbox = [
195
- ...seq.features[0].geometry.coordinates,
196
- ...seq.features[0].geometry.coordinates
197
- ];
198
-
199
- for(let i=1; i < seq.features.length; i++) {
200
- const c = seq.features[i].geometry.coordinates;
201
- if(c[0] < bbox[0]) { bbox[0] = c[0]; }
202
- if(c[1] < bbox[1]) { bbox[1] = c[1]; }
203
- if(c[0] > bbox[2]) { bbox[2] = c[0]; }
204
- if(c[1] > bbox[3]) { bbox[3] = c[1]; }
205
- }
206
-
207
- this.map.fitBounds(bbox, {animate: false});
194
+ console.log("Picture with ID", pic, "was not found");
195
+ }
196
+ }
197
+ // Show area of sequence otherwise
198
+ else {
199
+ const bbox = [
200
+ ...seq.features[0].geometry.coordinates,
201
+ ...seq.features[0].geometry.coordinates
202
+ ];
203
+
204
+ for(let i=1; i < seq.features.length; i++) {
205
+ const c = seq.features[i].geometry.coordinates;
206
+ if(c[0] < bbox[0]) { bbox[0] = c[0]; }
207
+ if(c[1] < bbox[1]) { bbox[1] = c[1]; }
208
+ if(c[0] > bbox[2]) { bbox[2] = c[0]; }
209
+ if(c[1] > bbox[3]) { bbox[3] = c[1]; }
208
210
  }
209
- this._loader.dismiss();
210
- };
211
211
 
212
- if(this.map.loaded()) { onMapLoad(); }
213
- else { this.map.once("load", onMapLoad); }
212
+ this.map.fitBounds(bbox, {animate: false});
213
+ }
214
214
  }).catch(e => this._loader.dismiss(e, this._t.gvs.error_api));
215
215
  }
216
216
 
package/src/utils/API.js CHANGED
@@ -336,13 +336,29 @@ export default class API {
336
336
  * Get sequence GeoJSON representation
337
337
  *
338
338
  * @param {string} seqId The sequence ID
339
+ * @param {string} [next] The next link URL (only for internals)
340
+ * @param {object} [data] The previous dataset (only for internals)
339
341
  * @returns {Promise} Resolves on sequence GeoJSON
340
342
  */
341
- async getSequenceItems(seqId) {
343
+ async getSequenceItems(seqId, next = null, data = null) {
342
344
  if(!this.isReady()) { throw new Error("API is not ready to use"); }
343
345
  try {
344
346
  API.isIdValid(seqId);
345
- return fetch(`${this._endpoints.collections}/${seqId}/items`, this._getFetchOptions()).then(res => res.json());
347
+ return fetch(
348
+ next || `${this._endpoints.collections}/${seqId}/items`,
349
+ this._getFetchOptions()
350
+ )
351
+ .then(res => res.json())
352
+ .then(res => {
353
+ // Merge previous data with current page
354
+ let nextData = res;
355
+ if(data) { nextData.features = data.features.concat(nextData.features); }
356
+
357
+ // Handle pagination for next link
358
+ const nextLink = res.links.find(l => l.rel === "next");
359
+ if(nextLink) { return this.getSequenceItems(seqId, nextLink.href, nextData); }
360
+ else { return nextData; }
361
+ });
346
362
  }
347
363
  catch(e) {
348
364
  return Promise.reject(e);
@@ -277,6 +277,7 @@ export default class URLHash extends EventTarget {
277
277
 
278
278
  // Change focus
279
279
  if(vals.focus && ["map", "pic"].includes(vals.focus)) {
280
+ this._viewer.setPopup(false);
280
281
  this._viewer.setFocus(vals.focus);
281
282
  }
282
283
  if(vals.focus && vals.focus == "meta") {
@@ -434,11 +435,18 @@ export default class URLHash extends EventTarget {
434
435
  const prevPic = this._getCurrentHash().pic || "";
435
436
  const nextPic = this._viewer?.psv?.getPictureMetadata()?.id || "";
436
437
 
438
+ const prevFocus = this._getCurrentHash().focus || "";
439
+ const nextFocus = nextUrl.hash.includes("focus=meta") ? "meta" : (nextUrl.hash.includes("focus=map") ? "map" : "pic");
440
+
437
441
  try {
438
442
  // If different pic, add entry in browser history
439
443
  if(prevPic != nextPic) {
440
444
  window.history.pushState(window.history.state, null, nextUrl.href);
441
445
  }
446
+ // If metadata popup is open, come back to pic/map
447
+ else if(prevFocus != nextFocus && nextFocus == "meta") {
448
+ window.history.pushState(window.history.state, null, nextUrl.href);
449
+ }
442
450
  // If same pic, just update viewer params
443
451
  else {
444
452
  window.history.replaceState(window.history.state, null, nextUrl.href);
@@ -319,6 +319,7 @@ describe("_onHashChange", () => {
319
319
  select: jest.fn(),
320
320
  setFocus: jest.fn(),
321
321
  setFilters: jest.fn(),
322
+ setPopup: jest.fn(),
322
323
  };
323
324
  const uh = new URLHash(v);
324
325
  uh._getCurrentHash = () => ({
@@ -383,6 +384,7 @@ describe("_onHashChange", () => {
383
384
  select: jest.fn(),
384
385
  setFocus: jest.fn(),
385
386
  setFilters: jest.fn(),
387
+ setPopup: jest.fn(),
386
388
  };
387
389
  const uh = new URLHash(v);
388
390
  uh._getCurrentHash = () => ({
@@ -414,6 +416,7 @@ describe("_onHashChange", () => {
414
416
  select: jest.fn(),
415
417
  setFocus: jest.fn(),
416
418
  setFilters: jest.fn(),
419
+ setPopup: jest.fn(),
417
420
  };
418
421
  const uh = new URLHash(v);
419
422
  uh._getCurrentHash = () => ({