Browse Source

Prevent update override properties

pull/3428/head
Artur Arseniev 5 years ago
parent
commit
342cb04378
  1. 23
      src/dom_components/model/Component.js
  2. 27
      test/specs/dom_components/model/Symbols.js

23
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 });
});
}
},

27
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;

Loading…
Cancel
Save