From e5dbca21b0482b2a2f9d19ff26bea7b95886293c Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 25 Apr 2025 17:10:31 +0200 Subject: [PATCH] fix: make sure DataLayer rank is always set Co-authored-by: David Larlet --- umap/static/umap/js/modules/data/layer.js | 16 +++++++++++++++- umap/static/umap/js/modules/managers.js | 2 +- umap/static/umap/js/modules/umap.js | 8 +++----- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/umap/static/umap/js/modules/data/layer.js b/umap/static/umap/js/modules/data/layer.js index c4e0e037..acfdd6d4 100644 --- a/umap/static/umap/js/modules/data/layer.js +++ b/umap/static/umap/js/modules/data/layer.js @@ -125,6 +125,20 @@ export class DataLayer { return `datalayer-${stamp(this)}` } + get rank() { + // Make sure we always have a valid rank. Undefined rank may happen + // after importing an old umap backup, and not touching the layers + // after that. + if (this.options.rank === undefined) { + this.options.rank = this.getDOMOrder() + } + return this.options.rank + } + + set rank(value) { + this.options.rank = value + } + getSyncMetadata() { return { subject: 'datalayer', @@ -1132,7 +1146,7 @@ export class DataLayer { const formData = new FormData() formData.append('name', this.options.name) formData.append('display_on_load', !!this.options.displayOnLoad) - formData.append('rank', this.options.rank) + formData.append('rank', this.rank) formData.append('settings', this.prepareOptions()) // Filename support is shaky, don't do it for now. const blob = new Blob([JSON.stringify(geojson)], { type: 'application/json' }) diff --git a/umap/static/umap/js/modules/managers.js b/umap/static/umap/js/modules/managers.js index 00a06606..76ddc205 100644 --- a/umap/static/umap/js/modules/managers.js +++ b/umap/static/umap/js/modules/managers.js @@ -5,7 +5,7 @@ export class DataLayerManager extends Object { active() { return Object.values(this) .filter((datalayer) => !datalayer.isDeleted) - .sort((a, b) => a.options.rank > b.options.rank) + .sort((a, b) => a.rank > b.rank) } reverse() { return this.active().reverse() diff --git a/umap/static/umap/js/modules/umap.js b/umap/static/umap/js/modules/umap.js index f7435a99..5ab1a609 100644 --- a/umap/static/umap/js/modules/umap.js +++ b/umap/static/umap/js/modules/umap.js @@ -657,9 +657,7 @@ export default class Umap { const parent = this._leafletMap.getPane('overlayPane') const datalayers = Object.values(this.datalayers) .filter((datalayer) => !datalayer._isDeleted) - .sort( - (datalayer1, datalayer2) => datalayer1.options.rank > datalayer2.options.rank - ) + .sort((datalayer1, datalayer2) => datalayer1.rank > datalayer2.rank) for (const datalayer of datalayers) { const child = parent.querySelector(`[data-id="${datalayer.id}"]`) parent.appendChild(child) @@ -1503,8 +1501,8 @@ export default class Umap { this.datalayers.reverse().map((datalayer) => { const rank = datalayer.getDOMOrder() if (rank >= minIndex && rank <= maxIndex) { - const oldRank = datalayer.options.rank - datalayer.options.rank = rank + const oldRank = datalayer.rank + datalayer.rank = rank datalayer.sync.update('options.rank', rank, oldRank) } })