Browse Source

Up data sources

ci/dependabot
Artur Arseniev 3 years ago
parent
commit
3e58fbe039
  1. 18
      src/dataSources/index.ts
  2. 24
      src/dataSources/model/DataRecord.ts
  3. 22
      src/dataSources/model/DataSource.ts
  4. 5
      src/dataSources/model/DataSources.ts
  5. 11
      src/dom_components/view/ComponentDataVariableView.ts
  6. 4
      src/editor/index.ts
  7. 6
      src/editor/model/Editor.ts

18
src/dataSources/index.ts

@ -1,11 +1,11 @@
import { ItemManagerModule } from '../abstract/Module'; import { ItemManagerModule, ModuleConfig } from '../abstract/Module';
import { ObjectAny } from '../common'; import { AddOptions, ObjectAny } from '../common';
import EditorModel from '../editor/model/Editor'; import EditorModel from '../editor/model/Editor';
import { get } from '../utils/mixins'; import { get } from '../utils/mixins';
import { DataSources } from './model/DataSources'; import { DataSources } from './model/DataSources';
import { DataSourcesEvents } from './types'; import { DataSourceProps, DataSourcesEvents } from './types';
export default class DataSourceManager extends ItemManagerModule<{}, DataSources> { export default class DataSourceManager extends ItemManagerModule<ModuleConfig, DataSources> {
storageKey = ''; storageKey = '';
destroy(): void {} destroy(): void {}
@ -24,4 +24,14 @@ export default class DataSourceManager extends ItemManagerModule<{}, DataSources
console.log('getValue', { context }); console.log('getValue', { context });
return get(context, key, defValue); return get(context, key, defValue);
} }
add(props: DataSourceProps, opts: AddOptions = {}) {
const { all } = this;
props.id = props.id || this._createId();
return all.add(props, opts);
}
get(id: string) {
return this.all.add(id);
}
} }

24
src/dataSources/model/DataRecord.ts

@ -1,23 +1,31 @@
import { keys } from 'underscore'; import { keys } from 'underscore';
import { Collection, Model } from '../../common'; import { Model } from '../../common';
import { DataRecordProps } from '../types'; import { DataRecordProps } from '../types';
import { DataRecords } from './DataRecords';
export class DataRecord<T extends DataRecordProps = DataRecordProps> extends Model<T> { export class DataRecord<T extends DataRecordProps = DataRecordProps> extends Model<T> {
// collection?: Collection<T>;
constructor(props: T, opts = {}) { constructor(props: T, opts = {}) {
super(props, opts); super(props, opts);
this.on('change', dr => { this.on('change', (dr: DataRecord) => {
const { id, em } = this.dataSource;
const changed = dr.changedAttributes(); const changed = dr.changedAttributes();
keys(changed).forEach(prop => { keys(changed).forEach(prop => {
const eventKey = `${this.dataSource.id}.${this.id}.${prop}`; const path = this.getPath(prop);
console.log('changed', eventKey); console.log('TODO change to data:path:DS_ID.DR_ID.KEY ', path);
// em.trigger(eventKey); em.trigger(path);
}); });
}); });
} }
get dataSource() { get dataSource() {
return (this.collection as any).dataSource; return (this.collection as unknown as DataRecords).dataSource;
}
getPath(prop?: string) {
const { dataSource, id } = this;
const dsId = dataSource.id;
const suffix = prop ? `.${prop}` : '';
return `${dsId}.${id}${suffix}`;
} }
} }

22
src/dataSources/model/DataSource.ts

@ -1,6 +1,11 @@
import { Model } from '../../common'; import { Collection } from 'backbone';
import { CombinedModelConstructorOptions, Model } from '../../common';
import EditorModel from '../../editor/model/Editor';
import { DataSourceProps } from '../types'; import { DataSourceProps } from '../types';
import { DataRecords } from './DataRecords'; import { DataRecords } from './DataRecords';
import { DataSources } from './DataSources';
interface DataSourceOptions extends CombinedModelConstructorOptions<{ em: EditorModel }, DataSource> {}
export class DataSource extends Model<DataSourceProps> { export class DataSource extends Model<DataSourceProps> {
defaults() { defaults() {
@ -9,7 +14,22 @@ export class DataSource extends Model<DataSourceProps> {
}; };
} }
constructor(props: DataSourceProps, opts: DataSourceOptions) {
super(props, opts);
const { records } = props;
if (!(records instanceof DataRecords)) {
this.set({ records: new DataRecords(records!, { dataSource: this }) });
}
console.log('DataSource.constructor', { props, records: this.records, opts, coll: this.collection });
}
get records() { get records() {
return this.attributes.records as DataRecords; return this.attributes.records as DataRecords;
} }
get em() {
return (this.collection as unknown as DataSources).em;
}
} }

