Skip to content

Commit 3792f2a

Browse files
committed
feat: add dg config
1 parent 43438e8 commit 3792f2a

File tree

4 files changed

+79
-62
lines changed

4 files changed

+79
-62
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { generateUUID } from "@mendix/widget-plugin-platform/framework/generate-uuid";
2+
import { DatagridContainerProps } from "../typings/DatagridProps";
3+
4+
/** Config for static values that don't change at runtime. */
5+
export interface DatagridConfig {
6+
checkboxColumnEnabled: boolean;
7+
filtersChannelName: string;
8+
id: string;
9+
name: string;
10+
refreshIntervalMs: number;
11+
selectAllCheckboxEnabled: boolean;
12+
selectionEnabled: boolean;
13+
selectorColumnEnabled: boolean;
14+
settingsStorageEnabled: boolean;
15+
}
16+
17+
export function datagridConfig(props: DatagridContainerProps): DatagridConfig {
18+
const id = `${props.name}:Datagrid@${generateUUID()}`;
19+
20+
return Object.freeze({
21+
checkboxColumnEnabled: isCheckboxColumnEnabled(props),
22+
filtersChannelName: `${id}:events`,
23+
id,
24+
name: props.name,
25+
refreshIntervalMs: props.refreshInterval * 1000,
26+
selectAllCheckboxEnabled: props.showSelectAllToggle,
27+
selectionEnabled: isSelectionEnabled(props),
28+
selectorColumnEnabled: props.columnsHidable,
29+
settingsStorageEnabled: isSettingsStorageEnabled(props)
30+
});
31+
}
32+
33+
function isSelectionEnabled(props: DatagridContainerProps): boolean {
34+
return props.itemSelection !== undefined;
35+
}
36+
37+
function isCheckboxColumnEnabled(props: DatagridContainerProps): boolean {
38+
if (!props.itemSelection) return false;
39+
return props.itemSelectionMethod === "checkbox";
40+
}
41+
42+
function isSettingsStorageEnabled(props: DatagridContainerProps): boolean {
43+
if (props.configurationStorageType === "localStorage") return true;
44+
if (props.configurationStorageType === "attribute" && props.configurationAttribute) return true;
45+
return false;
46+
}

packages/pluggableWidgets/datagrid-web/src/Datagrid.depsContainer.ts

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,18 @@ import { GateProvider } from "@mendix/widget-plugin-mobx-kit/GateProvider";
1414
import { DerivedPropsGate, SetupComponentHost } from "@mendix/widget-plugin-mobx-kit/main";
1515
import { useConst } from "@mendix/widget-plugin-mobx-kit/react/useConst";
1616
import { useSetup } from "@mendix/widget-plugin-mobx-kit/react/useSetup";
17-
1817
import { generateUUID } from "@mendix/widget-plugin-platform/framework/generate-uuid";
1918
import { Container, injected, token } from "brandi";
2019
import { useEffect } from "react";
2120
import { DatagridContainerProps, SelectionCounterPositionEnum } from "../typings/DatagridProps";
2221
import { DatasourceParamsController } from "./controllers/DatasourceParamsController";
2322
import { DerivedLoaderController, DerivedLoaderControllerConfig } from "./controllers/DerivedLoaderController";
2423
import { PaginationConfig, PaginationController } from "./controllers/PaginationController";
24+
import { datagridConfig, DatagridConfig } from "./Datagrid.config";
2525
import { ColumnGroupStore } from "./helpers/state/ColumnGroupStore";
2626
import { GridBasicData } from "./helpers/state/GridBasicData";
2727
import { GridPersonalizationStore } from "./helpers/state/GridPersonalizationStore";
2828
import { DatagridSetupService } from "./services/DatagridSetupService";
29-
import { StaticInfo } from "./typings/static-info";
3029
import { SelectAllBarViewModel } from "./view-models/SelectAllBarViewModel";
3130
import { SelectionProgressDialogViewModel } from "./view-models/SelectionProgressDialogViewModel";
3231

