mirror of
https://github.com/n8n-io/n8n.git
synced 2024-11-12 07:34:08 -08:00
89 lines
2.2 KiB
TypeScript
89 lines
2.2 KiB
TypeScript
|
import { AddConnectionCommand, COMMANDS, RemoveConnectionCommand } from './../models/history';
|
||
|
import { BulkCommand, Command, Undoable, MoveNodeCommand } from "@/models/history";
|
||
|
import { STORES } from "@/constants";
|
||
|
import { HistoryState } from "@/Interface";
|
||
|
import { defineStore } from "pinia";
|
||
|
|
||
|
const STACK_LIMIT = 100;
|
||
|
|
||
|
export const useHistoryStore = defineStore(STORES.HISTORY, {
|
||
|
state: (): HistoryState => ({
|
||
|
undoStack: [],
|
||
|
redoStack: [],
|
||
|
currentBulkAction: null,
|
||
|
bulkInProgress: false,
|
||
|
}),
|
||
|
actions: {
|
||
|
popUndoableToUndo(): Undoable | undefined {
|
||
|
if (this.undoStack.length > 0) {
|
||
|
return this.undoStack.pop();
|
||
|
}
|
||
|
|
||
|
return undefined;
|
||
|
},
|
||
|
pushCommandToUndo(undoable: Command, clearRedo = true): void {
|
||
|
if (!this.bulkInProgress) {
|
||
|
if (this.currentBulkAction) {
|
||
|
const alreadyIn = this.currentBulkAction.commands.find(c => c.isEqualTo(undoable)) !== undefined;
|
||
|
if (!alreadyIn) {
|
||
|
this.currentBulkAction.commands.push(undoable);
|
||
|
}
|
||
|
} else {
|
||
|
this.undoStack.push(undoable);
|
||
|
}
|
||
|
this.checkUndoStackLimit();
|
||
|
if (clearRedo) {
|
||
|
this.clearRedoStack();
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
pushBulkCommandToUndo(undoable: BulkCommand, clearRedo = true): void {
|
||
|
this.undoStack.push(undoable);
|
||
|
this.checkUndoStackLimit();
|
||
|
if (clearRedo) {
|
||
|
this.clearRedoStack();
|
||
|
}
|
||
|
},
|
||
|
checkUndoStackLimit() {
|
||
|
if (this.undoStack.length > STACK_LIMIT) {
|
||
|
this.undoStack.shift();
|
||
|
}
|
||
|
},
|
||
|
checkRedoStackLimit() {
|
||
|
if (this.redoStack.length > STACK_LIMIT) {
|
||
|
this.redoStack.shift();
|
||
|
}
|
||
|
},
|
||
|
clearUndoStack() {
|
||
|
this.undoStack = [];
|
||
|
},
|
||
|
clearRedoStack() {
|
||
|
this.redoStack = [];
|
||
|
},
|
||
|
reset() {
|
||
|
this.clearRedoStack();
|
||
|
this.clearUndoStack();
|
||
|
},
|
||
|
popUndoableToRedo(): Undoable | undefined {
|
||
|
if (this.redoStack.length > 0) {
|
||
|
return this.redoStack.pop();
|
||
|
}
|
||
|
return undefined;
|
||
|
},
|
||
|
pushUndoableToRedo(undoable: Undoable): void {
|
||
|
this.redoStack.push(undoable);
|
||
|
this.checkRedoStackLimit();
|
||
|
},
|
||
|
startRecordingUndo() {
|
||
|
this.currentBulkAction = new BulkCommand([]);
|
||
|
},
|
||
|
stopRecordingUndo() {
|
||
|
if (this.currentBulkAction && this.currentBulkAction.commands.length > 0) {
|
||
|
this.undoStack.push(this.currentBulkAction);
|
||
|
this.checkUndoStackLimit();
|
||
|
}
|
||
|
this.currentBulkAction = null;
|
||
|
},
|
||
|
},
|
||
|
});
|