@databiosphere/findable-ui 18.0.0 → 19.0.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 (180) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/CHANGELOG.md +11 -0
  3. package/lib/components/Detail/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.js +2 -0
  4. package/lib/components/Detail/components/Table/components/TableRows/tableRows.js +1 -15
  5. package/lib/components/Export/components/ExportForm/components/ExportFileSummaryForm/exportFileSummaryForm.js +9 -10
  6. package/lib/components/Links/components/Link/components/ExploreViewLink/exploreViewLink.js +23 -12
  7. package/lib/components/Table/common/columnDef.js +1 -0
  8. package/lib/components/Table/common/gridTable.styles.js +5 -11
  9. package/lib/components/Table/common/utils.d.ts +3 -29
  10. package/lib/components/Table/common/utils.js +25 -60
  11. package/lib/components/Table/components/TableBody/hooks/virtualizer/constants.d.ts +3 -0
  12. package/lib/components/Table/components/TableBody/hooks/virtualizer/constants.js +3 -0
  13. package/lib/components/Table/components/TableBody/hooks/virtualizer/hook.d.ts +8 -0
  14. package/lib/components/Table/components/TableBody/hooks/virtualizer/hook.js +18 -0
  15. package/lib/components/Table/components/TableBody/hooks/virtualizer/types.d.ts +4 -0
  16. package/lib/components/Table/components/TableBody/tableBody.d.ts +3 -2
  17. package/lib/components/Table/components/TableBody/tableBody.js +7 -28
  18. package/lib/components/Table/components/TableBody/utils.d.ts +12 -0
  19. package/lib/components/Table/components/TableBody/utils.js +17 -0
  20. package/lib/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.d.ts +3 -1
  21. package/lib/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.js +6 -14
  22. package/lib/components/Table/components/TableFeatures/ColumnGrouping/utils.d.ts +28 -0
  23. package/lib/components/Table/components/TableFeatures/ColumnGrouping/utils.js +52 -0
  24. package/lib/components/Table/components/TableFeatures/ColumnVisibility/utils.d.ts +21 -0
  25. package/lib/components/Table/components/TableFeatures/ColumnVisibility/utils.js +37 -0
  26. package/lib/components/Table/components/TableFeatures/RowSorting/utils.d.ts +29 -0
  27. package/lib/components/Table/components/TableFeatures/RowSorting/utils.js +68 -0
  28. package/lib/components/Table/components/TableHead/tableHead.d.ts +2 -6
  29. package/lib/components/Table/components/TableHead/tableHead.js +6 -4
  30. package/lib/components/Table/components/TableHead/types.d.ts +6 -0
  31. package/lib/components/Table/components/TableHead/types.js +1 -0
  32. package/lib/components/Table/components/TableHead/utils.d.ts +19 -0
  33. package/lib/components/Table/components/TableHead/utils.js +34 -0
  34. package/lib/components/Table/components/TableRow/tableRow.styles.d.ts +1 -0
  35. package/lib/components/Table/components/TableRow/tableRow.styles.js +14 -2
  36. package/lib/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.d.ts +3 -2
  37. package/lib/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.js +8 -4
  38. package/lib/components/Table/components/TableRows/components/CollapsableRows/hook.d.ts +9 -0
  39. package/lib/components/Table/components/TableRows/components/CollapsableRows/hook.js +17 -0
  40. package/lib/components/Table/components/TableRows/tableRows.d.ts +3 -3
  41. package/lib/components/Table/components/TableRows/tableRows.js +9 -5
  42. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.d.ts +3 -0
  43. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.js +26 -0
  44. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.styles.d.ts +2 -0
  45. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.styles.js +16 -0
  46. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/menuItems.d.ts +3 -0
  47. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/menuItems.js +12 -0
  48. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/types.d.ts +7 -0
  49. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/types.js +1 -0
  50. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/constants.d.ts +4 -0
  51. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/constants.js +13 -0
  52. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/types.d.ts +4 -0
  53. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/types.js +1 -0
  54. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/utils.d.ts +17 -0
  55. package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/utils.js +36 -0
  56. package/lib/components/Table/components/TableToolbar/components/RowSelection/components/DropdownMenu/dropdownMenu.d.ts +2 -3
  57. package/lib/components/Table/components/TableToolbar/components/RowSelection/components/DropdownMenu/dropdownMenu.js +3 -11
  58. package/lib/components/Table/components/TableToolbar/tableToolbar.js +4 -2
  59. package/lib/components/Table/features/RowPosition/constants.js +2 -2
  60. package/lib/components/Table/features/RowPosition/utils.d.ts +2 -2
  61. package/lib/components/Table/features/RowPosition/utils.js +12 -5
  62. package/lib/components/Table/options/updater.d.ts +10 -0
  63. package/lib/components/Table/options/updater.js +24 -0
  64. package/lib/components/Table/table.js +22 -17
  65. package/lib/components/TableCreator/common/constants.d.ts +2 -2
  66. package/lib/components/TableCreator/common/constants.js +2 -1
  67. package/lib/components/TableCreator/common/utils.d.ts +5 -2
  68. package/lib/components/TableCreator/common/utils.js +11 -4
  69. package/lib/components/TableCreator/options/expanded/constants.d.ts +2 -0
  70. package/lib/components/TableCreator/options/expanded/constants.js +6 -0
  71. package/lib/components/TableCreator/options/expanded/hook.d.ts +2 -0
  72. package/lib/components/TableCreator/options/expanded/hook.js +4 -0
  73. package/lib/components/TableCreator/options/grouping/constants.d.ts +2 -0
  74. package/lib/components/TableCreator/options/grouping/constants.js +5 -0
  75. package/lib/components/TableCreator/options/grouping/hook.d.ts +2 -0
  76. package/lib/components/TableCreator/options/grouping/hook.js +9 -0
  77. package/lib/components/TableCreator/options/hook.d.ts +2 -0
  78. package/lib/components/TableCreator/options/hook.js +25 -0
  79. package/lib/components/TableCreator/options/rowSelection/constants.d.ts +2 -0
  80. package/lib/components/TableCreator/options/rowSelection/constants.js +5 -0
  81. package/lib/components/TableCreator/options/rowSelection/hook.d.ts +2 -0
  82. package/lib/components/TableCreator/options/rowSelection/hook.js +4 -0
  83. package/lib/components/TableCreator/options/sorting/constants.d.ts +2 -0
  84. package/lib/components/TableCreator/options/sorting/constants.js +5 -0
  85. package/lib/components/TableCreator/options/sorting/hook.d.ts +2 -0
  86. package/lib/components/TableCreator/options/sorting/hook.js +4 -0
  87. package/lib/components/TableCreator/tableCreator.d.ts +3 -5
  88. package/lib/components/TableCreator/tableCreator.js +4 -2
  89. package/lib/components/common/DropdownMenu/dropdownMenu.d.ts +2 -3
  90. package/lib/components/common/DropdownMenu/dropdownMenu.js +7 -7
  91. package/lib/components/common/DropdownMenu/dropdownMenu.styles.d.ts +1 -1
  92. package/lib/components/common/DropdownMenu/dropdownMenu.styles.js +1 -1
  93. package/lib/components/common/Menu/hooks/useMenu.d.ts +5 -6
  94. package/lib/config/entities.d.ts +6 -6
  95. package/lib/config/utils.d.ts +0 -7
  96. package/lib/config/utils.js +0 -12
  97. package/lib/providers/exploreState/actions/updateGrouping/action.d.ts +10 -0
  98. package/lib/providers/exploreState/actions/updateGrouping/action.js +16 -0
  99. package/lib/providers/exploreState/actions/updateGrouping/dispatch.d.ts +7 -0
  100. package/lib/providers/exploreState/actions/updateGrouping/dispatch.js +12 -0
  101. package/lib/providers/exploreState/actions/updateGrouping/types.d.ts +9 -0
  102. package/lib/providers/exploreState/actions/updateGrouping/types.js +1 -0
  103. package/lib/providers/exploreState/actions/updateGrouping/utils.d.ts +10 -0
  104. package/lib/providers/exploreState/actions/updateGrouping/utils.js +26 -0
  105. package/lib/providers/exploreState/entities.d.ts +3 -4
  106. package/lib/providers/exploreState/initializer/utils.js +41 -8
  107. package/lib/providers/exploreState/payloads/entities.d.ts +2 -1
  108. package/lib/providers/exploreState/utils.d.ts +6 -4
  109. package/lib/providers/exploreState/utils.js +7 -4
  110. package/lib/providers/exploreState.d.ts +3 -1
  111. package/lib/providers/exploreState.js +15 -5
  112. package/lib/views/ExploreView/exploreView.js +2 -2
  113. package/package.json +1 -1
  114. package/src/components/Detail/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.tsx +2 -0
  115. package/src/components/Detail/components/Table/components/TableRows/tableRows.tsx +3 -18
  116. package/src/components/Export/components/ExportForm/components/ExportFileSummaryForm/exportFileSummaryForm.tsx +28 -32
  117. package/src/components/Links/components/Link/components/ExploreViewLink/exploreViewLink.tsx +27 -13
  118. package/src/components/Table/common/columnDef.ts +1 -0
  119. package/src/components/Table/common/gridTable.styles.ts +5 -11
  120. package/src/components/Table/common/utils.ts +44 -107
  121. package/src/components/Table/components/TableBody/hooks/virtualizer/constants.ts +3 -0
  122. package/src/components/Table/components/TableBody/hooks/virtualizer/hook.ts +23 -0
  123. package/src/components/Table/components/TableBody/hooks/virtualizer/types.ts +5 -0
  124. package/src/components/Table/components/TableBody/tableBody.tsx +14 -30
  125. package/src/components/Table/components/TableBody/utils.ts +21 -0
  126. package/src/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.tsx +14 -15
  127. package/src/components/Table/components/TableFeatures/ColumnGrouping/utils.ts +70 -0
  128. package/src/components/Table/components/TableFeatures/ColumnVisibility/utils.ts +52 -0
  129. package/src/components/Table/components/TableFeatures/RowSorting/utils.ts +87 -0
  130. package/src/components/Table/components/TableHead/tableHead.tsx +21 -29
  131. package/src/components/Table/components/TableHead/types.ts +7 -0
  132. package/src/components/Table/components/TableHead/utils.ts +42 -0
  133. package/src/components/Table/components/TableRow/tableRow.styles.ts +19 -2
  134. package/src/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.tsx +8 -2
  135. package/src/components/Table/components/TableRows/components/CollapsableRows/hook.ts +20 -0
  136. package/src/components/Table/components/TableRows/tableRows.tsx +18 -15
  137. package/src/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.styles.ts +17 -0
  138. package/src/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.tsx +54 -0
  139. package/src/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/menuItems.tsx +28 -0
  140. package/src/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/types.ts +8 -0
  141. package/src/components/Table/components/TableToolbar/components/ColumnGrouping/constants.ts +17 -0
  142. package/src/components/Table/components/TableToolbar/components/ColumnGrouping/types.ts +5 -0
  143. package/src/components/Table/components/TableToolbar/components/ColumnGrouping/utils.ts +45 -0
  144. package/src/components/Table/components/TableToolbar/components/RowSelection/components/DropdownMenu/dropdownMenu.tsx +7 -20
  145. package/src/components/Table/components/TableToolbar/tableToolbar.tsx +8 -2
  146. package/src/components/Table/features/RowPosition/constants.ts +2 -2
  147. package/src/components/Table/features/RowPosition/utils.ts +10 -5
  148. package/src/components/Table/options/updater.ts +29 -0
  149. package/src/components/Table/table.tsx +43 -25
  150. package/src/components/TableCreator/common/constants.ts +4 -6
  151. package/src/components/TableCreator/common/utils.ts +14 -7
  152. package/src/components/TableCreator/options/expanded/constants.ts +14 -0
  153. package/src/components/TableCreator/options/expanded/hook.ts +6 -0
  154. package/src/components/TableCreator/options/grouping/constants.ts +6 -0
  155. package/src/components/TableCreator/options/grouping/hook.ts +17 -0
  156. package/src/components/TableCreator/options/hook.ts +31 -0
  157. package/src/components/TableCreator/options/rowSelection/constants.ts +10 -0
  158. package/src/components/TableCreator/options/rowSelection/hook.ts +8 -0
  159. package/src/components/TableCreator/options/sorting/constants.ts +10 -0
  160. package/src/components/TableCreator/options/sorting/hook.ts +6 -0
  161. package/src/components/TableCreator/tableCreator.tsx +4 -11
  162. package/src/components/common/DropdownMenu/dropdownMenu.styles.ts +1 -1
  163. package/src/components/common/DropdownMenu/dropdownMenu.tsx +19 -17
  164. package/src/components/common/Menu/hooks/useMenu.ts +8 -9
  165. package/src/config/entities.ts +10 -9
  166. package/src/config/utils.ts +0 -14
  167. package/src/providers/exploreState/actions/updateGrouping/action.ts +26 -0
  168. package/src/providers/exploreState/actions/updateGrouping/dispatch.ts +16 -0
  169. package/src/providers/exploreState/actions/updateGrouping/types.ts +11 -0
  170. package/src/providers/exploreState/actions/updateGrouping/utils.ts +33 -0
  171. package/src/providers/exploreState/entities.ts +3 -3
  172. package/src/providers/exploreState/initializer/utils.ts +58 -10
  173. package/src/providers/exploreState/payloads/entities.ts +2 -0
  174. package/src/providers/exploreState/utils.ts +10 -7
  175. package/src/providers/exploreState.tsx +29 -6
  176. package/src/views/ExploreView/exploreView.tsx +1 -3
  177. package/types/data-explorer-ui.d.ts +8 -1
  178. package/lib/components/TableCreator/common/entities.d.ts +0 -5
  179. package/src/components/TableCreator/common/entities.ts +0 -6
  180. /package/lib/components/{TableCreator/common/entities.js → Table/components/TableBody/hooks/virtualizer/types.js} +0 -0
