From 56890aea5b188b223695130e9f1b06234980c055 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Tue, 2 Mar 2021 01:23:09 +0100 Subject: [PATCH] Switch undo manager on page change --- src/pages/index.js | 3 ++- src/undo_manager/index.js | 38 +++++++++++++++++++++++++------------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/pages/index.js b/src/pages/index.js index 9b0b168a1..cf51ed128 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -103,7 +103,8 @@ export default () => { const { em, selected } = this; const page = isString(pg) ? this.get(pg) : pg; this.selected = page; - em.get('UndoManager').select(page.id, { ...opts, create: 1 }); + const um = em.get('UndoManager'); + um && um.select(page.id, { ...opts, create: 1 }); !opts.silent && em.trigger(evPageSelect, page, selected); return this; }, diff --git a/src/undo_manager/index.js b/src/undo_manager/index.js index 974254c13..f36323189 100644 --- a/src/undo_manager/index.js +++ b/src/undo_manager/index.js @@ -32,7 +32,6 @@ const typeMain = 'main'; export default () => { let em; - let um; let config; let beforeCache; const configDef = { @@ -52,7 +51,16 @@ export default () => { config = { ...opts, ...configDef }; em = config.em; this.em = em; - um = new UndoManager({ track: true, register: [], ...config }); + const umObj = { id: typeMain, um: this._createInst(config) }; + this.all = [umObj]; + this.select(typeMain, { silent: 1 }); + + return this; + }, + + _createInst(conf) { + const { em } = this; + const um = new UndoManager({ track: true, register: [], ...conf }); um.changeUndoType('change', { condition: false }); um.changeUndoType('add', { on(model, collection, options = {}) { @@ -109,11 +117,7 @@ export default () => { ); ['undo', 'redo'].forEach(ev => um.on(ev, () => em.trigger(ev))); - const umObj = { id: typeMain, um }; - this.all = [umObj]; - this.select(typeMain, { silent: 1 }); - - return this; + return um; }, /** @@ -126,11 +130,11 @@ export default () => { /** * Get undo instance by id */ - getInst(id, opts = {}) { + getInst(id) { return this.getAll().filter(i => i.id === id)[0]; }, - addInst(id, um) { + addInst(id, um, opts = {}) { let result = this.getInst(id); if (!result) { result = { id, um }; @@ -141,10 +145,18 @@ export default () => { select(id, opts = {}) { const { selected } = this; - const inst = this.getInst(id); + let inst = this.getInst(id); + + if (opts.main) { + inst = this.getInst(typeMain); + inst.id = id; + } else if (!inst && opts.create) { + inst = this.addInst(id, this._createInst(config), opts); + } + this.selected = inst; - console.log('Select um', inst, opts); !opts.silent && this.em.trigger(evSelect, inst, selected); + return inst; }, getSelected() { @@ -340,12 +352,12 @@ export default () => { }, getInstance() { - return um; + return this.getSelected().um; }, destroy() { this.clear().removeAll(); - [em, um, config, beforeCache].forEach(i => (i = {})); + [em, config, beforeCache].forEach(i => (i = {})); ['all', 'selected'].forEach(i => (this[i] = {})); this.em = {}; }