@addev-be/ui 0.2.13 → 0.2.15

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 (114) hide show
  1. package/dist/Icons.d.ts +3 -1
  2. package/dist/Icons.js +5 -1
  3. package/dist/components/data/DataGrid/{FilterValuesScroller.d.ts → DataGridFilterMenu/FilterValuesScroller.d.ts} +1 -1
  4. package/dist/components/data/DataGrid/{FilterValuesScroller.js → DataGridFilterMenu/FilterValuesScroller.js} +6 -9
  5. package/dist/components/data/DataGrid/DataGridFilterMenu/index.js +3 -3
  6. package/dist/components/data/DataGrid/DataGridFilterMenu/styles.d.ts +9 -0
  7. package/dist/components/data/DataGrid/DataGridFilterMenu/styles.js +12 -2
  8. package/dist/components/data/DataGrid/FilterModalContent/index.js +18 -9
  9. package/dist/components/data/DataGrid/helpers/columns.d.ts +1 -0
  10. package/dist/components/data/DataGrid/helpers/columns.js +7 -6
  11. package/dist/components/data/DataGrid/helpers/filters.d.ts +1 -0
  12. package/dist/components/data/DataGrid/helpers/filters.js +71 -2
  13. package/dist/components/data/DataGrid/hooks/useDataGrid.js +2 -1
  14. package/dist/components/data/DataGrid/hooks/useDataGridCopy.js +2 -0
  15. package/dist/components/data/DataGrid/styles.d.ts +0 -9
  16. package/dist/components/data/DataGrid/styles.js +2 -12
  17. package/dist/components/data/DataGrid/types.d.ts +2 -0
  18. package/dist/components/data/SqlRequestDataGrid/helpers/columns.js +6 -6
  19. package/dist/helpers/numbers.d.ts +1 -0
  20. package/dist/helpers/numbers.js +9 -1
  21. package/dist/services/globalSearch.d.ts +13 -0
  22. package/dist/services/globalSearch.js +8 -0
  23. package/package.json +18 -12
  24. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.d.ts +0 -9
  25. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.js +0 -171
  26. package/dist/components/data/DataGrid/helpers/advancedRequests.d.ts +0 -12
  27. package/dist/components/data/DataGrid/helpers/advancedRequests.js +0 -53
  28. package/eslint.config.js +0 -28
  29. package/src/Icons.tsx +0 -108
  30. package/src/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.ts +0 -93
  31. package/src/components/data/AdvancedRequestDataGrid/helpers/columns.tsx +0 -262
  32. package/src/components/data/AdvancedRequestDataGrid/helpers/index.ts +0 -2
  33. package/src/components/data/AdvancedRequestDataGrid/index.tsx +0 -267
  34. package/src/components/data/AdvancedRequestDataGrid/types.ts +0 -47
  35. package/src/components/data/DataGrid/DataGridCell.tsx +0 -73
  36. package/src/components/data/DataGrid/DataGridColumnsModal/helpers.ts +0 -14
  37. package/src/components/data/DataGrid/DataGridColumnsModal/hooks.tsx +0 -59
  38. package/src/components/data/DataGrid/DataGridColumnsModal/index.tsx +0 -181
  39. package/src/components/data/DataGrid/DataGridColumnsModal/styles.ts +0 -104
  40. package/src/components/data/DataGrid/DataGridEditableCell.tsx +0 -43
  41. package/src/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.tsx +0 -120
  42. package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +0 -75
  43. package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +0 -360
  44. package/src/components/data/DataGrid/DataGridFilterMenu/styles.ts +0 -96
  45. package/src/components/data/DataGrid/DataGridFooter.tsx +0 -42
  46. package/src/components/data/DataGrid/DataGridHeader.tsx +0 -126
  47. package/src/components/data/DataGrid/DataGridHeaderCell.tsx +0 -132
  48. package/src/components/data/DataGrid/FilterModalContent/index.tsx +0 -136
  49. package/src/components/data/DataGrid/FilterModalContent/styles.ts +0 -22
  50. package/src/components/data/DataGrid/VirtualScroller.tsx +0 -46
  51. package/src/components/data/DataGrid/helpers/columns.tsx +0 -295
  52. package/src/components/data/DataGrid/helpers/filters.ts +0 -287
  53. package/src/components/data/DataGrid/helpers/index.ts +0 -2
  54. package/src/components/data/DataGrid/hooks/index.ts +0 -30
  55. package/src/components/data/DataGrid/hooks/useDataGrid.tsx +0 -306
  56. package/src/components/data/DataGrid/hooks/useDataGridCopy.ts +0 -175
  57. package/src/components/data/DataGrid/hooks/useDataGridSettings.ts +0 -48
  58. package/src/components/data/DataGrid/index.tsx +0 -140
  59. package/src/components/data/DataGrid/styles.ts +0 -323
  60. package/src/components/data/DataGrid/types.ts +0 -267
  61. package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +0 -277
  62. package/src/components/data/SqlRequestDataGrid/helpers/index.ts +0 -2
  63. package/src/components/data/SqlRequestDataGrid/helpers/sqlRequests.ts +0 -16
  64. package/src/components/data/SqlRequestDataGrid/index.tsx +0 -347
  65. package/src/components/data/SqlRequestDataGrid/types.ts +0 -47
  66. package/src/components/data/index.ts +0 -8
  67. package/src/components/forms/Button.tsx +0 -99
  68. package/src/components/forms/IconButton.tsx +0 -56
  69. package/src/components/forms/IndeterminateCheckbox.tsx +0 -46
  70. package/src/components/forms/Select.tsx +0 -40
  71. package/src/components/forms/index.ts +0 -5
  72. package/src/components/forms/styles.ts +0 -20
  73. package/src/components/index.ts +0 -3
  74. package/src/components/layout/Dropdown/index.tsx +0 -79
  75. package/src/components/layout/Dropdown/styles.ts +0 -44
  76. package/src/components/layout/Loading/index.tsx +0 -29
  77. package/src/components/layout/Loading/styles.ts +0 -29
  78. package/src/components/layout/Modal/index.tsx +0 -51
  79. package/src/components/layout/Modal/styles.ts +0 -110
  80. package/src/components/layout/index.ts +0 -3
  81. package/src/components/ui/ContextMenu/index.tsx +0 -79
  82. package/src/components/ui/ContextMenu/styles.ts +0 -119
  83. package/src/config/index.ts +0 -14
  84. package/src/helpers/dates.ts +0 -9
  85. package/src/helpers/getScrollbarSize.ts +0 -14
  86. package/src/helpers/numbers.ts +0 -26
  87. package/src/hooks/index.ts +0 -2
  88. package/src/hooks/useElementSize.ts +0 -24
  89. package/src/hooks/useWindowSize.ts +0 -20
  90. package/src/index.ts +0 -7
  91. package/src/providers/PortalsProvider/index.tsx +0 -54
  92. package/src/providers/PortalsProvider/styles.ts +0 -27
  93. package/src/providers/SettingsProvider/index.tsx +0 -70
  94. package/src/providers/ThemeProvider/ThemeProvider.ts +0 -55
  95. package/src/providers/ThemeProvider/defaultTheme.ts +0 -444
  96. package/src/providers/ThemeProvider/index.ts +0 -3
  97. package/src/providers/ThemeProvider/types.ts +0 -123
  98. package/src/providers/UiProviders/index.tsx +0 -65
  99. package/src/providers/UiProviders/styles.ts +0 -10
  100. package/src/providers/hooks.ts +0 -8
  101. package/src/providers/index.ts +0 -5
  102. package/src/services/HttpService.ts +0 -80
  103. package/src/services/WebSocketService.ts +0 -147
  104. package/src/services/advancedRequests.ts +0 -101
  105. package/src/services/base.ts +0 -31
  106. package/src/services/globalSearch.ts +0 -27
  107. package/src/services/hooks.ts +0 -23
  108. package/src/services/index.ts +0 -2
  109. package/src/services/sqlRequests.ts +0 -110
  110. package/src/styles/animations.scss +0 -30
  111. package/src/styles/index.scss +0 -42
  112. package/src/typings.d.ts +0 -6
  113. package/tsconfig.json +0 -18
  114. package/tsconfig.tsbuildinfo +0 -1
