diff --git a/src/dom_components/model/Component.js b/src/dom_components/model/Component.js index a2f3d13b0..e2e22898a 100644 --- a/src/dom_components/model/Component.js +++ b/src/dom_components/model/Component.js @@ -839,6 +839,15 @@ const Component = Backbone.Model.extend(Styleable).extend( symb.append(toAppend, { fromInstance: this, ...o }); }); } else { + // Remove instance reference from the symbol + const symb = m.__getSymbol(); + symb && + !o.temporary && + symb.set( + keySymbols, + symb.__getSymbols().filter(i => i !== m) + ); + // Propagate remove only if the component is an inner symbol if (!m.__isSymbolTop()) { const { index } = o; @@ -864,15 +873,6 @@ const Component = Backbone.Model.extend(Styleable).extend( }); toUp.forEach(toUpFn); } - - // Remove instance reference from the symbol - const symb = m.__getSymbol(); - symb && - !o.temporary && - symb.set( - keySymbols, - symb.__getSymbols().filter(i => i !== m) - ); } this.__changesUp(optUp); @@ -1428,11 +1428,13 @@ const Component = Backbone.Model.extend(Styleable).extend( delete obj.open; // used in Layers if (!opts.fromUndo) { - if (obj[keySymbols]) { - obj[keySymbols] = (this.__getSymbols() || []).map(i => i.getId()); + const symbol = obj[keySymbol]; + const symbols = obj[keySymbols]; + if (symbols && isArray(symbols)) { + obj[keySymbols] = symbols.map(i => (i.getId ? i.getId() : i)); } - if (obj[keySymbol] && !isString(obj[keySymbol])) { - obj[keySymbol] = obj[keySymbol].getId(); + if (symbol && !isString(symbol)) { + obj[keySymbol] = symbol.getId(); } } diff --git a/src/undo_manager/index.js b/src/undo_manager/index.js index d2c630c84..a66e2cea2 100644 --- a/src/undo_manager/index.js +++ b/src/undo_manager/index.js @@ -48,7 +48,7 @@ export default () => { * @private */ init(opts = {}) { - config = { ...opts, ...configDef }; + config = { ...configDef, ...opts }; em = config.em; this.em = em; const fromUndo = true; diff --git a/test/specs/dom_components/model/Symbols.js b/test/specs/dom_components/model/Symbols.js index 20b0e1d83..f654a864b 100644 --- a/test/specs/dom_components/model/Symbols.js +++ b/test/specs/dom_components/model/Symbols.js @@ -229,6 +229,17 @@ describe('Symbols', () => { expect(symbol.__getSymbols().length).toBe(allInst.length - 1); }); + test('Removing one instance, works with UndoManager', done => { + setTimeout(() => { + // This will commit the undo + const um = getUm(comp); + allInst[0].remove(); + um.undo(); + expect(symbol.__getSymbols().length).toBe(allInst.length); + done(); + }); + }); + test('Adding a new component to a symbol, it will be propogated to all instances', () => { const added = symbol.append(simpleComp, { at: 0 })[0]; all.forEach(cmp =>