Skip to content

Commit c538181

Browse files
committed
refactor: minor fixes
1 parent 4014806 commit c538181

File tree

5 files changed

+33
-54
lines changed

5 files changed

+33
-54
lines changed

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

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -137,30 +137,9 @@ export class RootGridStore extends BaseControllerHost {
137137
add(this.columnsStore.setup());
138138
add(() => this.settingsStore.dispose());
139139
add(autorun(() => this.updateProps(this.gate.props)));
140-
add(this.setupSelectAllProgressStore());
141-
142140
return disposeAll;
143141
}
144142

145-
private setupSelectAllProgressStore() {
146-
const controller = this.selectAllController;
147-
const loadstart = (e: ProgressEvent): void => this.selectAllProgressStore.onloadstart(e);
148-
const loadend = (e: ProgressEvent): void => this.selectAllProgressStore.onloadstart(e);
149-
const progress = (e: ProgressEvent): void => this.selectAllProgressStore.onprogress(e);
150-
151-
controller.addEventListener("loadstart", loadstart);
152-
controller.addEventListener("loadend", loadend);
153-
controller.addEventListener("abort", loadend);
154-
controller.addEventListener("progress", progress);
155-
156-
return () => {
157-
controller.removeEventListener("loadstart", loadstart);
158-
controller.removeEventListener("loadend", loadend);
159-
controller.removeEventListener("abort", loadend);
160-
controller.removeEventListener("progress", progress);
161-
};
162-
}
163-
164143
private updateProps(props: RequiredProps): void {
165144
this.columnsStore.updateProps(props);
166145
this.settingsStore.updateProps(props);

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { SelectAllHost } from "@mendix/widget-plugin-grid/selection";
22
import { ProgressStore } from "@mendix/widget-plugin-grid/stores/ProgressStore";
33
import { ClosableGateProvider } from "@mendix/widget-plugin-mobx-kit/ClosableGateProvider";
4+
import { GateProvider } from "@mendix/widget-plugin-mobx-kit/GateProvider";
45
import { useConst } from "@mendix/widget-plugin-mobx-kit/react/useConst";
56
import { useSetup } from "@mendix/widget-plugin-mobx-kit/react/useSetup";
67
import { useEffect } from "react";
@@ -19,10 +20,7 @@ export function useRootStore(props: DatagridContainerProps): RootGridStore {
1920
});
2021
});
2122

22-
const selectAllGateProvider = useConst(() => {
23-
// Closed when not selecting all
24-
return new ClosableGateProvider(props, () => !selectAllProgressStore.inProgress);
25-
});
23+
const selectAllGateProvider = useConst(() => new GateProvider(props));
2624

