Co-authored-by: Alexis Métaireau <alexis@notmyidea.org>
This commit is contained in:
Yohan Boniface 2025-03-14 14:28:40 +01:00
parent 3ad676ed59
commit a09984e340
2 changed files with 65 additions and 16 deletions

View file

@ -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':

View file

@ -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 })
}
}