@@ -23,9 +23,9 @@ export const ROW_POSITION: TableFeature = {
23
23
  };
24
24
  },
25
25
  createTable: <T extends RowData>(table: Table<T>): void => {
26
- const originalGetRowModel = table.getRowModel.bind(table);
27
26
  table.getRowModel = (): RowModel<T> => {
28
- return getRowModel(table, originalGetRowModel);
27
+ const rowModel = table.getPaginationRowModel();
28
+ return getRowModel(table, rowModel);
29
29
  };
30
30
  },
31
31
  getInitialState: (initialState?: InitialTableState): Partial<TableState> => {
@@ -11,17 +11,21 @@ import { DEFAULT_PAGINATION } from "../constants";
11
11
  /**
12
12
  * Returns row model, with getter for row position.
13
13
  * @param table - Table.
14
- * @param getRowModel - Table getRowModel function.
14
+ * @param rowModel - Row model.
15
15
  * @returns row model.
16
16
  */
17
17
  export function getRowModel<T extends RowData>(
18
18
  table: Table<T>,
19
- getRowModel: Table<T>[`getRowModel`]
19
+ rowModel: RowModel<T>
20
20
  ): RowModel<T> {
21
- const rowModel = getRowModel();
22
- rowModel.rows.forEach(({ id }, i) => {
21
+ let i = 0;
22
+ rowModel.flatRows.forEach(({ getIsGrouped, id }) => {
23
+ const isGroupedRow = getIsGrouped();
24
+ const index = isGroupedRow ? -1 : i; // Capture the current value of i for this iteration.
23
25
  rowModel.rowsById[id].getRowPosition = (): number =>
24
- calculateRowPosition(table, i);
26
+ calculateRowPosition(table, index);
27
+ if (isGroupedRow) return; // Iterate only for non-grouped rows.
28
+ i++;
25
29
  });
26
30
  return rowModel;
27
31
  }
@@ -51,6 +55,7 @@ function calculateRowPosition<T extends RowData>(
51
55
  table: Table<T>,
52
56
  index: number
53
57
  ): number {
58
+ if (index < 0) return index; // Grouped rows have a position of -1.
54
59
  const { getState } = table;
55
60
  const {
56
61
  pagination: { pageIndex, pageSize },
@@ -0,0 +1,29 @@
1
+ import { Updater } from "@tanstack/react-table";
2
+
3
+ /**
4
+ * Type guard to check if the given value is TanStack's updater function.
5
+ * TanStack updater can either be a function that computes the new value based on the old value,
6
+ * or a direct value. This type guard identifies whether the provided updater is a function.
7
+ * @param updaterOrValue - The value to check.
8
+ * @returns True if the value is a function, false otherwise.
9
+ */
10
+ function isUpdaterFunction<T>(
11
+ updaterOrValue: Updater<T>
12
+ ): updaterOrValue is (old: T) => T {
13
+ return typeof updaterOrValue === "function";
14
+ }
15
+
16
+ /**
17
+ * Utility function to resolve TanStack updater into a new value.
18
+ * If the updater is a function, it is called with the `old` value to compute the new value.
19
+ * If the updater is not a function, it is returned as-is.
20
+ * @param updaterOrValue - The updater, either a function or a direct value.
21
+ * @param old - The (old) value.
22
+ * @returns Resolved value.
23
+ */
24
+ export function resolveUpdater<T>(updaterOrValue: Updater<T>, old: T): T {
25
+ if (isUpdaterFunction(updaterOrValue)) {
26
+ return updaterOrValue(old);
27
+ }
28
+ return updaterOrValue;
29
+ }
@@ -16,7 +16,7 @@ import {
16
16
  useReactTable,
17
17
  VisibilityState,
18
18
  } from "@tanstack/react-table";
19
- import React, { useEffect, useMemo } from "react";
19
+ import React, { useCallback, useEffect, useMemo } from "react";
20
20
  import { track } from "../../common/analytics/analytics";
21
21
  import {
22
22
  EVENT_NAME,
@@ -98,8 +98,13 @@ TableProps<T>): JSX.Element => {
98
98
  rowPreview,
99
99
  tabValue,
100
100
  } = exploreState;
101
- const { columnsVisibility, enableRowSelection, rowSelection, sorting } =
102
- entityPageState[tabValue];
101
+ const {
102
+ columnsVisibility,
103
+ enableRowSelection,
104
+ grouping,
105
+ rowSelection,
106
+ sorting,
107
+ } = entityPageState[tabValue];
103
108
  const { currentPage, pages, pageSize, rows: pageCount } = paginationState;
104
109
  const { disablePagination = false, enableRowPreview = false } =
105
110
  listView || {};
@@ -113,15 +118,19 @@ TableProps<T>): JSX.Element => {
113
118
  );
114
119
 
115
120
  const onSortingChange = (updater: Updater<ColumnSort[]>): void => {
121
+ // TODO(cc) memoize `onSortingChange` with `useCallback`.
122
+ // TODO(cc) copy `onSortingChange` to ../options/sorting/hook.ts see src/components/Table/options/grouping/hook.ts for example.
116
123
  exploreDispatch({
117
124
  payload: typeof updater === "function" ? updater(sorting) : updater,
118
125
  type: ExploreActionKind.UpdateSorting,
119
126
  });
120
127
  // Execute GTM tracking.
128
+ // TODO(cc) update tracking to handle sorting of multiple columns.
129
+ // TODO(cc) GTM tracking when `onSortingChange` is triggered only tracks the first column sorted, and takes the value from explore state which is not updated yet.
121
130
  track(EVENT_NAME.ENTITY_TABLE_SORTED, {
122
131
  [EVENT_PARAM.ENTITY_NAME]: exploreState.tabValue,
123
- [EVENT_PARAM.COLUMN_NAME]: sorting[0].id,
124
- [EVENT_PARAM.SORT_DIRECTION]: sorting[0].desc
132
+ [EVENT_PARAM.COLUMN_NAME]: sorting?.[0]?.id, // TODO(cc) sorting should always be at least `[]` and never `undefined`.
133
+ [EVENT_PARAM.SORT_DIRECTION]: sorting?.[0]?.desc // TODO(cc) sorting should always be at least `[]` and never `undefined`.
125
134
  ? SORT_DIRECTION.DESC
126
135
  : SORT_DIRECTION.ASC,
127
136
  });
@@ -130,6 +139,7 @@ TableProps<T>): JSX.Element => {
130
139
  const onColumnVisibilityChange = (
131
140
  updater: Updater<VisibilityState>
132
141
  ): void => {
142
+ // TODO(cc) memoize `onColumnVisibilityChange` with `useCallback`.
133
143
  exploreDispatch({
134
144
  payload:
135
145
  typeof updater === "function" ? updater(columnsVisibility) : updater,
@@ -137,22 +147,31 @@ TableProps<T>): JSX.Element => {
137
147
  });
138
148
  };
139
149
 
140
- const onRowPreviewChange = (updater: Updater<RowPreviewState>): void => {
141
- exploreDispatch({
142
- payload: typeof updater === "function" ? updater(rowPreview) : updater,
143
- type: ExploreActionKind.UpdateRowPreview,
144
- });
145
- };
150
+ const onRowPreviewChange = useCallback(
151
+ (updater: Updater<RowPreviewState>): void => {
152
+ exploreDispatch({
153
+ payload: typeof updater === "function" ? updater(rowPreview) : updater,
154
+ type: ExploreActionKind.UpdateRowPreview,
155
+ });
156
+ },
157
+ [exploreDispatch, rowPreview]
158
+ );
146
159
 
147
- const onRowSelectionChange = (updater: Updater<RowSelectionState>): void => {
148
- exploreDispatch({
149
- payload: typeof updater === "function" ? updater(rowSelection) : updater,
150
- type: ExploreActionKind.UpdateRowSelection,
151
- });
152
- };
160
+ const onRowSelectionChange = useCallback(
161
+ (updater: Updater<RowSelectionState>): void => {
162
+ // TODO(cc) refactor `onRowSelectionChange` to /options/rowSelection/hook.ts see onGroupingChange.
163
+ exploreDispatch({
164
+ payload:
165
+ typeof updater === "function" ? updater(rowSelection) : updater,
166
+ type: ExploreActionKind.UpdateRowSelection,
167
+ });
168
+ },
169
+ [exploreDispatch, rowSelection]
170
+ );
153
171
 
154
172
  const state: Partial<TableState> = {
155
173
  columnVisibility: columnsVisibility,
174
+ grouping,
156
175
  pagination,
157
176
  rowPreview,
158
177
  rowSelection,
@@ -180,11 +199,9 @@ TableProps<T>): JSX.Element => {
180
199
  data: items,
181
200
  enableColumnFilters: true, // client-side filtering.
182
201
  enableFilters: true, // client-side filtering.
183
- enableMultiSort: clientFiltering,
202
+ enableMultiSort: clientFiltering, // TODO(cc) move to sorting options; default to false and let the table options in config flag this value.
184
203
  enableRowPreview,
185
204
  enableRowSelection,
186
- enableSorting: true, // client-side filtering.
187
- enableSortingRemoval: false, // client-side filtering.
188
205
  getCoreRowModel: getCoreRowModel(),
189
206
  getFacetedRowModel: clientFiltering ? getFacetedRowModel() : undefined,
190
207
  getFacetedUniqueValues: clientFiltering
@@ -215,8 +232,8 @@ TableProps<T>): JSX.Element => {
215
232
  } = tableInstance;
216
233
  const allColumns = getAllColumns();
217
234
  const { columnFilters } = getState();
218
- const { rows: results } = getRowModel();
219
- const noResults = !loading && (!results || results.length === 0);
235
+ const { rows } = getRowModel();
236
+ const noResults = !loading && (!rows || rows.length === 0);
220
237
  const scrollTop = useScroll();
221
238
  const visibleColumns = getVisibleFlatColumns();
222
239
  const gridTemplateColumns = getGridTemplateColumns(visibleColumns);
@@ -280,8 +297,8 @@ TableProps<T>): JSX.Element => {
280
297
  loading: false,
281
298
  paginationResponse: {
282
299
  ...DEFAULT_PAGINATION_STATE,
283
- pageSize: results.length,
284
- rows: results.length,
300
+ pageSize: rows.filter(({ getIsGrouped }) => !getIsGrouped()).length,
301
+ rows: rows.filter(({ getIsGrouped }) => !getIsGrouped()).length,
285
302
  },
286
303
  selectCategories: buildCategoryViews(allColumns, columnFilters),
287
304
  },
@@ -294,7 +311,7 @@ TableProps<T>): JSX.Element => {
294
311
  columnFilters,
295
312
  exploreDispatch,
296
313
  listItems,
297
- results,
314
+ rows,
298
315
  ]);
299
316
 
300
317
  function canNextPage(): boolean {
@@ -325,6 +342,7 @@ TableProps<T>): JSX.Element => {
325
342
  tableInstance={tableInstance}
326
343
  />
327
344
  <TableBody
345
+ rows={rows}
328
346
  rowDirection={rowDirection}
329
347
  tableInstance={tableInstance}
330
348
  />
@@ -1,22 +1,20 @@
1
1
  import { RowData } from "@tanstack/react-table";
2
+ import { ColumnConfig } from "../../../config/entities";
2
3
  import { RowSelectionCell } from "../../Table/components/TableCell/components/RowSelectionCell/rowSelectionCell";
3
- import { BaseColumnConfig } from "./entities";
4
4
 
5
5
  export const ACCESSOR_KEYS = {
6
6
  ROW_POSITION: "rowPosition",
7
7
  SELECT: "select",
8
8
  };
9
9
 
10
- export const COLUMN_CONFIGS: Record<
11
- string,
12
- BaseColumnConfig<RowData, unknown>
13
- > = {
10
+ export const COLUMN_CONFIGS: Record<string, ColumnConfig<RowData>> = {
14
11
  SELECT: {
15
12
  columnPinned: false,
16
13
  columnVisible: false,
17
14
  componentConfig: { component: RowSelectionCell },
18
15
  disableHiding: true,
19
- disableSorting: true,
16
+ enableGrouping: false,
17
+ enableSorting: false,
20
18
  header: ACCESSOR_KEYS.SELECT,
21
19
  id: ACCESSOR_KEYS.SELECT,
22
20
  meta: {
@@ -1,34 +1,41 @@
1
1
  import { ColumnDef } from "@tanstack/react-table";
2
- import { BaseColumnConfig } from "./entities";
2
+ import { ColumnConfig } from "../../../config/entities";
3
3
 
4
4
  /**
5
5
  * Builds a base column definition.
6
+ * The following properties are set by default:
7
+ * - Grouping is not enabled `enableGrouping: false`.
8
+ * - Sorting is enabled - `enableSorting: true`.
6
9
  * @param baseColumnConfig - Base column configuration.
7
10
  * @returns column definition.
8
11
  */
9
- export function buildBaseColumnDef<T, TValue>(
10
- baseColumnConfig: BaseColumnConfig<T, TValue>
12
+ export function buildBaseColumnDef<T>(
13
+ baseColumnConfig: ColumnConfig<T>
11
14
  ): ColumnDef<T> {
12
15
  const {
13
16
  columnPinned,
17
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Destructure to avoid passing it to the columnDef.
18
+ columnVisible,
19
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Destructure to avoid passing it to the columnDef.
20
+ componentConfig,
14
21
  disableHiding,
15
- disableSorting,
16
22
  header,
17
23
  id,
18
24
  meta,
19
25
  width,
26
+ ...columnDef
20
27
  } = baseColumnConfig;
21
28
  return {
29
+ ...columnDef,
22
30
  accessorKey: id,
23
31
  enableHiding: !disableHiding,
24
- enableSorting: !disableSorting,
25
32
  header,
26
33
  id,
27
34
  meta: {
28
- ...meta,
29
35
  columnPinned,
30
- header: meta ? meta.header : header,
36
+ header: typeof header === "string" ? header : undefined,
31
37
  width,
38
+ ...meta,
32
39
  },
33
40
  };
34
41
  }
@@ -0,0 +1,14 @@
1
+ import {
2
+ ExpandedOptions,
3
+ getExpandedRowModel,
4
+ RowData,
5
+ } from "@tanstack/react-table";
6
+
7
+ export const EXPANDED_OPTIONS: Pick<
8
+ ExpandedOptions<RowData>,
9
+ "autoResetExpanded" | "enableExpanding" | "getExpandedRowModel"
10
+ > = {
11
+ autoResetExpanded: false,
12
+ enableExpanding: false,
13
+ getExpandedRowModel: getExpandedRowModel(),
14
+ };
@@ -0,0 +1,6 @@
1
+ import { ExpandedOptions, RowData } from "@tanstack/react-table";
2
+ import { EXPANDED_OPTIONS } from "./constants";
3
+
4
+ export function useExpandedOptions<T extends RowData>(): ExpandedOptions<T> {
5
+ return { ...EXPANDED_OPTIONS };
6
+ }
@@ -0,0 +1,6 @@
1
+ import { getGroupedRowModel, GroupingOptions } from "@tanstack/react-table";
2
+
3
+ export const GROUPING_OPTIONS: GroupingOptions = {
4
+ enableGrouping: false,
5
+ getGroupedRowModel: getGroupedRowModel(),
6
+ };
@@ -0,0 +1,17 @@
1
+ import { GroupingOptions, GroupingState, Updater } from "@tanstack/react-table";
2
+ import { useCallback } from "react";
3
+ import { useExploreState } from "../../../../hooks/useExploreState";
4
+ import { updateGrouping } from "../../../../providers/exploreState/actions/updateGrouping/dispatch";
5
+ import { GROUPING_OPTIONS } from "./constants";
6
+
7
+ export function useGroupingOptions(): GroupingOptions {
8
+ const { exploreDispatch } = useExploreState();
9
+
10
+ const onGroupingChange = useCallback(
11
+ (updaterOrValue: Updater<GroupingState>): void =>
12
+ exploreDispatch(updateGrouping({ updaterOrValue })),
13
+ [exploreDispatch]
14
+ );
15
+
16
+ return { ...GROUPING_OPTIONS, onGroupingChange };
17
+ }
@@ -0,0 +1,31 @@
1
+ import { RowData, TableOptions } from "@tanstack/react-table";
2
+ import { useConfig } from "../../../hooks/useConfig";
3
+ import { useExpandedOptions } from "./expanded/hook";
4
+ import { useGroupingOptions } from "./grouping/hook";
5
+ import { useRowSelectionOptions } from "./rowSelection/hook";
6
+ import { useSortingOptions } from "./sorting/hook";
7
+
8
+ export function useTableOptions<T extends RowData>(): Partial<TableOptions<T>> {
9
+ const {
10
+ entityConfig: {
11
+ list: { defaultSort, tableOptions },
12
+ },
13
+ } = useConfig();
14
+ const expandedOptions = useExpandedOptions<T>();
15
+ const groupingOptions = useGroupingOptions();
16
+ const rowSelectionOptions = useRowSelectionOptions<T>();
17
+ const sortingOptions = useSortingOptions<T>();
18
+ return {
19
+ ...expandedOptions,
20
+ ...groupingOptions,
21
+ ...rowSelectionOptions,
22
+ ...sortingOptions, // TODO(cc) merge of all sorting options.
23
+ ...tableOptions,
24
+ initialState: {
25
+ ...tableOptions?.initialState,
26
+ sorting: defaultSort
27
+ ? [defaultSort] // TODO(cc) deprecate `defaultSort` in favor of `initialState.sorting`.
28
+ : tableOptions?.initialState?.sorting,
29
+ },
30
+ };
31
+ }
@@ -0,0 +1,10 @@
1
+ import { RowData, RowSelectionOptions } from "@tanstack/react-table";
2
+
3
+ export const ROW_SELECTION_OPTIONS: Pick<
4
+ RowSelectionOptions<RowData>,
5
+ "enableRowSelection" | "enableSubRowSelection" | "enableMultiRowSelection"
6
+ > = {
7
+ enableMultiRowSelection: false,
8
+ enableRowSelection: false,
9
+ enableSubRowSelection: false,
10
+ };
@@ -0,0 +1,8 @@
1
+ import { RowData, RowSelectionOptions } from "@tanstack/react-table";
2
+ import { ROW_SELECTION_OPTIONS } from "./constants";
3
+
4
+ export function useRowSelectionOptions<
5
+ T extends RowData
6
+ >(): RowSelectionOptions<T> {
7
+ return { ...(ROW_SELECTION_OPTIONS as RowSelectionOptions<T>) };
8
+ }
@@ -0,0 +1,10 @@
1
+ import { RowData, SortingOptions } from "@tanstack/react-table";
2
+
3
+ export const SORTING_OPTIONS: Pick<
4
+ SortingOptions<RowData>,
5
+ "enableSorting" | "enableSortingInteraction" | "enableSortingRemoval"
6
+ > = {
7
+ enableSorting: true,
8
+ enableSortingInteraction: true,
9
+ enableSortingRemoval: false, // false i.e. toggling the sorting on a column will not remove sorting on the column.
10
+ };
@@ -0,0 +1,6 @@
1
+ import { RowData, SortingOptions } from "@tanstack/react-table";
2
+ import { SORTING_OPTIONS } from "./constants";
3
+
4
+ export function useSortingOptions<T extends RowData>(): SortingOptions<T> {
5
+ return { ...SORTING_OPTIONS };
6
+ }
@@ -1,17 +1,12 @@
1
1
  import {
2
2
  CellContext,
3
3
  ColumnDef,
4
- ColumnSort,
5
4
  CoreOptions,
6
5
  HeaderContext,
7
6
  RowData,
8
7
  } from "@tanstack/react-table";
9
8
  import React, { useMemo } from "react";
10
- import {
11
- ColumnConfig,
12
- ListConfig,
13
- ListViewConfig,
14
- } from "../../config/entities";
9
+ import { ColumnConfig, ListViewConfig } from "../../config/entities";
15
10
  import { PAPER_PANEL_STYLE } from "../common/Paper/paper";
16
11
  import { ComponentCreator } from "../ComponentCreator/ComponentCreator";
17
12
  import { Loading } from "../Loading/loading";
@@ -26,16 +21,15 @@ import { HeadSelectionCell } from "../Table/components/TableHead/components/Head
26
21
  import { Table } from "../Table/table";
27
22
  import { COLUMN_CONFIGS } from "./common/constants";
28
23
  import { buildBaseColumnDef } from "./common/utils";
24
+ import { useTableOptions } from "./options/hook";
29
25
  import { TableCreator as TableCreatorContainer } from "./tableCreator.styles";
30
26
 
31
27
  export interface TableCreatorProps<T> {
32
28
  columns: ColumnConfig<T>[];
33
- defaultSort: ColumnSort | undefined;
34
29
  getRowId?: CoreOptions<T>["getRowId"];
35
30
  items: T[];
36
31
  listView?: ListViewConfig;
37
32
  loading?: boolean;
38
- tableOptions?: ListConfig<T>["tableOptions"];
39
33
  }
40
34
 
41
35
  const createCell = <T extends RowData = RowData, TData = unknown>(
@@ -63,13 +57,12 @@ const createRowSelectionCell = <T extends RowData>() =>
63
57
 
64
58
  export const TableCreator = <T extends RowData>({
65
59
  columns,
66
- defaultSort,
67
60
  getRowId,
68
61
  items,
69
62
  listView,
70
63
  loading,
71
- tableOptions,
72
64
  }: TableCreatorProps<T>): JSX.Element => {
65
+ const tableOptions = useTableOptions<T>();
73
66
  const columnDefs: ColumnDef<T>[] = useMemo(
74
67
  () =>
75
68
  columns.reduce(
@@ -95,7 +88,7 @@ export const TableCreator = <T extends RowData>({
95
88
  ),
96
89
  [columns]
97
90
  );
98
- const initialState = getInitialState(columns, defaultSort);
91
+ const initialState = getInitialState(columns);
99
92
  return (
100
93
  <TableCreatorContainer>
101
94
  <Loading
@@ -1,7 +1,7 @@
1
1
  import styled from "@emotion/styled";
2
2
  import { Menu as MMenu } from "@mui/material";
3
3
 
4
- export const Menu = styled(MMenu)`
4
+ export const StyledMenu = styled(MMenu)`
5
5
  .MuiPaper-menu {
6
6
  margin: 4px 0;
7
7
  }
@@ -1,48 +1,50 @@
1
1
  import { MenuProps as MMenuProps } from "@mui/material";
2
- import React, { ElementType, Fragment, MouseEvent, useState } from "react";
2
+ import React, { Fragment } from "react";
3
+ import { useMenu } from "../Menu/hooks/useMenu";
3
4
  import { DEFAULT_DROPDOWN_MENU_PROPS } from "./common/constants";
4
5
  import {
5
6
  DropdownMenuButtonProps,
6
7
  DropdownMenuIconButtonProps,
7
8
  DropdownMenuItemProps,
8
9
  } from "./common/entities";
9
- import { Menu } from "./dropdownMenu.styles";
10
+ import { StyledMenu } from "./dropdownMenu.styles";
10
11
 
11
12
  export interface DropdownMenuProps
12
13
  extends Omit<MMenuProps, "children" | "open"> {
13
- Button:
14
- | ElementType<DropdownMenuButtonProps>
15
- | ElementType<DropdownMenuIconButtonProps>;
14
+ button: (
15
+ props:
16
+ | Pick<DropdownMenuButtonProps, "onClick" | "open">
17
+ | Pick<DropdownMenuIconButtonProps, "onClick" | "open">
18
+ ) => JSX.Element;
16
19
  children?: ({ closeMenu }: DropdownMenuItemProps) => JSX.Element[];
17
20
  className?: string;
18
21
  }
19
22
 
20
23
  export const DropdownMenu = ({
21
- Button,
24
+ button,
22
25
  children,
23
26
  className,
24
27
  ...props /* Spread props to allow for Mui Menu specific prop overrides e.g. "anchorOrigin". */
25
28
  }: DropdownMenuProps): JSX.Element => {
26
- const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
27
- const closeMenu = (): void => setAnchorEl(null);
29
+ const {
30
+ anchorEl,
31
+ onClose: closeMenu,
32
+ onOpen: openMenu,
33
+ open,
34
+ } = useMenu<HTMLButtonElement>();
28
35
  return (
29
36
  <Fragment>
30
- <Button
31
- onClick={(event: MouseEvent<HTMLButtonElement>): void =>
32
- setAnchorEl(event.currentTarget)
33
- }
34
- open={Boolean(anchorEl)}
35
- />
36
- <Menu
37
+ {button({ onClick: openMenu, open })}
38
+ <StyledMenu
37
39
  {...DEFAULT_DROPDOWN_MENU_PROPS}
38
40
  anchorEl={anchorEl}
39
41
  className={className}
40
42
  onClose={closeMenu}
41
- open={Boolean(anchorEl)}
43
+ open={open}
42
44
  {...props}
43
45
  >
44
46
  {children ? children({ closeMenu }) : null}
45
- </Menu>
47
+ </StyledMenu>
46
48
  </Fragment>
47
49
  );
48
50
  };
@@ -1,13 +1,12 @@
1
- import { PopperProps as MPopperProps } from "@mui/material";
2
1
  import { MouseEvent, useCallback, useMemo, useState } from "react";
3
2
 
4
- export interface UseMenu {
5
- anchorEl: MPopperProps["anchorEl"];
3
+ export interface UseMenu<E extends HTMLElement> {
4
+ anchorEl: E | null;
6
5
  onClose: () => void;
7
6
  onDisableScrollLock: () => void;
8
7
  onEnableScrollLock: () => void;
9
- onOpen: (event: MouseEvent<HTMLElement>) => void;
10
- onToggleOpen: (event: MouseEvent<HTMLElement>) => void;
8
+ onOpen: (event: MouseEvent<E>) => void;
9
+ onToggleOpen: (event: MouseEvent<E>) => void;
11
10
  open: boolean;
12
11
  }
13
12
 
@@ -15,8 +14,8 @@ export interface UseMenu {
15
14
  * Menu functionality for menu dropdown, with menu position.
16
15
  * @returns menu functionality.
17
16
  */
18
- export const useMenu = (): UseMenu => {
19
- const [anchorEl, setAnchorEl] = useState<MPopperProps["anchorEl"]>(null);
17
+ export const useMenu = <E extends HTMLElement>(): UseMenu<E> => {
18
+ const [anchorEl, setAnchorEl] = useState<E | null>(null);
20
19
  const open = useMemo(() => Boolean(anchorEl), [anchorEl]);
21
20
 
22
21
  // Closes menu.
@@ -35,13 +34,13 @@ export const useMenu = (): UseMenu => {
35
34
  }, []);
36
35
 
37
36
  // Opens menu.
38
- const onOpen = useCallback((event: MouseEvent<HTMLElement>): void => {
37
+ const onOpen = useCallback((event: MouseEvent<E>): void => {
39
38
  setAnchorEl(event.currentTarget);
40
39
  }, []);
41
40
 
42
41
  // Toggles menu open/close.
43
42
  const onToggleOpen = useCallback(
44
- (event: MouseEvent<HTMLElement>): void => {
43
+ (event: MouseEvent<E>): void => {
45
44
  if (open) {
46
45
  setAnchorEl(null);
47
46
  } else {