From 22ce9bd1d06e86ea2836c1ea1a6a98e727586fd6 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Tue, 11 May 2021 23:10:33 +0200 Subject: [PATCH] Avoid removing components with override --- src/dom_components/model/Component.js | 11 +++++++---- test/specs/dom_components/model/Symbols.js | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/dom_components/model/Component.js b/src/dom_components/model/Component.js index fe2e4ea92..110e982a9 100644 --- a/src/dom_components/model/Component.js +++ b/src/dom_components/model/Component.js @@ -887,19 +887,22 @@ const Component = Backbone.Model.extend(Styleable).extend( // Propagate remove only if the component is an inner symbol if (!m.__isSymbolTop()) { - const rmEv = 'components:remove'; + const changed = 'components:remove'; const { index } = o; const parent = m.parent(); const opts = { fromInstance: m, ...o }; const isSymbNested = m.__isSymbolNested(); - let toUpFn = symb => symb.remove(opts); + let toUpFn = symb => { + const symbPrnt = symb.parent(); + symbPrnt && !symbPrnt.__isSymbOvrd(changed) && symb.remove(opts); + }; // Check if the parent allows the removing - let toUp = !parent.__isSymbOvrd(rmEv) + let toUp = !parent.__isSymbOvrd(changed) ? m.__getSymbToUp(toUpOpts) : []; if (isSymbNested) { - toUp = parent.__getSymbToUp(toUpOpts); + toUp = parent.__getSymbToUp({ ...toUpOpts, changed }); toUpFn = symb => { const toRemove = symb.components().at(index); toRemove && toRemove.remove({ fromInstance: parent, ...opts }); diff --git a/test/specs/dom_components/model/Symbols.js b/test/specs/dom_components/model/Symbols.js index 78be315f2..5c06bd5a4 100644 --- a/test/specs/dom_components/model/Symbols.js +++ b/test/specs/dom_components/model/Symbols.js @@ -483,7 +483,6 @@ describe('Symbols', () => { test('Symbol is not removing components data if override is set', () => { symbol.set(keySymbolOvrd, ['components']); const innCompsLen = symbol.components().length; - // Check for remove action symbol .components() .at(0) @@ -494,6 +493,20 @@ describe('Symbols', () => { ); }); + test('Symbol is not propagating remove on instances with ovverride', () => { + comp.set(keySymbolOvrd, ['components']); + const innCompsLen = symbol.components().length; + symbol + .components() + .at(0) + .remove(); + all.forEach(cmp => + expect(cmp.components().length).toBe( + cmp === comp ? innCompsLen : innCompsLen - 1 + ) + ); + }); + test('On symbol components update, those having override are ignored', () => { comp.set(keySymbolOvrd, ['components']); const innCompsLen = comp.components().length;