From 39f78b2a45d307f3a40719c0db57a83e65015dac Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Sat, 5 Dec 2020 19:33:32 +0100 Subject: [PATCH 1/3] Apply avoidDefaults option to Selectors --- src/dom_components/model/Component.js | 3 ++- src/selector_manager/model/Selector.js | 35 +++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/dom_components/model/Component.js b/src/dom_components/model/Component.js index 186ea2c47..b5eb513c5 100644 --- a/src/dom_components/model/Component.js +++ b/src/dom_components/model/Component.js @@ -1036,6 +1036,7 @@ const Component = Backbone.Model.extend(Styleable).extend( delete obj.attributes.class; delete obj.toolbar; delete obj.traits; + delete obj.status; if (this.em.getConfig('avoidDefaults')) { this.getChangedProps(obj); @@ -1052,7 +1053,7 @@ const Component = Backbone.Model.extend(Styleable).extend( const defaults = result(this, 'defaults'); forEach(defaults, (value, key) => { - if (['type', 'content'].indexOf(key) === -1 && obj[key] === value) { + if (['type'].indexOf(key) === -1 && obj[key] === value) { delete obj[key]; } }); diff --git a/src/selector_manager/model/Selector.js b/src/selector_manager/model/Selector.js index 8fdfeb263..5c0c03956 100644 --- a/src/selector_manager/model/Selector.js +++ b/src/selector_manager/model/Selector.js @@ -1,9 +1,11 @@ import Backbone from 'backbone'; +import { result, forEach, keys } from 'underscore'; const TYPE_CLASS = 1; const TYPE_ID = 2; +const { Model } = Backbone; -const Selector = Backbone.Model.extend( +const Selector = Model.extend( { idAttribute: 'name', @@ -43,6 +45,7 @@ const Selector = Backbone.Model.extend( ? escapeName(namePreEsc) : Selector.escapeName(namePreEsc); this.set('name', nameEsc); + this.em = config.em; }, /** @@ -64,6 +67,36 @@ const Selector = Backbone.Model.extend( } return init + (escape ? escape(name) : name); + }, + + toJSON(opts = {}) { + const { em } = this; + let obj = Model.prototype.toJSON.call(this, [opts]); + const defaults = result(this, 'defaults'); + + if (em && em.getConfig('avoidDefaults')) { + forEach(defaults, (value, key) => { + if (obj[key] === value) { + delete obj[key]; + } + }); + + if (obj.label === obj.name) { + delete obj.label; + } + + const objLen = keys(obj).length; + + if (objLen === 1 && obj.name) { + obj = obj.name; + } + + if (objLen === 2 && obj.name && obj.type) { + obj = this.getFullName(); + } + } + + return obj; } }, { From a246b37890a2fbb8294e40968cd23ab8719f3c0d Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Sat, 5 Dec 2020 19:49:21 +0100 Subject: [PATCH 2/3] Fix tests --- test/specs/css_composer/e2e/CssComposer.js | 11 +---------- test/specs/dom_components/model/Component.js | 6 +++--- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/test/specs/css_composer/e2e/CssComposer.js b/test/specs/css_composer/e2e/CssComposer.js index 83a015a1f..f512923b3 100644 --- a/test/specs/css_composer/e2e/CssComposer.js +++ b/test/specs/css_composer/e2e/CssComposer.js @@ -128,16 +128,7 @@ describe('E2E tests', () => { // ruleOut is a Model ruleOut = JSON.parse(JSON.stringify(ruleOut)); var ruleResult = { - selectors: [ - { - active: true, - label: 'test1', - name: 'test1', - type: clsm.Selector.TYPE_CLASS, - private: false, - protected: false - } - ], + selectors: ['test1'], style: { color: 'red', width: '10px' diff --git a/test/specs/dom_components/model/Component.js b/test/specs/dom_components/model/Component.js index 82bc1b204..8a55aff90 100644 --- a/test/specs/dom_components/model/Component.js +++ b/test/specs/dom_components/model/Component.js @@ -274,9 +274,9 @@ describe('Component', () => { }); test('setAttributes overwrites correctly', () => { - obj.setAttributes({ id: 'test', 'data-test': 'value', a: 'b' }); - obj.setAttributes({ 'data-test': 'value2' }); - expect(obj.getAttributes()).toEqual({ 'data-test': 'value2' }); + obj.setAttributes({ id: 'test', 'data-test': 'value', a: 'b', b: 'c' }); + obj.setAttributes({ id: 'test2', 'data-test': 'value2' }); + expect(obj.getAttributes()).toEqual({ id: 'test2', 'data-test': 'value2' }); }); test('append() returns always an array', () => { From 69d9c7291184786ef0304290206b2ff70d49c4ac Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Sat, 5 Dec 2020 20:29:20 +0100 Subject: [PATCH 3/3] Add tests for Selectors to JSON --- src/dom_components/model/Component.js | 20 ++-------- .../selector_manager/e2e/ClassManager.js | 38 +++++++++++++++++++ 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/dom_components/model/Component.js b/src/dom_components/model/Component.js index b5eb513c5..04de60b90 100644 --- a/src/dom_components/model/Component.js +++ b/src/dom_components/model/Component.js @@ -838,23 +838,11 @@ const Component = Backbone.Model.extend(Styleable).extend( * @private */ normalizeClasses(arr) { - var res = []; - const em = this.em; - - if (!em) return; - - var clm = em.get('SelectorManager'); + const res = []; + const { em } = this; + const clm = em && em.get('SelectorManager'); if (!clm) return; - - arr.forEach(val => { - var name = ''; - - if (typeof val === 'string') name = val; - else name = val.name; - - var model = clm.add(name); - res.push(model); - }); + arr.forEach(val => res.push(clm.add(val))); return res; }, diff --git a/test/specs/selector_manager/e2e/ClassManager.js b/test/specs/selector_manager/e2e/ClassManager.js index 494cd3a8b..f04f082d1 100644 --- a/test/specs/selector_manager/e2e/ClassManager.js +++ b/test/specs/selector_manager/e2e/ClassManager.js @@ -1,3 +1,4 @@ +import Selector from 'selector_manager/model/Selector'; import Selectors from 'selector_manager/model/Selectors'; import ClassTagsView from 'selector_manager/view/ClassTagsView'; @@ -117,5 +118,42 @@ describe('E2E tests', () => { tagEl.addNewTag('test2'); expect(spy.called).toEqual(true); }); + + test('Selectors are properly transformed to JSON', () => { + const model = components.add({ + classes: [ + 'test1', + '.test1a', + '#test2', + { name: 'test3', label: 'test3' }, + { name: 'test4', label: 'test4a' }, + { name: 'test5' }, + { name: 'test6', type: Selector.TYPE_CLASS }, + { name: 'test7', type: Selector.TYPE_ID }, + { name: 'test8', type: Selector.TYPE_CLASS, protected: 1 }, + { name: 'test9', type: Selector.TYPE_ID, protected: 1 }, + { label: 'test10' }, + { label: 'test11', type: Selector.TYPE_ID }, + { label: 'test12', protected: 1 } + ] + }); + + const modelTr = JSON.parse(JSON.stringify(model)); + expect(modelTr.classes).toEqual([ + 'test1', + 'test1a', + '#test2', + 'test3', + { name: 'test4', label: 'test4a' }, + 'test5', + 'test6', + '#test7', + { name: 'test8', protected: 1 }, + { name: 'test9', type: Selector.TYPE_ID, protected: 1 }, + 'test10', + '#test11', + { name: 'test12', protected: 1 } + ]); + }); }); });