@absreim/react-bootstrap-data-grid-pro 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +6 -0
  3. package/grid/Grid.d.ts +5 -0
  4. package/grid/Grid.js +56 -0
  5. package/grid/InternalGrid.d.ts +19 -0
  6. package/grid/InternalGrid.js +57 -0
  7. package/grid/editing/EditControlsCell.d.ts +17 -0
  8. package/grid/editing/EditControlsCell.js +19 -0
  9. package/grid/editing/EditableRow.d.ts +22 -0
  10. package/grid/editing/EditableRow.js +68 -0
  11. package/grid/editing/inputStrsToRowData.d.ts +3 -0
  12. package/grid/editing/inputStrsToRowData.js +18 -0
  13. package/grid/editing/types.d.ts +16 -0
  14. package/grid/editing/types.js +1 -0
  15. package/grid/export/ExportForm.d.ts +9 -0
  16. package/grid/export/ExportForm.js +97 -0
  17. package/grid/export/types.d.ts +5 -0
  18. package/grid/export/types.js +1 -0
  19. package/grid/export/useExportFn.d.ts +23 -0
  20. package/grid/export/useExportFn.js +115 -0
  21. package/grid/filtering/DateFilterRow.d.ts +16 -0
  22. package/grid/filtering/DateFilterRow.js +45 -0
  23. package/grid/filtering/FilterOptionsTable.d.ts +11 -0
  24. package/grid/filtering/FilterOptionsTable.js +117 -0
  25. package/grid/filtering/FilterRow.d.ts +19 -0
  26. package/grid/filtering/FilterRow.js +18 -0
  27. package/grid/filtering/NumberFilterRow.d.ts +14 -0
  28. package/grid/filtering/NumberFilterRow.js +35 -0
  29. package/grid/filtering/StringFilterRow.d.ts +14 -0
  30. package/grid/filtering/StringFilterRow.js +35 -0
  31. package/grid/filtering/types.d.ts +70 -0
  32. package/grid/filtering/types.js +30 -0
  33. package/grid/filtering/useFilterFormState.d.ts +3 -0
  34. package/grid/filtering/useFilterFormState.js +72 -0
  35. package/grid/index.d.ts +10 -0
  36. package/grid/index.js +10 -0
  37. package/grid/main/BodyRows.d.ts +19 -0
  38. package/grid/main/BodyRows.js +18 -0
  39. package/grid/main/ColHeaderCell/index.d.ts +4 -0
  40. package/grid/main/ColHeaderCell/index.js +16 -0
  41. package/grid/main/ColHeaderCell/useSortHeaderStates.d.ts +9 -0
  42. package/grid/main/ColHeaderCell/useSortHeaderStates.js +54 -0
  43. package/grid/main/ToggleButton.d.ts +9 -0
  44. package/grid/main/ToggleButton.js +14 -0
  45. package/grid/pagination/PageSelector.d.ts +24 -0
  46. package/grid/pagination/PageSelector.js +92 -0
  47. package/grid/pagination/PageSizeSelector.d.ts +10 -0
  48. package/grid/pagination/PageSizeSelector.js +15 -0
  49. package/grid/pagination/Pagination.d.ts +9 -0
  50. package/grid/pagination/Pagination.js +24 -0
  51. package/grid/pagination/types.d.ts +22 -0
  52. package/grid/pagination/types.js +1 -0
  53. package/grid/pipeline/types.d.ts +1 -0
  54. package/grid/pipeline/types.js +1 -0
  55. package/grid/pipeline/useAugFormattedRows.d.ts +4 -0
  56. package/grid/pipeline/useAugFormattedRows.js +22 -0
  57. package/grid/pipeline/useCombinedPipeline/index.d.ts +19 -0
  58. package/grid/pipeline/useCombinedPipeline/index.js +31 -0
  59. package/grid/pipeline/useCombinedPipeline/useCurrentPageRows.d.ts +8 -0
  60. package/grid/pipeline/useCombinedPipeline/useCurrentPageRows.js +52 -0
  61. package/grid/pipeline/useCombinedPipeline/useDisplayRows.d.ts +3 -0
  62. package/grid/pipeline/useCombinedPipeline/useDisplayRows.js +60 -0
  63. package/grid/pipeline/useCombinedPipeline/useFilter.d.ts +4 -0
  64. package/grid/pipeline/useCombinedPipeline/useFilter.js +84 -0
  65. package/grid/pipeline/useCombinedPipeline/useFilterStateFromEditable.d.ts +4 -0
  66. package/grid/pipeline/useCombinedPipeline/useFilterStateFromEditable.js +18 -0
  67. package/grid/pipeline/useCombinedPipeline/useFilterStateStore.d.ts +4 -0
  68. package/grid/pipeline/useCombinedPipeline/useFilterStateStore.js +57 -0
  69. package/grid/pipeline/useCombinedPipeline/useSortedRows.d.ts +10 -0
  70. package/grid/pipeline/useCombinedPipeline/useSortedRows.js +58 -0
  71. package/grid/pipeline/useGetInputStrSubmitCallback.d.ts +5 -0
  72. package/grid/pipeline/useGetInputStrSubmitCallback.js +13 -0
  73. package/grid/pipeline/useGridSelectionFns.d.ts +16 -0
  74. package/grid/pipeline/useGridSelectionFns.js +131 -0
  75. package/grid/pipeline/useUnwrappedGridStyles.d.ts +7 -0
  76. package/grid/pipeline/useUnwrappedGridStyles.js +17 -0
  77. package/grid/selection/SelectAllHeaderCell.d.ts +11 -0
  78. package/grid/selection/SelectAllHeaderCell.js +55 -0
  79. package/grid/selection/SelectionInput.d.ts +19 -0
  80. package/grid/selection/SelectionInput.js +23 -0
  81. package/grid/selection/types.d.ts +30 -0
  82. package/grid/selection/types.js +4 -0
  83. package/grid/sorting/arrowPlaceholder.d.ts +2 -0
  84. package/grid/sorting/arrowPlaceholder.js +7 -0
  85. package/grid/sorting/downArrow.d.ts +2 -0
  86. package/grid/sorting/downArrow.js +3 -0
  87. package/grid/sorting/types.d.ts +19 -0
  88. package/grid/sorting/types.js +1 -0
  89. package/grid/sorting/upArrow.d.ts +2 -0
  90. package/grid/sorting/upArrow.js +13 -0
  91. package/grid/styling/styleModelUnwrappers.d.ts +4 -0
  92. package/grid/styling/styleModelUnwrappers.js +58 -0
  93. package/grid/styling/types.d.ts +62 -0
  94. package/grid/styling/types.js +1 -0
  95. package/grid/toolbar/Toolbar.d.ts +12 -0
  96. package/grid/toolbar/Toolbar.js +26 -0
  97. package/grid/toolbar/ToolbarContainer.d.ts +9 -0
  98. package/grid/toolbar/ToolbarContainer.js +24 -0
  99. package/grid/toolbar/types.d.ts +3 -0
  100. package/grid/toolbar/types.js +1 -0
  101. package/grid/toolbar/useInterfaces.d.ts +9 -0
  102. package/grid/toolbar/useInterfaces.js +23 -0
  103. package/grid/types.d.ts +63 -0
  104. package/grid/types.js +1 -0
  105. package/grid/util/datetime.d.ts +2 -0
  106. package/grid/util/datetime.js +5 -0
  107. package/grid/util/getWidthStyle.d.ts +3 -0
  108. package/grid/util/getWidthStyle.js +9 -0
  109. package/grid/util/isSubset.d.ts +2 -0
  110. package/grid/util/isSubset.js +11 -0
  111. package/grid/util/useControlledHover.d.ts +9 -0
  112. package/grid/util/useControlledHover.js +13 -0
  113. package/grid-pro/ColHeaderCellPro.d.ts +4 -0
  114. package/grid-pro/ColHeaderCellPro.js +140 -0
  115. package/grid-pro/GridPro.d.ts +4 -0
  116. package/grid-pro/GridPro.js +56 -0
  117. package/grid-pro/index.d.ts +3 -0
  118. package/grid-pro/index.js +3 -0
  119. package/grid-pro/resize/types.d.ts +5 -0
  120. package/grid-pro/resize/types.js +1 -0
  121. package/grid-pro/resize/useResizeModel.d.ts +5 -0
  122. package/grid-pro/resize/useResizeModel.js +65 -0
  123. package/grid-pro/types.d.ts +18 -0
  124. package/grid-pro/types.js +1 -0
  125. package/package.json +34 -0
  126. package/style.css +1 -0
