Skip to content

Commit f59e981

Browse files
authored
Align component wrapper resolver with collections (#6653)
1 parent 61ebd6c commit f59e981

File tree

7 files changed

+71
-71
lines changed

7 files changed

+71
-71
lines changed

packages/core/src/data_sources/index.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,13 @@ import { DataCollectionStateType } from './model/data_collection/types';
3636
import DataRecord from './model/DataRecord';
3737
import DataSource from './model/DataSource';
3838
import DataSources from './model/DataSources';
39-
import { DataComponentTypes, DataRecordProps, DataSourceProps, DataSourcesEvents } from './types';
39+
import { DataCollectionKeys, DataComponentTypes, DataRecordProps, DataSourceProps, DataSourcesEvents } from './types';
4040

4141
export default class DataSourceManager extends ItemManagerModule<DataSourcesConfig & ModuleConfig, DataSources> {
4242
storageKey = 'dataSources';
4343
events = DataSourcesEvents;
4444
dataComponentTypes = DataComponentTypes;
45+
dataCollectionKeys = DataCollectionKeys;
4546
dataCollectionStateTypes = DataCollectionStateType;
4647
dataOperationTypes = {
4748
any: AnyTypeOperation,
@@ -104,8 +105,8 @@ export default class DataSourceManager extends ItemManagerModule<DataSourcesConf
104105
* @returns {any}
105106
* const value = dsm.getValue('ds_id.record_id.propName', 'defaultValue');
106107
*/
107-
getValue(path: string | string[], defValue?: any) {
108-
return get(this.getContext(), path, defValue);
108+
getValue(path: string | string[], defValue?: any, opts?: { context?: Record<string, any> }) {
109+
return get(opts?.context || this.getContext(), path, defValue);
109110
}
110111

111112
/**
@@ -130,7 +131,7 @@ export default class DataSourceManager extends ItemManagerModule<DataSourcesConf
130131
return false;
131132
}
132133

133-
private getContext() {
134+
getContext() {
134135
return this.all.reduce((acc, ds) => {
135136
acc[ds.id] = ds.records.reduce((accR, dr, i) => {
136137
const dataRecord = dr;

packages/core/src/data_sources/model/DataVariable.ts

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
import { Model } from '../../common';
2-
import { keyRootData } from '../../dom_components/constants';
32
import EditorModel from '../../editor/model/Editor';
43
import { DataComponentTypes } from '../types';
54
import { isDataVariable } from '../utils';
6-
import {
7-
DataCollectionStateMap,
8-
DataCollectionState,
9-
DataCollectionStateType,
10-
RootDataType,
11-
} from './data_collection/types';
5+
import { DataCollectionState, DataCollectionStateMap, DataCollectionStateType } from './data_collection/types';
126

137
export const DataVariableType = DataComponentTypes.variable as const;
148

@@ -163,18 +157,15 @@ export default class DataVariable extends Model<DataVariableProps> {
163157
const collectionItem = collectionsStateMap[collectionId];
164158
if (!collectionItem) return defaultValue;
165159

166-
if (collectionId === keyRootData) {
167-
const root = collectionItem as RootDataType;
168-
return path ? root?.[path as keyof RootDataType] : root;
169-
}
170-
171160
if (!variableType) {
172161
em.logError(`Missing collection variable type for collection: ${collectionId}`);
173162
return defaultValue;
174163
}
175164

176165
if (variableType === 'currentItem') {
177-
return DataVariable.resolveCurrentItem(collectionItem as DataCollectionState, path, collectionId, em);
166+
return (
167+
DataVariable.resolveCurrentItem(collectionItem as DataCollectionState, path, collectionId, em) ?? defaultValue
168+
);
178169
}
179170

180171
const state = collectionItem as DataCollectionState;
@@ -190,7 +181,7 @@ export default class DataVariable extends Model<DataVariableProps> {
190181
const currentItem = collectionItem.currentItem;
191182
if (!currentItem) {
192183
em.logError(`Current item is missing for collection: ${collectionId}`);
193-
return '';
184+
return;
194185
}
195186

196187
if (currentItem.type === DataVariableType) {
@@ -199,8 +190,7 @@ export default class DataVariable extends Model<DataVariableProps> {
199190
}
200191

201192
if (path && !(currentItem as any)[path]) {
202-
em.logError(`Path not found in current item: ${path} for collection: ${collectionId}`);
203-
return '';
193+
return;
204194
}
205195

206196
return path ? (currentItem as any)[path] : currentItem;

packages/core/src/data_sources/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ export enum DataComponentTypes {
2222
collectionItem = 'data-collection-item',
2323
}
2424

25+
export enum DataCollectionKeys {
26+
rootData = '__rootData',
27+
}
28+
2529
export interface DataRecordProps extends ObjectAny {
2630
/**
2731
* Record id.

packages/core/src/dom_components/constants.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

packages/core/src/dom_components/model/Component.ts

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,73 @@
1+
import { Model, ModelDestroyOptions } from 'backbone';
12
import {
2-
isUndefined,
3-
isFunction,
3+
bindAll,
4+
forEach,
5+
has,
46
isArray,
5-
isEmpty,
67
isBoolean,
7-
has,
8+
isEmpty,
9+
isFunction,
810
isString,
9-
forEach,
10-
result,
11-
bindAll,
11+
isUndefined,
1212
keys,
13+
result,
1314
} from 'underscore';
14-
import {
15-
shallowDiff,
16-
capitalize,
17-
isEmptyObj,
18-
isObject,
19-
toLowerCase,
20-
escapeAltQuoteAttrValue,
21-
escapeAttrValue,
22-
} from '../../utils/mixins';
15+
import Frame from '../../canvas/model/Frame';
16+
import { AddOptions, ExtractMethods, ObjectAny, PrevToNewIdMap, SetOptions } from '../../common';
17+
import CssRule, { CssRuleJSON } from '../../css_composer/model/CssRule';
18+
import { DataCollectionStateMap } from '../../data_sources/model/data_collection/types';
19+
import { DataCollectionKeys } from '../../data_sources/types';
20+
import { checkAndGetSyncableCollectionItemId } from '../../data_sources/utils';
2321
import StyleableModel, {
2422
GetStyleOpts,
2523
StyleProps,
2624
UpdateStyleOptions,
2725
} from '../../domain_abstract/model/StyleableModel';
28-
import { Model, ModelDestroyOptions } from 'backbone';
29-
import Components from './Components';
26+
import EditorModel from '../../editor/model/Editor';
27+
import ItemView from '../../navigator/view/ItemView';
3028
import Selector from '../../selector_manager/model/Selector';
3129
import Selectors from '../../selector_manager/model/Selectors';
30+
import Trait from '../../trait_manager/model/Trait';
3231
import Traits from '../../trait_manager/model/Traits';
33-
import EditorModel from '../../editor/model/Editor';
32+
import { TraitProperties } from '../../trait_manager/types';
3433
import {
35-
ComponentAdd,
36-
ComponentDefinition,
37-
ComponentDefinitionDefined,
38-
ComponentOptions,
39-
ComponentProperties,
40-
DragMode,
41-
ResetComponentsOptions,
42-
SymbolToUpOptions,
43-
ToHTMLOptions,
44-
} from './types';
45-
import Frame from '../../canvas/model/Frame';
34+
capitalize,
35+
escapeAltQuoteAttrValue,
36+
escapeAttrValue,
37+
isEmptyObj,
38+
isObject,
39+
shallowDiff,
40+
toLowerCase,
41+
} from '../../utils/mixins';
4642
import { DomComponentsConfig } from '../config/config';
47-
import ComponentView from '../view/ComponentView';
48-
import { AddOptions, ExtractMethods, ObjectAny, PrevToNewIdMap, SetOptions } from '../../common';
49-
import CssRule, { CssRuleJSON } from '../../css_composer/model/CssRule';
50-
import Trait from '../../trait_manager/model/Trait';
51-
import { ToolbarButtonProps } from './ToolbarButton';
52-
import { TraitProperties } from '../../trait_manager/types';
5343
import { ActionLabelComponents, ComponentsEvents } from '../types';
54-
import ItemView from '../../navigator/view/ItemView';
44+
import ComponentView from '../view/ComponentView';
45+
import Components from './Components';
46+
import { DataWatchersOptions } from './ModelResolverWatcher';
5547
import {
56-
getSymbolMain,
5748
getSymbolInstances,
49+
getSymbolMain,
50+
getSymbolsToUpdate,
5851
initSymbol,
5952
isSymbol,
6053
isSymbolMain,
6154
isSymbolRoot,
6255
updateSymbolCls,
6356
updateSymbolComps,
6457
updateSymbolProps,
65-
getSymbolsToUpdate,
6658
} from './SymbolUtils';
67-
import { DataWatchersOptions } from './ModelResolverWatcher';
68-
import { DataCollectionStateMap } from '../../data_sources/model/data_collection/types';
69-
import { checkAndGetSyncableCollectionItemId } from '../../data_sources/utils';
70-
import { keyRootData } from '../constants';
59+
import { ToolbarButtonProps } from './ToolbarButton';
60+
import {
61+
ComponentAdd,
62+
ComponentDefinition,
63+
ComponentDefinitionDefined,
64+
ComponentOptions,
65+
ComponentProperties,
66+
DragMode,
67+
ResetComponentsOptions,
68+
SymbolToUpOptions,
69+
ToHTMLOptions,
70+
} from './types';
7171

7272
export interface IComponent extends ExtractMethods<Component> {}
7373
export interface SetAttrOptions extends SetOptions, UpdateStyleOptions, DataWatchersOptions {}
@@ -446,7 +446,7 @@ export default class Component extends StyleableModel<ComponentProperties> {
446446
this.emitWithEditor(ComponentsEvents.styleUpdate, this, pros);
447447
styleKeys.forEach((key) => this.emitWithEditor(`${ComponentsEvents.styleUpdateProperty}${key}`, this, pros));
448448

449-
const parentCollectionIds = Object.keys(collectionsStateMap).filter((key) => key !== keyRootData);
449+
const parentCollectionIds = Object.keys(collectionsStateMap).filter((key) => key !== DataCollectionKeys.rootData);
450450

451451
if (parentCollectionIds.length === 0) return;
452452

packages/core/src/dom_components/model/ComponentWrapper.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import ComponentWithCollectionsState from '../../data_sources/model/ComponentWit
33
import DataResolverListener from '../../data_sources/model/DataResolverListener';
44
import { DataVariableProps } from '../../data_sources/model/DataVariable';
55
import { DataCollectionStateMap } from '../../data_sources/model/data_collection/types';
6+
import { DataCollectionKeys } from '../../data_sources/types';
67
import { attrToString } from '../../utils/dom';
7-
import { keyRootData } from '../constants';
88
import Component from './Component';
99
import ComponentHead, { type as typeHead } from './ComponentHead';
1010
import Components from './Components';
@@ -160,15 +160,19 @@ export default class ComponentWrapper extends ComponentWithCollectionsState<Data
160160
const dsm = em.DataSources;
161161
if (!dataResolverPath) return {};
162162

163+
const collectionId = DataCollectionKeys.rootData;
163164
const allItems = this.getDataSourceItems() as any;
164-
const selectedItems = isNumber(resolverCurrentItem)
165+
const currentItem = isNumber(resolverCurrentItem)
165166
? allItems[resolverCurrentItem]
166167
: isString(resolverCurrentItem)
167168
? dsm.getValue(`${dataResolverPath}.${resolverCurrentItem}`)
168169
: allItems;
169170

170171
return {
171-
[keyRootData]: selectedItems,
172+
[collectionId]: {
173+
collectionId,
174+
currentItem,
175+
},
172176
} as DataCollectionStateMap;
173177
}
174178

packages/core/test/specs/dom_components/model/ComponentWrapper.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { DataRecord, DataSourceManager } from '../../../../src';
2+
import { DataCollectionStateType } from '../../../../src/data_sources/model/data_collection/types';
23
import { DataVariableProps, DataVariableType } from '../../../../src/data_sources/model/DataVariable';
3-
import { DataComponentTypes } from '../../../../src/data_sources/types';
4-
import { keyRootData } from '../../../../src/dom_components/constants';
4+
import { DataCollectionKeys, DataComponentTypes } from '../../../../src/data_sources/types';
55
import Component from '../../../../src/dom_components/model/Component';
66
import ComponentHead from '../../../../src/dom_components/model/ComponentHead';
77
import ComponentWrapper from '../../../../src/dom_components/model/ComponentWrapper';
@@ -10,6 +10,7 @@ import EditorModel from '../../../../src/editor/model/Editor';
1010
import { setupTestEditor } from '../../../common';
1111

1212
describe('ComponentWrapper', () => {
13+
const keyRootData = DataCollectionKeys.rootData;
1314
let em: Editor;
1415

1516
beforeEach(() => {
@@ -101,13 +102,14 @@ describe('ComponentWrapper', () => {
101102
type: 'default',
102103
title: {
103104
type: DataComponentTypes.variable,
105+
variableType: DataCollectionStateType.currentItem,
104106
collectionId: keyRootData,
105107
path,
106108
},
107109
components: {
108110
tagName: 'span',
109111
type: DataComponentTypes.variable,
110-
dataResolver: { collectionId: keyRootData, path },
112+
dataResolver: { collectionId: keyRootData, variableType: DataCollectionStateType.currentItem, path },
111113
},
112114
})[0];
113115

0 commit comments

Comments
 (0)