From 763865d90385066070fee38d230ad145eb10a812 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Thu, 15 Jun 2023 12:24:41 +0400 Subject: [PATCH] Add `addStyles` option to `editor.Css.setRule`. Closes #5173 --- src/css_composer/index.ts | 27 ++++++++++++++++++--- src/domain_abstract/model/StyleableModel.ts | 2 +- test/specs/css_composer/index.ts | 16 +++++++++--- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/css_composer/index.ts b/src/css_composer/index.ts index 97227cf0d..25f0b2293 100644 --- a/src/css_composer/index.ts +++ b/src/css_composer/index.ts @@ -40,10 +40,22 @@ import EditorModel from '../editor/model/Editor'; import Component from '../dom_components/model/Component'; import { ObjectAny } from '../common'; -type RuleOptions = { +interface RuleOptions { + /** + * At-rule type, eg. `media` + */ atRuleType?: string; + /** + * At-rule parameters, eg. `(min-width: 500px)` + */ atRuleParams?: string; -}; +} +interface SetRuleOptions extends RuleOptions { + /** + * If the rule exists already, merge passed styles instead of replacing them. + */ + addStyles?: boolean; +} type CssRuleStyle = Required['style']; @@ -260,6 +272,7 @@ export default class CssComposer extends ItemManagerModule extends Model * this.addStyle({color: 'red'}); * this.addStyle('color', 'blue'); */ - addStyle(prop: string | ObjectAny, value = '', opts = {}) { + addStyle(prop: string | ObjectAny, value: any = '', opts: ObjectAny = {}) { if (typeof prop == 'string') { prop = { [prop]: value, diff --git a/test/specs/css_composer/index.ts b/test/specs/css_composer/index.ts index 43e9f1656..9a67602e1 100644 --- a/test/specs/css_composer/index.ts +++ b/test/specs/css_composer/index.ts @@ -216,7 +216,7 @@ describe('Css Composer', () => { describe('setRule/getRule', () => { test('Create a simple class-based rule', () => { const selector = '.test'; - const result = obj.setRule(selector, { color: 'red' }); + obj.setRule(selector, { color: 'red' }); expect(obj.getAll().length).toEqual(1); const rule = obj.getRule(selector)!; expect(rule.selectorsToString()).toEqual(selector); @@ -225,7 +225,7 @@ describe('Css Composer', () => { test('Avoid creating multiple rules with the same selector', () => { const selector = '.test'; - obj.setRule(selector, { color: 'red' }); + obj.setRule(selector, { color: 'red', background: 'red' }); obj.setRule(selector, { color: 'blue' }); expect(obj.getAll().length).toEqual(1); const rule = obj.getRule(selector)!; @@ -233,9 +233,17 @@ describe('Css Composer', () => { expect(rule.styleToString()).toEqual('color:blue;'); }); + test('Update rule with addStyles option', () => { + const selector = '.test'; + obj.setRule(selector, { color: 'red', background: 'red' }); + obj.setRule(selector, { color: 'blue' }, { addStyles: true }); + const rule = obj.getRule(selector)!; + expect(rule.styleToString()).toEqual('color:blue;background:red;'); + }); + test('Create a class-based rule', () => { const selector = '.test.test2'; - const result = obj.setRule(selector, { color: 'red' }); + obj.setRule(selector, { color: 'red' }); expect(obj.getAll().length).toEqual(1); const rule = obj.getRule(selector)!; expect(rule.selectorsToString()).toEqual(selector); @@ -244,7 +252,7 @@ describe('Css Composer', () => { test('Create a class-based rule with a state', () => { const selector = '.test.test2:hover'; - const result = obj.setRule(selector, { color: 'red' }); + obj.setRule(selector, { color: 'red' }); expect(obj.getAll().length).toEqual(1); const rule = obj.getRule(selector)!; expect(rule.selectorsToString()).toEqual(selector);