Browse Source

feat: add view to rule and watchers for data vars

rule-view-data-var
danstarns 2 years ago
parent
commit
9718ad3ee2
  1. 13
      packages/core/src/css_composer/model/CssRule.ts
  2. 2
      packages/core/src/css_composer/view/CssRulesView.ts
  3. 18
      packages/core/src/domain_abstract/model/StyleableModel.ts
  4. 9
      packages/core/test/specs/data_sources/model/StyleDataVariable.ts

13
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 { isEmptyObj, hasWin } from '../../utils/mixins';
import Selector, { SelectorProps } from '../../selector_manager/model/Selector'; import Selector, { SelectorProps } from '../../selector_manager/model/Selector';
import EditorModel from '../../editor/model/Editor'; import EditorModel from '../../editor/model/Editor';
import CssRuleView from '../view/CssRuleView';
import DataVariableListenerManager from '../../data_sources/model/DataVariableListenerManager';
/** @private */ /** @private */
export interface CssRuleProperties { export interface CssRuleProperties {
@ -92,6 +94,8 @@ export default class CssRule extends StyleableModel<CssRuleProperties> {
config: CssRuleProperties; config: CssRuleProperties;
em?: EditorModel; em?: EditorModel;
opt: any; opt: any;
view?: CssRuleView;
dataVariableListeners: Record<string, DataVariableListenerManager> = {};
defaults() { defaults() {
return { return {
@ -117,6 +121,7 @@ export default class CssRule extends StyleableModel<CssRuleProperties> {
this.em = opt.em; this.em = opt.em;
this.ensureSelectors(null, null, {}); this.ensureSelectors(null, null, {});
this.on('change', this.__onChange); this.on('change', this.__onChange);
super.setStyle(this.get('style'));
} }
__onChange(m: CssRule, opts: any) { __onChange(m: CssRule, opts: any) {
@ -360,4 +365,12 @@ export default class CssRule extends StyleableModel<CssRuleProperties> {
return true; return true;
} }
setView(cssRuleView: CssRuleView) {
super.setView(cssRuleView);
}
getView() {
return this.view;
}
} }

2
packages/core/src/css_composer/view/CssRulesView.ts

@ -82,6 +82,8 @@ export default class CssRulesView extends View {
rendered = view.render().el; rendered = view.render().el;
} }
model.setView(view);
const clsName = this.className!; const clsName = this.className!;
const mediaText = model.get('mediaText'); const mediaText = model.get('mediaText');
const defaultBlockId = getBlockId(clsName); const defaultBlockId = getBlockId(clsName);

18
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 StyleDataVariable from '../../data_sources/model/StyleDataVariable';
import { DataVariableType } from '../../data_sources/model/DataVariable'; import { DataVariableType } from '../../data_sources/model/DataVariable';
import DataVariableListenerManager from '../../data_sources/model/DataVariableListenerManager'; import DataVariableListenerManager from '../../data_sources/model/DataVariableListenerManager';
import CssRuleView from '../../css_composer/view/CssRuleView';
export type StyleProps = Record< export type StyleProps = Record<
string, string,
@ -35,6 +36,12 @@ export const getLastStyleValue = (value: string | string[]) => {
export default class StyleableModel<T extends ObjectHash = any> extends Model<T> { export default class StyleableModel<T extends ObjectHash = any> extends Model<T> {
em?: EditorModel; em?: EditorModel;
dataVariableListeners: Record<string, DataVariableListenerManager> = {}; dataVariableListeners: Record<string, DataVariableListenerManager> = {};
view?: CssRuleView;
constructor(attributes: T, options: { em?: EditorModel } = {}) {
super(attributes, options);
this.em = options.em;
}
/** /**
* Parse style string to an object * Parse style string to an object
@ -153,6 +160,17 @@ export default class StyleableModel<T extends ObjectHash = any> extends Model<T>
style[prop] = value; style[prop] = value;
this.setStyle(style, { noEvent: true }); this.setStyle(style, { noEvent: true });
this.trigger(`change:style:${prop}`); this.trigger(`change:style:${prop}`);
this.updateView();
}
setView(view: CssRuleView) {
this.view = view;
}
updateView() {
if (this.view) {
this.view.render();
}
} }
/** /**

9
packages/core/test/specs/data_sources/model/StyleDataVariable.ts

@ -183,7 +183,9 @@ describe('StyleDataVariable', () => {
content: 'Hello World', content: 'Hello World',
})[0]; })[0];
const [rule] = em.getEditor().CssComposer.addCollection([ const cssComposer = em.getEditor().CssComposer;
const [rule] = cssComposer.addCollection([
{ {
selectors: [], selectors: [],
selectorsAdd: selector, selectorsAdd: selector,
@ -198,14 +200,19 @@ describe('StyleDataVariable', () => {
}, },
]); ]);
cssComposer.render();
const view = rule.getView();
expect(rule.getStyle()).toHaveProperty('color', 'red'); expect(rule.getStyle()).toHaveProperty('color', 'red');
expect(em.getEditor().getCss()).toContain(`${selector}{color:red;}`); expect(em.getEditor().getCss()).toContain(`${selector}{color:red;}`);
expect(view?.el.innerHTML).toContain(`h1{color:red;}`);
const ds = dsm.get(dsId); const ds = dsm.get(dsId);
ds.getRecord(drId)?.set({ value: 'blue' }); ds.getRecord(drId)?.set({ value: 'blue' });
expect(rule.getStyle()).toHaveProperty('color', 'blue'); expect(rule.getStyle()).toHaveProperty('color', 'blue');
expect(em.getEditor().getCss()).toContain(`${selector}{color:blue;}`); expect(em.getEditor().getCss()).toContain(`${selector}{color:blue;}`);
expect(view?.el.innerHTML).toContain(`h1{color:blue;}`);
}); });
}); });
}); });

Loading…
Cancel
Save