@@ -1,287 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
-
3
- import {
4
- DataGridFilter,
5
- DataGridFilterCheckbox,
6
- DataGridFilterDataType,
7
- DataGridFilterFormatter,
8
- DataGridFilterGroup,
9
- DataGridFilterPredicateBuilder,
10
- DataGridFilterPredicates,
11
- DataGridFilterRenderer,
12
- DataGridFilterType,
13
- DataGridFilterValue,
14
- } from '../types';
15
-
16
- import moment from 'moment';
17
-
18
- const escapeRegExp = (s: string) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
19
-
20
- const textContainsPredicate: DataGridFilterPredicateBuilder<string> = (
21
- ...filterValues
22
- ) => {
23
- const regex = new RegExp(`${escapeRegExp(filterValues[0])}`, 'i');
24
- return (valueToVerify: string) => regex.test(valueToVerify);
25
- };
26
- const textNotContainsPredicate: DataGridFilterPredicateBuilder<string> = (
27
- ...filterValues
28
- ) => {
29
- const regex = new RegExp(`${escapeRegExp(filterValues[0])}`, 'i');
30
- return (valueToVerify: string) => !regex.test(valueToVerify);
31
- };
32
- const textEqualsPredicate: DataGridFilterPredicateBuilder<string> = (
33
- ...filterValues
34
- ) => {
35
- const regex = new RegExp(`^${escapeRegExp(filterValues[0])}$`, 'i');
36
- return (valueToVerify: string) => regex.test(valueToVerify);
37
- };
38
- const textNotEqualsPredicate: DataGridFilterPredicateBuilder<string> = (
39
- ...filterValues
40
- ) => {
41
- const regex = new RegExp(`^${escapeRegExp(filterValues[0])}$`, 'i');
42
- return (valueToVerify: string) => !regex.test(valueToVerify);
43
- };
44
- const textStartsWithPredicate: DataGridFilterPredicateBuilder<string> = (
45
- ...filterValues
46
- ) => {
47
- const regex = new RegExp(`^${escapeRegExp(filterValues[0])}`, 'i');
48
- return (valueToVerify: string) => regex.test(valueToVerify);
49
- };
50
- const textEndsWithPredicate: DataGridFilterPredicateBuilder<string> = (
51
- ...filterValues
52
- ) => {
53
- const regex = new RegExp(`${escapeRegExp(filterValues[0])}$`, 'i');
54
- return (valueToVerify: string) => regex.test(valueToVerify);
55
- };
56
- const textInArrayPredicate: DataGridFilterPredicateBuilder<string> = (
57
- ...filterValues
58
- ) => {
59
- return (valueToVerify: string) => filterValues.includes(valueToVerify);
60
- };
61
-
62
- const numberEqualsPredicate: DataGridFilterPredicateBuilder<number> =
63
- (...filterValues) =>
64
- (valueToVerify: number) =>
65
- valueToVerify === filterValues[0];
66
- const numberNotEqualsPredicate: DataGridFilterPredicateBuilder<number> =
67
- (...filterValues) =>
68
- (valueToVerify: number) =>
69
- valueToVerify !== filterValues[0];
70
- const numberLessThanPredicate: DataGridFilterPredicateBuilder<number> =
71
- (...filterValues) =>
72
- (valueToVerify: number) =>
73
- valueToVerify < filterValues[0];
74
- const numberLessThanOrEqualPredicate: DataGridFilterPredicateBuilder<number> =
75
- (...filterValues) =>
76
- (valueToVerify: number) =>
77
- valueToVerify <= filterValues[0];
78
- const numberGreaterThanPredicate: DataGridFilterPredicateBuilder<number> =
79
- (...filterValues) =>
80
- (valueToVerify: number) =>
81
- valueToVerify > filterValues[0];
82
- const numberGreaterThanOrEqualPredicate: DataGridFilterPredicateBuilder<
83
- number
84
- > =
85
- (...filterValues) =>
86
- (valueToVerify: number) =>
87
- valueToVerify >= filterValues[0];
88
- const numberInRangePredicate: DataGridFilterPredicateBuilder<number> =
89
- (...filterValues) =>
90
- (valueToVerify: number) =>
91
- valueToVerify >= filterValues[0] && valueToVerify <= filterValues[1];
92
- const numberInArrayPredicate: DataGridFilterPredicateBuilder<number> = (
93
- ...filterValues
94
- ) => {
95
- return (valueToVerify: number) => filterValues.includes(valueToVerify);
96
- };
97
-
98
- const dateBeforePredicate: DataGridFilterPredicateBuilder<string> = (
99
- ...filterValues
100
- ) => {
101
- const limitDate = moment(filterValues[0]);
102
- return (valueToVerify) => moment(valueToVerify).isBefore(limitDate);
103
- };
104
- const dateAfterPredicate: DataGridFilterPredicateBuilder<string> = (
105
- ...filterValues
106
- ) => {
107
- const limitDate = moment(filterValues[0]);
108
- return (valueToVerify) => moment(valueToVerify).isAfter(limitDate);
109
- };
110
- const dateEqualsPredicate: DataGridFilterPredicateBuilder<string> = (
111
- ...filterValues
112
- ) => {
113
- const date = moment(filterValues[0]);
114
- return (valueToVerify) => moment(valueToVerify).isSame(date);
115
- };
116
- const dateNotEqualsPredicate: DataGridFilterPredicateBuilder<string> = (
117
- ...filterValues
118
- ) => {
119
- const date = moment(filterValues[0]);
120
- return (valueToVerify) => !moment(valueToVerify).isSame(date);
121
- };
122
- const dateInRangePredicate: DataGridFilterPredicateBuilder<string> = (
123
- ...filterValues
124
- ) => {
125
- const date1 = moment(filterValues[0]);
126
- const date2 = moment(filterValues[1]);
127
- const startDate = date1.isBefore(date2) ? date1 : date2;
128
- const endDate = date1.isBefore(date2) ? date2 : date1;
129
- return (valueToVerify) =>
130
- moment(valueToVerify).isBetween(startDate, endDate, 'days', '[]');
131
- };
132
- const dateInArrayPredicate: DataGridFilterPredicateBuilder<string> = (
133
- ...filterValues
134
- ) => {
135
- return (valueToVerify) => filterValues.includes(valueToVerify);
136
- };
137
-
138
- export const filtersPredicates: DataGridFilterPredicates = {
139
- date: {
140
- before: dateBeforePredicate,
141
- after: dateAfterPredicate,
142
- equals: dateEqualsPredicate,
143
- notEquals: dateNotEqualsPredicate,
144
- inRange: dateInRangePredicate,
145
- inArray: dateInArrayPredicate,
146
- },
147
- text: {
148
- contains: textContainsPredicate,
149
- notContains: textNotContainsPredicate,
150
- equals: textEqualsPredicate,
151
- notEquals: textNotEqualsPredicate,
152
- startsWith: textStartsWithPredicate,
153
- endsWith: textEndsWithPredicate,
154
- inArray: textInArrayPredicate,
155
- },
156
- number: {
157
- equals: numberEqualsPredicate,
158
- notEquals: numberNotEqualsPredicate,
159
- lessThan: numberLessThanPredicate,
160
- lessThanOrEqual: numberLessThanOrEqualPredicate,
161
- greaterThan: numberGreaterThanPredicate,
162
- greaterThanOrEqual: numberGreaterThanOrEqualPredicate,
163
- inRange: numberInRangePredicate,
164
- inArray: numberInArrayPredicate,
165
- },
166
- };
167
-
168
- export const applyFilters = <R>(rows: R[], filters: DataGridFilter[]): R[] => {
169
- return filters.reduce(
170
- (tempRows, filter) => applyFilter(tempRows, filter),
171
- rows
172
- );
173
- };
174
-
175
- export const applyFilter = <R>(rows: R[], filter: DataGridFilter): R[] => {
176
- const predicateBuilder = (filtersPredicates as any)[filter.type][
177
- filter.operator
178
- ];
179
- if (typeof predicateBuilder !== 'function') return rows;
180
- const predicate = predicateBuilder(...filter.values);
181
- return rows.filter((row) => predicate(filter.getter(row)));
182
- };
183
-
184
- export const defaultFilterGetter = (row: any, columnKey: string) =>
185
- row[columnKey];
186
-
187
- export const defaultFilterValues: {
188
- [K in DataGridFilterType]: DataGridFilterDataType<K>;
189
- } = {
190
- date: '',
191
- text: '',
192
- number: 0,
193
- };
194
-
195
- export const defaultValueParsers: {
196
- [K in DataGridFilterType]: (value: string) => DataGridFilterDataType<K>;
197
- } = {
198
- date: (value) => moment(value).format('YYYY-MM-DD'),
199
- text: (value) => value,
200
- number: (value) => parseFloat(value),
201
- };
202
-
203
- export const groupDatesByYearAndMonth = (dates: any[]) =>
204
- dates.reduce((acc: Record<string, Record<string, any[]>>, date) => {
205
- const year = moment(date).format('YYYY');
206
- if (!acc[year]) {
207
- acc[year] = {};
208
- }
209
- const yearAndMonth = moment(date).format(`MM/YYYY`);
210
- if (!acc[year][yearAndMonth]) {
211
- acc[year][yearAndMonth] = [];
212
- }
213
- acc[year][yearAndMonth].push(date);
214
- return acc;
215
- }, {} as Record<string, Record<string, any[]>>);
216
-
217
- export const getDateGroups = (dates: any[]): DataGridFilterGroup[] => {
218
- const grouperDates = groupDatesByYearAndMonth(dates);
219
- return Object.entries(grouperDates).map(([year, months]) => ({
220
- name: year,
221
- displayValue: year,
222
- values: Object.values(months).flat(),
223
- groups: Object.entries(months).map(([month, dates]) => ({
224
- displayValue: month,
225
- name: month,
226
- values: dates,
227
- })),
228
- }));
229
- };
230
-
231
- export const defaultRendererAndFormatter = (value: any) =>
232
- String(value ?? '').trim() || '(Vides)';
233
-
234
- export const getCheckboxes = (
235
- values: DataGridFilterValue[],
236
- displayValue: DataGridFilterValue,
237
- renderer: DataGridFilterRenderer,
238
- formatter: DataGridFilterFormatter,
239
- groups?: DataGridFilterGroup[],
240
- level = 0
241
- ): DataGridFilterCheckbox[] =>
242
- groups
243
- ? groups
244
- .map<DataGridFilterCheckbox[]>((group) => [
245
- {
246
- displayValue: group.displayValue,
247
- title: formatter(group.displayValue),
248
- values: group.values ?? [],
249
- level,
250
- },
251
- ...getCheckboxes(
252
- group.values ?? [],
253
- group.displayValue,
254
- renderer,
255
- formatter,
256
- group.groups,
257
- level + 1
258
- ),
259
- ])
260
- .flat()
261
- : values.map<DataGridFilterCheckbox>((value) => ({
262
- displayValue: renderer(value),
263
- title: formatter(value),
264
- values: [value ?? ''],
265
- level,
266
- }));
267
-
268
- export const dateFilter = (key: string): DataGridFilter<'date'> => ({
269
- type: 'date',
270
- operator: 'before',
271
- values: [''],
272
- getter: (row) => row[key] ?? '',
273
- });
274
-
275
- export const textFilter = (key: string): DataGridFilter<'text'> => ({
276
- type: 'text',
277
- operator: 'contains',
278
- values: [''],
279
- getter: (row) => row[key] ?? '',
280
- });
281
-
282
- export const numberFilter = (key: string): DataGridFilter<'number'> => ({
283
- type: 'number',
284
- operator: 'equals',
285
- values: [0],
286
- getter: (row) => row[key] ?? '',
287
- });
@@ -1,2 +0,0 @@
1
- export * from './filters';
2
- export * from './columns';
@@ -1,30 +0,0 @@
1
- import { DataGridColumns, DataGridContext } from '../types';
2
- import { useContext, useMemo } from 'react';
3
-
4
- import { isColumnVisible } from '../helpers/columns';
5
- import { pickBy } from 'lodash';
6
-
7
- export { useDataGridCopy } from './useDataGridCopy';
8
- export { useDataGridSettings } from './useDataGridSettings';
9
- export { useDataGrid } from './useDataGrid';
10
-
11
- export const useDataGridContext = <R>(context: DataGridContext<R>) =>
12
- useContext(context);
13
-
14
- export const useVisibleAndHiddenColumns = <R>(columns: DataGridColumns<R>) =>
15
- useMemo(
16
- () => [
17
- pickBy(columns, (col) => isColumnVisible(col)),
18
- pickBy(columns, (col) => !isColumnVisible(col)),
19
- ],
20
- [columns]
21
- );
22
-
23
- export const useSortedColumns = <R>(columns: DataGridColumns<R>) =>
24
- useMemo(
25
- () =>
26
- Object.entries(columns)
27
- .filter(([, col]) => isColumnVisible(col))
28
- .sort((a, b) => (a[1].order ?? 0) - (b[1].order ?? 0)),
29
- [columns]
30
- );
@@ -1,306 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
-
4
- import { DEFAULT_ROW_HEIGHT, VIRTUAL_SCROLL_TOLERANCE } from '../styles';
5
- import {
6
- DataGridColumns,
7
- DataGridContext,
8
- DataGridContextProps,
9
- DataGridFilters,
10
- DataGridFooterFunction,
11
- DataGridProps,
12
- DataGridSort,
13
- } from '../types';
14
- import {
15
- createContext,
16
- useCallback,
17
- useEffect,
18
- useMemo,
19
- useRef,
20
- useState,
21
- } from 'react';
22
- import { useDataGridCopy, useSortedColumns } from '.';
23
-
24
- import { applyFilter } from '../helpers';
25
- import { merge } from 'lodash';
26
- import { useDataGridSettings } from './useDataGridSettings';
27
- import { useElementSize } from '../../../../hooks';
28
-
29
- export const useDataGrid = <R,>(
30
- props: DataGridProps<R>,
31
- override?: Partial<DataGridContextProps<R>>
32
- ): [DataGridContextProps<R>, DataGridContext<R>] => {
33
- const {
34
- rows,
35
- onFiltersChanged,
36
- onSortsChanged,
37
- loadCopyRows,
38
- rowHeight = DEFAULT_ROW_HEIGHT,
39
- onVisibleRowsChange,
40
- onSelectionChange,
41
- selectable,
42
- initialSorts,
43
- } = props;
44
- const [columns, setColumns] = useState<DataGridColumns<R>>(props.columns);
45
-
46
- const visibleColumns = useSortedColumns(columns);
47
-
48
- /** SETTINGS */
49
-
50
- const { settings, setSettings, saveSettings } = useDataGridSettings(
51
- props.name
52
- );
53
-
54
- const setColumnWidth = useCallback(
55
- (key: string, width: number) => {
56
- setSettings((prev) => ({ ...prev, [key]: { ...prev[key], width } }));
57
- },
58
- [setSettings]
59
- );
60
-
61
- const gridTemplateColumns = useMemo(
62
- () =>
63
- [
64
- ...(selectable ? ['var(--space-10)'] : []),
65
- ...visibleColumns.map(([, col]) => `${col.width ?? 150}px`),
66
- ].join(' '),
67
- [selectable, visibleColumns]
68
- );
69
-
70
- // Update columns when settings change
71
- useEffect(() => {
72
- setColumns((prev) => merge({}, prev, settings));
73
- }, [settings]);
74
-
75
- /** ROWS SELECTION **/
76
-
77
- const rowKeyGetter = useMemo(
78
- () =>
79
- typeof props.rowKey === 'function'
80
- ? props.rowKey
81
- : (row: R) => String(row?.[props.rowKey as keyof R]),
82
- [props.rowKey]
83
- );
84
- const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
85
-
86
- const selectedRows = useMemo(
87
- () => props.rows.filter((row) => selectedKeys.includes(rowKeyGetter(row))),
88
- [props.rows, rowKeyGetter, selectedKeys]
89
- );
90
-
91
- useEffect(() => {
92
- onSelectionChange?.(selectedKeys);
93
- }, [onSelectionChange, selectedKeys]);
94
-
95
- /** ROWS FILTERING **/
96
-
97
- const [filters, setFilters] = useState<DataGridFilters>({});
98
- const [filteredRows, setFilteredRows] = useState<R[]>(rows ?? []);
99
-
100
- useEffect(() => {
101
- onFiltersChanged?.(filters);
102
- }, [filters, onFiltersChanged]);
103
-
104
- useEffect(() => {
105
- const filteredRows =
106
- props.filter === false
107
- ? rows
108
- : Object.entries(filters).reduce(
109
- (tempRows, [, filter]) =>
110
- applyFilter(tempRows, filter as any /* TODO : fix typings */),
111
- rows
112
- );
113
- setFilteredRows(filteredRows ?? []);
114
- }, [filters, props.filter, rows]);
115
-
116
- /** CELL EDITING */
117
-
118
- const [editingCell, setEditingCell] = useState<[number, number]>([-1, -1]);
119
-
120
- /** ROWS SORTING **/
121
-
122
- const [sorts, setSorts] = useState<Record<string, DataGridSort>>(
123
- initialSorts ?? {}
124
- );
125
- const [sortedRows, setSortedRows] = useState<R[]>(rows);
126
-
127
- useEffect(() => {
128
- const sortedRows = [...filteredRows];
129
- if (props.sort !== false) {
130
- Object.entries(sorts).forEach(([sortKey, sort]) => {
131
- // Get the sort column and make sure it exists and is sortable
132
- const sortColumn = columns[sortKey];
133
- if (!sortColumn || typeof sortColumn.sortGetter !== 'function') return;
134
-
135
- // Sort the rows using the sortGetter function of the column
136
- const sortDirection = sort === 'asc' ? 1 : -1;
137
- sortedRows.sort((a: R, b: R) => {
138
- const aValue = sortColumn.sortGetter!(a);
139
- const bValue = sortColumn.sortGetter!(b);
140
- if (aValue === bValue) return 0;
141
- return aValue > bValue ? sortDirection : -sortDirection;
142
- });
143
- });
144
- }
145
- setSortedRows(sortedRows);
146
- }, [columns, filteredRows, sorts, onSortsChanged, props.sort]);
147
-
148
- useEffect(() => {
149
- onSortsChanged?.(sorts);
150
- }, [sorts, onSortsChanged]);
151
-
152
- /** VIRTUAL SCROLLING */
153
-
154
- const scrollableRef = useRef<HTMLTableSectionElement | null>(null);
155
- const { height } = useElementSize(scrollableRef.current);
156
-
157
- const [scrollTop, setScrollTop] = useState(0);
158
- const [index, length] =
159
- // props.showAllRows ? [0, sortedRows.length] :
160
- [Math.floor(scrollTop / rowHeight), Math.ceil(height / rowHeight)];
161
-
162
- const onScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {
163
- const target = e.target as HTMLDivElement;
164
- setScrollTop(target.scrollTop);
165
- }, []);
166
-
167
- const indexWithTolerance = Math.max(0, index - VIRTUAL_SCROLL_TOLERANCE);
168
- const lengthWithTolerance = length + 2 * VIRTUAL_SCROLL_TOLERANCE;
169
- const visibleRows = sortedRows.slice(
170
- indexWithTolerance,
171
- indexWithTolerance + lengthWithTolerance
172
- );
173
-
174
- useEffect(() => {
175
- onVisibleRowsChange?.(indexWithTolerance, lengthWithTolerance);
176
- }, [indexWithTolerance, lengthWithTolerance, onVisibleRowsChange]);
177
-
178
- /** FOOTERS */
179
- const [footers, setFooters] = useState<Record<string, string>>(
180
- props.initialFooters ?? {}
181
- );
182
-
183
- const footerFunctions = useMemo(
184
- () =>
185
- Object.entries(footers).reduce((acc, [columnKey, footerKey]) => {
186
- const column = columns[columnKey];
187
- if (!column) {
188
- return acc;
189
- }
190
- if (typeof column.footer === 'function') {
191
- acc[columnKey] = column.footer;
192
- } else if (
193
- typeof column.footer === 'object' &&
194
- typeof column.footer[footerKey] === 'function' &&
195
- column.footer[footerKey] !== null
196
- ) {
197
- acc[columnKey] = column.footer[footerKey] as any;
198
- }
199
- return acc;
200
- }, {} as Record<string, DataGridFooterFunction<R>>),
201
- [columns, footers]
202
- );
203
-
204
- /** COPYING */
205
-
206
- const { copyTable } = useDataGridCopy({
207
- rows,
208
- visibleColumns,
209
- footerFunctions,
210
- loadCopyRows,
211
- });
212
-
213
- const contextValue = useMemo<DataGridContextProps<R>>(
214
- () => ({
215
- ...props,
216
- columns,
217
- visibleColumns,
218
- sortedRows,
219
- selectedRows,
220
- selectedKeys,
221
- setSelectedKeys,
222
- sorts,
223
- setSorts,
224
- filters,
225
- setFilters,
226
- editingCell,
227
- setEditingCell,
228
- copyTable,
229
- setColumnWidth,
230
- settings,
231
- setSettings,
232
- saveSettings,
233
- visibleRows,
234
- scrollableRef,
235
- onScroll,
236
- index,
237
- length,
238
- rowKeyGetter,
239
- gridTemplateColumns,
240
- footers,
241
- setFooters,
242
- footerFunctions,
243
- ...override,
244
- }),
245
- [
246
- props,
247
- columns,
248
- visibleColumns,
249
- sortedRows,
250
- selectedRows,
251
- selectedKeys,
252
- sorts,
253
- filters,
254
- editingCell,
255
- copyTable,
256
- setColumnWidth,
257
- settings,
258
- setSettings,
259
- saveSettings,
260
- visibleRows,
261
- onScroll,
262
- index,
263
- length,
264
- rowKeyGetter,
265
- gridTemplateColumns,
266
- footers,
267
- footerFunctions,
268
- override,
269
- ]
270
- );
271
-
272
- const context = useMemo(
273
- () =>
274
- createContext<DataGridContextProps<R>>({
275
- rows: [],
276
- columns: {},
277
- visibleColumns: [],
278
- rowKey: '' as keyof R,
279
- rowKeyGetter: () => '',
280
- sortedRows: [],
281
- selectedRows: [],
282
- selectedKeys: [],
283
- setSelectedKeys: () => {},
284
- setSorts: () => {},
285
- setFilters: () => {},
286
- editingCell: [-1, -1],
287
- setEditingCell: () => {},
288
- copyTable: async () => {},
289
- setColumnWidth: () => {},
290
- saveSettings: () => {},
291
- settings: {},
292
- setSettings: () => {},
293
- visibleRows: [],
294
- scrollableRef: { current: null },
295
- onScroll: () => {},
296
- index: 0,
297
- length: 0,
298
- gridTemplateColumns: '',
299
- footers: {},
300
- setFooters: () => {},
301
- }),
302
- []
303
- );
304
-
305
- return useMemo(() => [contextValue, context], [context, contextValue]);
306
- };