diff --git a/umap/static/umap/js/modules/sync/undo.js b/umap/static/umap/js/modules/sync/undo.js index f973febe..57826495 100644 --- a/umap/static/umap/js/modules/sync/undo.js +++ b/umap/static/umap/js/modules/sync/undo.js @@ -22,12 +22,41 @@ export class UndoManager { this.toggleState() } - cleanOperation(operation, redo) { - const syncOperation = Utils.CopyJSON(operation) - delete syncOperation.oldValue - delete syncOperation.newValue - syncOperation.value = redo ? operation.newValue : operation.oldValue - return syncOperation + markSaved() { + if (this._undoStack.length > 0) { + const lastOperation = this._undoStack[this._undoStack.length - 1] + lastOperation.saved_marker = true + } + } + + /** + * Returns the list of changed "subjects" from the undo stack, + * since the last time we marked "saved" + **/ + getChangedObjects() { + // Get operations in the undo stack since the last save + let last_save_index = this._undoStack.findLastIndex( + (op) => op.saved_marker === true + ) + if (last_save_index === -1) { + last_save_index = 0 + } + + console.log('last save index', last_save_index) + const operations_since_last_saved = this._undoStack.slice(last_save_index) + + return operations_since_last_saved.reduce((acc, op) => { + const metadata = { subject: op.subject, metadata: op.metadata } + const obj = this._getSaveTargetFromOperation(op) + if (!acc.includes(obj)) { + acc.push(obj) + } + return acc + }, []) + } + + _getSaveTargetFromOperation({ subject, metadata }) { + return this._getUpdater(subject, metadata).getSaveTarget(metadata) } undo(redo = false) { @@ -37,10 +66,10 @@ export class UndoManager { if (!operation) return if (operation.verb === 'batch') { for (const op of operation.operations) { - this.applyOperation(this.cleanOperation(op, redo)) + this._applyOperation(this._cleanOperation(op, redo)) } } else { - this.applyOperation(this.cleanOperation(operation, redo)) + this._applyOperation(this._cleanOperation(operation, redo)) } toStack.push(operation) this.toggleState() @@ -50,7 +79,15 @@ export class UndoManager { this.undo(true) } - applyOperation(syncOperation) { + _cleanOperation(operation, redo) { + const syncOperation = Utils.CopyJSON(operation) + delete syncOperation.oldValue + delete syncOperation.newValue + syncOperation.value = redo ? operation.newValue : operation.oldValue + return syncOperation + } + + _applyOperation(syncOperation) { const updater = this._getUpdater(syncOperation.subject, syncOperation.metadata) switch (syncOperation.verb) { case 'update': diff --git a/umap/static/umap/js/modules/sync/updaters.js b/umap/static/umap/js/modules/sync/updaters.js index 0ea66d2e..32471934 100644 --- a/umap/static/umap/js/modules/sync/updaters.js +++ b/umap/static/umap/js/modules/sync/updaters.js @@ -31,8 +31,8 @@ class BaseUpdater { } } - getDataLayerFromID(layerId) { - return this._umap.getDataLayerByUmapId(layerId) + getDataLayerFromMetadata({ id }) { + return this._umap.getDataLayerByUmapId(id) } applyMessage(payload) { @@ -51,6 +51,10 @@ export class MapUpdater extends BaseUpdater { this._umap.onPropertiesUpdated([key]) this._umap.render([key]) } + + getSaveTarget(metadata) { + return this._umap + } } export class DataLayerUpdater extends BaseUpdater { @@ -60,7 +64,7 @@ export class DataLayerUpdater extends BaseUpdater { console.log( 'found datalayer with id', value.id, - this.getDataLayerFromID(value.id) + this.getDataLayerFromMetadata(value) ) } catch { console.log('we are the fucking catch', value) @@ -72,7 +76,7 @@ export class DataLayerUpdater extends BaseUpdater { } update({ key, metadata, value }) { - const datalayer = this.getDataLayerFromID(metadata.id) + const datalayer = this.getDataLayerFromMetadata(metadata) if (fieldInSchema(key)) { this.updateObjectValue(datalayer, key, value) } else { @@ -85,17 +89,21 @@ export class DataLayerUpdater extends BaseUpdater { } delete({ metadata }) { - const datalayer = this.getDataLayerFromID(metadata.id) + const datalayer = this.getDataLayerFromMetadata(metadata) if (datalayer) { datalayer.del(false) datalayer.commitDelete() } } + + getSaveTarget(metadata) { + return this.getDataLayerFromMetadata(metadata) + } } export class FeatureUpdater extends BaseUpdater { getFeatureFromMetadata({ id, layerId }) { - const datalayer = this.getDataLayerFromID(layerId) + const datalayer = this.getDataLayerFromMetadata({ id: layerId }) return datalayer.getFeatureById(id) } @@ -103,7 +111,7 @@ export class FeatureUpdater extends BaseUpdater { upsert({ metadata, value }) { console.log('updater.upsert for', metadata, value) const { id, layerId } = metadata - const datalayer = this.getDataLayerFromID(layerId) + const datalayer = this.getDataLayerFromMetadata({ id: layerId }) const feature = this.getFeatureFromMetadata(metadata) console.log('feature', feature) @@ -139,4 +147,8 @@ export class FeatureUpdater extends BaseUpdater { const feature = this.getFeatureFromMetadata(metadata) if (feature) feature.del(false) } + + getSaveTarget({ layerId }) { + return this.getDataLayerFromMetadata({ id: layerId }) + } }