mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-16 23:02:50 +00:00
89 lines
2.1 KiB
JavaScript
89 lines
2.1 KiB
JavaScript
import Debug from 'debug';
|
|
import { fastClone } from './index';
|
|
const DEFAULT_CONFIG = {
|
|
limit: 20,
|
|
};
|
|
const debug = Debug('utils:undoRedoHelper');
|
|
export default class UndoRedoHelper {
|
|
constructor(config) {
|
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
this.data = {};
|
|
}
|
|
|
|
create(key, value, forceCreate) {
|
|
if (!this.data[key] || forceCreate) {
|
|
this.data[key] = {
|
|
list: [fastClone(value)],
|
|
idx: 0,
|
|
};
|
|
}
|
|
return this.data[key];
|
|
}
|
|
|
|
delete(key) {
|
|
delete this.data[key];
|
|
}
|
|
|
|
resetRecord(key, value) {
|
|
const data = this.data[key];
|
|
if (!data || !data.list) return;
|
|
data.list = data.list.slice(0, data.idx + 1);
|
|
data.list[data.idx] = fastClone(value);
|
|
}
|
|
|
|
record(key, value) {
|
|
const data = this.data[key];
|
|
const limit = this.config.limit;
|
|
if (!data || !data.list) return;
|
|
data.list = data.list.slice(0, data.idx + 1);
|
|
if (data.list.length >= limit) {
|
|
data.list.shift();
|
|
}
|
|
data.list.push(fastClone(value));
|
|
++data.idx;
|
|
}
|
|
|
|
undo(key) {
|
|
const data = this.data[key];
|
|
if (!data || !data.list) return null;
|
|
//若没有前置操作,返回当前数据
|
|
if (data.idx <= 0) return data.list[data.idx];
|
|
--data.idx;
|
|
return data.list[data.idx];
|
|
}
|
|
redo(key) {
|
|
const data = this.data[key];
|
|
if (!data || !data.list) return null;
|
|
//若没有后续操作,返回当前数据
|
|
if (data.idx >= data.list.length - 1) return data.list[data.idx];
|
|
++data.idx;
|
|
return data.list[data.idx];
|
|
}
|
|
|
|
past(key) {
|
|
const data = this.data[key];
|
|
if (!data || !data.list || data.idx <= 0) return null;
|
|
return data.list[data.idx - 1];
|
|
}
|
|
|
|
present(key) {
|
|
const data = this.data[key];
|
|
if (!data || !data.list) return null;
|
|
return data.list[data.idx];
|
|
}
|
|
|
|
future(key) {
|
|
const data = this.data[key];
|
|
if (!data || !data.list || data.idx >= data.list.length - 1) return null;
|
|
return data.list[data.idx + 1];
|
|
}
|
|
|
|
get(key) {
|
|
return {
|
|
past: this.past(key),
|
|
present: this.present(key),
|
|
future: this.future(key),
|
|
};
|
|
}
|
|
}
|