mirror of
https://github.com/umap-project/umap.git
synced 2025-05-04 13:41:49 +02:00
fixup! Introduce a _future_uuid property to track not-yet-synced datalayers
This commit is contained in:
parent
9759f780ad
commit
d68a34e591
4 changed files with 39 additions and 24 deletions
|
@ -36,7 +36,7 @@ const LAYER_MAP = LAYER_TYPES.reduce((acc, klass) => {
|
|||
}, {})
|
||||
|
||||
export class DataLayer {
|
||||
constructor(map, data, sync) {
|
||||
constructor(map, data, sync, future_uuid) {
|
||||
this.map = map
|
||||
this.sync = map.sync_engine.proxy(this)
|
||||
this._index = Array()
|
||||
|
@ -61,6 +61,13 @@ export class DataLayer {
|
|||
this._isDirty = false
|
||||
this._isDeleted = false
|
||||
this.setUmapId(data.id)
|
||||
|
||||
if (!this.umap_id) {
|
||||
// Generate a random uuid if none is provided
|
||||
this._future_uuid = future_uuid !== undefined ? future_uuid : crypto.randomUUID()
|
||||
console.log('Future UUID for datalayer', this._future_uuid)
|
||||
}
|
||||
|
||||
this.setOptions(data)
|
||||
|
||||
if (!Utils.isObject(this.options.remoteData)) {
|
||||
|
@ -79,8 +86,9 @@ export class DataLayer {
|
|||
this.connectToMap()
|
||||
this.permissions = new DataLayerPermissions(this)
|
||||
|
||||
if (!this.createdOnServer) {
|
||||
// When importing data, show the layer immediately if applicable
|
||||
console.debug("createdOnServer", this.createdOnServer)
|
||||
if (!this.umap_id) {
|
||||
console.debug("showAtLoad", this.showAtLoad())
|
||||
if (this.showAtLoad()) this.show()
|
||||
this.isDirty = true
|
||||
}
|
||||
|
@ -92,8 +100,7 @@ export class DataLayer {
|
|||
}
|
||||
|
||||
get createdOnServer(){
|
||||
console.log("reference version", this._reference_version)
|
||||
return this._reference_version !== undefined
|
||||
return this.umap_id !== undefined
|
||||
}
|
||||
|
||||
set isDirty(status) {
|
||||
|
@ -127,6 +134,7 @@ export class DataLayer {
|
|||
subject: 'datalayer',
|
||||
metadata: {
|
||||
id: this.umap_id,
|
||||
future_uuid: this._future_uuid,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -219,13 +227,14 @@ export class DataLayer {
|
|||
}
|
||||
|
||||
async fetchData() {
|
||||
if (!this.createdOnServer) return
|
||||
console.trace("fetchData", this.umap_id)
|
||||
if (!this.umap_id) return
|
||||
if (this._loading) return
|
||||
this._loading = true
|
||||
const [geojson, response, error] = await this.map.server.get(this._dataUrl())
|
||||
if (!error) {
|
||||
this._reference_version = response.headers.get('X-Datalayer-Version')
|
||||
// FIXME: for now this property is set dynamically from backend
|
||||
// FIXME: for now the _umap_options property is set dynamically from backend
|
||||
// And thus it's not in the geojson file in the server
|
||||
// So do not let all options to be reset
|
||||
// Fix is a proper migration so all datalayers settings are
|
||||
|
@ -311,7 +320,7 @@ export class DataLayer {
|
|||
}
|
||||
|
||||
isLoaded() {
|
||||
return !this.createdOnServer || this._loaded
|
||||
return !this.umap_id || this._loaded
|
||||
}
|
||||
|
||||
hasDataLoaded() {
|
||||
|
@ -321,11 +330,6 @@ export class DataLayer {
|
|||
setUmapId(id) {
|
||||
// Datalayer ID is null when listening creation form
|
||||
if (!this.umap_id && id) this.umap_id = id
|
||||
else {
|
||||
// Generate a random uuid if none is provided
|
||||
this.umap_id = crypto.randomUUID()
|
||||
console.log('Generating random UUID for datalayer', this.umap_id)
|
||||
}
|
||||
}
|
||||
|
||||
backupOptions() {
|
||||
|
@ -909,6 +913,7 @@ export class DataLayer {
|
|||
|
||||
async show() {
|
||||
this.map.addLayer(this.layer)
|
||||
|
||||
if (!this.isLoaded()) await this.fetchData()
|
||||
this.propagateShow()
|
||||
}
|
||||
|
@ -1054,7 +1059,7 @@ export class DataLayer {
|
|||
formData.append('geojson', blob)
|
||||
const saveURL = this.map.urls.get('datalayer_save', {
|
||||
map_id: this.map.options.umap_id,
|
||||
pk: this.umap_id,
|
||||
pk: this.umap_id || this._future_uuid,
|
||||
created: this.createdOnServer,
|
||||
})
|
||||
console.log("saveUrl", saveURL)
|
||||
|
|
|
@ -563,4 +563,9 @@ export const SCHEMA = {
|
|||
type: Object,
|
||||
impacts: ['data'],
|
||||
},
|
||||
|
||||
_reference_version: {
|
||||
type: Number,
|
||||
impacts: ['data'],
|
||||
},
|
||||
}
|
||||
|
|
|
@ -31,8 +31,8 @@ class BaseUpdater {
|
|||
}
|
||||
}
|
||||
|
||||
getDataLayerFromID(layerId) {
|
||||
if (layerId) return this.map.getDataLayerByUmapId(layerId)
|
||||
getDataLayerFromID(layerId, future_uuid) {
|
||||
if (layerId) return this.map.getDataLayerByUmapId(layerId, future_uuid)
|
||||
return this.map.defaultEditDataLayer()
|
||||
}
|
||||
|
||||
|
@ -53,14 +53,15 @@ export class MapUpdater extends BaseUpdater {
|
|||
}
|
||||
|
||||
export class DataLayerUpdater extends BaseUpdater {
|
||||
upsert({ value }) {
|
||||
// Inserts does not happen (we use multiple updates instead).
|
||||
this.map.createDataLayer(value, false)
|
||||
upsert({ value, metadata }) {
|
||||
console.log('upsert', value, metadata)
|
||||
// Upsert only happens when a new datalayer is created.
|
||||
this.map.createDataLayer(value, false, metadata.future_uuid)
|
||||
this.map.render([])
|
||||
}
|
||||
|
||||
update({ key, metadata, value }) {
|
||||
const datalayer = this.getDataLayerFromID(metadata.id)
|
||||
const datalayer = this.getDataLayerFromID(metadata.id, metadata.future_uuid)
|
||||
if (fieldInSchema(key)) {
|
||||
this.updateObjectValue(datalayer, key, value)
|
||||
} else {
|
||||
|
|
|
@ -817,9 +817,10 @@ U.Map = L.Map.extend({
|
|||
return L.Map.prototype.setMaxBounds.call(this, bounds)
|
||||
},
|
||||
|
||||
createDataLayer: function (options = {}, sync = true) {
|
||||
createDataLayer: function (options = {}, sync = true, future_uuid = undefined) {
|
||||
console.log("Create Datalayer", options)
|
||||
options.name = options.name || `${L._('Layer')} ${this.datalayers_index.length + 1}`
|
||||
const datalayer = new U.DataLayer(this, options, sync)
|
||||
const datalayer = new U.DataLayer(this, options, sync, future_uuid)
|
||||
|
||||
if (sync !== false) {
|
||||
datalayer.sync.upsert(datalayer.options)
|
||||
|
@ -828,7 +829,7 @@ U.Map = L.Map.extend({
|
|||
},
|
||||
|
||||
newDataLayer: function () {
|
||||
const datalayer = this.createDataLayer({})
|
||||
const datalayer = this.createDataLayer({}, sync=true)
|
||||
datalayer.edit()
|
||||
},
|
||||
|
||||
|
@ -1192,7 +1193,10 @@ U.Map = L.Map.extend({
|
|||
return this.createDataLayer()
|
||||
},
|
||||
|
||||
getDataLayerByUmapId: function (umap_id) {
|
||||
getDataLayerByUmapId: function (umap_id, future_uuid) {
|
||||
if (future_uuid !== undefined) {
|
||||
return this.findDataLayer((d) => d._future_uuid === future_uuid)
|
||||
}
|
||||
return this.findDataLayer((d) => d.umap_id === umap_id)
|
||||
},
|
||||
|
||||
|
|
Loading…
Reference in a new issue