From 9718ad3ee210f98ead9c54f2c6334f003fd44ed0 Mon Sep 17 00:00:00 2001 From: danstarns Date: Tue, 8 Oct 2024 15:05:13 -0700 Subject: [PATCH] feat: add view to rule and watchers for data vars --- .../core/src/css_composer/model/CssRule.ts | 13 +++++++++++++ .../core/src/css_composer/view/CssRulesView.ts | 2 ++ .../domain_abstract/model/StyleableModel.ts | 18 ++++++++++++++++++ .../data_sources/model/StyleDataVariable.ts | 9 ++++++++- 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/core/src/css_composer/model/CssRule.ts b/packages/core/src/css_composer/model/CssRule.ts index 8466401b7..54b89c025 100644 --- a/packages/core/src/css_composer/model/CssRule.ts +++ b/packages/core/src/css_composer/model/CssRule.ts @@ -6,6 +6,8 @@ import { getMediaLength } from '../../code_manager/model/CssGenerator'; import { isEmptyObj, hasWin } from '../../utils/mixins'; import Selector, { SelectorProps } from '../../selector_manager/model/Selector'; import EditorModel from '../../editor/model/Editor'; +import CssRuleView from '../view/CssRuleView'; +import DataVariableListenerManager from '../../data_sources/model/DataVariableListenerManager'; /** @private */ export interface CssRuleProperties { @@ -92,6 +94,8 @@ export default class CssRule extends StyleableModel { config: CssRuleProperties; em?: EditorModel; opt: any; + view?: CssRuleView; + dataVariableListeners: Record = {}; defaults() { return { @@ -117,6 +121,7 @@ export default class CssRule extends StyleableModel { this.em = opt.em; this.ensureSelectors(null, null, {}); this.on('change', this.__onChange); + super.setStyle(this.get('style')); } __onChange(m: CssRule, opts: any) { @@ -360,4 +365,12 @@ export default class CssRule extends StyleableModel { return true; } + + setView(cssRuleView: CssRuleView) { + super.setView(cssRuleView); + } + + getView() { + return this.view; + } } diff --git a/packages/core/src/css_composer/view/CssRulesView.ts b/packages/core/src/css_composer/view/CssRulesView.ts index a63e83ac4..a5b9ff095 100644 --- a/packages/core/src/css_composer/view/CssRulesView.ts +++ b/packages/core/src/css_composer/view/CssRulesView.ts @@ -82,6 +82,8 @@ export default class CssRulesView extends View { rendered = view.render().el; } + model.setView(view); + const clsName = this.className!; const mediaText = model.get('mediaText'); const defaultBlockId = getBlockId(clsName); diff --git a/packages/core/src/domain_abstract/model/StyleableModel.ts b/packages/core/src/domain_abstract/model/StyleableModel.ts index 05d4579c3..22b7e573a 100644 --- a/packages/core/src/domain_abstract/model/StyleableModel.ts +++ b/packages/core/src/domain_abstract/model/StyleableModel.ts @@ -7,6 +7,7 @@ import EditorModel from '../../editor/model/Editor'; import StyleDataVariable from '../../data_sources/model/StyleDataVariable'; import { DataVariableType } from '../../data_sources/model/DataVariable'; import DataVariableListenerManager from '../../data_sources/model/DataVariableListenerManager'; +import CssRuleView from '../../css_composer/view/CssRuleView'; export type StyleProps = Record< string, @@ -35,6 +36,12 @@ export const getLastStyleValue = (value: string | string[]) => { export default class StyleableModel extends Model { em?: EditorModel; dataVariableListeners: Record = {}; + view?: CssRuleView; + + constructor(attributes: T, options: { em?: EditorModel } = {}) { + super(attributes, options); + this.em = options.em; + } /** * Parse style string to an object @@ -153,6 +160,17 @@ export default class StyleableModel extends Model style[prop] = value; this.setStyle(style, { noEvent: true }); this.trigger(`change:style:${prop}`); + this.updateView(); + } + + setView(view: CssRuleView) { + this.view = view; + } + + updateView() { + if (this.view) { + this.view.render(); + } } /** diff --git a/packages/core/test/specs/data_sources/model/StyleDataVariable.ts b/packages/core/test/specs/data_sources/model/StyleDataVariable.ts index 1a06a3401..514523e40 100644 --- a/packages/core/test/specs/data_sources/model/StyleDataVariable.ts +++ b/packages/core/test/specs/data_sources/model/StyleDataVariable.ts @@ -183,7 +183,9 @@ describe('StyleDataVariable', () => { content: 'Hello World', })[0]; - const [rule] = em.getEditor().CssComposer.addCollection([ + const cssComposer = em.getEditor().CssComposer; + + const [rule] = cssComposer.addCollection([ { selectors: [], selectorsAdd: selector, @@ -198,14 +200,19 @@ describe('StyleDataVariable', () => { }, ]); + cssComposer.render(); + const view = rule.getView(); + expect(rule.getStyle()).toHaveProperty('color', 'red'); expect(em.getEditor().getCss()).toContain(`${selector}{color:red;}`); + expect(view?.el.innerHTML).toContain(`h1{color:red;}`); const ds = dsm.get(dsId); ds.getRecord(drId)?.set({ value: 'blue' }); expect(rule.getStyle()).toHaveProperty('color', 'blue'); expect(em.getEditor().getCss()).toContain(`${selector}{color:blue;}`); + expect(view?.el.innerHTML).toContain(`h1{color:blue;}`); }); }); });