5
src/dataSources/model/DataSources.ts

@ -9,5 +9,10 @@ export class DataSources extends Collection<DataSource> {
constructor(models: DataSource[] | DataSourceProps[], em: EditorModel) { constructor(models: DataSource[] | DataSourceProps[], em: EditorModel) {
super(models, em); super(models, em);
this.em = em; this.em = em;
// @ts-ignore We need to inject `em` for pages created on reset from the Storage load
this.model = (props: DataSourceProps, opts = {}) => {
return new DataSource(props, { ...opts, em });
};
} }
} }

11
src/dom_components/view/ComponentDataVariableView.ts

@ -5,16 +5,13 @@ export default class ComponentDataVariableView extends ComponentView<ComponentDa
initialize(opt = {}) { initialize(opt = {}) {
super.initialize(opt); super.initialize(opt);
const { model, em } = this; const { model, em } = this;
const { key } = model.attributes; this.listenTo(em, model.attributes.path, () => this.postRender());
this.listenTo(em, key, () => this.postRender());
} }
postRender() { postRender() {
const { model, el } = this; const { model, el, em } = this;
const { key, default: def } = model.attributes; const { path, value } = model.attributes;
// this.el.innerHTML = getValue(key, def); el.innerHTML = em.DataSources.getValue(path, value);
el.innerHTML = def;
console.log('this.el.innerHTML', { key, def });
super.postRender(); super.postRender();
} }
} }

4
src/editor/index.ts

@ -64,6 +64,7 @@ import { AddOptions, EventHandler, LiteralUnion } from '../common';
import CssComposer from '../css_composer'; import CssComposer from '../css_composer';
import CssRule from '../css_composer/model/CssRule'; import CssRule from '../css_composer/model/CssRule';
import CssRules from '../css_composer/model/CssRules'; import CssRules from '../css_composer/model/CssRules';
import DataSourceManager from '../dataSources';
import DeviceManager from '../device_manager'; import DeviceManager from '../device_manager';
import ComponentManager, { ComponentEvent } from '../dom_components'; import ComponentManager, { ComponentEvent } from '../dom_components';
import Component from '../dom_components/model/Component'; import Component from '../dom_components/model/Component';
@ -240,6 +241,9 @@ export default class Editor implements IBaseModule<EditorConfig> {
get DeviceManager(): DeviceManager { get DeviceManager(): DeviceManager {
return this.em.Devices; return this.em.Devices;
} }
get DataSources(): DataSourceManager {
return this.em.DataSources;
}
get EditorModel() { get EditorModel() {
return this.em; return this.em;

6
src/editor/model/Editor.ts

@ -42,6 +42,7 @@ import CssRules from '../../css_composer/model/CssRules';
import { ComponentAdd, DragMode } from '../../dom_components/model/types'; import { ComponentAdd, DragMode } from '../../dom_components/model/types';
import ComponentWrapper from '../../dom_components/model/ComponentWrapper'; import ComponentWrapper from '../../dom_components/model/ComponentWrapper';
import { CanvasSpotBuiltInTypes } from '../../canvas/model/CanvasSpot'; import { CanvasSpotBuiltInTypes } from '../../canvas/model/CanvasSpot';
import DataSourceManager from '../../dataSources';
Backbone.$ = $; Backbone.$ = $;
@ -64,6 +65,7 @@ const deps: (new (em: EditorModel) => IModule)[] = [
CanvasModule, CanvasModule,
CommandsModule, CommandsModule,
BlockManager, BlockManager,
DataSourceManager,
]; ];
const storableDeps: (new (em: EditorModel) => IModule & IStorableModule)[] = [ const storableDeps: (new (em: EditorModel) => IModule & IStorableModule)[] = [
AssetManager, AssetManager,
@ -228,6 +230,10 @@ export default class EditorModel extends Model {
return this.get('StyleManager'); return this.get('StyleManager');
} }
get DataSources(): DataSourceManager {
return this.get('DataSources');
}
constructor(conf: EditorConfig = {}) { constructor(conf: EditorConfig = {}) {
super(); super();
this._config = conf; this._config = conf;

Loading…
Cancel
Save