fix: make sure DataLayer rank is always set

Co-authored-by: David Larlet <david@larlet.fr>
This commit is contained in:
Yohan Boniface 2025-04-25 17:10:31 +02:00
parent 1ecddc1c02
commit e5dbca21b0
3 changed files with 19 additions and 7 deletions

View file

@ -125,6 +125,20 @@ export class DataLayer {
return `datalayer-${stamp(this)}` 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() { getSyncMetadata() {
return { return {
subject: 'datalayer', subject: 'datalayer',
@ -1132,7 +1146,7 @@ export class DataLayer {
const formData = new FormData() const formData = new FormData()
formData.append('name', this.options.name) formData.append('name', this.options.name)
formData.append('display_on_load', !!this.options.displayOnLoad) formData.append('display_on_load', !!this.options.displayOnLoad)
formData.append('rank', this.options.rank) formData.append('rank', this.rank)
formData.append('settings', this.prepareOptions()) formData.append('settings', this.prepareOptions())
// Filename support is shaky, don't do it for now. // Filename support is shaky, don't do it for now.
const blob = new Blob([JSON.stringify(geojson)], { type: 'application/json' }) const blob = new Blob([JSON.stringify(geojson)], { type: 'application/json' })

View file

@ -5,7 +5,7 @@ export class DataLayerManager extends Object {
active() { active() {
return Object.values(this) return Object.values(this)
.filter((datalayer) => !datalayer.isDeleted) .filter((datalayer) => !datalayer.isDeleted)
.sort((a, b) => a.options.rank > b.options.rank) .sort((a, b) => a.rank > b.rank)
} }
reverse() { reverse() {
return this.active().reverse() return this.active().reverse()

View file

@ -657,9 +657,7 @@ export default class Umap {
const parent = this._leafletMap.getPane('overlayPane') const parent = this._leafletMap.getPane('overlayPane')
const datalayers = Object.values(this.datalayers) const datalayers = Object.values(this.datalayers)
.filter((datalayer) => !datalayer._isDeleted) .filter((datalayer) => !datalayer._isDeleted)
.sort( .sort((datalayer1, datalayer2) => datalayer1.rank > datalayer2.rank)
(datalayer1, datalayer2) => datalayer1.options.rank > datalayer2.options.rank
)
for (const datalayer of datalayers) { for (const datalayer of datalayers) {
const child = parent.querySelector(`[data-id="${datalayer.id}"]`) const child = parent.querySelector(`[data-id="${datalayer.id}"]`)
parent.appendChild(child) parent.appendChild(child)
@ -1503,8 +1501,8 @@ export default class Umap {
this.datalayers.reverse().map((datalayer) => { this.datalayers.reverse().map((datalayer) => {
const rank = datalayer.getDOMOrder() const rank = datalayer.getDOMOrder()
if (rank >= minIndex && rank <= maxIndex) { if (rank >= minIndex && rank <= maxIndex) {
const oldRank = datalayer.options.rank const oldRank = datalayer.rank
datalayer.options.rank = rank datalayer.rank = rank
datalayer.sync.update('options.rank', rank, oldRank) datalayer.sync.update('options.rank', rank, oldRank)
} }
}) })