From 342cb0437843c1980c3a4cb1218f897ff765f18d Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Sat, 1 May 2021 11:04:17 +0200 Subject: [PATCH] Prevent update override properties --- src/dom_components/model/Component.js | 23 +++++++++++++----- test/specs/dom_components/model/Symbols.js | 27 ++++++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/dom_components/model/Component.js b/src/dom_components/model/Component.js index 94add2d69..eba486d56 100644 --- a/src/dom_components/model/Component.js +++ b/src/dom_components/model/Component.js @@ -754,8 +754,9 @@ const Component = Backbone.Model.extend(Styleable).extend( opts.fromInstance || opts.noPropagate || opts.fromUndo || - (changed && this.__isSymbOvrd(changed)) || - !symbEnabled + !symbEnabled || + // Avoid updating others if the current component has override + (changed && this.__isSymbOvrd(changed)) ) { return result; } @@ -763,8 +764,12 @@ const Component = Backbone.Model.extend(Styleable).extend( const symbols = this.__getSymbols() || []; const symbol = this.__getSymbol(); const all = symbol ? [symbol, ...(symbol.__getSymbols() || [])] : symbols; + result = all + .filter(s => s !== this) + // Avoid updating those with override + .filter(s => !(changed && s.__isSymbOvrd(changed))); - return all.filter(s => s !== this); + return result; }, __getSymbTop(opts) { @@ -792,14 +797,20 @@ const Component = Backbone.Model.extend(Styleable).extend( if (!isEmptyObj(attrs)) changed.attributes = attrs; if (!isEmptyObj(changed)) { const toUp = this.__getSymbToUp(opts); + // Avoid propagating overrides to other symbols keys(changed).map(prop => { if (this.__isSymbOvrd(prop)) delete changed[prop]; }); this.__logSymbol('props', toUp, { opts, changed }); - toUp.forEach(child => - child.set(changed, { fromInstance: this, ...opts }) - ); + toUp.forEach(child => { + const propsChanged = { ...changed }; + // Avoid updating those with override + keys(propsChanged).map(prop => { + if (child.__isSymbOvrd(prop)) delete propsChanged[prop]; + }); + child.set(propsChanged, { fromInstance: this, ...opts }); + }); } }, diff --git a/test/specs/dom_components/model/Symbols.js b/test/specs/dom_components/model/Symbols.js index 1f4b10697..92778b6ce 100644 --- a/test/specs/dom_components/model/Symbols.js +++ b/test/specs/dom_components/model/Symbols.js @@ -434,6 +434,33 @@ describe('Symbols', () => { }); }); + test('On symbol props update, those having override are ignored', () => { + const propKey = 'someprop'; + const propValue = 'somevalue'; + comp.set(keySymbolOvrd, true); + symbol.set(propKey, propValue); + // All symbols are updated except the one with override + all.forEach(cmp => { + if (cmp === comp) { + expect(cmp.get(propKey)).toBeFalsy(); + } else { + expect(cmp.get(propKey)).toBe(propValue); + } + }); + comp.set(keySymbolOvrd, ['prop1']); + symbol.set({ prop1: 'value1', prop2: 'value2' }); + // Only the overrided property is ignored + all.forEach(cmp => { + if (cmp === comp) { + expect(cmp.get('prop1')).toBeFalsy(); + expect(cmp.get('prop2')).toBe('value2'); + } else { + expect(cmp.get('prop1')).toBe('value1'); + expect(cmp.get('prop2')).toBe('value2'); + } + }); + }); + test('Symbol is not propagating components data if override is set', () => { symbol.set(keySymbolOvrd, ['components']); const innCompsLen = symbol.components().length;