Browse Source

Refactor and fix DataResolverListener

pull/6419/head
mohamedsalem401 2 years ago
parent
commit
2e80660ef8
  1. 48
      packages/core/src/data_sources/model/DataResolverListener.ts

48
packages/core/src/data_sources/model/DataResolverListener.ts

@ -14,8 +14,12 @@ export interface DataResolverListenerProps {
onUpdate: (value: any) => void; onUpdate: (value: any) => void;
} }
interface ListenerWithCallback extends DataSourceListener {
callback: () => void;
}
export default class DataResolverListener { export default class DataResolverListener {
private listeners: DataSourceListener[] = []; private listeners: ListenerWithCallback[] = [];
private em: EditorModel; private em: EditorModel;
private onUpdate: (value: any) => void; private onUpdate: (value: any) => void;
private model = new Model(); private model = new Model();
@ -33,10 +37,14 @@ export default class DataResolverListener {
this.onUpdate(value); this.onUpdate(value);
}; };
private createListener(obj: any, event: string, callback: () => void = this.onChange): ListenerWithCallback {
return { obj, event, callback };
}
listenToResolver() { listenToResolver() {
const { resolver, model } = this; const { resolver, model } = this;
this.removeListeners(); this.removeListeners();
let listeners: DataSourceListener[] = []; let listeners: ListenerWithCallback[] = [];
const type = resolver.attributes.type; const type = resolver.attributes.type;
switch (type) { switch (type) {
@ -51,11 +59,11 @@ export default class DataResolverListener {
break; break;
} }
listeners.forEach((ls) => model.listenTo(ls.obj, ls.event, this.onChange)); listeners.forEach((ls) => model.listenTo(ls.obj, ls.event, ls.callback));
this.listeners = listeners; this.listeners = listeners;
} }
private listenToConditionalVariable(dataVariable: DataCondition) { private listenToConditionalVariable(dataVariable: DataCondition): ListenerWithCallback[] {
const { em } = this; const { em } = this;
const dataListeners = dataVariable.getDependentDataVariables().flatMap((dataVariable) => { const dataListeners = dataVariable.getDependentDataVariables().flatMap((dataVariable) => {
return this.listenToDataVariable(new DataVariable(dataVariable, { em })); return this.listenToDataVariable(new DataVariable(dataVariable, { em }));
@ -64,29 +72,41 @@ export default class DataResolverListener {
return dataListeners; return dataListeners;
} }
private listenToDataVariable(dataVariable: DataVariable) { private listenToDataVariable(dataVariable: DataVariable): ListenerWithCallback[] {
const { em } = this; const { em } = this;
const dataListeners: DataSourceListener[] = [];
const { path } = dataVariable.attributes; const { path } = dataVariable.attributes;
const normPath = stringToPath(path || '').join('.'); const normPath = stringToPath(path || '').join('.');
const [ds, dr] = em.DataSources.fromPath(path!); const [ds, dr] = em.DataSources.fromPath(path!);
ds && dataListeners.push({ obj: ds.records, event: 'add remove reset' });
dr && dataListeners.push({ obj: dr, event: 'change' }); const dataListeners: ListenerWithCallback[] = [];
if (ds) {
dataListeners.push(this.createListener(ds.records, 'add remove reset'));
}
if (dr) {
dataListeners.push(this.createListener(dr, 'change'));
}
dataListeners.push( dataListeners.push(
{ obj: dataVariable, event: 'change:path change:defaultValue' }, this.createListener(dataVariable, 'change:path', () => {
{ obj: em.DataSources.all, event: 'add remove reset' }, this.listenToResolver();
{ obj: em, event: `${DataSourcesEvents.path}:${normPath}` }, this.onChange();
}),
this.createListener(dataVariable, 'change:defaultValue'),
this.createListener(em.DataSources.all, 'add remove reset'),
this.createListener(em, `${DataSourcesEvents.path}:${normPath}`),
); );
return dataListeners; return dataListeners;
} }
private listenToDataCollectionVariable(dataVariable: DataCollectionVariable) { private listenToDataCollectionVariable(dataVariable: DataCollectionVariable): ListenerWithCallback[] {
return [{ obj: dataVariable, event: 'change:value' }]; return [this.createListener(dataVariable, 'change:value')];
} }
private removeListeners() { private removeListeners() {
this.listeners.forEach((ls) => this.model.stopListening(ls.obj, ls.event, this.onChange)); this.listeners.forEach((ls) => this.model.stopListening(ls.obj, ls.event, ls.callback));
this.listeners = []; this.listeners = [];
} }

Loading…
Cancel
Save