From f59e981f76ff378f59c06cf706af88e502db098e Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Wed, 19 Nov 2025 10:28:38 +0400 Subject: [PATCH] Align component wrapper resolver with collections (#6653) --- packages/core/src/data_sources/index.ts | 9 +- .../src/data_sources/model/DataVariable.ts | 22 ++--- packages/core/src/data_sources/types.ts | 4 + packages/core/src/dom_components/constants.ts | 1 - .../src/dom_components/model/Component.ts | 88 +++++++++---------- .../dom_components/model/ComponentWrapper.ts | 10 ++- .../dom_components/model/ComponentWrapper.ts | 8 +- 7 files changed, 71 insertions(+), 71 deletions(-) delete mode 100644 packages/core/src/dom_components/constants.ts diff --git a/packages/core/src/data_sources/index.ts b/packages/core/src/data_sources/index.ts index 09560ffe8..fb737164d 100644 --- a/packages/core/src/data_sources/index.ts +++ b/packages/core/src/data_sources/index.ts @@ -36,12 +36,13 @@ import { DataCollectionStateType } from './model/data_collection/types'; import DataRecord from './model/DataRecord'; import DataSource from './model/DataSource'; import DataSources from './model/DataSources'; -import { DataComponentTypes, DataRecordProps, DataSourceProps, DataSourcesEvents } from './types'; +import { DataCollectionKeys, DataComponentTypes, DataRecordProps, DataSourceProps, DataSourcesEvents } from './types'; export default class DataSourceManager extends ItemManagerModule { storageKey = 'dataSources'; events = DataSourcesEvents; dataComponentTypes = DataComponentTypes; + dataCollectionKeys = DataCollectionKeys; dataCollectionStateTypes = DataCollectionStateType; dataOperationTypes = { any: AnyTypeOperation, @@ -104,8 +105,8 @@ export default class DataSourceManager extends ItemManagerModule }) { + return get(opts?.context || this.getContext(), path, defValue); } /** @@ -130,7 +131,7 @@ export default class DataSourceManager extends ItemManagerModule { acc[ds.id] = ds.records.reduce((accR, dr, i) => { const dataRecord = dr; diff --git a/packages/core/src/data_sources/model/DataVariable.ts b/packages/core/src/data_sources/model/DataVariable.ts index b14e8f63a..356247e98 100644 --- a/packages/core/src/data_sources/model/DataVariable.ts +++ b/packages/core/src/data_sources/model/DataVariable.ts @@ -1,14 +1,8 @@ import { Model } from '../../common'; -import { keyRootData } from '../../dom_components/constants'; import EditorModel from '../../editor/model/Editor'; import { DataComponentTypes } from '../types'; import { isDataVariable } from '../utils'; -import { - DataCollectionStateMap, - DataCollectionState, - DataCollectionStateType, - RootDataType, -} from './data_collection/types'; +import { DataCollectionState, DataCollectionStateMap, DataCollectionStateType } from './data_collection/types'; export const DataVariableType = DataComponentTypes.variable as const; @@ -163,18 +157,15 @@ export default class DataVariable extends Model { const collectionItem = collectionsStateMap[collectionId]; if (!collectionItem) return defaultValue; - if (collectionId === keyRootData) { - const root = collectionItem as RootDataType; - return path ? root?.[path as keyof RootDataType] : root; - } - if (!variableType) { em.logError(`Missing collection variable type for collection: ${collectionId}`); return defaultValue; } if (variableType === 'currentItem') { - return DataVariable.resolveCurrentItem(collectionItem as DataCollectionState, path, collectionId, em); + return ( + DataVariable.resolveCurrentItem(collectionItem as DataCollectionState, path, collectionId, em) ?? defaultValue + ); } const state = collectionItem as DataCollectionState; @@ -190,7 +181,7 @@ export default class DataVariable extends Model { const currentItem = collectionItem.currentItem; if (!currentItem) { em.logError(`Current item is missing for collection: ${collectionId}`); - return ''; + return; } if (currentItem.type === DataVariableType) { @@ -199,8 +190,7 @@ export default class DataVariable extends Model { } if (path && !(currentItem as any)[path]) { - em.logError(`Path not found in current item: ${path} for collection: ${collectionId}`); - return ''; + return; } return path ? (currentItem as any)[path] : currentItem; diff --git a/packages/core/src/data_sources/types.ts b/packages/core/src/data_sources/types.ts index 5ddc65bf4..3fd251c90 100644 --- a/packages/core/src/data_sources/types.ts +++ b/packages/core/src/data_sources/types.ts @@ -22,6 +22,10 @@ export enum DataComponentTypes { collectionItem = 'data-collection-item', } +export enum DataCollectionKeys { + rootData = '__rootData', +} + export interface DataRecordProps extends ObjectAny { /** * Record id. diff --git a/packages/core/src/dom_components/constants.ts b/packages/core/src/dom_components/constants.ts deleted file mode 100644 index 6b5aa1bbc..000000000 --- a/packages/core/src/dom_components/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const keyRootData = '__rootData'; diff --git a/packages/core/src/dom_components/model/Component.ts b/packages/core/src/dom_components/model/Component.ts index 345dcff3f..58c689047 100644 --- a/packages/core/src/dom_components/model/Component.ts +++ b/packages/core/src/dom_components/model/Component.ts @@ -1,60 +1,53 @@ +import { Model, ModelDestroyOptions } from 'backbone'; import { - isUndefined, - isFunction, + bindAll, + forEach, + has, isArray, - isEmpty, isBoolean, - has, + isEmpty, + isFunction, isString, - forEach, - result, - bindAll, + isUndefined, keys, + result, } from 'underscore'; -import { - shallowDiff, - capitalize, - isEmptyObj, - isObject, - toLowerCase, - escapeAltQuoteAttrValue, - escapeAttrValue, -} from '../../utils/mixins'; +import Frame from '../../canvas/model/Frame'; +import { AddOptions, ExtractMethods, ObjectAny, PrevToNewIdMap, SetOptions } from '../../common'; +import CssRule, { CssRuleJSON } from '../../css_composer/model/CssRule'; +import { DataCollectionStateMap } from '../../data_sources/model/data_collection/types'; +import { DataCollectionKeys } from '../../data_sources/types'; +import { checkAndGetSyncableCollectionItemId } from '../../data_sources/utils'; import StyleableModel, { GetStyleOpts, StyleProps, UpdateStyleOptions, } from '../../domain_abstract/model/StyleableModel'; -import { Model, ModelDestroyOptions } from 'backbone'; -import Components from './Components'; +import EditorModel from '../../editor/model/Editor'; +import ItemView from '../../navigator/view/ItemView'; import Selector from '../../selector_manager/model/Selector'; import Selectors from '../../selector_manager/model/Selectors'; +import Trait from '../../trait_manager/model/Trait'; import Traits from '../../trait_manager/model/Traits'; -import EditorModel from '../../editor/model/Editor'; +import { TraitProperties } from '../../trait_manager/types'; import { - ComponentAdd, - ComponentDefinition, - ComponentDefinitionDefined, - ComponentOptions, - ComponentProperties, - DragMode, - ResetComponentsOptions, - SymbolToUpOptions, - ToHTMLOptions, -} from './types'; -import Frame from '../../canvas/model/Frame'; + capitalize, + escapeAltQuoteAttrValue, + escapeAttrValue, + isEmptyObj, + isObject, + shallowDiff, + toLowerCase, +} from '../../utils/mixins'; import { DomComponentsConfig } from '../config/config'; -import ComponentView from '../view/ComponentView'; -import { AddOptions, ExtractMethods, ObjectAny, PrevToNewIdMap, SetOptions } from '../../common'; -import CssRule, { CssRuleJSON } from '../../css_composer/model/CssRule'; -import Trait from '../../trait_manager/model/Trait'; -import { ToolbarButtonProps } from './ToolbarButton'; -import { TraitProperties } from '../../trait_manager/types'; import { ActionLabelComponents, ComponentsEvents } from '../types'; -import ItemView from '../../navigator/view/ItemView'; +import ComponentView from '../view/ComponentView'; +import Components from './Components'; +import { DataWatchersOptions } from './ModelResolverWatcher'; import { - getSymbolMain, getSymbolInstances, + getSymbolMain, + getSymbolsToUpdate, initSymbol, isSymbol, isSymbolMain, @@ -62,12 +55,19 @@ import { updateSymbolCls, updateSymbolComps, updateSymbolProps, - getSymbolsToUpdate, } from './SymbolUtils'; -import { DataWatchersOptions } from './ModelResolverWatcher'; -import { DataCollectionStateMap } from '../../data_sources/model/data_collection/types'; -import { checkAndGetSyncableCollectionItemId } from '../../data_sources/utils'; -import { keyRootData } from '../constants'; +import { ToolbarButtonProps } from './ToolbarButton'; +import { + ComponentAdd, + ComponentDefinition, + ComponentDefinitionDefined, + ComponentOptions, + ComponentProperties, + DragMode, + ResetComponentsOptions, + SymbolToUpOptions, + ToHTMLOptions, +} from './types'; export interface IComponent extends ExtractMethods {} export interface SetAttrOptions extends SetOptions, UpdateStyleOptions, DataWatchersOptions {} @@ -446,7 +446,7 @@ export default class Component extends StyleableModel { this.emitWithEditor(ComponentsEvents.styleUpdate, this, pros); styleKeys.forEach((key) => this.emitWithEditor(`${ComponentsEvents.styleUpdateProperty}${key}`, this, pros)); - const parentCollectionIds = Object.keys(collectionsStateMap).filter((key) => key !== keyRootData); + const parentCollectionIds = Object.keys(collectionsStateMap).filter((key) => key !== DataCollectionKeys.rootData); if (parentCollectionIds.length === 0) return; diff --git a/packages/core/src/dom_components/model/ComponentWrapper.ts b/packages/core/src/dom_components/model/ComponentWrapper.ts index cb6271444..f8ff2f97e 100644 --- a/packages/core/src/dom_components/model/ComponentWrapper.ts +++ b/packages/core/src/dom_components/model/ComponentWrapper.ts @@ -3,8 +3,8 @@ import ComponentWithCollectionsState from '../../data_sources/model/ComponentWit import DataResolverListener from '../../data_sources/model/DataResolverListener'; import { DataVariableProps } from '../../data_sources/model/DataVariable'; import { DataCollectionStateMap } from '../../data_sources/model/data_collection/types'; +import { DataCollectionKeys } from '../../data_sources/types'; import { attrToString } from '../../utils/dom'; -import { keyRootData } from '../constants'; import Component from './Component'; import ComponentHead, { type as typeHead } from './ComponentHead'; import Components from './Components'; @@ -160,15 +160,19 @@ export default class ComponentWrapper extends ComponentWithCollectionsState { + const keyRootData = DataCollectionKeys.rootData; let em: Editor; beforeEach(() => { @@ -101,13 +102,14 @@ describe('ComponentWrapper', () => { type: 'default', title: { type: DataComponentTypes.variable, + variableType: DataCollectionStateType.currentItem, collectionId: keyRootData, path, }, components: { tagName: 'span', type: DataComponentTypes.variable, - dataResolver: { collectionId: keyRootData, path }, + dataResolver: { collectionId: keyRootData, variableType: DataCollectionStateType.currentItem, path }, }, })[0];