@@ -61,6 +60,7 @@ type MainGateProps = Pick<
6160
/** Tokens to resolve dependencies from the container. */
6261
export const TOKENS = {
6362
basicDate: token<GridBasicData>("GridBasicData"),
63+
config: token<DatagridConfig>("DatagridConfig"),
6464
columnsStore: token<ColumnGroupStore>("ColumnGroupStore"),
6565
combinedFilter: token<CombinedFilter>("CombinedFilter"),
6666
combinedFilterConfig: token<CombinedFilterConfig>("CombinedFilterKey"),
@@ -81,7 +81,6 @@ export const TOKENS = {
8181
selectionCounter: token<SelectionCounterViewModel>("SelectionCounterViewModel"),
8282
selectionCounterPosition: token<SelectionCounterPositionEnum>("SelectionCounterPositionEnum"),
8383
setupService: token<SetupComponentHost>("DatagridSetupHost"),
84-
staticInfo: token<StaticInfo>("StaticInfo"),
8584
enableSelectAll: token<boolean>("enableSelectAll"),
8685
selectAllProgressService: token<TaskProgressService>("SelectAllProgressService"),
8786
selectAllGate: token<DerivedPropsGate<SelectAllGateProps>>("SelectAllGateForProps"),
@@ -91,7 +90,7 @@ export const TOKENS = {
9190
};
9291

9392
/** Deps injections */
94-
injected(ColumnGroupStore, TOKENS.setupService, TOKENS.mainGate, TOKENS.staticInfo, TOKENS.filterHost);
93+
injected(ColumnGroupStore, TOKENS.setupService, TOKENS.mainGate, TOKENS.config, TOKENS.filterHost);
9594
injected(GridBasicData, TOKENS.mainGate);
9695
injected(CombinedFilter, TOKENS.setupService, TOKENS.combinedFilterConfig);
9796
injected(WidgetFilterAPI, TOKENS.parentChannelName, TOKENS.filterHost);
@@ -138,7 +137,7 @@ class DatagridContainer extends Container {
138137
* Setup container bindings.
139138
* @remark Make sure not to bind things that already exist in root container.
140139
*/
141-
init(props: MainGateProps, root: RootContainer, selectAllModule: Container): DatagridContainer {
140+
init(props: DatagridContainerProps, root: RootContainer, selectAllModule: Container): DatagridContainer {
142141
this.extend(root);
143142

144143
// Connect select all module
@@ -161,6 +160,10 @@ class DatagridContainer extends Container {
161160
this.bind(TOKENS.mainGate).toConstant(gateProvider.gate);
162161
this.bind(TOKENS.queryGate).toConstant(gateProvider.gate);
163162

163+
// Bind config
164+
const config = datagridConfig(props);
165+
this.bind(TOKENS.config).toConstant(config);
166+
164167
// Columns store
165168
this.bind(TOKENS.columnsStore).toInstance(ColumnGroupStore).inSingletonScope();
166169

@@ -192,9 +195,7 @@ class DatagridContainer extends Container {
192195
this.bind(TOKENS.paginationService).toInstance(PaginationController).inSingletonScope();
193196

194197
// Events channel for child widgets
195-
this.bind(TOKENS.parentChannelName)
196-
.toInstance(() => `Datagrid@${generateUUID()}`)
197-
.inSingletonScope();
198+
this.bind(TOKENS.parentChannelName).toConstant(config.filtersChannelName);
198199

199200
// Loader view model
200201
this.bind(TOKENS.loaderViewModel).toInstance(DerivedLoaderController).inSingletonScope();
@@ -208,12 +209,6 @@ class DatagridContainer extends Container {
208209
// Selection progress dialog view model
209210
this.bind(TOKENS.selectionDialogViewModel).toInstance(SelectionProgressDialogViewModel).inSingletonScope();
210211

211-
// Bind static info
212-
this.bind(TOKENS.staticInfo).toConstant({
213-
name: props.name,
214-
filtersChannelName: this.get(TOKENS.parentChannelName)
215-
});
216-
217212
// Bind refresh interval
218213
this.bind(TOKENS.refreshInterval).toConstant(props.refreshInterval * 1000);
219214

@@ -246,7 +241,7 @@ class DatagridContainer extends Container {
246241
// Make sure essential services are created upfront
247242
this.get(TOKENS.paramsService);
248243
this.get(TOKENS.paginationService);
249-
if (this.isSettingsStorageEnabled(props)) {
244+
if (config.settingsStorageEnabled) {
250245
this.get(TOKENS.personalizationService);
251246
}
252247

@@ -256,12 +251,6 @@ class DatagridContainer extends Container {
256251
return this;
257252
}
258253

259-
private isSettingsStorageEnabled(props: MainGateProps): boolean {
260-
if (props.configurationStorageType === "localStorage") return true;
261-
if (props.configurationStorageType === "attribute" && props.configurationAttribute) return true;
262-
return false;
263-
}
264-
265254
setProps = (_props: MainGateProps): void => {
266255
throw new Error(`${this.id} is not initialized yet`);
267256
};
Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,24 @@
11
import { createInjectionHooks } from "brandi-react";
22
import { TOKENS } from "./Datagrid.depsContainer";
33

4-
const [
5-
useBasicData,
6-
usePaginationService,
7-
useSelectionCounterViewModel,
8-
useLoaderViewModel,
9-
useColumnsStore,
10-
useExportProgressService,
11-
useMainGate,
12-
useStaticInfo,
13-
useDatagridFilterAPI,
14-
useSelectAllBarViewModel,
15-
useSelectionDialogViewModel
16-
] = createInjectionHooks(
17-
TOKENS.basicDate,
18-
TOKENS.paginationService,
19-
TOKENS.selectionCounter,
20-
TOKENS.loaderViewModel,
21-
TOKENS.columnsStore,
22-
TOKENS.exportProgressService,
23-
TOKENS.mainGate,
24-
TOKENS.staticInfo,
25-
TOKENS.filterAPI,
26-
TOKENS.selectAllBar,
27-
TOKENS.selectionDialogViewModel
28-
);
29-
30-
export {
31-
useBasicData,
32-
useColumnsStore,
33-
useDatagridFilterAPI,
34-
useExportProgressService,
35-
useLoaderViewModel,
36-
useMainGate,
37-
usePaginationService,
38-
useSelectAllBarViewModel,
39-
useSelectionCounterViewModel,
40-
useSelectionDialogViewModel,
41-
useStaticInfo
42-
};
4+
export const [useBasicData] = createInjectionHooks(TOKENS.basicDate);
5+
6+
export const [useDatagridConfig] = createInjectionHooks(TOKENS.config);
7+
8+
export const [usePaginationService] = createInjectionHooks(TOKENS.paginationService);
9+
10+
export const [useSelectionCounterViewModel] = createInjectionHooks(TOKENS.selectionCounter);
11+
12+
export const [useLoaderViewModel] = createInjectionHooks(TOKENS.loaderViewModel);
13+
14+
export const [useColumnsStore] = createInjectionHooks(TOKENS.columnsStore);
15+
16+
export const [useExportProgressService] = createInjectionHooks(TOKENS.exportProgressService);
17+
18+
export const [useMainGate] = createInjectionHooks(TOKENS.mainGate);
19+
20+
export const [useDatagridFilterAPI] = createInjectionHooks(TOKENS.filterAPI);
21+
22+
export const [useSelectAllBarViewModel] = createInjectionHooks(TOKENS.selectAllBar);
23+
24+
export const [useSelectionDialogViewModel] = createInjectionHooks(TOKENS.selectionDialogViewModel);

packages/pluggableWidgets/datagrid-web/src/helpers/useDataGridJSActions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { useOnClearSelectionEvent, useOnResetFiltersEvent } from "@mendix/widget-plugin-external-events/hooks";
2-
import { useStaticInfo } from "../deps-hooks";
2+
import { useDatagridConfig } from "../deps-hooks";
33
import { SelectActionHelper } from "./SelectActionHelper";
44

55
export function useDataGridJSActions(selectActionHelper?: SelectActionHelper): void {
6-
const info = useStaticInfo();
6+
const info = useDatagridConfig();
77
useOnResetFiltersEvent(info.name, info.filtersChannelName);
88
useOnClearSelectionEvent({
99
widgetName: info.name,

0 commit comments

Comments
 (0)