diff --git a/core/app/src/app-common/metadata/list.metadata.model.ts b/core/app/src/app-common/metadata/list.metadata.model.ts index 5e1fa87b4..ec409ab94 100644 --- a/core/app/src/app-common/metadata/list.metadata.model.ts +++ b/core/app/src/app-common/metadata/list.metadata.model.ts @@ -5,13 +5,16 @@ import {ChartTypesMap} from '@app-common/containers/chart/chart.model'; import {WidgetMetadata} from '@app-common/metadata/widget.metadata'; import {FieldDefinition} from '@app-common/record/field.model'; -export interface ListViewMeta { +export interface RecordListMeta { fields: ColumnDefinition[]; bulkActions: BulkActionsMap; lineActions: LineAction[]; + filters: Filter[]; +} + +export interface ListViewMeta extends RecordListMeta { chartTypes: ChartTypesMap; sidebarWidgets?: WidgetMetadata[]; - filters: Filter[]; } export interface Filter { diff --git a/core/app/src/containers/record-list-modal/store/record-list-modal/record-list-modal.store.factory.ts b/core/app/src/containers/record-list-modal/store/record-list-modal/record-list-modal.store.factory.ts new file mode 100644 index 000000000..813636c92 --- /dev/null +++ b/core/app/src/containers/record-list-modal/store/record-list-modal/record-list-modal.store.factory.ts @@ -0,0 +1,20 @@ +import {Injectable} from '@angular/core'; +import {RecordListStoreFactory} from '@store/record-list/record-list.store.factory'; +import {RecordListModalStore} from '@containers/record-list-modal/store/record-list-modal/record-list-modal.store'; +import {MetadataStore} from '@store/metadata/metadata.store.service'; + +@Injectable({ + providedIn: 'root', +}) +export class RecordListModalStoreFactory { + + constructor( + protected listStoreFactory: RecordListStoreFactory, + protected metadataStore: MetadataStore, + ) { + } + + create(): RecordListModalStore { + return new RecordListModalStore(this.listStoreFactory, this.metadataStore); + } +} diff --git a/core/app/src/containers/record-list-modal/store/record-list-modal/record-list-modal.store.spec.mock.ts b/core/app/src/containers/record-list-modal/store/record-list-modal/record-list-modal.store.spec.mock.ts new file mode 100644 index 000000000..c65c38a15 --- /dev/null +++ b/core/app/src/containers/record-list-modal/store/record-list-modal/record-list-modal.store.spec.mock.ts @@ -0,0 +1,8 @@ +import {RecordListModalStoreFactory} from '@containers/record-list-modal/store/record-list-modal/record-list-modal.store.factory'; +import {metadataStoreMock} from '@store/metadata/metadata.store.spec.mock'; +import {listStoreFactoryMock} from '@store/record-list/record-list.store.spec.mock'; + +export const recordlistModalStoreFactoryMock = new RecordListModalStoreFactory( + listStoreFactoryMock, + metadataStoreMock +); diff --git a/core/app/src/containers/record-list-modal/store/record-list-modal/record-list-modal.store.ts b/core/app/src/containers/record-list-modal/store/record-list-modal/record-list-modal.store.ts new file mode 100644 index 000000000..f28a9779a --- /dev/null +++ b/core/app/src/containers/record-list-modal/store/record-list-modal/record-list-modal.store.ts @@ -0,0 +1,74 @@ +import {Injectable} from '@angular/core'; +import {StateStore} from '@store/state'; +import {RecordList, RecordListStore} from '@store/record-list/record-list.store'; +import {BehaviorSubject, Observable} from 'rxjs'; +import {RecordListStoreFactory} from '@store/record-list/record-list.store.factory'; +import {ColumnDefinition, RecordListMeta} from '@app-common/metadata/list.metadata.model'; +import {MetadataStore} from '@store/metadata/metadata.store.service'; +import {map, take, tap} from 'rxjs/operators'; + +@Injectable() +export class RecordListModalStore implements StateStore { + + recordList: RecordListStore; + metadata$: Observable; + columns$: Observable; + metadata: RecordListMeta; + loading$: Observable; + metadataLoading$: Observable; + protected metadataLoadingState: BehaviorSubject; + + constructor( + protected listStoreFactory: RecordListStoreFactory, + protected meta: MetadataStore, + ) { + this.recordList = listStoreFactory.create(); + this.loading$ = this.recordList.loading$; + + this.metadataLoadingState = new BehaviorSubject(false); + this.metadataLoading$ = this.metadataLoadingState.asObservable(); + } + + clear(): void { + this.recordList.clear(); + this.recordList = null; + } + + clearAuthBased(): void { + this.recordList.clearAuthBased(); + } + + /** + * Initial list records load if not cached and update state. + * Returns observable to be used in resolver if needed + * + * @param {string} module name + */ + public init(module: string): void { + + this.metadataLoadingState.next(true); + this.metadata$ = this.meta.getMetadata(module).pipe( + map(meta => meta.listView), + tap(() => { + this.metadataLoadingState.next(false); + this.recordList.load().pipe( + take(1) + ).subscribe(); + }) + ); + this.recordList.init(module, false, 'list_max_entries_per_subpanel'); + this.columns$ = this.metadata$.pipe(map(metadata => metadata.fields)); + } + + + /** + * Load / reload records using current pagination and criteria + * + * @param {boolean} useCache if to use cache + * @returns {object} Observable + */ + public load(useCache = true): Observable { + + return this.recordList.load(useCache); + } +}