|
1 |
| -import { useSelectionHelper } from "@mendix/widget-plugin-grid/selection"; |
| 1 | +import { useOnResetFiltersEvent } from "@mendix/widget-plugin-external-events/hooks"; |
2 | 2 | import { generateUUID } from "@mendix/widget-plugin-platform/framework/generate-uuid";
|
| 3 | +import { observer } from "mobx-react-lite"; |
3 | 4 | import { ReactElement, ReactNode, createElement, useCallback, useEffect, useMemo } from "react";
|
4 | 5 | import { DatagridContainerProps } from "../typings/DatagridProps";
|
5 | 6 | import { Cell } from "./components/Cell";
|
6 | 7 | import { Widget } from "./components/Widget";
|
7 | 8 | import { WidgetHeaderContext } from "./components/WidgetHeaderContext";
|
8 |
| -import "./ui/Datagrid.scss"; |
9 |
| -import { useShowPagination } from "./utils/useShowPagination"; |
10 |
| -import { useSelectActionHelper } from "./helpers/SelectActionHelper"; |
11 |
| -import { useClickActionHelper } from "@mendix/widget-plugin-grid/helpers/ClickActionHelper"; |
12 |
| -import { useCellEventsController } from "./features/row-interaction/CellEventsController"; |
13 |
| -import { useCheckboxEventsController } from "./features/row-interaction/CheckboxEventsController"; |
14 |
| -import { useFocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/useFocusTargetController"; |
15 |
| -import { useOnResetFiltersEvent } from "@mendix/widget-plugin-external-events/hooks"; |
| 9 | +import { ProgressStore } from "./features/data-export/ProgressStore"; |
| 10 | +import { useDataExport } from "./features/data-export/useDataExport"; |
16 | 11 | import { IColumnGroupStore } from "./helpers/state/ColumnGroupStore";
|
17 |
| -import { observer } from "mobx-react-lite"; |
18 | 12 | import { RootGridStore } from "./helpers/state/RootGridStore";
|
19 | 13 | import { useRootStore } from "./helpers/state/useRootStore";
|
20 |
| -import { useDataExport } from "./features/data-export/useDataExport"; |
21 |
| -import { ProgressStore } from "./features/data-export/ProgressStore"; |
| 14 | +import "./ui/Datagrid.scss"; |
| 15 | +import { useShowPagination } from "./utils/useShowPagination"; |
| 16 | +import { HelpersProvider, useProvideGridHelpers } from "./helpers/helpers-context"; |
22 | 17 |
|
23 | 18 | interface Props extends DatagridContainerProps {
|
24 | 19 | columnsStore: IColumnGroupStore;
|
@@ -64,96 +59,73 @@ const Container = observer((props: Props): ReactElement => {
|
64 | 59 | [props.datasource, props.pageSize, isInfiniteLoad, currentPage]
|
65 | 60 | );
|
66 | 61 |
|
67 |
| - const selectionHelper = useSelectionHelper(props.itemSelection, props.datasource, props.onSelectionChange); |
68 |
| - |
69 |
| - const selectActionHelper = useSelectActionHelper(props, selectionHelper); |
70 |
| - |
71 |
| - const clickActionHelper = useClickActionHelper({ |
72 |
| - onClickTrigger: props.onClickTrigger, |
73 |
| - onClick: props.onClick |
74 |
| - }); |
75 | 62 | useOnResetFiltersEvent(props.rootStore.staticInfo.name, props.rootStore.staticInfo.filtersChannelName);
|
76 | 63 |
|
77 |
| - const visibleColumnsCount = selectActionHelper.showCheckboxColumn |
78 |
| - ? columnsStore.visibleColumns.length + 1 |
79 |
| - : columnsStore.visibleColumns.length; |
80 |
| - |
81 |
| - const focusController = useFocusTargetController({ |
82 |
| - rows: items.length, |
83 |
| - columns: visibleColumnsCount, |
84 |
| - pageSize: props.pageSize |
85 |
| - }); |
86 |
| - |
87 |
| - const cellEventsController = useCellEventsController(selectActionHelper, clickActionHelper, focusController); |
88 |
| - |
89 |
| - const checkboxEventsController = useCheckboxEventsController(selectActionHelper, focusController); |
| 64 | + const helpers = useProvideGridHelpers(props); |
90 | 65 |
|
91 | 66 | return (
|
92 |
| - <Widget |
93 |
| - className={props.class} |
94 |
| - CellComponent={Cell} |
95 |
| - columnsDraggable={props.columnsDraggable} |
96 |
| - columnsFilterable={props.columnsFilterable} |
97 |
| - columnsHidable={props.columnsHidable} |
98 |
| - columnsResizable={props.columnsResizable} |
99 |
| - columnsSortable={props.columnsSortable} |
100 |
| - data={items} |
101 |
| - emptyPlaceholderRenderer={useCallback( |
102 |
| - (renderWrapper: (children: ReactNode) => ReactElement) => |
103 |
| - props.showEmptyPlaceholder === "custom" ? renderWrapper(props.emptyPlaceholder) : <div />, |
104 |
| - [props.emptyPlaceholder, props.showEmptyPlaceholder] |
105 |
| - )} |
106 |
| - filterRenderer={useCallback( |
107 |
| - (renderWrapper, columnIndex) => { |
108 |
| - const columnFilter = columnsStore.columnFilters[columnIndex]; |
109 |
| - return renderWrapper(columnFilter.renderFilterWidgets()); |
110 |
| - }, |
111 |
| - [columnsStore.columnFilters] |
112 |
| - )} |
113 |
| - headerTitle={props.filterSectionTitle?.value} |
114 |
| - headerContent={ |
115 |
| - props.filtersPlaceholder && ( |
116 |
| - <WidgetHeaderContext selectionHelper={selectionHelper} filtersStore={rootStore.headerFiltersStore}> |
117 |
| - {props.filtersPlaceholder} |
118 |
| - </WidgetHeaderContext> |
119 |
| - ) |
120 |
| - } |
121 |
| - hasMoreItems={props.datasource.hasMoreItems ?? false} |
122 |
| - headerWrapperRenderer={useCallback((_columnIndex: number, header: ReactElement) => header, [])} |
123 |
| - id={useMemo(() => `DataGrid${generateUUID()}`, [])} |
124 |
| - numberOfItems={props.datasource.totalCount} |
125 |
| - onExportCancel={abortExport} |
126 |
| - page={currentPage} |
127 |
| - pageSize={props.pageSize} |
128 |
| - paginationType={props.pagination} |
129 |
| - loadMoreButtonCaption={props.loadMoreButtonCaption?.value} |
130 |
| - paging={useShowPagination({ |
131 |
| - pagination: props.pagination, |
132 |
| - showPagingButtons: props.showPagingButtons, |
133 |
| - totalCount: props.datasource.totalCount, |
134 |
| - limit: props.datasource.limit |
135 |
| - })} |
136 |
| - pagingPosition={props.pagingPosition} |
137 |
| - showPagingButtons={props.showPagingButtons} |
138 |
| - rowClass={useCallback((value: any) => props.rowClass?.get(value)?.value ?? "", [props.rowClass])} |
139 |
| - gridInteractive={!!(props.itemSelection || props.onClick)} |
140 |
| - setPage={setPage} |
141 |
| - styles={props.style} |
142 |
| - selectionStatus={selectionHelper?.type === "Multi" ? selectionHelper.selectionStatus : "unknown"} |
143 |
| - exporting={exportProgress.exporting} |
144 |
| - processedRows={exportProgress.loaded} |
145 |
| - exportDialogLabel={props.exportDialogLabel?.value} |
146 |
| - cancelExportLabel={props.cancelExportLabel?.value} |
147 |
| - selectRowLabel={props.selectRowLabel?.value} |
148 |
| - visibleColumns={columnsStore.visibleColumns} |
149 |
| - availableColumns={columnsStore.availableColumns} |
150 |
| - columnsCreateSizeSnapshot={() => columnsStore.createSizeSnapshot()} |
151 |
| - columnsSwap={(moved, [target, placement]) => columnsStore.swapColumns(moved, [target, placement])} |
152 |
| - selectActionHelper={selectActionHelper} |
153 |
| - cellEventsController={cellEventsController} |
154 |
| - checkboxEventsController={checkboxEventsController} |
155 |
| - focusController={focusController} |
156 |
| - /> |
| 67 | + <HelpersProvider value={helpers}> |
| 68 | + <Widget |
| 69 | + className={props.class} |
| 70 | + CellComponent={Cell} |
| 71 | + columnsDraggable={props.columnsDraggable} |
| 72 | + columnsFilterable={props.columnsFilterable} |
| 73 | + columnsHidable={props.columnsHidable} |
| 74 | + columnsResizable={props.columnsResizable} |
| 75 | + columnsSortable={props.columnsSortable} |
| 76 | + data={items} |
| 77 | + emptyPlaceholderRenderer={useCallback( |
| 78 | + (renderWrapper: (children: ReactNode) => ReactElement) => |
| 79 | + props.showEmptyPlaceholder === "custom" ? renderWrapper(props.emptyPlaceholder) : <div />, |
| 80 | + [props.emptyPlaceholder, props.showEmptyPlaceholder] |
| 81 | + )} |
| 82 | + filterRenderer={useCallback( |
| 83 | + (renderWrapper, columnIndex) => { |
| 84 | + const columnFilter = columnsStore.columnFilters[columnIndex]; |
| 85 | + return renderWrapper(columnFilter.renderFilterWidgets()); |
| 86 | + }, |
| 87 | + [columnsStore.columnFilters] |
| 88 | + )} |
| 89 | + headerTitle={props.filterSectionTitle?.value} |
| 90 | + headerContent={ |
| 91 | + props.filtersPlaceholder && ( |
| 92 | + <WidgetHeaderContext filtersStore={rootStore.headerFiltersStore}> |
| 93 | + {props.filtersPlaceholder} |
| 94 | + </WidgetHeaderContext> |
| 95 | + ) |
| 96 | + } |
| 97 | + hasMoreItems={props.datasource.hasMoreItems ?? false} |
| 98 | + headerWrapperRenderer={useCallback((_columnIndex: number, header: ReactElement) => header, [])} |
| 99 | + id={useMemo(() => `DataGrid${generateUUID()}`, [])} |
| 100 | + numberOfItems={props.datasource.totalCount} |
| 101 | + onExportCancel={abortExport} |
| 102 | + page={currentPage} |
| 103 | + pageSize={props.pageSize} |
| 104 | + paginationType={props.pagination} |
| 105 | + loadMoreButtonCaption={props.loadMoreButtonCaption?.value} |
| 106 | + paging={useShowPagination({ |
| 107 | + pagination: props.pagination, |
| 108 | + showPagingButtons: props.showPagingButtons, |
| 109 | + totalCount: props.datasource.totalCount, |
| 110 | + limit: props.datasource.limit |
| 111 | + })} |
| 112 | + pagingPosition={props.pagingPosition} |
| 113 | + showPagingButtons={props.showPagingButtons} |
| 114 | + rowClass={useCallback((value: any) => props.rowClass?.get(value)?.value ?? "", [props.rowClass])} |
| 115 | + gridInteractive={!!(props.itemSelection || props.onClick)} |
| 116 | + setPage={setPage} |
| 117 | + styles={props.style} |
| 118 | + exporting={exportProgress.exporting} |
| 119 | + processedRows={exportProgress.loaded} |
| 120 | + exportDialogLabel={props.exportDialogLabel?.value} |
| 121 | + cancelExportLabel={props.cancelExportLabel?.value} |
| 122 | + selectRowLabel={props.selectRowLabel?.value} |
| 123 | + visibleColumns={columnsStore.visibleColumns} |
| 124 | + availableColumns={columnsStore.availableColumns} |
| 125 | + columnsCreateSizeSnapshot={() => columnsStore.createSizeSnapshot()} |
| 126 | + columnsSwap={(moved, [target, placement]) => columnsStore.swapColumns(moved, [target, placement])} |
| 127 | + /> |
| 128 | + </HelpersProvider> |
157 | 129 | );
|
158 | 130 | });
|
159 | 131 |
|
|
0 commit comments