package/LICENSE ADDED
@@ -0,0 +1,16 @@
1
+ Commercial License
2
+
3
+ Copyright (c) 2026 Brook Li
4
+
5
+ The software in this package can only be used for evaluation purposes.
6
+
7
+ A license to use the software in this package in production is currently not available but there are plans to provide
8
+ one in the near future. Once a license is available, this file will be updated with it.
9
+
10
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
11
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
13
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
14
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
15
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
16
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,6 @@
1
+ **@absreim/react-bootstrap-data-grid-pro** is the paid version of a data grid UI component meant for web apps using both
2
+ React and Bootstrap. A license key is required for use in production.
3
+
4
+ See the documentation site at https://react-bootstrap-data-grid.vercel.app/ for instructions on usage.
5
+
6
+ See the source repository at https://github.com/absreim/react-bootstrap-data-grid to view the source code.
package/grid/Grid.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { FC } from "react";
2
+ import { GridProps } from "./types";
3
+ declare const Grid: FC<GridProps>;
4
+ export default Grid;
5
+ export type { GridProps } from "./types";
package/grid/Grid.js ADDED
@@ -0,0 +1,56 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useMemo } from "react";
4
+ import InternalGrid from "./InternalGrid";
5
+ import ColHeaderCell from "./main/ColHeaderCell";
6
+ import useCombinedPipeline from "./pipeline/useCombinedPipeline";
7
+ import useGridSelectionFns from "./pipeline/useGridSelectionFns";
8
+ import useUnwrappedGridStyles from "./pipeline/useUnwrappedGridStyles";
9
+ import useGetInputStrSubmitCallback from "./pipeline/useGetInputStrSubmitCallback";
10
+ import useAugFormattedRows from "./pipeline/useAugFormattedRows";
11
+ import BodyRows from "./main/BodyRows";
12
+ var Grid = function (props) {
13
+ var rows = props.rows, cols = props.cols, filterModel = props.filterModel, sortModel = props.sortModel, pagination = props.pagination, selectModel = props.selectModel, styleModel = props.styleModel, editModel = props.editModel;
14
+ var combinedPipelineOutput = useCombinedPipeline({
15
+ rows: rows,
16
+ cols: cols,
17
+ filterModel: filterModel,
18
+ sortModel: sortModel,
19
+ pagination: pagination,
20
+ selectModel: selectModel,
21
+ });
22
+ var _a = combinedPipelineOutput.sortedRowsOutput, sortColDef = _a.sortColDef, setSortColDef = _a.setSortColDef, sortingEnabled = _a.sortingEnabled, showSelectCol = combinedPipelineOutput.showSelectCol, displayRows = combinedPipelineOutput.displayRows;
23
+ var gridSelectionFns = useGridSelectionFns(selectModel, rows);
24
+ var unwrappedStyles = useUnwrappedGridStyles(styleModel);
25
+ var getInputStrSubmitCallback = useGetInputStrSubmitCallback(editModel, cols);
26
+ var colNameToWidth = useMemo(function () {
27
+ var map = {};
28
+ cols.forEach(function (_a) {
29
+ var name = _a.name, width = _a.width;
30
+ return (map[name] = width);
31
+ });
32
+ return map;
33
+ }, [cols]);
34
+ var augFormattedRows = useAugFormattedRows(colNameToWidth, displayRows);
35
+ var colHeaderCells = cols.map(function (_a, index) {
36
+ var _b;
37
+ var name = _a.name, label = _a.label, sortable = _a.sortable, width = _a.width;
38
+ var colSortModel = sortingEnabled && sortable
39
+ ? {
40
+ sortOrder: (sortColDef === null || sortColDef === void 0 ? void 0 : sortColDef.name) === name ? sortColDef.order : null,
41
+ setSortOrder: function (order) {
42
+ setSortColDef && setSortColDef(order && { name: name, order: order });
43
+ },
44
+ }
45
+ : undefined;
46
+ return (_jsx(ColHeaderCell, { label: label, sortModel: colSortModel, ariaColIndex: index + 1 + (showSelectCol ? 1 : 0), additionalClasses: ((_b = styleModel === null || styleModel === void 0 ? void 0 : styleModel.mainTableStyleModel) === null || _b === void 0 ? void 0 : _b.theadTh) &&
47
+ styleModel.mainTableStyleModel.theadTh(index), width: width }, name));
48
+ });
49
+ var bodyRows = (_jsx(BodyRows, { augFormattedRows: augFormattedRows, gridSelectionFns: gridSelectionFns, selectModel: selectModel, unwrappedStyles: unwrappedStyles, combinedPipelineOutput: combinedPipelineOutput, editModel: editModel, getInputStrSubmitCallback: getInputStrSubmitCallback }));
50
+ return (_jsx(InternalGrid, { gridProps: props, hooks: {
51
+ pipelineOutput: combinedPipelineOutput,
52
+ selectFns: gridSelectionFns,
53
+ unwrappedStyles: unwrappedStyles,
54
+ }, slots: { colHeaderCells: colHeaderCells, bodyRows: bodyRows } }));
55
+ };
56
+ export default Grid;
@@ -0,0 +1,19 @@
1
+ import { FC, ReactNode } from "react";
2
+ import { BaseGridProps } from "./types";
3
+ import { UseCombinedPipelineHook } from "./pipeline/useCombinedPipeline";
4
+ import { UseGridSelectionFnsHook } from "./pipeline/useGridSelectionFns";
5
+ import { UseUnwrappedGridStylesHook } from "./pipeline/useUnwrappedGridStyles";
6
+ export interface InternalGridProps {
7
+ gridProps: BaseGridProps;
8
+ hooks: {
9
+ selectFns: UseGridSelectionFnsHook;
10
+ pipelineOutput: UseCombinedPipelineHook;
11
+ unwrappedStyles: UseUnwrappedGridStylesHook;
12
+ };
13
+ slots: {
14
+ colHeaderCells: ReactNode;
15
+ bodyRows: ReactNode;
16
+ };
17
+ }
18
+ declare const InternalGrid: FC<InternalGridProps>;
19
+ export default InternalGrid;
@@ -0,0 +1,57 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useMemo, useState } from "react";
4
+ import ToggleButton from "./main/ToggleButton";
5
+ import FilterOptionsTable from "./filtering/FilterOptionsTable";
6
+ import SelectAllHeaderCell from "./selection/SelectAllHeaderCell";
7
+ import Pagination from "./pagination/Pagination";
8
+ import classNames from "classnames";
9
+ import useInterfaces from "./toolbar/useInterfaces";
10
+ import ToolbarContainer from "./toolbar/ToolbarContainer";
11
+ import useExportFn from "./export/useExportFn";
12
+ import getWidthStyle from "./util/getWidthStyle";
13
+ var InternalGrid = function (_a) {
14
+ var _b;
15
+ var _c = _a.gridProps, rows = _c.rows, cols = _c.cols, pagination = _c.pagination, filterModel = _c.filterModel, selectModel = _c.selectModel, editModel = _c.editModel, caption = _c.caption, styleModel = _c.styleModel, useToolbar = _c.useToolbar, responsive = _c.responsive, displayMode = _c.displayMode, _d = _a.hooks, pipelineOutput = _d.pipelineOutput, selectFns = _d.selectFns, unwrappedStyles = _d.unwrappedStyles, _e = _a.slots, colHeaderCells = _e.colHeaderCells, bodyRows = _e.bodyRows;
16
+ var normalizedTableFilterModel = pipelineOutput.normalizedTableFilterModel, filteredRows = pipelineOutput.filteredRows, filterState = pipelineOutput.filterState, sortedRows = pipelineOutput.sortedRowsOutput.sortedRows, _f = pipelineOutput.currentPageRowsOutput, paginatedRows = _f.paginatedRows, normalizedModel = _f.normalizedModel, showSelectCol = pipelineOutput.showSelectCol;
17
+ var _g = useState(false), filterOptionsVisible = _g[0], setFilterOptionsVisible = _g[1];
18
+ var exportFnInfo = useExportFn({
19
+ rows: rows,
20
+ cols: cols,
21
+ filteredRows: filterModel && filteredRows,
22
+ currentPageRows: pagination && paginatedRows,
23
+ });
24
+ var toolbarInterfaceParams = useMemo(function () { return ({
25
+ filtering: useToolbar && filterState && filterModel && normalizedTableFilterModel
26
+ ? {
27
+ filterState: filterState,
28
+ setFilterState: normalizedTableFilterModel.setTableFilterState,
29
+ caption: filterModel.filterTableCaption,
30
+ styleModel: styleModel === null || styleModel === void 0 ? void 0 : styleModel.filterInputTableStyleModel,
31
+ }
32
+ : undefined,
33
+ exporting: useToolbar
34
+ ? { exportFnInfo: exportFnInfo, styleModel: styleModel === null || styleModel === void 0 ? void 0 : styleModel.exportFormStyleModel }
35
+ : undefined,
36
+ }); }, [
37
+ exportFnInfo,
38
+ filterModel,
39
+ filterState,
40
+ normalizedTableFilterModel,
41
+ styleModel === null || styleModel === void 0 ? void 0 : styleModel.exportFormStyleModel,
42
+ styleModel === null || styleModel === void 0 ? void 0 : styleModel.filterInputTableStyleModel,
43
+ useToolbar,
44
+ ]);
45
+ var toolbarInterfaces = useInterfaces(toolbarInterfaceParams);
46
+ var handleToggleFilterOptions = function () {
47
+ setFilterOptionsVisible(!filterOptionsVisible);
48
+ };
49
+ var rowsAreSelectable = selectFns.rowsAreSelectable, selectionInfo = selectFns.selectionInfo, selectAllOnClick = selectFns.selectAllOnClick;
50
+ var unwrappedTableModel = unwrappedStyles.unwrappedTableModel, unwrappedAdditionalStyleModel = unwrappedStyles.unwrappedAdditionalStyleModel;
51
+ var mainTable = (_jsxs("table", { className: classNames("table", {
52
+ "table-hover": rowsAreSelectable,
53
+ "d-block": displayMode === "block",
54
+ }, unwrappedTableModel.table), "aria-rowcount": filteredRows.length + 1, children: [caption !== undefined && (_jsx("caption", { className: classNames(unwrappedTableModel.caption), children: caption })), _jsx("thead", { className: classNames(unwrappedTableModel.thead), children: _jsxs("tr", { "aria-rowindex": 1, className: classNames(unwrappedTableModel.theadTr), children: [showSelectCol && (_jsx(SelectAllHeaderCell, { style: getWidthStyle(selectModel === null || selectModel === void 0 ? void 0 : selectModel.selectColWidth), selectionInfo: selectionInfo, onClick: selectAllOnClick, totalRows: rows.length, additionalClasses: unwrappedTableModel.rowSelectColTh })), colHeaderCells, editModel && (_jsx("th", { "aria-colindex": cols.length + 1 + (showSelectCol ? 1 : 0), className: classNames(unwrappedTableModel.editColTh), style: getWidthStyle(editModel === null || editModel === void 0 ? void 0 : editModel.editColWidth), children: "Edit Controls" }))] }) }), _jsx("tbody", { className: classNames(unwrappedTableModel.tbody), children: bodyRows })] }));
55
+ return (_jsxs("div", { "data-testid": "rbdg-top-level-div", className: classNames(unwrappedAdditionalStyleModel.topLevelDiv), children: [normalizedTableFilterModel && !useToolbar && (_jsxs("div", { "data-testid": "rbdg-filter-inputs-div", className: classNames(unwrappedAdditionalStyleModel.filterInputsDiv), children: [_jsx(ToggleButton, { isActive: filterOptionsVisible, label: "".concat(filterOptionsVisible ? "Hide" : "Show ", " Filter Options"), onClick: handleToggleFilterOptions, classes: (_b = styleModel === null || styleModel === void 0 ? void 0 : styleModel.additionalComponentsStyleModel) === null || _b === void 0 ? void 0 : _b.filterUiToggleButton }), filterOptionsVisible && (_jsx(FilterOptionsTable, { caption: filterModel.filterTableCaption, filterState: filterState, setFilterState: normalizedTableFilterModel.setTableFilterState, styleModel: styleModel === null || styleModel === void 0 ? void 0 : styleModel.filterInputTableStyleModel }))] })), useToolbar && (_jsx(ToolbarContainer, { interfaces: toolbarInterfaces, styleModel: styleModel === null || styleModel === void 0 ? void 0 : styleModel.toolbarStyleModel })), _jsxs("div", { "data-testid": "rbdg-table-and-pagination-div", className: classNames(unwrappedAdditionalStyleModel.tableAndPaginationDiv), children: [responsive ? (_jsx("div", { "data-testid": "rbdg-table-div", className: "table-responsive", children: mainTable })) : (_jsx(_Fragment, { children: mainTable })), normalizedModel && (_jsx(Pagination, { normalizedModel: normalizedModel, prePagingNumRows: sortedRows.length, containerDivClasses: unwrappedAdditionalStyleModel.paginationUiDiv }))] })] }));
56
+ };
57
+ export default InternalGrid;
@@ -0,0 +1,17 @@
1
+ import { CSSProperties, FC } from "react";
2
+ export interface EditControlsCellProps {
3
+ ariaColIndex: number;
4
+ beginEditingCallback: () => void;
5
+ cancelEditingCallback: () => void;
6
+ isEditing: boolean;
7
+ saveCallback: () => void;
8
+ deleteCallback?: () => void;
9
+ editControlsCellClasses: string[];
10
+ saveButtonClasses: string[];
11
+ deleteButtonClasses: string[];
12
+ startButtonClasses: string[];
13
+ cancelButtonClasses: string[];
14
+ style?: CSSProperties;
15
+ }
16
+ declare const EditControlsCell: FC<EditControlsCellProps>;
17
+ export default EditControlsCell;
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import classNames from "classnames";
3
+ var stopPropagationWrapper = function (fn) { return function (event) {
4
+ event.stopPropagation();
5
+ fn();
6
+ }; };
7
+ var EditControlsCell = function (_a) {
8
+ var ariaColIndex = _a.ariaColIndex, beginEditingCallback = _a.beginEditingCallback, cancelEditingCallback = _a.cancelEditingCallback, isEditing = _a.isEditing, saveCallback = _a.saveCallback, deleteCallback = _a.deleteCallback, editControlsCellClasses = _a.editControlsCellClasses, saveButtonClasses = _a.saveButtonClasses, deleteButtonClasses = _a.deleteButtonClasses, startButtonClasses = _a.startButtonClasses, cancelButtonClasses = _a.cancelButtonClasses;
9
+ return (_jsx("td", { "aria-colindex": ariaColIndex, className: classNames(editControlsCellClasses), children: _jsx("div", { className: "hstack gap-2", children: isEditing ? (_jsxs(_Fragment, { children: [_jsx("button", { "aria-label": "Cancel", className: classNames("btn", cancelButtonClasses.length === 0
10
+ ? ["btn-secondary"]
11
+ : cancelButtonClasses), onClick: stopPropagationWrapper(cancelEditingCallback), title: "Cancel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", fill: "currentColor", viewBox: "0 0 16 16", children: _jsx("path", { d: "M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M5.354 4.646a.5.5 0 1 0-.708.708L7.293 8l-2.647 2.646a.5.5 0 0 0 .708.708L8 8.707l2.646 2.647a.5.5 0 0 0 .708-.708L8.707 8l2.647-2.646a.5.5 0 0 0-.708-.708L8 7.293z" }) }) }), _jsx("button", { "aria-label": "Save", className: classNames("btn", saveButtonClasses.length === 0
12
+ ? ["btn-primary"]
13
+ : saveButtonClasses), onClick: stopPropagationWrapper(saveCallback), title: "Save", children: _jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", fill: "currentColor", viewBox: "0 0 16 16", children: [_jsx("path", { d: "M12 2h-2v3h2z" }), _jsx("path", { d: "M1.5 0A1.5 1.5 0 0 0 0 1.5v13A1.5 1.5 0 0 0 1.5 16h13a1.5 1.5 0 0 0 1.5-1.5V2.914a1.5 1.5 0 0 0-.44-1.06L14.147.439A1.5 1.5 0 0 0 13.086 0zM4 6a1 1 0 0 1-1-1V1h10v4a1 1 0 0 1-1 1zM3 9h10a1 1 0 0 1 1 1v5H2v-5a1 1 0 0 1 1-1" })] }) })] })) : (_jsxs(_Fragment, { children: [deleteCallback && (_jsx("button", { "aria-label": "Delete", className: classNames("btn", deleteButtonClasses.length === 0
14
+ ? ["btn-secondary"]
15
+ : deleteButtonClasses), onClick: stopPropagationWrapper(deleteCallback), title: "Delete", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", fill: "currentColor", viewBox: "0 0 16 16", children: _jsx("path", { d: "M2.5 1a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1H3v9a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V4h.5a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H10a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1zm3 4a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 .5-.5M8 5a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7A.5.5 0 0 1 8 5m3 .5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 1 0" }) }) })), _jsx("button", { "aria-label": "Edit", className: classNames("btn", startButtonClasses.length === 0
16
+ ? ["btn-primary"]
17
+ : startButtonClasses), onClick: stopPropagationWrapper(beginEditingCallback), title: "Edit", children: _jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", fill: "currentColor", viewBox: "0 0 16 16", children: [_jsx("path", { d: "M15.502 1.94a.5.5 0 0 1 0 .706L14.459 3.69l-2-2L13.502.646a.5.5 0 0 1 .707 0l1.293 1.293zm-1.75 2.456-2-2L4.939 9.21a.5.5 0 0 0-.121.196l-.805 2.414a.25.25 0 0 0 .316.316l2.414-.805a.5.5 0 0 0 .196-.12l6.813-6.814z" }), _jsx("path", { fillRule: "evenodd", d: "M1 13.5A1.5 1.5 0 0 0 2.5 15h11a1.5 1.5 0 0 0 1.5-1.5v-6a.5.5 0 0 0-1 0v6a.5.5 0 0 1-.5.5h-11a.5.5 0 0 1-.5-.5v-11a.5.5 0 0 1 .5-.5H9a.5.5 0 0 0 0-1H2.5A1.5 1.5 0 0 0 1 2.5z" })] }) })] })) }) }));
18
+ };
19
+ export default EditControlsCell;
@@ -0,0 +1,22 @@
1
+ import { CSSProperties, FC, ReactNode } from "react";
2
+ import { RowId } from "../types";
3
+ import React from "react";
4
+ import { CellData } from "./types";
5
+ export type EditableRowProps = Pick<React.ComponentProps<"tr">, "onClick" | "className" | "aria-rowindex" | "aria-selected"> & {
6
+ ariaColIndexOffset: number;
7
+ dataRowId: RowId;
8
+ children: ReactNode;
9
+ cellData: CellData[];
10
+ updateCallback?: (values: string[]) => void;
11
+ deleteCallback?: () => void;
12
+ dataCellClasses: (colIndex: number) => string[];
13
+ dataCellInputClasses: (colIndex: number) => string[];
14
+ editCellClasses: string[];
15
+ deleteButtonClasses: string[];
16
+ cancelButtonClasses: string[];
17
+ startButtonClasses: string[];
18
+ saveButtonClasses: string[];
19
+ editControlCellStyles?: CSSProperties;
20
+ };
21
+ declare const EditableRow: FC<EditableRowProps>;
22
+ export default EditableRow;
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useRef, useState } from "react";
4
+ import { dateToDatetimeInputStr, dateToInputStr } from "../util/datetime";
5
+ import EditControlsCell from "./EditControlsCell";
6
+ import classNames from "classnames";
7
+ import getWidthStyle from "../util/getWidthStyle";
8
+ var initValueToFormValue = function (value, type) {
9
+ switch (type) {
10
+ case "date":
11
+ return dateToInputStr(value);
12
+ case "datetime":
13
+ return dateToDatetimeInputStr(value);
14
+ case "number":
15
+ return String(value);
16
+ default:
17
+ return value;
18
+ }
19
+ };
20
+ var colDataTypeToInputType = function (colDataType) {
21
+ switch (colDataType) {
22
+ case "date":
23
+ return "date";
24
+ case "datetime":
25
+ return "datetime-local";
26
+ case "number":
27
+ return "number";
28
+ default:
29
+ return "text";
30
+ }
31
+ };
32
+ var EditableRow = function (_a) {
33
+ var ariaColIndexOffset = _a.ariaColIndexOffset, cellData = _a.cellData, children = _a.children, updateCallback = _a.updateCallback, deleteCallback = _a.deleteCallback, onClick = _a.onClick, className = _a.className, ariaRowIndex = _a["aria-rowindex"], ariaSelected = _a["aria-selected"], dataRowId = _a.dataRowId, dataCellClasses = _a.dataCellClasses, dataCellInputClasses = _a.dataCellInputClasses, editCellClasses = _a.editCellClasses, saveButtonClasses = _a.saveButtonClasses, startButtonClasses = _a.startButtonClasses, cancelButtonClasses = _a.cancelButtonClasses, deleteButtonClasses = _a.deleteButtonClasses, editControlCellStyles = _a.editControlCellStyles;
34
+ var trRef = useRef(null);
35
+ var _b = useState(false), isEditing = _b[0], setIsEditing = _b[1];
36
+ var handleSave = function () {
37
+ var failedValidationFound = false;
38
+ var formValues = [];
39
+ for (var _i = 0, _a = Array.from(trRef.current.children); _i < _a.length; _i++) {
40
+ var rowChild = _a[_i];
41
+ if (!(rowChild instanceof HTMLTableCellElement)) {
42
+ console.warn("Found non-td element inside EditableRow");
43
+ continue;
44
+ }
45
+ for (var _b = 0, _c = Array.from(rowChild.children); _b < _c.length; _b++) {
46
+ var cellChild = _c[_b];
47
+ if (!(cellChild instanceof HTMLInputElement) ||
48
+ cellChild.type === "checkbox" ||
49
+ cellChild.type === "radio") {
50
+ continue;
51
+ }
52
+ formValues.push(cellChild.value);
53
+ failedValidationFound =
54
+ !cellChild.reportValidity() || failedValidationFound;
55
+ break; // Each cell should only have one input element
56
+ }
57
+ }
58
+ if (!failedValidationFound) {
59
+ updateCallback(formValues);
60
+ setIsEditing(false);
61
+ }
62
+ };
63
+ return (_jsxs("tr", { ref: trRef, onClick: onClick, className: className, "aria-rowindex": ariaRowIndex, "aria-selected": ariaSelected, "data-rowid": dataRowId, children: [children, cellData.map(function (_a, index) {
64
+ var type = _a.type, value = _a.value, formattedValue = _a.formattedValue, label = _a.label, width = _a.width;
65
+ return (_jsx("td", { "aria-colindex": index + ariaColIndexOffset + 1, className: classNames(dataCellClasses(index)), style: getWidthStyle(width), children: isEditing && !!updateCallback ? (_jsx("input", { "aria-label": label, name: "editable-cell-input-".concat(dataRowId, "-").concat(index), className: classNames("form-control", dataCellInputClasses(index)), type: colDataTypeToInputType(type), defaultValue: initValueToFormValue(value, type), required: type !== "string" })) : (formattedValue) }, index));
66
+ }), updateCallback && (_jsx(EditControlsCell, { ariaColIndex: ariaColIndexOffset + cellData.length + 1, beginEditingCallback: function () { return setIsEditing(true); }, cancelEditingCallback: function () { return setIsEditing(false); }, isEditing: isEditing, saveCallback: handleSave, deleteCallback: deleteCallback, editControlsCellClasses: editCellClasses, startButtonClasses: startButtonClasses, deleteButtonClasses: deleteButtonClasses, cancelButtonClasses: cancelButtonClasses, saveButtonClasses: saveButtonClasses, style: editControlCellStyles }))] }));
67
+ };
68
+ export default EditableRow;
@@ -0,0 +1,3 @@
1
+ import { ColDefBase, RowData } from "../types";
2
+ declare const inputStrsToRowData: (cols: ColDefBase[], inputStrs: string[]) => RowData;
3
+ export default inputStrsToRowData;
@@ -0,0 +1,18 @@
1
+ var inputStrsToRowData = function (cols, inputStrs) {
2
+ var newRow = {};
3
+ inputStrs.forEach(function (value, index) {
4
+ var col = cols[index];
5
+ switch (col.type) {
6
+ case "string":
7
+ newRow[col.name] = value;
8
+ return;
9
+ case "number":
10
+ newRow[col.name] = Number(value);
11
+ return;
12
+ default:
13
+ newRow[col.name] = new Date(value);
14
+ }
15
+ });
16
+ return newRow;
17
+ };
18
+ export default inputStrsToRowData;
@@ -0,0 +1,16 @@
1
+ import { ColDataType, ColDataTypeStrings, RowData, RowId } from "../types";
2
+ export interface CellData {
3
+ fieldName: string;
4
+ value: ColDataType;
5
+ type: ColDataTypeStrings;
6
+ ariaColIndex: number;
7
+ formattedValue: string;
8
+ label: string;
9
+ width?: number;
10
+ }
11
+ export type UpdateCallbackGenerator = (id: RowId) => (rowData: RowData) => void;
12
+ export interface EditModel {
13
+ getUpdateCallback: UpdateCallbackGenerator;
14
+ getDeleteCallback?: (id: RowId) => () => void;
15
+ editColWidth?: number;
16
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import { ExportFnInfo } from "./useExportFn";
2
+ import { FC } from "react";
3
+ import { ExportFormStyleModel } from "../styling/types";
4
+ export interface ExportFormProps {
5
+ exportFnInfo: ExportFnInfo;
6
+ styleModel?: ExportFormStyleModel;
7
+ }
8
+ declare const ExportForm: FC<ExportFormProps>;
9
+ export default ExportForm;
@@ -0,0 +1,97 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useId, useState } from "react";
14
+ import classNames from "classnames";
15
+ var ExportForm = function (_a) {
16
+ var _b = _a.exportFnInfo, exportFn = _b.exportFn, formattersExist = _b.formattersExist, paginationEnabled = _b.paginationEnabled, filteringEnabled = _b.filteringEnabled, rowCounts = _b.rowCounts, styleModel = _a.styleModel;
17
+ var formId = useId();
18
+ var _c = useState({
19
+ stage: "original",
20
+ formatted: false,
21
+ fileType: "json",
22
+ }), formState = _c[0], setFormState = _c[1];
23
+ var getChangeHandler = function (field, value) {
24
+ return function () {
25
+ setFormState(function (prev) {
26
+ var _a;
27
+ return (__assign(__assign({}, prev), (_a = {}, _a[field] = value, _a)));
28
+ });
29
+ };
30
+ };
31
+ var getRowCountLabel = function (featureType, count) {
32
+ if (count === undefined) {
33
+ return "".concat(featureType, " disabled");
34
+ }
35
+ return "".concat(count, " ").concat(count === 1 ? "row" : "rows");
36
+ };
37
+ var stageOptions = [
38
+ {
39
+ value: "original",
40
+ label: "Original rows (total ".concat(rowCounts.total, " ").concat(rowCounts.total === 1 ? "row" : "rows", ")"),
41
+ disabled: false,
42
+ },
43
+ {
44
+ value: "filtered",
45
+ label: "After filters applied (".concat(getRowCountLabel("filtering", rowCounts.filtered), ")"),
46
+ disabled: !filteringEnabled,
47
+ },
48
+ {
49
+ value: "paged",
50
+ label: "Current page only (".concat(getRowCountLabel("pagination", rowCounts.currentPage), ")"),
51
+ disabled: !paginationEnabled,
52
+ },
53
+ ];
54
+ var formatOptions = [
55
+ {
56
+ formatted: false,
57
+ label: "Use original data",
58
+ disabled: false,
59
+ },
60
+ {
61
+ formatted: true,
62
+ label: "Apply formatters to data".concat(formattersExist ? "" : " (no formatters defined)"),
63
+ disabled: !formattersExist,
64
+ },
65
+ ];
66
+ var fileTypeOptions = [
67
+ {
68
+ fileType: "json",
69
+ label: "JSON",
70
+ },
71
+ {
72
+ fileType: "csv",
73
+ label: "CSV",
74
+ },
75
+ ];
76
+ var handleSubmit = function (event) {
77
+ event.preventDefault();
78
+ var stage = formState.stage, fileType = formState.fileType, formatted = formState.formatted;
79
+ exportFn(stage, fileType, formatted);
80
+ };
81
+ var legendClasses = classNames((styleModel === null || styleModel === void 0 ? void 0 : styleModel.legend) || []);
82
+ var radioContainerClasses = classNames((styleModel === null || styleModel === void 0 ? void 0 : styleModel.radioContainer) || ["form-check"]);
83
+ var radioInputClasses = classNames((styleModel === null || styleModel === void 0 ? void 0 : styleModel.radioInput) || ["form-check-input"]);
84
+ var radioLabelClasses = classNames((styleModel === null || styleModel === void 0 ? void 0 : styleModel.radioLabel) || ["form-check-label"]);
85
+ var submitButtonClasses = classNames((styleModel === null || styleModel === void 0 ? void 0 : styleModel.submitButton) || ["btn", "btn-secondary"]);
86
+ return (_jsxs("form", { onSubmit: handleSubmit, children: [_jsxs("fieldset", { children: [_jsx("legend", { className: legendClasses, children: "Choose data to export" }), stageOptions.map(function (_a) {
87
+ var value = _a.value, label = _a.label, disabled = _a.disabled;
88
+ return (_jsxs("div", { className: radioContainerClasses, children: [_jsx("input", { className: radioInputClasses, type: "radio", id: "".concat(formId, "-").concat(value), value: value, checked: formState.stage === value, onChange: getChangeHandler("stage", value), disabled: disabled }), _jsx("label", { className: radioLabelClasses, htmlFor: "".concat(formId, "-").concat(value), children: label })] }, value));
89
+ })] }), _jsxs("fieldset", { children: [_jsx("legend", { className: legendClasses, children: "Choose whether to apply formatters" }), formatOptions.map(function (_a) {
90
+ var formatted = _a.formatted, label = _a.label, disabled = _a.disabled;
91
+ return (_jsxs("div", { className: radioContainerClasses, children: [_jsx("input", { className: radioInputClasses, type: "radio", id: "".concat(formId, "-").concat(formatted), value: String(formatted), checked: formState.formatted === formatted, onChange: getChangeHandler("formatted", formatted), disabled: disabled }), _jsx("label", { className: radioLabelClasses, htmlFor: "".concat(formId, "-").concat(formatted), children: label })] }, String(formatted)));
92
+ })] }), _jsxs("fieldset", { children: [_jsx("legend", { className: legendClasses, children: "Choose the file type" }), fileTypeOptions.map(function (_a) {
93
+ var fileType = _a.fileType, label = _a.label;
94
+ return (_jsxs("div", { className: radioContainerClasses, children: [_jsx("input", { className: radioInputClasses, type: "radio", id: "".concat(formId, "-").concat(fileType), value: fileType, checked: formState.fileType === fileType, onChange: getChangeHandler("fileType", fileType) }), _jsx("label", { className: radioLabelClasses, htmlFor: "".concat(formId, "-").concat(fileType), children: label })] }, fileType));
95
+ })] }), _jsx("button", { type: "submit", className: submitButtonClasses, children: "Submit" })] }));
96
+ };
97
+ export default ExportForm;
@@ -0,0 +1,5 @@
1
+ import { RowId } from "../types";
2
+ export type FormattedExportRow = {
3
+ id: RowId;
4
+ data: Record<string, string | number>;
5
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { ColDef, RowDef } from "../types";
2
+ export interface UseExportFnsParams {
3
+ rows: RowDef[];
4
+ cols: ColDef[];
5
+ filteredRows?: RowDef[];
6
+ currentPageRows?: RowDef[];
7
+ }
8
+ export type Stage = "original" | "filtered" | "paged";
9
+ export type FileType = "csv" | "json";
10
+ export type ExportFn = (stage: Stage, fileType: FileType, formatted: boolean) => void;
11
+ export interface ExportFnInfo {
12
+ exportFn: ExportFn;
13
+ formattersExist: boolean;
14
+ filteringEnabled: boolean;
15
+ paginationEnabled: boolean;
16
+ rowCounts: {
17
+ total: number;
18
+ filtered?: number;
19
+ currentPage?: number;
20
+ };
21
+ }
22
+ declare const useExportFn: (params: UseExportFnsParams) => ExportFnInfo;
23
+ export default useExportFn;
@@ -0,0 +1,115 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { dateToDatetimeInputStr, dateToInputStr } from "../util/datetime";
13
+ import Papa from "papaparse";
14
+ import { useCallback, useMemo } from "react";
15
+ var downloadFile = function (data, filename, type) {
16
+ var blob = new Blob([data], { type: type });
17
+ var url = URL.createObjectURL(blob);
18
+ var a = document.createElement("a");
19
+ a.href = url;
20
+ a.download = filename;
21
+ a.click();
22
+ a.remove();
23
+ setTimeout(function () { return URL.revokeObjectURL(url); }, 0);
24
+ };
25
+ var getDefaultFormatter = function (type) {
26
+ switch (type) {
27
+ case "date":
28
+ return dateToInputStr;
29
+ case "datetime":
30
+ return dateToDatetimeInputStr;
31
+ default:
32
+ return function (a) { return a; };
33
+ }
34
+ };
35
+ var applyFormatters = function (rows, cols, defaultOnly) {
36
+ var colToFormatter = cols.reduce(function (map, _a) {
37
+ var name = _a.name, formatter = _a.formatter, type = _a.type;
38
+ var normalizedFormatter = (!defaultOnly && formatter) || getDefaultFormatter(type);
39
+ map.set(name, normalizedFormatter);
40
+ return map;
41
+ }, new Map());
42
+ return rows.map(function (_a) {
43
+ var id = _a.id, data = _a.data;
44
+ return ({
45
+ id: id,
46
+ data: Object.keys(data).reduce(function (newData, name) {
47
+ var formatter = colToFormatter.get(name);
48
+ newData[name] = formatter(data[name]);
49
+ return newData;
50
+ }, {}),
51
+ });
52
+ });
53
+ };
54
+ var flattenExportRows = function (rows) {
55
+ return rows.map(function (_a) {
56
+ var id = _a.id, data = _a.data;
57
+ return (__assign({ id: id }, data));
58
+ });
59
+ };
60
+ var exportJson = function (rows, cols, useDefaultFormatters) {
61
+ var formattedRows = applyFormatters(rows, cols, useDefaultFormatters);
62
+ var json = JSON.stringify(formattedRows, null, 2);
63
+ downloadFile(json, "export.json", "application/json");
64
+ };
65
+ var exportCsv = function (rows, cols, useDefaultFormatters) {
66
+ var formattedRows = applyFormatters(rows, cols, useDefaultFormatters);
67
+ var flattenedRows = flattenExportRows(formattedRows);
68
+ var csv = Papa.unparse(flattenedRows, { header: true });
69
+ downloadFile(csv, "export.csv", "text/csv");
70
+ };
71
+ var useExportFn = function (_a) {
72
+ var rows = _a.rows, cols = _a.cols, filteredRows = _a.filteredRows, currentPageRows = _a.currentPageRows;
73
+ var formattersExist = useMemo(function () { return cols.reduce(function (prev, _a) {
74
+ var formatter = _a.formatter;
75
+ return prev || !!formatter;
76
+ }, false); }, [cols]);
77
+ var exportFn = useCallback(function (stage, fileType, formatted) {
78
+ if (stage === "filtered" && !filteredRows) {
79
+ throw Error("Cannot export filtered rows because filtering is not enabled for this grid");
80
+ }
81
+ if (stage === "paged" && !currentPageRows) {
82
+ throw Error("Cannot export current page of rows because paging is not enabled for this grid");
83
+ }
84
+ if (formatted && !formattersExist) {
85
+ throw Error("Cannot export formatted rows because formatters are not defined for this grid");
86
+ }
87
+ var exportRows = (function () {
88
+ switch (stage) {
89
+ case "filtered":
90
+ return filteredRows;
91
+ case "paged":
92
+ return currentPageRows;
93
+ default:
94
+ return rows;
95
+ }
96
+ })();
97
+ if (fileType === "csv") {
98
+ exportCsv(exportRows, cols, !formatted);
99
+ return;
100
+ }
101
+ exportJson(exportRows, cols, !formatted);
102
+ }, [cols, currentPageRows, filteredRows, formattersExist, rows]);
103
+ return useMemo(function () { return ({
104
+ exportFn: exportFn,
105
+ formattersExist: formattersExist,
106
+ paginationEnabled: !!currentPageRows,
107
+ filteringEnabled: !!filteredRows,
108
+ rowCounts: {
109
+ total: rows.length,
110
+ filtered: filteredRows === null || filteredRows === void 0 ? void 0 : filteredRows.length,
111
+ currentPage: currentPageRows === null || currentPageRows === void 0 ? void 0 : currentPageRows.length,
112
+ },
113
+ }); }, [currentPageRows, exportFn, filteredRows, formattersExist, rows.length]);
114
+ };
115
+ export default useExportFn;
@@ -0,0 +1,16 @@
1
+ import { FC } from "react";
2
+ import { DateFormFilterState } from "./types";
3
+ import { CommonFilterRowStyleProps } from "./FilterRow";
4
+ export type DateFilterRowProps = {
5
+ ariaRowIndex: number;
6
+ includeTime: boolean;
7
+ columnLabel: string;
8
+ filterState: DateFormFilterState;
9
+ setFilterState: (filterState: DateFormFilterState) => void;
10
+ schemeSelectClasses: string[];
11
+ enableInputClasses: string[];
12
+ startDateInputClasses: string[];
13
+ endDateInputClasses: string[];
14
+ } & CommonFilterRowStyleProps;
15
+ declare const DateFilterRow: FC<DateFilterRowProps>;
16
+ export default DateFilterRow;