Skip to content

Commit 688c166

Browse files
committed
feat(datagrid-web): refactor, remove duplicate logic, move new controller to helpers
1 parent 38cd47a commit 688c166

File tree

4 files changed

+61
-276
lines changed

4 files changed

+61
-276
lines changed

packages/pluggableWidgets/datagrid-web/src/components/CheckboxColumnHeader.tsx

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,19 @@ export function CheckboxColumnHeader(): ReactElement {
2323
return;
2424
}
2525

26-
if (selectActionHelper.canSelectAllPages && selectionStatus !== "none") {
27-
// Toggle off still uses normal flow
28-
onSelectAll();
29-
return;
30-
}
31-
32-
if (selectActionHelper.canSelectAllPages && selectionStatus === "none") {
33-
// Delegate to root store orchestration
34-
await rootStore?.startMultiPageSelectAll(selectActionHelper);
26+
// When multi-page selection is enabled, handle both select and unselect across all pages
27+
if (selectActionHelper.canSelectAllPages) {
28+
if (selectionStatus === "none") {
29+
// Select all pages
30+
await rootStore?.startMultiPageSelectAll(selectActionHelper);
31+
} else {
32+
// Unselect all pages (both "all" and "some" states)
33+
await rootStore?.clearAllPages();
34+
}
3535
return;
3636
}
3737

38+
// Fallback to normal single-page toggle
3839
onSelectAll();
3940
};
4041

packages/pluggableWidgets/datagrid-web/src/features/multi-page-selection/MultiPageSelectionController.ts

Lines changed: 0 additions & 246 deletions
This file was deleted.

packages/pluggableWidgets/datagrid-web/src/helpers/state/RootGridStore.ts

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { CustomFilterHost } from "@mendix/widget-plugin-filtering/stores/generic
44
import { DatasourceController } from "@mendix/widget-plugin-grid/query/DatasourceController";
55
import { QueryController } from "@mendix/widget-plugin-grid/query/query-controller";
66
import { RefreshController } from "@mendix/widget-plugin-grid/query/RefreshController";
7+
import { clearAllPages, selectAllPages } from "@mendix/widget-plugin-grid/selection/select-all-pages";
78
import { SelectionCountStore } from "@mendix/widget-plugin-grid/selection/stores/SelectionCountStore";
89
import { BaseControllerHost } from "@mendix/widget-plugin-mobx-kit/BaseControllerHost";
910
import { disposeBatch } from "@mendix/widget-plugin-mobx-kit/disposeBatch";
@@ -17,11 +18,10 @@ import { DerivedLoaderController } from "../../controllers/DerivedLoaderControll
1718
import { PaginationController } from "../../controllers/PaginationController";
1819
import { ProgressStore } from "../../features/data-export/ProgressStore";
1920
import { SelectAllProgressStore } from "../../features/multi-page-selection/SelectAllProgressStore";
20-
import { MultiPageSelectionController } from "../../features/multi-page-selection/MultiPageSelectionController";
2121
import { StaticInfo } from "../../typings/static-info";
22+
import { SelectActionHelper } from "../SelectActionHelper";
2223
import { ColumnGroupStore } from "./ColumnGroupStore";
2324
import { GridPersonalizationStore } from "./GridPersonalizationStore";
24-
import { SelectActionHelper } from "../SelectActionHelper";
2525

2626
type RequiredProps = Pick<
2727
DatagridContainerProps,
@@ -55,7 +55,8 @@ export class RootGridStore extends BaseControllerHost {
5555
staticInfo: StaticInfo;
5656
exportProgressCtrl: ProgressStore;
5757
selectAllProgressStore: SelectAllProgressStore;
58-
multiPageSelectionCtrl: MultiPageSelectionController;
58+
private selectAllAbortController?: AbortController;
59+
private selectAllLocked = false;
5960
loaderCtrl: DerivedLoaderController;
6061
paginationCtrl: PaginationController;
6162
readonly filterAPI: FilterAPI;
@@ -103,11 +104,6 @@ export class RootGridStore extends BaseControllerHost {
103104

104105
this.selectAllProgressStore = new SelectAllProgressStore();
105106

106-
this.multiPageSelectionCtrl = new MultiPageSelectionController(this, {
107-
query,
108-
progressStore: this.selectAllProgressStore
109-
});
110-
111107
new DatasourceParamsController(this, {
112108
query,
113109
filterHost: combinedFilter,
@@ -146,33 +142,45 @@ export class RootGridStore extends BaseControllerHost {
146142
}
147143

148144
async startMultiPageSelectAll(selectActionHelper: SelectActionHelper): Promise<void> {
149-
const ds = this.gate.props.datasource;
150-
const selectionHelper = this.basicData.currentSelectionHelper;
151-
152-
if (!selectionHelper) {
145+
if (this.selectAllLocked) {
153146
return;
154147
}
155148

156149
// Check if multi-page selection is possible
157-
const canSelect = this.multiPageSelectionCtrl.canSelectAllPages(
158-
selectActionHelper.canSelectAllPages,
159-
selectActionHelper.selectionType
160-
);
150+
const canSelect = selectActionHelper.canSelectAllPages;
161151

162152
if (!canSelect) {
163153
selectActionHelper.onSelectAll("selectAll");
164154
return;
165155
}
166156

167-
// Delegate to the controller
168-
const success = await this.multiPageSelectionCtrl.selectAllPages(ds, selectionHelper);
157+
this.selectAllLocked = true;
158+
this.selectAllAbortController = new AbortController();
159+
const success = await selectAllPages({
160+
query: this.query as QueryController,
161+
gate: this.gate as any,
162+
progress: this.selectAllProgressStore,
163+
bufferSize: selectActionHelper.selectAllPagesBufferSize,
164+
signal: this.selectAllAbortController.signal
165+
});
169166

170167
if (!success) {
171168
selectActionHelper.onSelectAll("selectAll");
172169
}
170+
this.selectAllLocked = false;
171+
this.selectAllAbortController = undefined;
172+
}
173+
174+
async clearAllPages(): Promise<void> {
175+
clearAllPages(this.gate);
173176
}
174177

175178
abortMultiPageSelect(): void {
176-
this.multiPageSelectionCtrl.abort();
179+
if (this.selectAllAbortController) {
180+
this.selectAllAbortController.abort();
181+
this.selectAllProgressStore.oncancel();
182+
this.selectAllLocked = false;
183+
this.selectAllAbortController = undefined;
184+
}
177185
}
178186
}

0 commit comments

Comments
 (0)