Browse Source

Add duplicateSelected

pull/4957/head
Artur Arseniev 3 years ago
parent
commit
b6ca7ed701
  1. 7
      src/css_composer/index.ts
  2. 4
      src/domain_abstract/model/StyleableModel.ts
  3. 30
      src/selector_manager/index.ts

7
src/css_composer/index.ts

@ -167,7 +167,12 @@ export default class CssComposer extends ItemManagerModule<CssComposerConfig & {
* color: '#000', * color: '#000',
* }); * });
* */ * */
get(selectors: any, state?: string, width?: string, ruleProps?: Omit<CssRuleProperties, 'selectors'>) { get(
selectors: any,
state?: string,
width?: string,
ruleProps?: Omit<CssRuleProperties, 'selectors'>
): CssRule | undefined {
let slc = selectors; let slc = selectors;
if (isString(selectors)) { if (isString(selectors)) {
const sm = this.em.Selectors; const sm = this.em.Selectors;

4
src/domain_abstract/model/StyleableModel.ts

@ -1,7 +1,7 @@
import { isString, isArray, keys } from 'underscore'; import { isString, isArray, keys } from 'underscore';
import { shallowDiff } from '../../utils/mixins'; import { shallowDiff } from '../../utils/mixins';
import ParserHtml from '../../parser/model/ParserHtml'; import ParserHtml from '../../parser/model/ParserHtml';
import { Model, ObjectAny, ObjectHash } from '../../common'; import { Model, ObjectAny, ObjectHash, ObjectStrings } from '../../common';
import Selectors from '../../selector_manager/model/Selectors'; import Selectors from '../../selector_manager/model/Selectors';
const parserHtml = ParserHtml(); const parserHtml = ParserHtml();
@ -30,7 +30,7 @@ export default class StyleableModel<T extends ObjectHash = any> extends Model<T>
* Get style object * Get style object
* @return {Object} * @return {Object}
*/ */
getStyle(prop?: string | ObjectAny) { getStyle(prop?: string | ObjectAny): ObjectStrings {
const style = this.get('style') || {}; const style = this.get('style') || {};
const result: ObjectAny = { ...style }; const result: ObjectAny = { ...style };
return prop && isString(prop) ? result[prop] : result; return prop && isString(prop) ? result[prop] : result;

30
src/selector_manager/index.ts

@ -86,6 +86,7 @@ import Component from '../dom_components/model/Component';
import { ItemManagerModule } from '../abstract/Module'; import { ItemManagerModule } from '../abstract/Module';
import { StyleModuleParam } from '../style_manager'; import { StyleModuleParam } from '../style_manager';
import StyleableModel from '../domain_abstract/model/StyleableModel'; import StyleableModel from '../domain_abstract/model/StyleableModel';
import CssRule from '../css_composer/model/CssRule';
export type SelectorEvent = 'selector:add' | 'selector:remove' | 'selector:update' | 'selector:state' | 'selector'; export type SelectorEvent = 'selector:add' | 'selector:remove' | 'selector:update' | 'selector:state' | 'selector';
@ -422,7 +423,6 @@ export default class SelectorManager extends ItemManagerModule<SelectorManagerCo
*/ */
addSelected(props: SelectorStringObject) { addSelected(props: SelectorStringObject) {
const added = this.add(props); const added = this.add(props);
// TODO: target should be the one from StyleManager
this.em.getSelectedAll().forEach(target => { this.em.getSelectedAll().forEach(target => {
target.getSelectors().add(added); target.getSelectors().add(added);
}); });
@ -441,6 +441,34 @@ export default class SelectorManager extends ItemManagerModule<SelectorManagerCo
}); });
} }
duplicateSelected(selector: Selector, opts: { suffix?: string } = {}) {
const { em } = this;
const commonSelectors = this.getSelected();
if (commonSelectors.indexOf(selector) < 0) return;
const state = this.getState();
const media = em.getCurrentMedia();
const rule = em.Css.get(commonSelectors, state, media);
const styleToApply = rule?.getStyle();
em.getSelectedAll().forEach(component => {
const selectors = component.getSelectors();
if (selectors.includes(selector)) {
const suffix = opts.suffix || ' copy';
const label = selector.getLabel();
const newSelector = this.addSelector(`${label}${suffix}`);
const at = selectors.indexOf(selector);
selectors.remove(selector);
selectors.add(newSelector, { at });
}
});
if (styleToApply) {
const newRule = em.Css.add(this.getSelected(), state, media);
newRule.setStyle(styleToApply);
}
}
/** /**
* Get the array of currently selected targets. * Get the array of currently selected targets.
* @returns {Array<[Component]|[CssRule]>} * @returns {Array<[Component]|[CssRule]>}

Loading…
Cancel
Save