Browse Source

Ignore current `state` and `device` for component related styles. Fixes #5213

pull/5246/head
Artur Arseniev 3 years ago
parent
commit
4a0ae61737
  1. 18
      src/css_composer/index.ts
  2. 4
      src/dom_components/model/Component.ts
  3. 14
      src/dom_components/view/ComponentView.ts

18
src/css_composer/index.ts

@ -60,6 +60,14 @@ interface SetRuleOptions extends RuleOptions {
addStyles?: boolean; addStyles?: boolean;
} }
/** @private */
export interface GetSetRuleOptions {
state?: string;
mediaText?: string;
addOpts?: ObjectAny;
current?: boolean;
}
type CssRuleStyle = Required<CssRuleProperties>['style']; type CssRuleStyle = Required<CssRuleProperties>['style'];
export default class CssComposer extends ItemManagerModule<CssComposerConfig & { pStylePrefix?: string }> { export default class CssComposer extends ItemManagerModule<CssComposerConfig & { pStylePrefix?: string }> {
@ -385,7 +393,7 @@ export default class CssComposer extends ItemManagerModule<CssComposerConfig & {
* // #myid { color: red } * // #myid { color: red }
* // #myid:hover { color: blue } * // #myid:hover { color: blue }
*/ */
setIdRule(name: string, style: CssRuleStyle = {}, opts: ObjectAny = {}) { setIdRule(name: string, style: CssRuleStyle = {}, opts: GetSetRuleOptions = {}) {
const { addOpts = {}, mediaText } = opts; const { addOpts = {}, mediaText } = opts;
const state = opts.state || ''; const state = opts.state || '';
const media = !isUndefined(mediaText) ? mediaText : this.em.getCurrentMedia(); const media = !isUndefined(mediaText) ? mediaText : this.em.getCurrentMedia();
@ -406,7 +414,7 @@ export default class CssComposer extends ItemManagerModule<CssComposerConfig & {
* const rule = css.getIdRule('myid'); * const rule = css.getIdRule('myid');
* const ruleHover = css.setIdRule('myid', { state: 'hover' }); * const ruleHover = css.setIdRule('myid', { state: 'hover' });
*/ */
getIdRule(name: string, opts: ObjectAny = {}) { getIdRule(name: string, opts: GetSetRuleOptions = {}) {
const { mediaText } = opts; const { mediaText } = opts;
const state = opts.state || ''; const state = opts.state || '';
const media = !isUndefined(mediaText) ? mediaText : this.em.getCurrentMedia(); const media = !isUndefined(mediaText) ? mediaText : this.em.getCurrentMedia();
@ -428,7 +436,7 @@ export default class CssComposer extends ItemManagerModule<CssComposerConfig & {
* // .myclass { color: red } * // .myclass { color: red }
* // .myclass:hover { color: blue } * // .myclass:hover { color: blue }
*/ */
setClassRule(name: string, style: CssRuleStyle = {}, opts: ObjectAny = {}) { setClassRule(name: string, style: CssRuleStyle = {}, opts: GetSetRuleOptions = {}) {
const state = opts.state || ''; const state = opts.state || '';
const media = opts.mediaText || this.em.getCurrentMedia(); const media = opts.mediaText || this.em.getCurrentMedia();
const sm = this.em.Selectors; const sm = this.em.Selectors;
@ -448,7 +456,7 @@ export default class CssComposer extends ItemManagerModule<CssComposerConfig & {
* const rule = css.getClassRule('myclass'); * const rule = css.getClassRule('myclass');
* const ruleHover = css.getClassRule('myclass', { state: 'hover' }); * const ruleHover = css.getClassRule('myclass', { state: 'hover' });
*/ */
getClassRule(name: string, opts: ObjectAny = {}) { getClassRule(name: string, opts: GetSetRuleOptions = {}) {
const state = opts.state || ''; const state = opts.state || '';
const media = opts.mediaText || this.em.getCurrentMedia(); const media = opts.mediaText || this.em.getCurrentMedia();
const selector = this.em.Selectors.get(name, Selector.TYPE_CLASS); const selector = this.em.Selectors.get(name, Selector.TYPE_CLASS);
@ -481,7 +489,7 @@ export default class CssComposer extends ItemManagerModule<CssComposerConfig & {
return this; return this;
} }
getComponentRules(cmp: Component, opts: ObjectAny = {}) { getComponentRules(cmp: Component, opts: GetSetRuleOptions = {}) {
let { state, mediaText, current } = opts; let { state, mediaText, current } = opts;
if (current) { if (current) {
state = this.em.get('state') || ''; state = this.em.get('state') || '';

4
src/dom_components/model/Component.ts

@ -43,7 +43,7 @@ const escapeRegExp = (str: string) => {
return str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'); return str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&');
}; };
const avoidInline = (em: EditorModel) => !!em?.getConfig().avoidInlineStyle; export const avoidInline = (em: EditorModel) => !!em?.getConfig().avoidInlineStyle;
export const eventDrag = 'component:drag'; export const eventDrag = 'component:drag';
export const keySymbols = '__symbols'; export const keySymbols = '__symbols';
@ -603,7 +603,7 @@ export default class Component extends StyleableModel<ComponentProperties> {
const state = em.get('state'); const state = em.get('state');
const cc = em.Css; const cc = em.Css;
const propOrig = this.getStyle(opts); const propOrig = this.getStyle(opts);
this.rule = cc.setIdRule(this.getId(), prop, { ...opts, state }); this.rule = cc.setIdRule(this.getId(), prop, { state, ...opts });
const diff = shallowDiff(propOrig, prop); const diff = shallowDiff(propOrig, prop);
this.set('style', '', { silent: true }); this.set('style', '', { silent: true });
keys(diff).forEach(pr => this.trigger(`change:style:${pr}`)); keys(diff).forEach(pr => this.trigger(`change:style:${pr}`));

14
src/dom_components/view/ComponentView.ts

@ -1,5 +1,5 @@
import { isEmpty, each, keys, result } from 'underscore'; import { isEmpty, each, keys, result } from 'underscore';
import Component from '../model/Component'; import Component, { avoidInline } from '../model/Component';
import Components from '../model/Components'; import Components from '../model/Components';
import ComponentsView from './ComponentsView'; import ComponentsView from './ComponentsView';
import Selectors from '../../selector_manager/model/Selectors'; import Selectors from '../../selector_manager/model/Selectors';
@ -10,6 +10,7 @@ import { ComponentOptions } from '../model/types';
import EditorModel from '../../editor/model/Editor'; import EditorModel from '../../editor/model/Editor';
import { DomComponentsConfig } from '../config/config'; import { DomComponentsConfig } from '../config/config';
import Editor from '../../editor'; import Editor from '../../editor';
import { GetSetRuleOptions } from '../../css_composer';
type ClbObj = ReturnType<ComponentView['_clbObj']>; type ClbObj = ReturnType<ComponentView['_clbObj']>;
@ -89,6 +90,10 @@ Component> {
!modelOpt.temporary && this.init(this._clbObj()); !modelOpt.temporary && this.init(this._clbObj());
} }
get __cmpStyleOpts(): GetSetRuleOptions {
return { state: '', mediaText: '' };
}
__isDraggable() { __isDraggable() {
const { model, config } = this; const { model, config } = this;
const { draggable } = model.attributes; const { draggable } = model.attributes;
@ -276,9 +281,10 @@ Component> {
updateStyle(m?: any, v?: any, opts: ObjectAny = {}) { updateStyle(m?: any, v?: any, opts: ObjectAny = {}) {
const { model, em } = this; const { model, em } = this;
if (em && em.getConfig().avoidInlineStyle && !opts.inline) { if (avoidInline(em) && !opts.inline) {
const style = model.getStyle(); const styleOpts = this.__cmpStyleOpts;
!isEmpty(style) && model.setStyle(style); const style = model.getStyle(styleOpts);
!isEmpty(style) && model.setStyle(style, styleOpts);
} else { } else {
this.setAttribute('style', model.styleToString(opts)); this.setAttribute('style', model.styleToString(opts));
} }

Loading…
Cancel
Save