From 22edded4d0c27f70cdb022927b5aa3b5f7deb316 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Thu, 29 Feb 2024 00:35:53 +0400 Subject: [PATCH] Refactor --- src/dataSources/index.ts | 39 +++++++++++++++++++--------- src/dataSources/model/DataRecord.ts | 4 +-- src/dataSources/model/DataRecords.ts | 6 ++--- src/dataSources/model/DataSource.ts | 22 +++++++++++----- src/dataSources/model/DataSources.ts | 4 +-- src/dataSources/types.ts | 4 +-- src/utils/mixins.ts | 3 ++- test/specs/dataSources/index.ts | 28 +++++++++++++++++--- 8 files changed, 78 insertions(+), 32 deletions(-) diff --git a/src/dataSources/index.ts b/src/dataSources/index.ts index 86b5ba2f1..f84757a82 100644 --- a/src/dataSources/index.ts +++ b/src/dataSources/index.ts @@ -1,8 +1,10 @@ import { ItemManagerModule, ModuleConfig } from '../abstract/Module'; import { AddOptions, ObjectAny } from '../common'; import EditorModel from '../editor/model/Editor'; -import { get } from '../utils/mixins'; -import { DataSources } from './model/DataSources'; +import { get, stringToPath } from '../utils/mixins'; +import DataRecord from './model/DataRecord'; +import DataSource from './model/DataSource'; +import DataSources from './model/DataSources'; import { DataSourceProps, DataSourcesEvents } from './types'; export default class DataSourceManager extends ItemManagerModule { @@ -15,15 +17,7 @@ export default class DataSourceManager extends ItemManagerModule { - acc[ds.id] = ds.records.reduce((accR, dr, i) => { - accR[i] = dr.attributes; - accR[dr.id || i] = dr.attributes; - return accR; - }, {} as ObjectAny); - return acc; - }, {} as ObjectAny); - return get(context, key, defValue); + return get(this.getContext(), key, defValue); } add(props: DataSourceProps, opts: AddOptions = {}) { @@ -33,6 +27,27 @@ export default class DataSourceManager extends ItemManagerModule { + acc[ds.id] = ds.records.reduce((accR, dr, i) => { + accR[i] = dr.attributes; + accR[dr.id || i] = dr.attributes; + return accR; + }, {} as ObjectAny); + return acc; + }, {} as ObjectAny); + } + + fromPath(path: string) { + const result: [DataSource?, DataRecord?] = []; + const [dsId, drId] = stringToPath(path || ''); + const dataSource = this.get(dsId); + const dataRecord = dataSource?.records.get(drId); + dataSource && result.push(dataSource); + dataRecord && result.push(dataRecord); + return result; } } diff --git a/src/dataSources/model/DataRecord.ts b/src/dataSources/model/DataRecord.ts index 159673b1c..663cd48a8 100644 --- a/src/dataSources/model/DataRecord.ts +++ b/src/dataSources/model/DataRecord.ts @@ -1,9 +1,9 @@ import { keys } from 'underscore'; import { Model } from '../../common'; import { DataRecordProps, DataSourcesEvents } from '../types'; -import { DataRecords } from './DataRecords'; +import DataRecords from './DataRecords'; -export class DataRecord extends Model { +export default class DataRecord extends Model { constructor(props: T, opts = {}) { super(props, opts); this.on('change', this.handleChange); diff --git a/src/dataSources/model/DataRecords.ts b/src/dataSources/model/DataRecords.ts index f7f3dc84b..87a172dae 100644 --- a/src/dataSources/model/DataRecords.ts +++ b/src/dataSources/model/DataRecords.ts @@ -1,9 +1,9 @@ import { Collection } from '../../common'; import { DataRecordProps } from '../types'; -import { DataRecord } from './DataRecord'; -import { DataSource } from './DataSource'; +import DataRecord from './DataRecord'; +import DataSource from './DataSource'; -export class DataRecords extends Collection { +export default class DataRecords extends Collection { dataSource: DataSource; constructor(models: DataRecord[] | DataRecordProps[], options: { dataSource: DataSource }) { diff --git a/src/dataSources/model/DataSource.ts b/src/dataSources/model/DataSource.ts index 1600a08d9..3044176a2 100644 --- a/src/dataSources/model/DataSource.ts +++ b/src/dataSources/model/DataSource.ts @@ -1,13 +1,13 @@ -import { Collection } from 'backbone'; -import { CombinedModelConstructorOptions, Model } from '../../common'; +import { AddOptions, CombinedModelConstructorOptions, Model } from '../../common'; import EditorModel from '../../editor/model/Editor'; -import { DataSourceProps } from '../types'; -import { DataRecords } from './DataRecords'; -import { DataSources } from './DataSources'; +import { DataRecordProps, DataSourceProps } from '../types'; +import DataRecord from './DataRecord'; +import DataRecords from './DataRecords'; +import DataSources from './DataSources'; interface DataSourceOptions extends CombinedModelConstructorOptions<{ em: EditorModel }, DataSource> {} -export class DataSource extends Model { +export default class DataSource extends Model { defaults() { return { records: [], @@ -21,6 +21,8 @@ export class DataSource extends Model { if (!(records instanceof DataRecords)) { this.set({ records: new DataRecords(records!, { dataSource: this }) }); } + + this.listenTo(this.records, 'add', this.onAdd); } get records() { @@ -30,4 +32,12 @@ export class DataSource extends Model { get em() { return (this.collection as unknown as DataSources).em; } + + onAdd(dr: DataRecord) { + dr.triggerChange(); + } + + addRecord(record: DataRecordProps, opts?: AddOptions) { + return this.records.add(record, opts); + } } diff --git a/src/dataSources/model/DataSources.ts b/src/dataSources/model/DataSources.ts index d31795854..4f7478762 100644 --- a/src/dataSources/model/DataSources.ts +++ b/src/dataSources/model/DataSources.ts @@ -1,9 +1,9 @@ import { Collection } from '../../common'; import EditorModel from '../../editor/model/Editor'; import { DataSourceProps } from '../types'; -import { DataSource } from './DataSource'; +import DataSource from './DataSource'; -export class DataSources extends Collection { +export default class DataSources extends Collection { em: EditorModel; constructor(models: DataSource[] | DataSourceProps[], em: EditorModel) { diff --git a/src/dataSources/types.ts b/src/dataSources/types.ts index fdc7d36e4..8b21cc7d7 100644 --- a/src/dataSources/types.ts +++ b/src/dataSources/types.ts @@ -1,6 +1,6 @@ import { ObjectAny } from '../common'; -import { DataRecord } from './model/DataRecord'; -import { DataRecords } from './model/DataRecords'; +import DataRecord from './model/DataRecord'; +import DataRecords from './model/DataRecords'; export interface DataSourceProps { /** diff --git a/src/utils/mixins.ts b/src/utils/mixins.ts index e0e86d259..9d8e6ee65 100644 --- a/src/utils/mixins.ts +++ b/src/utils/mixins.ts @@ -9,7 +9,8 @@ const obj: ObjectAny = {}; const reEscapeChar = /\\(\\)?/g; const rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; -const stringToPath = function (string: string) { + +export const stringToPath = function (string: string) { const result = []; if (string.charCodeAt(0) === 46 /* . */) result.push(''); string.replace(rePropName, (match: string, number, quote, subString) => { diff --git a/test/specs/dataSources/index.ts b/test/specs/dataSources/index.ts index 01edbe475..5f789d4c5 100644 --- a/test/specs/dataSources/index.ts +++ b/test/specs/dataSources/index.ts @@ -21,7 +21,6 @@ describe('DataSourceManager', () => { avoidInlineStyle: true, }); dsm = em.DataSources; - // em.Pages.onLoad(); }); afterEach(() => { @@ -69,8 +68,7 @@ describe('DataSourceManager', () => { fixtures.appendChild(wrapperEl.el); }); - test('component is properly initiliazed with a value', () => { - dsm.add(dsTest); + test('component is properly initiliazed with default value', () => { const cmpVar = cmpRoot.append({ type: 'data-variable', value: 'default', @@ -79,9 +77,31 @@ describe('DataSourceManager', () => { expect(cmpVar.getEl()?.innerHTML).toBe('default'); }); - test('component is properly updating on record add', () => {}); + test('component is properly initiliazed with current value', () => { + dsm.add(dsTest); + const cmpVar = cmpRoot.append({ + type: 'data-variable', + value: 'default', + path: 'ds1.id2.name', + })[0]; + expect(cmpVar.getEl()?.innerHTML).toBe('Name2'); + }); + + test('component is properly updating on record add', () => { + const ds = dsm.add(dsTest); + const cmpVar = cmpRoot.append({ + type: 'data-variable', + value: 'default', + path: 'ds1.id4.name', + })[0]; + ds.addRecord({ id: 'id4', name: 'Name4' }); + expect(cmpVar.getEl()?.innerHTML).toBe('Name4'); + }); + test('component is properly updating on record change', () => {}); + test('component is properly updating on record remove', () => {}); + test('component is properly updating on record reset', () => {}); }); });