Skip to content

Commit b99c478

Browse files
iobuhovyordan-st
authored andcommitted
refactor: migrate event handlers to container
1 parent 54f32d0 commit b99c478

File tree

9 files changed

+80
-113
lines changed

9 files changed

+80
-113
lines changed

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

Lines changed: 3 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,22 @@
1-
import { useClickActionHelper } from "@mendix/widget-plugin-grid/helpers/ClickActionHelper";
2-
import { useFocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/useFocusTargetController";
3-
import { useConst } from "@mendix/widget-plugin-mobx-kit/react/useConst";
41
import { ContainerProvider } from "brandi-react";
52
import { observer } from "mobx-react-lite";
63
import { ReactElement } from "react";
74
import { DatagridContainerProps } from "../typings/DatagridProps";
85
import { Widget } from "./components/Widget";
96
import { useDataExport } from "./features/data-export/useDataExport";
10-
import { useCellEventsController } from "./features/row-interaction/CellEventsController";
11-
import { useCheckboxEventsController } from "./features/row-interaction/CheckboxEventsController";
12-
import { LegacyContext } from "./helpers/root-context";
137
import { useDataGridJSActions } from "./helpers/useDataGridJSActions";
14-
import {
15-
useColumnsStore,
16-
useDatagridConfig,
17-
useExportProgressService,
18-
useMainGate,
19-
useSelectActions,
20-
useSelectionHelper
21-
} from "./model/hooks/injection-hooks";
8+
import { useColumnsStore, useExportProgressService } from "./model/hooks/injection-hooks";
229
import { useDatagridContainer } from "./model/hooks/useDatagridContainer";
2310

2411
const DatagridRoot = observer((props: DatagridContainerProps): ReactElement => {
25-
const config = useDatagridConfig();
26-
const gate = useMainGate();
2712
const columnsStore = useColumnsStore();
2813
const exportProgress = useExportProgressService();
29-
const items = gate.props.datasource.items ?? [];
3014

3115
const [abortExport] = useDataExport(props, columnsStore, exportProgress);
3216

33-
const selectionHelper = useSelectionHelper();
17+
useDataGridJSActions();
3418

35-
const selectActionHelper = useSelectActions();
36-
37-
const clickActionHelper = useClickActionHelper({
38-
onClickTrigger: props.onClickTrigger,
39-
onClick: props.onClick
40-
});
41-
42-
useDataGridJSActions(selectActionHelper);
43-
44-
const visibleColumnsCount = config.checkboxColumnEnabled
45-
? columnsStore.visibleColumns.length + 1
46-
: columnsStore.visibleColumns.length;
47-
48-
const focusController = useFocusTargetController({
49-
rows: items.length,
50-
columns: visibleColumnsCount,
51-
pageSize: props.pageSize
52-
});
53-
54-
const cellEventsController = useCellEventsController(selectActionHelper, clickActionHelper, focusController);
55-
56-
const checkboxEventsController = useCheckboxEventsController(selectActionHelper, focusController);
57-
58-
return (
59-
<LegacyContext.Provider
60-
value={useConst({
61-
selectionHelper,
62-
selectActionHelper,
63-
cellEventsController,
64-
checkboxEventsController,
65-
focusController
66-
})}
67-
>
68-
<Widget onExportCancel={abortExport} />
69-
</LegacyContext.Provider>
70-
);
19+
return <Widget onExportCancel={abortExport} />;
7120
});
7221

7322
DatagridRoot.displayName = "DatagridComponent";

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,34 @@
11
import { KeyNavProvider } from "@mendix/widget-plugin-grid/keyboard-navigation/context";
22
import { observer } from "mobx-react-lite";
33
import { ReactElement } from "react";
4-
import { useLegacyContext } from "../helpers/root-context";
5-
import { useColumnsStore, useDatagridConfig, useRowClass, useRows } from "../model/hooks/injection-hooks";
4+
import {
5+
useCellEventsHandler,
6+
useColumnsStore,
7+
useDatagridConfig,
8+
useFocusService,
9+
useRowClass,
10+
useRows,
11+
useSelectActions
12+
} from "../model/hooks/injection-hooks";
613
import { Row } from "./Row";
714

815
export const RowsRenderer = observer(function RowsRenderer(): ReactElement {
916
const rows = useRows().get();
1017
const config = useDatagridConfig();
1118
const { visibleColumns } = useColumnsStore();
1219
const rowClass = useRowClass();
13-
const { cellEventsController, focusController, selectActionHelper } = useLegacyContext();
20+
const cellEventsController = useCellEventsHandler();
21+
const focusService = useFocusService();
22+
const selectActions = useSelectActions();
23+
1424
return (
15-
<KeyNavProvider focusController={focusController}>
25+
<KeyNavProvider focusController={focusService}>
1626
{rows.map((item, rowIndex) => {
1727
return (
1828
<Row
1929
totalRows={rows.length}
2030
clickable={config.isInteractive}
21-
selectActions={selectActionHelper}
31+
selectActions={selectActions}
2232
eventsController={cellEventsController}
2333
className={rowClass.class.get(item)}
2434
columns={visibleColumns}

packages/pluggableWidgets/datagrid-web/src/features/row-interaction/CellEventsController.ts

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,19 @@ import { eventSwitch } from "@mendix/widget-plugin-grid/event-switch/event-switc
44
import { ClickActionHelper, ExecuteActionFx } from "@mendix/widget-plugin-grid/helpers/ClickActionHelper";
55
import { FocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/FocusTargetController";
66
import { FocusTargetFx } from "@mendix/widget-plugin-grid/keyboard-navigation/base";
7-
import { SelectAdjacentFx, SelectAllFx, SelectFx } from "@mendix/widget-plugin-grid/selection";
7+
import {
8+
SelectAdjacentFx,
9+
SelectAllFx,
10+
SelectFx,
11+
SelectionMode,
12+
SelectionType
13+
} from "@mendix/widget-plugin-grid/selection";
814
import { ObjectItem } from "mendix";
9-
import { useMemo } from "react";
1015

1116
import { SelectActionsService } from "@mendix/widget-plugin-grid/main";
17+
import { ComputedAtom } from "@mendix/widget-plugin-mobx-kit/main";
1218
import { createActionHandlers } from "./action-handlers";
13-
import { CellContext } from "./base";
19+
import { CellContext, SelectionMethod } from "./base";
1420
import { createFocusTargetHandlers } from "./focus-target-handlers";
1521
import { createSelectHandlers } from "./select-handlers";
1622

@@ -45,29 +51,34 @@ export class CellEventsController {
4551
}
4652
}
4753

48-
export function useCellEventsController(
49-
selectHelper: SelectActionsService,
54+
export function createCellEventsController(
55+
config: {
56+
selectionType: SelectionType;
57+
selectionMethod: SelectionMethod;
58+
selectionMode: SelectionMode;
59+
},
60+
selectActions: SelectActionsService,
61+
focusController: FocusTargetController,
5062
clickHelper: ClickActionHelper,
51-
focusController: FocusTargetController
63+
pageSize: ComputedAtom<number>
5264
): CellEventsController {
53-
const pageSize = 10;
54-
return useMemo(() => {
55-
const cellContextFactory = (item: ObjectItem): CellContext => ({
56-
item,
57-
pageSize: selectHelper.pageSize,
58-
selectionType: selectHelper.selectionType,
59-
selectionMethod: selectHelper.selectionMethod,
60-
selectionMode: selectHelper.selectionMode,
61-
clickTrigger: clickHelper.clickTrigger
62-
});
65+
// Placeholder function, actual implementation will depend on the specific context and services available.
66+
const cellContextFactory = (item: ObjectItem): CellContext => ({
67+
type: "cell",
68+
item,
69+
pageSize: pageSize.get(),
70+
selectionType: config.selectionType,
71+
selectionMethod: config.selectionMethod,
72+
selectionMode: config.selectionMode,
73+
clickTrigger: clickHelper.clickTrigger
74+
});
6375

64-
return new CellEventsController(
65-
cellContextFactory,
66-
selectHelper.onSelect,
67-
selectHelper.onSelectAll,
68-
selectHelper.onSelectAdjacent,
69-
clickHelper.onExecuteAction,
70-
focusController.dispatch
71-
);
72-
}, [selectHelper, clickHelper, focusController]);
76+
return new CellEventsController(
77+
cellContextFactory,
78+
selectActions.select,
79+
selectActions.selectPage,
80+
selectActions.selectAdjacent,
81+
clickHelper.onExecuteAction,
82+
focusController.dispatch
83+
);
7384
}

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

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

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

Lines changed: 3 additions & 3 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 { SelectActionsService } from "@mendix/widget-plugin-grid/main";
3-
import { useDatagridConfig } from "../model/hooks/injection-hooks";
2+
import { useDatagridConfig, useSelectActions } from "../model/hooks/injection-hooks";
43

5-
export function useDataGridJSActions(selectActions: SelectActionsService): void {
4+
export function useDataGridJSActions(): void {
65
const info = useDatagridConfig();
6+
const selectActions = useSelectActions();
77
useOnResetFiltersEvent(info.name, info.filtersChannelName);
88
useOnClearSelectionEvent({
99
widgetName: info.name,

packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { Container, injected } from "brandi";
1818
import { MainGateProps } from "../../../typings/MainGateProps";
1919
import { WidgetRootViewModel } from "../../features/base/WidgetRoot.viewModel";
2020
import { EmptyPlaceholderViewModel } from "../../features/empty-message/EmptyPlaceholder.viewModel";
21+
import { createCellEventsController } from "../../features/row-interaction/CellEventsController";
2122
import { creteCheckboxEventsController } from "../../features/row-interaction/CheckboxEventsController";
2223
import { SelectAllModule } from "../../features/select-all/SelectAllModule.container";
2324
import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore";
@@ -38,7 +39,7 @@ injected(DatasourceParamsController, CORE.setupService, DG.query, DG.combinedFil
3839
injected(DatasourceService, CORE.setupService, DG.queryGate, DG.refreshInterval.optional);
3940
injected(PaginationController, CORE.setupService, DG.paginationConfig, DG.query);
4041
injected(GridBasicData, CORE.mainGate);
41-
injected(WidgetRootViewModel, CORE.mainGate, CORE.config, DG.exportProgressService, SA_TOKENS.progressService);
42+
injected(WidgetRootViewModel, CORE.mainGate, CORE.config, DG.exportProgressService, SA_TOKENS.selectionDialogVM);
4243

4344
// loader
4445
injected(DerivedLoaderController, DG.query, DG.exportProgressService, CORE.columnsStore, DG.loaderConfig);
@@ -66,6 +67,14 @@ injected(createFocusController, CORE.setupService, DG.virtualLayout);
6667
injected(creteCheckboxEventsController, CORE.config, DG.selectActions, DG.focusService, CORE.atoms.pageSize);
6768
injected(layoutAtom, CORE.atoms.itemCount, CORE.atoms.columnCount, CORE.atoms.pageSize);
6869
injected(createClickActionHelper, CORE.setupService, CORE.mainGate);
70+
injected(
71+
createCellEventsController,
72+
CORE.config,
73+
DG.selectActions,
74+
DG.focusService,
75+
DG.clickActionHelper,
76+
CORE.atoms.pageSize
77+
);
6978

7079
// selection counter
7180
injected(
@@ -125,6 +134,8 @@ export class DatagridContainer extends Container {
125134
this.bind(DG.focusService).toInstance(createFocusController).inSingletonScope();
126135
// Checkbox events service
127136
this.bind(DG.checkboxEventsHandler).toInstance(creteCheckboxEventsController).inSingletonScope();
137+
// Cell events service
138+
this.bind(DG.cellEventsHandler).toInstance(createCellEventsController).inSingletonScope();
128139
// Click action helper
129140
this.bind(DG.clickActionHelper).toInstance(createClickActionHelper).inSingletonScope();
130141
}
@@ -190,6 +201,9 @@ export class DatagridContainer extends Container {
190201
// Bind selection counter position
191202
this.bind(DG.selectionCounterCfg).toConstant({ position: props.selectionCounterPosition });
192203

204+
// Bind selection type
205+
this.bind(DG.selectionType).toConstant(config.selectionType);
206+
193207
this.postInit(props, config);
194208

195209
return this;

packages/pluggableWidgets/datagrid-web/src/model/containers/Root.container.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ injected(visibleColumnsCountAtom, CORE.columnsStore);
3232
injected(isAllItemsPresentAtom, CORE.atoms.offset, CORE.atoms.hasMoreItems);
3333
injected(rowsAtom, CORE.mainGate);
3434
injected(pageSizeAtom, CORE.pageSizeStore);
35-
injected(columnCount, CORE.atoms.columnCount, CORE.config);
35+
injected(columnCount, CORE.atoms.visibleColumnsCount, CORE.config);
3636

3737
// selection
3838
injected(

packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,7 @@ export const [useRowClass] = createInjectionHooks(DG.rowClass);
2020
export const [useDatagridRootVM] = createInjectionHooks(DG.datagridRootVM);
2121
export const [useRows] = createInjectionHooks(CORE.rows);
2222
export const [useSelectActions] = createInjectionHooks(DG.selectActions);
23+
export const [useClickActionHelper] = createInjectionHooks(DG.clickActionHelper);
24+
export const [useFocusService] = createInjectionHooks(DG.focusService);
25+
export const [useCheckboxEventsHandler] = createInjectionHooks(DG.checkboxEventsHandler);
26+
export const [useCellEventsHandler] = createInjectionHooks(DG.cellEventsHandler);

packages/pluggableWidgets/datagrid-web/src/model/tokens.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { CSSProperties, ReactNode } from "react";
2626
import { MainGateProps } from "../../typings/MainGateProps";
2727
import { WidgetRootViewModel } from "../features/base/WidgetRoot.viewModel";
2828
import { EmptyPlaceholderViewModel } from "../features/empty-message/EmptyPlaceholder.viewModel";
29+
import { CellEventsController } from "../features/row-interaction/CellEventsController";
2930
import { CheckboxEventsController } from "../features/row-interaction/CheckboxEventsController";
3031
import { SelectAllBarViewModel } from "../features/select-all/SelectAllBar.viewModel";
3132
import { SelectionProgressDialogViewModel } from "../features/select-all/SelectionProgressDialog.viewModel";
@@ -129,7 +130,8 @@ export const DG_TOKENS = {
129130
virtualLayout: token<ComputedAtom<VirtualGridLayout>>("@computed:virtualLayout"),
130131
clickActionHelper: token<ClickActionHelper>("@service:ClickActionHelper"),
131132
focusService: token<FocusTargetController>("@service:FocusTargetController"),
132-
checkboxEventsHandler: token<CheckboxEventsController>("@service:CheckboxEventsController")
133+
checkboxEventsHandler: token<CheckboxEventsController>("@service:CheckboxEventsController"),
134+
cellEventsHandler: token<CellEventsController>("@service:CellEventsController")
133135
};
134136

135137
/** "Select all" module tokens. */

0 commit comments

Comments
 (0)