2725
const selectAllHost = useSetup(
2826
() => new SelectAllHost({ gate: selectAllGateProvider.gate, selectAllProgressStore })

packages/shared/widget-plugin-grid/src/selection/SelectAllController.ts renamed to packages/shared/widget-plugin-grid/src/select-all/SelectAllController.ts

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ interface SelectAllControllerSpec {
1414

1515
type SelectAllEventType = "loadstart" | "progress" | "abort" | "loadend";
1616

17-
export class SelectAllController extends EventTarget implements ReactiveController {
17+
export class SelectAllController implements ReactiveController {
1818
private readonly gate: Gate;
1919
private readonly query: QueryController;
2020
private abortController?: AbortController;
2121
private locked = false;
2222
readonly pageSize: number = 100;
23+
private readonly emitter = new EventTarget();
2324

2425
constructor(host: ReactiveControllerHost, spec: SelectAllControllerSpec) {
25-
super();
2626
host.addController(this);
2727
this.gate = spec.gate;
2828
this.query = spec.query;
@@ -44,12 +44,12 @@ export class SelectAllController extends EventTarget implements ReactiveControll
4444
return () => this.abort();
4545
}
4646

47-
addEventListener(
48-
type: SelectAllEventType,
49-
callback: (pe: ProgressEvent<SelectAllController>) => void,
50-
options?: AddEventListenerOptions | boolean
51-
): void {
52-
super.addEventListener(type, callback, options);
47+
on(type: SelectAllEventType, listener: (pe: ProgressEvent) => void): void {
48+
this.emitter.addEventListener(type, listener);
49+
}
50+
51+
off(type: SelectAllEventType, listener: (pe: ProgressEvent) => void): void {
52+
this.emitter.removeEventListener(type, listener);
5353
}
5454

5555
get selection(): SelectionMultiValue | undefined {
@@ -96,6 +96,7 @@ export class SelectAllController extends EventTarget implements ReactiveControll
9696
this.setIsLocked(true);
9797

9898
const { offset: initOffset, limit: initLimit } = this.query;
99+
const initSelection = this.selection?.selection;
99100
const hasTotal = typeof this.query.totalCount === "number";
100101
const totalCount = this.query.totalCount ?? 0;
101102
let loaded = 0;
@@ -104,36 +105,39 @@ export class SelectAllController extends EventTarget implements ReactiveControll
104105
new ProgressEvent(type, { loaded, total: totalCount, lengthComputable: hasTotal });
105106
// We should avoid duplicates, so, we start with clean array.
106107
const allItems: ObjectItem[] = [];
108+
this.abortController = new AbortController();
109+
const signal = this.abortController.signal;
107110

108111
try {
109-
this.abortController = new AbortController();
110-
this.dispatchEvent(pe("loadstart"));
112+
this.emitter.dispatchEvent(pe("loadstart"));
111113
let loading = true;
112114
while (loading) {
113115
const loadedItems = await this.query.fetchPage({
114116
limit: this.pageSize,
115117
offset,
116-
signal: this.abortController.signal
118+
signal
117119
});
118120

119121
allItems.push(...loadedItems);
120122
loaded += loadedItems.length;
121123
offset += this.pageSize;
122-
this.dispatchEvent(pe("progress"));
123-
loading = !this.abortController.signal.aborted && this.query.hasMoreItems;
124+
this.emitter.dispatchEvent(pe("progress"));
125+
loading = !signal.aborted && this.query.hasMoreItems;
124126
}
127+
// Set allItems on success
128+
this.selection?.setSelection(allItems);
125129
} catch (error) {
126-
const aborted = this.abortController?.signal.aborted;
127-
if (!aborted) {
130+
if (!signal.aborted) {
128131
throw error;
129132
}
133+
// Restore selection on abort
134+
this.selection?.setSelection(initSelection ?? []);
130135
} finally {
131136
this.query.setOffset(initOffset);
132137
this.query.setLimit(initLimit);
133-
this.selection?.setSelection(allItems);
134138
this.locked = false;
139+
this.emitter.dispatchEvent(pe("loadend"));
135140
this.abortController = undefined;
136-
this.dispatchEvent(pe("loadend"));
137141
}
138142
}
139143

@@ -147,6 +151,6 @@ export class SelectAllController extends EventTarget implements ReactiveControll
147151

148152
abort(): void {
149153
this.abortController?.abort();
150-
this.dispatchEvent(new ProgressEvent("abort"));
154+
this.emitter.dispatchEvent(new ProgressEvent("abort"));
151155
}
152156
}

packages/shared/widget-plugin-grid/src/selection/SelectAllHost.ts renamed to packages/shared/widget-plugin-grid/src/select-all/SelectAllHost.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,17 @@ export class SelectAllHost extends BaseControllerHost {
3434
private setupSelectAllProgressStore() {
3535
const controller = this.selectAllController;
3636
const loadstart = (e: ProgressEvent): void => this.selectAllProgressStore.onloadstart(e);
37-
const loadend = (e: ProgressEvent): void => this.selectAllProgressStore.onloadstart(e);
37+
const loadend = (): void => this.selectAllProgressStore.onloadend();
3838
const progress = (e: ProgressEvent): void => this.selectAllProgressStore.onprogress(e);
3939

40-
controller.addEventListener("loadstart", loadstart);
41-
controller.addEventListener("loadend", loadend);
42-
controller.addEventListener("abort", loadend);
43-
controller.addEventListener("progress", progress);
40+
controller.on("loadstart", loadstart);
41+
controller.on("loadend", loadend);
42+
controller.on("progress", progress);
4443

4544
return () => {
46-
controller.removeEventListener("loadstart", loadstart);
47-
controller.removeEventListener("loadend", loadend);
48-
controller.removeEventListener("abort", loadend);
49-
controller.removeEventListener("progress", progress);
45+
controller.off("loadstart", loadstart);
46+
controller.off("loadend", loadend);
47+
controller.off("progress", progress);
5048
};
5149
}
5250
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
export { SelectAllController } from "./select-all/SelectAllController.js";
2+
export { SelectAllHost } from "./select-all/SelectAllHost.js";
13
export {
24
getGlobalSelectionContext,
35
useCreateSelectionContextValue,
@@ -6,6 +8,4 @@ export {
68
export * from "./selection/helpers.js";
79
export * from "./selection/keyboard.js";
810
export { SelectActionHandler } from "./selection/select-action-handler.js";
9-
export { SelectAllController } from "./selection/SelectAllController.js";
10-
export { SelectAllHost } from "./selection/SelectAllHost.js";
1111
export * from "./selection/types.js";

0 commit comments

Comments
 (0)