Browse Source

Add isRoot to getSymbolInfo

symbols-api
Artur Arseniev 2 years ago
parent
commit
c67a3a804b
  1. 10
      src/dom_components/index.ts
  2. 4
      src/dom_components/model/Component.ts
  3. 6
      src/dom_components/model/SymbolUtils.ts
  4. 1
      src/dom_components/types.ts
  5. 9
      test/specs/dom_components/model/Symbols.ts

10
src/dom_components/index.ts

@ -109,6 +109,7 @@ import {
isSymbolMain, isSymbolMain,
isSymbolInstance, isSymbolInstance,
detachSymbolInstance, detachSymbolInstance,
isSymbolRoot,
} from './model/SymbolUtils'; } from './model/SymbolUtils';
import { SymbolInfo } from './types'; import { SymbolInfo } from './types';
import Symbols from './model/Symbols'; import Symbols from './model/Symbols';
@ -710,6 +711,10 @@ export default class ComponentManager extends ItemManagerModule<DomComponentsCon
* // cmp.getSymbolInfo(symbol).isSymbol === true; * // cmp.getSymbolInfo(symbol).isSymbol === true;
*/ */
addSymbol(component: Component) { addSymbol(component: Component) {
if (isSymbol(component) && !isSymbolRoot(component)) {
return;
}
const symbol = component.clone({ symbol: true }); const symbol = component.clone({ symbol: true });
isSymbolMain(symbol) && this.symbols.add(symbol); isSymbolMain(symbol) && this.symbols.add(symbol);
@ -760,11 +765,14 @@ export default class ComponentManager extends ItemManagerModule<DomComponentsCon
const instances = (isMain ? getSymbolInstances(component) : getSymbolInstances(mainRef)) || []; const instances = (isMain ? getSymbolInstances(component) : getSymbolInstances(mainRef)) || [];
const main = mainRef || (isMain ? component : undefined); const main = mainRef || (isMain ? component : undefined);
const relatives = getSymbolsToUpdate(component, { changed: opts.withChanges }); const relatives = getSymbolsToUpdate(component, { changed: opts.withChanges });
const isSymbol = isMain || isInstance;
const isRoot = isSymbol && isSymbolRoot(component);
return { return {
isSymbol: isMain || isInstance, isSymbol,
isMain, isMain,
isInstance, isInstance,
isRoot,
main, main,
instances: instances, instances: instances,
relatives: relatives || [], relatives: relatives || [],

4
src/dom_components/model/Component.ts

@ -46,7 +46,7 @@ import {
initSymbol, initSymbol,
isSymbol, isSymbol,
isSymbolMain, isSymbolMain,
isSymbolTop, isSymbolRoot,
updateSymbolCls, updateSymbolCls,
updateSymbolComps, updateSymbolComps,
updateSymbolProps, updateSymbolProps,
@ -1247,7 +1247,7 @@ export default class Component extends StyleableModel<ComponentProperties> {
// @ts-ignore // @ts-ignore
attr.traits = []; attr.traits = [];
if (isSymbolTop(this)) { if (isSymbolRoot(this)) {
opt.symbol = true; opt.symbol = true;
} }

6
src/dom_components/model/SymbolUtils.ts

@ -10,7 +10,7 @@ export const isSymbolInstance = (cmp: Component) => !!cmp.get(keySymbol);
export const isSymbol = (cmp: Component) => !!(isSymbolMain(cmp) || isSymbolInstance(cmp)); export const isSymbol = (cmp: Component) => !!(isSymbolMain(cmp) || isSymbolInstance(cmp));
export const isSymbolTop = (symbol: Component) => { export const isSymbolRoot = (symbol: Component) => {
const parent = symbol.parent(); const parent = symbol.parent();
return isSymbol(symbol) && (!parent || !isSymbol(parent)); return isSymbol(symbol) && (!parent || !isSymbol(parent));
}; };
@ -236,12 +236,12 @@ export const updateSymbolComps = (symbol: Component, m: Component, c: Components
); );
// Propagate remove only if the component is an inner symbol // Propagate remove only if the component is an inner symbol
if (!isSymbolTop(m)) { if (!isSymbolRoot(m)) {
const changed = 'components:remove'; const changed = 'components:remove';
const { index } = o; const { index } = o;
const parent = m.parent(); const parent = m.parent();
const opts = { fromInstance: m, ...o }; const opts = { fromInstance: m, ...o };
const isSymbNested = isSymbolTop(m); const isSymbNested = isSymbolRoot(m);
let toUpFn = (symb: Component) => { let toUpFn = (symb: Component) => {
const symbPrnt = symb.parent(); const symbPrnt = symb.parent();
symbPrnt && !isSymbolOverride(symbPrnt, changed) && symb.remove(opts); symbPrnt && !isSymbolOverride(symbPrnt, changed) && symb.remove(opts);

1
src/dom_components/types.ts

@ -10,6 +10,7 @@ export interface SymbolInfo {
isSymbol: boolean; isSymbol: boolean;
isMain: boolean; isMain: boolean;
isInstance: boolean; isInstance: boolean;
isRoot: boolean;
main?: Component; main?: Component;
instances: Component[]; instances: Component[];
relatives: Component[]; relatives: Component[];

9
test/specs/dom_components/model/Symbols.ts

@ -10,11 +10,16 @@ describe('Symbols', () => {
const getSymbols = () => cmps.getSymbols(); const getSymbols = () => cmps.getSymbols();
const createSymbol = (component: Component) => cmps.addSymbol(component); const createSymbol = (component: Component) => cmps.addSymbol(component)!;
const detachSymbol = (component: Component) => cmps.detachSymbol(component); const detachSymbol = (component: Component) => cmps.detachSymbol(component);
const getSymbolInfo = ((comp, opts) => cmps.getSymbolInfo(comp, opts)) as Editor['Components']['getSymbolInfo']; const getSymbolInfo = ((comp, opts) => {
const result = cmps.getSymbolInfo(comp, opts);
// @ts-ignore skip for now from check
delete result.isRoot;
return result;
}) as Editor['Components']['getSymbolInfo'];
const setSymbolOverride = (comp: Component, value: Parameters<Component['setSymbolOverride']>[0]) => { const setSymbolOverride = (comp: Component, value: Parameters<Component['setSymbolOverride']>[0]) => {
comp.setSymbolOverride(value); comp.setSymbolOverride(value);

Loading…
Cancel
Save