Update sidebar chart on deleting records using bulk action menu in ListView

This commit is contained in:
p.kumar 2021-04-15 18:26:45 +05:30
parent 707054100c
commit 1d9a55aa56
9 changed files with 45 additions and 9 deletions

View file

@ -32,7 +32,7 @@ export interface WidgetMetadata {
labelKey?: string;
options: WidgetOptionMap;
reload$?: Observable<boolean>;
refreshOnRecordUpdate?: boolean;
refreshOn?: string;
}
export interface WidgetOptionMap {

View file

@ -40,9 +40,13 @@ export class ListViewSidebarWidgetAdapter {
if (metadata.sidebarWidgets && metadata.sidebarWidgets.length) {
metadata.sidebarWidgets.forEach(widget => {
if (widget && widget.refreshOnRecordUpdate) {
widget.reload$ = this.store.criteria$.pipe(map(() => true));
if (widget && widget.refreshOn === 'data-update') {
widget.reload$ = this.store.dataSetUpdate$.pipe(map(() => true));
} else if (widget && widget.refreshOn === 'data-reload') {
widget.reload$ = this.store.records$.pipe(map(() => true));
}
});
}

View file

@ -113,6 +113,8 @@ export class ListViewStore extends ViewStore implements StateStore,
showSidebarWidgets$: Observable<boolean>;
displayFilters$: Observable<boolean>;
recordList: RecordListStore;
dataUpdate$: Observable<boolean>;
dataSetUpdate$: Observable<boolean>;
/**
* View-model that resolves once all the data is ready (or updated).
@ -126,6 +128,7 @@ export class ListViewStore extends ViewStore implements StateStore,
protected internalState: ListViewState = deepClone(initialState);
protected store = new BehaviorSubject<ListViewState>(this.internalState);
protected state$ = this.store.asObservable();
protected dataUpdateState: BehaviorSubject<boolean>;
protected subs: Subscription[] = [];
constructor(
@ -191,6 +194,9 @@ export class ListViewStore extends ViewStore implements StateStore,
}));
this.columns = new BehaviorSubject<ColumnDefinition[]>(listViewColumns);
this.columns$ = this.columns.asObservable();
this.initDataUpdateState();
this.initDataSetUpdatedState();
}
get showFilters(): boolean {
@ -355,6 +361,10 @@ export class ListViewStore extends ViewStore implements StateStore,
this.recordList.clearSelection();
this.load(false).pipe(take(1)).subscribe();
}
if (process.data && process.data.dataUpdated) {
this.dataUpdateState.next(true);
}
});
}
@ -495,4 +505,25 @@ export class ListViewStore extends ViewStore implements StateStore,
});
}
/**
* Initialize data update state.
* It should be emitted on any change in values on the record list.
* Reload/Pagination is not considered as a data update
*/
protected initDataUpdateState(): void {
this.dataUpdateState = new BehaviorSubject<boolean>(true);
this.dataUpdate$ = this.dataUpdateState.asObservable();
}
/**
* Initialize the dataSet update state.
* It should be emitted on any change in dataSet e.g. due to data filter, due to data delete,
* due to data edit or any event which causes change in the resulting dataSet.
*/
protected initDataSetUpdatedState(): void {
this.dataSetUpdate$ = combineLatest(
[this.criteria$, this.dataUpdate$]
).pipe(map(() => true));
}
}

View file

@ -40,7 +40,7 @@ export class SidebarWidgetAdapter {
if (metadata.sidebarWidgets && metadata.sidebarWidgets.length) {
metadata.sidebarWidgets.forEach(widget => {
if (widget && widget.refreshOnRecordUpdate) {
if (widget && widget.refreshOn === 'data-update') {
widget.reload$ = this.store.record$.pipe(map(() => true));
}
});

View file

@ -38,7 +38,7 @@ export class TopWidgetAdapter {
]).pipe(
map(([metadata, show]) => {
if (metadata.topWidget && metadata.topWidget.refreshOnRecordUpdate) {
if (metadata.topWidget && metadata.topWidget.refreshOn === 'data-update') {
metadata.topWidget.reload$ = this.store.record$.pipe(map(() => true));
}

View file

@ -124,6 +124,7 @@ class DeleteRecordsBulkAction implements ProcessHandlerInterface, LoggerAwareInt
$responseData = [
'reload' => true,
'dataUpdated' => true,
];
$process->setStatus('success');

View file

@ -264,7 +264,7 @@ class RecordViewDefinitionHandler extends LegacyHandler
protected function addTopWidgetConfig(array $viewDefs, array &$metadata): void
{
$metadata['topWidget'] = $viewDefs['topWidget'] ?? [];
$metadata['topWidget']['refreshOnRecordUpdate'] = $metadata['topWidget']['refreshOnRecordUpdate'] ?? true;
$metadata['topWidget']['refreshOn'] = $metadata['topWidget']['refreshOn'] ?? 'data-update';
}
/**
@ -288,7 +288,7 @@ class RecordViewDefinitionHandler extends LegacyHandler
$metadata['sidebarWidgets'] = $viewDefs['sidebarWidgets'] ?? [];
foreach ($metadata['sidebarWidgets'] as $index => $widget) {
$metadata['sidebarWidgets'][$index]['refreshOnRecordUpdate'] = $widget['refreshOnRecordUpdate'] ?? true;
$metadata['sidebarWidgets'][$index]['refreshOn'] = $widget['refreshOn'] ?? 'data-update';
}
}

View file

@ -67,7 +67,7 @@ class ListViewSidebarWidgetDefinitionProvider implements ListViewSidebarWidgetDe
$widgets = $this->filterDefinitionEntries($module, 'widgets', $this->widgets, $this->aclManager);
foreach ($widgets as $index => $widget) {
$widgets[$index]['refreshOnRecordUpdate'] = $widget['refreshOnRecordUpdate'] ?? true;
$widgets[$index]['refreshOn'] = $widget['refreshOn'] ?? 'data-update';
}
return array_values($widgets);

View file

@ -126,7 +126,7 @@ class ListViewSidebarWidgetDefinitionProviderTest extends Unit
]
],
],
'refreshOnRecordUpdate' => true
'refreshOn' => 'data-update'
]
];
$widgets = $this->service->getSidebarWidgets('leads');