Browse Source

refactor collection symbols

collection-component
mohamedsalem401 2 years ago
parent
commit
b142b14ea7
  1. 68
      packages/core/src/data_sources/model/collection_component/CollectionComponent.ts

68
packages/core/src/data_sources/model/collection_component/CollectionComponent.ts

@ -6,6 +6,7 @@ import { ConditionDefinition } from '../conditional_variables/DataCondition';
import DataSource from '../DataSource'; import DataSource from '../DataSource';
import { DataVariableType } from '../DataVariable'; import { DataVariableType } from '../DataVariable';
import { ObjectAny } from '../../../common'; import { ObjectAny } from '../../../common';
import EditorModel from '../../../editor/model/Editor';
export const CollectionVariableType = 'collection-component'; export const CollectionVariableType = 'collection-component';
// Represents the type for defining a loop’s data source. // Represents the type for defining a loop’s data source.
@ -104,8 +105,7 @@ export default class CollectionComponent extends Component {
const { clonedBlock, overrideKeys } = resolveBlockValues(allCollectionItem, block); const { clonedBlock, overrideKeys } = resolveBlockValues(allCollectionItem, block);
const type = opt.em.Components.getType(clonedBlock?.type || 'default'); const type = opt.em.Components.getType(clonedBlock?.type || 'default');
const model = type.model; const model = type.model;
const symbol = new model(clonedBlock, opt); const component = new model(clonedBlock, opt);
symbolMain = opt.em.Components.addSymbol(symbol);
for (let index = resolvedStartIndex; index <= resolvedEndIndex; index++) { for (let index = resolvedStartIndex; index <= resolvedEndIndex; index++) {
const item = items[index]; const item = items[index];
@ -125,25 +125,7 @@ export default class CollectionComponent extends Component {
innerMostCollectionItem, innerMostCollectionItem,
innerMostCollectionItem innerMostCollectionItem
} }
const { overrideKeys } = resolveBlockValues(allCollectionItem, block); const cmpDefinition = getResolvedComponent(component, block, allCollectionItem, opt.em);
const instance = opt.em.Components.addSymbol(symbolMain!);
const children: any[] = []
Object.keys(overrideKeys).length && instance!.setSymbolOverride(Object.keys(overrideKeys));
instance!.set(overrideKeys);
for (let i = 0; i < instance!.components().length; i++) {
const childBlock = block['components'][i];
const { overrideKeys } = resolveBlockValues(allCollectionItem, deepCloneObject(childBlock));
const child = opt.em.Components.addSymbol(symbolMain!.components().at(i))
Object.keys(overrideKeys).length && child!.setSymbolOverride(Object.keys(overrideKeys));
child!.set(overrideKeys)
children.push(child);
}
const componentJSON = instance?.toJSON();
const cmpDefinition = {
...componentJSON,
components: children
};
components.push(cmpDefinition); components.push(cmpDefinition);
} }
@ -163,6 +145,28 @@ export default class CollectionComponent extends Component {
} }
} }
function getResolvedComponent(component: Component, block: any, allCollectionItem: any, em: EditorModel) {
const instance = em.Components.addSymbol(component);
const { overrideKeys } = resolveBlockValues(allCollectionItem, deepCloneObject(block));
Object.keys(overrideKeys).length && instance!.setSymbolOverride(Object.keys(overrideKeys));
instance!.set(overrideKeys);
const children: any[] = [];
for (let index = 0; index < instance!.components().length; index++) {
const childComponent = component!.components().at(index);
const childBlock = block['components'][index];
children.push(getResolvedComponent(childComponent, childBlock, allCollectionItem, em));
}
const componentJSON = instance?.toJSON();
const cmpDefinition = {
...componentJSON,
components: children
};
return cmpDefinition;
}
/** /**
* Deeply clones an object. * Deeply clones an object.
* @template T The type of the object to clone. * @template T The type of the object to clone.
@ -192,15 +196,14 @@ function resolveBlockValues(context: any, block: any) {
const clonedBlock = deepCloneObject(block); const clonedBlock = deepCloneObject(block);
const overrideKeys: ObjectAny = {}; const overrideKeys: ObjectAny = {};
if (typeof clonedBlock === 'object' && clonedBlock !== null) { if (typeof clonedBlock === 'object') {
const blockKeys = Object.keys(clonedBlock); const blockKeys = Object.keys(clonedBlock);
for (const key of blockKeys) { for (const key of blockKeys) {
let blockValue = clonedBlock[key]; let blockValue = clonedBlock[key];
if (key === 'collectionDefinition') continue; if (key === 'collectionDefinition') continue;
let shouldBeOverridden = false; let shouldBeOverridden = false;
if (typeof blockValue === 'object' && blockValue !== null) { if (typeof blockValue === 'object') {
const collectionItem = blockValue.collection_name const collectionItem = blockValue.collection_name
? context[blockValue.collection_name] ? context[blockValue.collection_name]
: innerMostCollectionItem; : innerMostCollectionItem;
@ -211,14 +214,12 @@ function resolveBlockValues(context: any, block: any) {
); );
} }
if (blockValue.variable_type === 'current_item') { if (blockValue.variable_type === 'current_item' && collectionItem.current_item.type === DataVariableType) {
if (collectionItem.current_item.type === DataVariableType) { const path = collectionItem.current_item.path ? `${collectionItem.current_item.path}.${blockValue.path}` : blockValue.path;
const path = collectionItem.current_item.path ? `${collectionItem.current_item.path}.${blockValue.path}` : blockValue.path; clonedBlock[key] = {
clonedBlock[key] = { ...collectionItem.current_item,
...collectionItem.current_item, path
path };
};
}
} else { } else {
clonedBlock[key] = collectionItem[blockValue.variable_type]; clonedBlock[key] = collectionItem[blockValue.variable_type];
} }
@ -231,10 +232,11 @@ function resolveBlockValues(context: any, block: any) {
if (Object.keys(itemOverrideKeys).length > 0) { if (Object.keys(itemOverrideKeys).length > 0) {
shouldBeOverridden = true; shouldBeOverridden = true;
} }
return typeof arrayItem === 'object' ? clonedBlock : arrayItem return typeof arrayItem === 'object' ? clonedBlock : arrayItem
}); });
} else { } else {
const { clonedBlock, overrideKeys: itemOverrideKeys } = resolveBlockValues(context, blockValue).clonedBlock; const { clonedBlock, overrideKeys: itemOverrideKeys } = resolveBlockValues(context, blockValue);
clonedBlock[key] = clonedBlock; clonedBlock[key] = clonedBlock;
if (Object.keys(itemOverrideKeys).length > 0) { if (Object.keys(itemOverrideKeys).length > 0) {

Loading…
Cancel
Save