Skip to content

Commit 253d090

Browse files
committed
refactor: use gate to avoid computations
1 parent 340421b commit 253d090

File tree

6 files changed

+25
-45
lines changed

6 files changed

+25
-45
lines changed

packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ enableStaticRendering(true);
77
import { useFocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/useFocusTargetController";
88
import { DatasourceController } from "@mendix/widget-plugin-grid/query/DatasourceController";
99
import { SelectAllController } from "@mendix/widget-plugin-grid/selection";
10-
import { SelectionCountStore } from "@mendix/widget-plugin-grid/selection/stores/SelectionCountStore";
1110
import { ProgressStore } from "@mendix/widget-plugin-grid/stores/ProgressStore";
11+
import { SelectionCountStore } from "@mendix/widget-plugin-grid/stores/SelectionCountStore";
1212
import { BaseControllerHost } from "@mendix/widget-plugin-mobx-kit/BaseControllerHost";
1313
import { GateProvider } from "@mendix/widget-plugin-mobx-kit/GateProvider";
1414
import { useConst } from "@mendix/widget-plugin-mobx-kit/react/useConst";

packages/pluggableWidgets/datagrid-web/src/Datagrid.tsx

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,35 +9,31 @@ import { DatagridContainerProps } from "../typings/DatagridProps";
99
import { Cell } from "./components/Cell";
1010
import { Widget } from "./components/Widget";
1111
import { WidgetHeaderContext } from "./components/WidgetHeaderContext";
12-
import { ProgressStore } from "./features/data-export/ProgressStore";
1312
import { useDataExport } from "./features/data-export/useDataExport";
1413
import { useCellEventsController } from "./features/row-interaction/CellEventsController";
1514
import { useCheckboxEventsController } from "./features/row-interaction/CheckboxEventsController";
1615
import { DatagridContext, DatagridRootScope } from "./helpers/root-context";
1716
import { useSelectActionHelper } from "./helpers/SelectActionHelper";
18-
import { IColumnGroupStore } from "./helpers/state/ColumnGroupStore";
1917
import { RootGridStore } from "./helpers/state/RootGridStore";
2018
import { useRootStore } from "./helpers/state/useRootStore";
2119
import { useDataGridJSActions } from "./helpers/useDataGridJSActions";
2220

2321
interface Props extends DatagridContainerProps {
24-
columnsStore: IColumnGroupStore;
2522
rootStore: RootGridStore;
26-
progressStore: ProgressStore;
2723
}
2824

2925
const Container = observer((props: Props): ReactElement => {
30-
const { columnsStore, rootStore } = props;
31-
const { paginationCtrl } = rootStore;
26+
const { rootStore } = props;
27+
const { paginationCtrl, gate, query, columnsStore, exportProgressStore } = rootStore;
3228

33-
const items = rootStore.query.items ?? [];
29+
const items = query.items ?? [];
3430

35-
const [exportProgress, abortExport] = useDataExport(props, props.columnsStore, props.progressStore);
31+
const [exportProgress, abortExport] = useDataExport(props, columnsStore, exportProgressStore);
3632

3733
const selectionHelper = useSelectionHelper(
38-
props.itemSelection,
39-
props.datasource,
40-
props.onSelectionChange,
34+
gate.props.itemSelection,
35+
gate.props.datasource,
36+
gate.props.onSelectionChange,
4137
props.keepSelection ? "always keep" : "always clear"
4238
);
4339

@@ -150,14 +146,5 @@ const Container = observer((props: Props): ReactElement => {
150146
Container.displayName = "DatagridComponent";
151147

152148
export default function Datagrid(props: DatagridContainerProps): ReactElement | null {
153-
const rootStore = useRootStore(props);
154-
155-
return (
156-
<Container
157-
{...props}
158-
rootStore={rootStore}
159-
columnsStore={rootStore.columnsStore}
160-
progressStore={rootStore.exportProgressStore}
161-
/>
162-
);
149+
return <Container {...props} rootStore={useRootStore(props)} />;
163150
}

packages/pluggableWidgets/datagrid-web/src/features/data-export/useDataExport.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import { useCallback, useEffect, useState } from "react";
2+
import { DatagridContainerProps } from "../../../typings/DatagridProps";
3+
import { IColumnGroupStore } from "../../helpers/state/ColumnGroupStore";
24
import { ExportController } from "./ExportController";
35
import { ProgressStore } from "./ProgressStore";
46
import { getExportRegistry } from "./registry";
5-
import { DatagridContainerProps } from "../../../typings/DatagridProps";
6-
import { IColumnGroupStore } from "../../helpers/state/ColumnGroupStore";
77

88
type ResourceEntry = {
99
key: string;
1010
controller: ExportController;
1111
};
1212

1313
export function useDataExport(
14-
props: DatagridContainerProps,
14+
props: Pick<DatagridContainerProps, "datasource" | "name" | "columns">,
1515
columnsStore: IColumnGroupStore,
1616
progress: ProgressStore
1717
): [store: ProgressStore, abort: () => void] {

packages/pluggableWidgets/datagrid-web/src/helpers/root-context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { FocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/FocusTargetController";
22
import { SelectAllController, SelectionHelper } from "@mendix/widget-plugin-grid/selection";
3-
import { SelectionCountStore } from "@mendix/widget-plugin-grid/selection/stores/SelectionCountStore";
43
import { ProgressStore } from "@mendix/widget-plugin-grid/stores/ProgressStore";
4+
import { SelectionCountStore } from "@mendix/widget-plugin-grid/stores/SelectionCountStore";
55
import { createContext, useContext } from "react";
66
import { GridBasicData } from "../helpers/state/GridBasicData";
77
import { EventsController } from "../typings/CellComponent";

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

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { DatasourceController } from "@mendix/widget-plugin-grid/query/Datasourc
55
import { QueryController } from "@mendix/widget-plugin-grid/query/query-controller";
66
import { RefreshController } from "@mendix/widget-plugin-grid/query/RefreshController";
77
import { SelectAllController } from "@mendix/widget-plugin-grid/selection";
8-
import { SelectionCountStore } from "@mendix/widget-plugin-grid/selection/stores/SelectionCountStore";
98
import { ProgressStore } from "@mendix/widget-plugin-grid/stores/ProgressStore";
9+
import { SelectionCountStore } from "@mendix/widget-plugin-grid/stores/SelectionCountStore";
1010
import { BaseControllerHost } from "@mendix/widget-plugin-mobx-kit/BaseControllerHost";
1111
import { disposeBatch } from "@mendix/widget-plugin-mobx-kit/disposeBatch";
1212
import { DerivedPropsGate } from "@mendix/widget-plugin-mobx-kit/props-gate";
@@ -17,9 +17,7 @@ import { DatagridContainerProps } from "../../../typings/DatagridProps";
1717
import { DatasourceParamsController } from "../../controllers/DatasourceParamsController";
1818
import { DerivedLoaderController } from "../../controllers/DerivedLoaderController";
1919
import { PaginationController } from "../../controllers/PaginationController";
20-
2120
import { StaticInfo } from "../../typings/static-info";
22-
2321
import { ColumnGroupStore } from "./ColumnGroupStore";
2422
import { GridPersonalizationStore } from "./GridPersonalizationStore";
2523

@@ -40,6 +38,7 @@ type RequiredProps = Pick<
4038
| "showNumberOfRows"
4139
| "selectAllPagesEnabled"
4240
| "selectAllPagesPageSize"
41+
| "onSelectionChange"
4342
>;
4443

4544
type Gate = DerivedPropsGate<RequiredProps>;
@@ -62,10 +61,9 @@ export class RootGridStore extends BaseControllerHost {
6261
selectAllProgressStore: ProgressStore;
6362
loaderCtrl: DerivedLoaderController;
6463
paginationCtrl: PaginationController;
65-
readonly filterAPI: FilterAPI;
66-
query!: QueryController;
67-
68-
private gate: Gate;
64+
filterAPI: FilterAPI;
65+
query: QueryController;
66+
gate: Gate;
6967

7068
constructor({ gate, exportProgressStore, selectAllProgressStore, selectAllController }: Spec) {
7169
super();
@@ -80,8 +78,7 @@ export class RootGridStore extends BaseControllerHost {
8078

8179
const filterHost = new CustomFilterHost();
8280

83-
const query = new DatasourceController(this, { gate });
84-
this.query = query;
81+
const query = (this.query = new DatasourceController(this, { gate }));
8582

8683
this.filterAPI = createContextWithStub({
8784
filterObserver: filterHost,
@@ -136,12 +133,10 @@ export class RootGridStore extends BaseControllerHost {
136133
add(super.setup());
137134
add(this.columnsStore.setup());
138135
add(() => this.settingsStore.dispose());
139-
add(autorun(() => this.updateProps(this.gate.props)));
136+
// Column store & settings store is still using old `updateProps`
137+
// approach. So, we use autorun to sync props.
138+
add(autorun(() => this.columnsStore.updateProps(this.gate.props)));
139+
add(autorun(() => this.settingsStore.updateProps(this.gate.props)));
140140
return disposeAll;
141141
}
142-
143-
private updateProps(props: RequiredProps): void {
144-
this.columnsStore.updateProps(props);
145-
this.settingsStore.updateProps(props);
146-
}
147142
}

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,10 @@ export class SelectAllController implements ReactiveController {
146146
const selectionBeforeReload = this.selection?.selection ?? [];
147147
// Reload selection to make sure setSelection is working as expected.
148148
await this.reloadSelection();
149-
150149
this.selection?.setSelection(success ? allItems : selectionBeforeReload);
151-
152150
this.locked = false;
153-
console.info(success, initLimit, initOffset);
154151
this.abortController = undefined;
152+
155153
performance.mark("SelectAll_End");
156154
const measure1 = performance.measure("Measure1", "SelectAll_Start", "SelectAll_End");
157155
console.debug(`Data grid 2: 'select all' took ${(measure1.duration / 1000).toFixed(2)} seconds.`);
@@ -161,7 +159,7 @@ export class SelectAllController implements ReactiveController {
161159
reloadSelection(): Promise<void> {
162160
const selection = this.selection;
163161
selection?.setSelection([]);
164-
// Resolve when selection value is updated
162+
// `when` resolves when selection value is updated
165163
return when(() => this.selection !== selection);
166164
}
167165

0 commit comments

Comments
 (0)