@monolith-forensics/monolith-ui 1.4.0 → 1.4.2

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.
@@ -17,10 +17,28 @@ import TableDefaults from "./TableDefaults";
17
17
  import shortUUID from "short-uuid";
18
18
  import { SelectionStatus } from "./enums";
19
19
  import moment from "moment";
20
+ import { useControlled } from "../Utilities";
21
+ const calculateSelectionTotal = (selectionState, totalRecords, dataLength = 0) => {
22
+ if (!selectionState) {
23
+ return 0;
24
+ }
25
+ switch (selectionState.selectionStatus) {
26
+ case SelectionStatus.All:
27
+ return totalRecords || dataLength;
28
+ case SelectionStatus.SomeIncluded:
29
+ return selectionState.selectedRowKeys.length;
30
+ case SelectionStatus.SomeExcluded:
31
+ return totalRecords
32
+ ? totalRecords - selectionState.excludedRowKeys.length
33
+ : dataLength - selectionState.excludedRowKeys.length;
34
+ default:
35
+ return 0;
36
+ }
37
+ };
20
38
  export const TableContext = createContext(null);
21
39
  const TableProvider = (_a) => {
22
- var { children, columns, tableInstanceRef, stateStorage, height, maxHeight, minHeight, focusedRowId } = _a, props = __rest(_a, ["children", "columns", "tableInstanceRef", "stateStorage", "height", "maxHeight", "minHeight", "focusedRowId"]);
23
- const _columns = columns
40
+ var { children, columns, data, keyField, tableInstanceRef, stateStorage, tableMenuOptions, manualSorting, manualFiltering, manualSearch, height, maxHeight, minHeight, focusedRowId, enableColumnResize, enableSorting, compact, totalRecords, onColumnStateChange, onColumnReorder, onColumnHeaderClick, onSort, onRowUpdated, tableElement, headerRowElm, tableDimensions, targetElm, listElm, defaultSelectionState, selectionState, onSelectionChange, defaultFilterState, filterState, onFilterChange } = _a, props = __rest(_a, ["children", "columns", "data", "keyField", "tableInstanceRef", "stateStorage", "tableMenuOptions", "manualSorting", "manualFiltering", "manualSearch", "height", "maxHeight", "minHeight", "focusedRowId", "enableColumnResize", "enableSorting", "compact", "totalRecords", "onColumnStateChange", "onColumnReorder", "onColumnHeaderClick", "onSort", "onRowUpdated", "tableElement", "headerRowElm", "tableDimensions", "targetElm", "listElm", "defaultSelectionState", "selectionState", "onSelectionChange", "defaultFilterState", "filterState", "onFilterChange"]);
41
+ const _columns = useMemo(() => columns
24
42
  .map((child, index) => {
25
43
  if (child.dataField === "__key") {
26
44
  throw new Error("dataField cannot be __key");
@@ -34,36 +52,47 @@ const TableProvider = (_a) => {
34
52
  ? child.width < TableDefaults.td.minWidth
35
53
  ? child.width
36
54
  : TableDefaults.td.minWidth
37
- : TableDefaults.td.minWidth, columnId: shortUUID.generate(), enableResize: resolveColumnResize(child, props.enableColumnResize) });
55
+ : TableDefaults.td.minWidth, columnId: shortUUID.generate(), enableResize: resolveColumnResize(child, enableColumnResize) });
38
56
  })
39
- .sort((a, b) => a.orderValue - b.orderValue);
57
+ .sort((a, b) => a.orderValue - b.orderValue), [columns, enableColumnResize]);
40
58
  const savedTableState = useMemo(() => {
41
59
  return (stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.enabled)
42
60
  ? StateStorage.getTableState(stateStorage.key)
43
61
  : undefined;
44
62
  }, [stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.key]);
45
63
  const { columnState: savedColumnState, selectionState: savedSelectionState, sortState: savedSortState, searchState: savedSearchState, filterState: savedFilterState, } = savedTableState || {};
46
- const [compactState, setCompactState] = useState(props.compact || false);
64
+ const [compactState, setCompactState] = useState(compact || false);
47
65
  const [columnState, setColumnState] = useState(syncColumnState(_columns, savedColumnState));
48
66
  const [search, setSearch] = useState(savedSearchState || "");
49
- const [filterState, setFilterState] = useState(savedFilterState);
67
+ const [_filterState, _setFilterState] = useControlled(filterState, defaultFilterState ||
68
+ savedFilterState || {
69
+ combinator: "and",
70
+ rules: [],
71
+ });
50
72
  const [sortState, setSortState] = useState(savedSortState);
51
- const [selectionStatus, setSelectionStatus] = useState((savedSelectionState === null || savedSelectionState === void 0 ? void 0 : savedSelectionState.selectionStatus) || SelectionStatus.None);
52
- const [excludedRowKeys, setExcludedRowKeys] = useState((savedSelectionState === null || savedSelectionState === void 0 ? void 0 : savedSelectionState.excludedRowKeys) || []);
53
- const [selectedRowKeys, setSelectedRowKeys] = useState((savedSelectionState === null || savedSelectionState === void 0 ? void 0 : savedSelectionState.selectedRowKeys) || []);
54
- const calculateSelectionTotal = (selectionState, totalRecords, dataLength = 0) => {
55
- switch (selectionState.selectionStatus) {
56
- case SelectionStatus.All:
57
- return totalRecords || dataLength;
58
- case SelectionStatus.SomeIncluded:
59
- return selectionState.selectedRowKeys.length;
60
- case SelectionStatus.SomeExcluded:
61
- return totalRecords
62
- ? totalRecords - selectionState.excludedRowKeys.length
63
- : dataLength - selectionState.excludedRowKeys.length;
64
- default:
65
- return 0;
66
- }
73
+ const [_selectionState, _setSelectionState] = useControlled(selectionState, defaultSelectionState || {
74
+ selectedRowKeys: (savedSelectionState === null || savedSelectionState === void 0 ? void 0 : savedSelectionState.selectedRowKeys) || [],
75
+ excludedRowKeys: (savedSelectionState === null || savedSelectionState === void 0 ? void 0 : savedSelectionState.excludedRowKeys) || [],
76
+ selectionStatus: (savedSelectionState === null || savedSelectionState === void 0 ? void 0 : savedSelectionState.selectionStatus) || SelectionStatus.None,
77
+ totalSelected: calculateSelectionTotal(savedSelectionState, totalRecords, data.length),
78
+ });
79
+ const selectionStatus = _selectionState.selectionStatus;
80
+ const excludedRowKeys = _selectionState.excludedRowKeys;
81
+ const selectedRowKeys = _selectionState.selectedRowKeys;
82
+ const setSelectionStatus = (selectionStatus) => {
83
+ _setSelectionState((prev) => {
84
+ return Object.assign(Object.assign({}, prev), { selectionStatus });
85
+ });
86
+ };
87
+ const setExcludedRowKeys = (excludedRowKeys) => {
88
+ _setSelectionState((prev) => {
89
+ return Object.assign(Object.assign({}, prev), { excludedRowKeys });
90
+ });
91
+ };
92
+ const setSelectedRowKeys = (selectedRowKeys) => {
93
+ _setSelectionState((prev) => {
94
+ return Object.assign(Object.assign({}, prev), { selectedRowKeys });
95
+ });
67
96
  };
68
97
  const getCalculatedSelectionTotal = () => {
69
98
  return calculateSelectionTotal({
@@ -71,15 +100,14 @@ const TableProvider = (_a) => {
71
100
  excludedRowKeys,
72
101
  selectionStatus,
73
102
  totalSelected: 0,
74
- }, props === null || props === void 0 ? void 0 : props.totalRecords, props.data.length);
103
+ }, totalRecords, data.length);
75
104
  };
76
105
  const getColumnState = (dataField) => {
77
106
  return columnState.find((col) => col.dataField === dataField);
78
107
  };
79
108
  const updateColumnState = (columnState) => {
80
- var _a;
81
109
  setColumnState(columnState);
82
- (_a = props.onColumnStateChange) === null || _a === void 0 ? void 0 : _a.call(props, columnState);
110
+ onColumnStateChange === null || onColumnStateChange === void 0 ? void 0 : onColumnStateChange(columnState);
83
111
  if (stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.enabled) {
84
112
  if ((stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.type) === "localStorage") {
85
113
  StateStorage.setColumnState(stateStorage.key, columnState);
@@ -87,7 +115,7 @@ const TableProvider = (_a) => {
87
115
  }
88
116
  };
89
117
  const handleColumnReorder = (dragColumn, dropColumn) => {
90
- var _a, _b, _c;
118
+ var _a, _b;
91
119
  if (!dragColumn || !dropColumn)
92
120
  return;
93
121
  const dropColumnOrder = (_a = columnState.find((col) => col.dataField === dropColumn.dataField)) === null || _a === void 0 ? void 0 : _a.orderValue;
@@ -110,14 +138,13 @@ const TableProvider = (_a) => {
110
138
  })
111
139
  .sort((a, b) => a.orderValue - b.orderValue);
112
140
  updateColumnState(newColumnState);
113
- (_c = props.onColumnReorder) === null || _c === void 0 ? void 0 : _c.call(props, {
141
+ onColumnReorder === null || onColumnReorder === void 0 ? void 0 : onColumnReorder({
114
142
  columnState: newColumnState,
115
143
  column: dragColumn,
116
144
  });
117
145
  };
118
146
  const handleColumnHeaderClick = (column) => {
119
- var _a, _b;
120
- if (props.enableSorting === true || column.enableSorting === true) {
147
+ if (enableSorting === true || column.enableSorting === true) {
121
148
  let newSortState = {
122
149
  dataField: column.dataField,
123
150
  dir: "asc",
@@ -132,16 +159,17 @@ const TableProvider = (_a) => {
132
159
  }
133
160
  }
134
161
  }
135
- (_a = props.onColumnHeaderClick) === null || _a === void 0 ? void 0 : _a.call(props, { column, sort: newSortState });
162
+ onColumnHeaderClick === null || onColumnHeaderClick === void 0 ? void 0 : onColumnHeaderClick({ column, sort: newSortState });
136
163
  updateSortState(newSortState);
137
164
  }
138
165
  else {
139
- (_b = props.onColumnHeaderClick) === null || _b === void 0 ? void 0 : _b.call(props, { column, sort: undefined });
166
+ onColumnHeaderClick === null || onColumnHeaderClick === void 0 ? void 0 : onColumnHeaderClick({ column, sort: undefined });
140
167
  updateSortState(undefined);
141
168
  }
142
169
  };
143
170
  const handleFilterChange = (query) => {
144
- setFilterState(query);
171
+ _setFilterState(query);
172
+ onFilterChange === null || onFilterChange === void 0 ? void 0 : onFilterChange(query);
145
173
  if (stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.enabled) {
146
174
  if ((stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.type) === "localStorage") {
147
175
  StateStorage.setFilterState(stateStorage.key, query);
@@ -149,9 +177,9 @@ const TableProvider = (_a) => {
149
177
  }
150
178
  };
151
179
  const updateSearchState = (searchState) => {
152
- var _a, _b, _c;
180
+ var _a, _b;
153
181
  setSearch(searchState);
154
- (_c = (_b = (_a = props.tableMenuOptions) === null || _a === void 0 ? void 0 : _a.searchOptions) === null || _b === void 0 ? void 0 : _b.onSearch) === null || _c === void 0 ? void 0 : _c.call(_b, searchState);
182
+ (_b = (_a = tableMenuOptions === null || tableMenuOptions === void 0 ? void 0 : tableMenuOptions.searchOptions) === null || _a === void 0 ? void 0 : _a.onSearch) === null || _b === void 0 ? void 0 : _b.call(_a, searchState);
155
183
  if (stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.enabled) {
156
184
  if ((stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.type) === "localStorage") {
157
185
  StateStorage.setSearchState(stateStorage.key, searchState);
@@ -165,10 +193,10 @@ const TableProvider = (_a) => {
165
193
  updateSearchState("");
166
194
  };
167
195
  const updateSortState = (sortState) => {
168
- var _a, _b;
196
+ var _a;
169
197
  setSortState(sortState);
170
- (_a = props.onSort) === null || _a === void 0 ? void 0 : _a.call(props, {
171
- column: (_b = columnState.find((col) => col.dataField === (sortState === null || sortState === void 0 ? void 0 : sortState.dataField))) !== null && _b !== void 0 ? _b : {},
198
+ onSort === null || onSort === void 0 ? void 0 : onSort({
199
+ column: (_a = columnState.find((col) => col.dataField === (sortState === null || sortState === void 0 ? void 0 : sortState.dataField))) !== null && _a !== void 0 ? _a : {},
172
200
  sort: sortState,
173
201
  });
174
202
  if (stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.enabled) {
@@ -179,7 +207,7 @@ const TableProvider = (_a) => {
179
207
  };
180
208
  const sortData = (sortState) => {
181
209
  // sort data
182
- return props.data.sort((a, b) => {
210
+ return data.sort((a, b) => {
183
211
  if (sortState) {
184
212
  if (sortState.dir === "asc") {
185
213
  if (a[sortState.dataField] < b[sortState.dataField]) {
@@ -212,7 +240,7 @@ const TableProvider = (_a) => {
212
240
  };
213
241
  const searchData = (searchText) => {
214
242
  const columnKeys = columnState.map((col) => col.dataField);
215
- return props.data.filter((row) => {
243
+ return data.filter((row) => {
216
244
  return columnKeys.some((key) => {
217
245
  if (typeof row[key] === "string") {
218
246
  return row[key].toLowerCase().includes(searchText.toLowerCase());
@@ -221,157 +249,114 @@ const TableProvider = (_a) => {
221
249
  });
222
250
  });
223
251
  };
252
+ const rowMatchesRule = (row, rule) => {
253
+ var _a, _b, _c, _d;
254
+ const column = columnState.find((col) => col.dataField === rule.dataField);
255
+ const { value, operator, dataField } = rule;
256
+ if (operator.value === "isEmpty") {
257
+ return !row[dataField];
258
+ }
259
+ if (operator.value === "isNotEmpty") {
260
+ return !!row[dataField];
261
+ }
262
+ if (!value || value.length === 0) {
263
+ return true;
264
+ }
265
+ switch (operator.value) {
266
+ case "=":
267
+ if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
268
+ return moment(row[dataField]).isSame(moment(value[0]), "day");
269
+ }
270
+ else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
271
+ return moment(row[dataField]).isSame(moment(value[0]));
272
+ }
273
+ return row[dataField] == value[0];
274
+ case "!=":
275
+ if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
276
+ return !moment(row[dataField]).isSame(moment(value[0]), "day");
277
+ }
278
+ else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
279
+ return !moment(row[dataField]).isSame(moment(value[0]));
280
+ }
281
+ return row[dataField] != value[0];
282
+ case ">":
283
+ if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
284
+ return moment(row[dataField]).isAfter(moment(value[0]), "day");
285
+ }
286
+ else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
287
+ return moment(row[dataField]).isAfter(moment(value[0]));
288
+ }
289
+ return row[dataField] > value[0];
290
+ case "<":
291
+ if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
292
+ return moment(row[dataField]).isBefore(moment(value[0]), "day");
293
+ }
294
+ else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
295
+ return moment(row[dataField]).isBefore(moment(value[0]));
296
+ }
297
+ return row[dataField] < value[0];
298
+ case ">=":
299
+ if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
300
+ return moment(row[dataField]).isSameOrAfter(moment(value[0]), "day");
301
+ }
302
+ else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
303
+ return moment(row[dataField]).isSameOrAfter(moment(value[0]));
304
+ }
305
+ return row[dataField] >= value[0];
306
+ case "<=":
307
+ if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
308
+ return moment(row[dataField]).isSameOrBefore(moment(value[0]), "day");
309
+ }
310
+ else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
311
+ return moment(row[dataField]).isSameOrBefore(moment(value[0]));
312
+ }
313
+ return row[dataField] <= value[0];
314
+ case "between":
315
+ if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
316
+ return moment(row[dataField]).isBetween(moment(value === null || value === void 0 ? void 0 : value[0]), moment(value === null || value === void 0 ? void 0 : value[1]), "day", "[]");
317
+ }
318
+ else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
319
+ return moment(row[dataField]).isBetween(moment(value === null || value === void 0 ? void 0 : value[0]), moment(value === null || value === void 0 ? void 0 : value[1]), undefined, "[]");
320
+ }
321
+ return (row[dataField] >= value[0] &&
322
+ row[dataField] <= value[1]);
323
+ case "notBetween":
324
+ if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
325
+ return !moment(row[dataField]).isBetween(moment(value === null || value === void 0 ? void 0 : value[0]), moment(value === null || value === void 0 ? void 0 : value[1]), "day", "[]");
326
+ }
327
+ else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
328
+ return !moment(row[dataField]).isBetween(moment(value === null || value === void 0 ? void 0 : value[0]), moment(value === null || value === void 0 ? void 0 : value[1]), undefined, "[]");
329
+ }
330
+ return (row[dataField] < value[0] ||
331
+ row[dataField] > value[1]);
332
+ case "contains":
333
+ return (_a = row[dataField]) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes((_b = value[0]) === null || _b === void 0 ? void 0 : _b.toString().toLowerCase());
334
+ case "doesNotContain":
335
+ return !((_c = row[dataField]) === null || _c === void 0 ? void 0 : _c.toLowerCase().includes((_d = value[0]) === null || _d === void 0 ? void 0 : _d.toString().toLowerCase()));
336
+ case "in":
337
+ if (!Array.isArray(value) || value.length === 0) {
338
+ return true;
339
+ }
340
+ return !!value.find((v) => v == row[dataField]);
341
+ case "nin":
342
+ if (!Array.isArray(value) || value.length === 0) {
343
+ return true;
344
+ }
345
+ return !value.find((v) => v == row[dataField]);
346
+ default:
347
+ return true;
348
+ }
349
+ };
224
350
  const filterData = (filter) => {
225
- if (!props.data)
351
+ if (!data)
226
352
  return [];
227
- // create copy of data
228
- let processedData = props.data.map((row) => row);
229
353
  const { combinator, rules } = filter;
230
354
  if (!combinator || !rules)
231
- return props.data;
232
- for (const rule of rules) {
233
- const column = columnState.find((col) => col.dataField === rule.dataField);
234
- const { value, operator, dataField } = rule;
235
- if (operator.value === "isEmpty" || operator.value === "isNotEmpty") {
236
- processedData = processedData.filter((row) => {
237
- return operator.value === "isEmpty"
238
- ? !row[dataField]
239
- : row[dataField];
240
- });
241
- }
242
- if (!value || value.length === 0) {
243
- continue;
244
- }
245
- switch (operator.value) {
246
- case "=":
247
- processedData = processedData.filter((row) => {
248
- if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
249
- return moment(row[dataField]).isSame(moment(value[0]), "day");
250
- }
251
- else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
252
- return moment(row[dataField]).isSame(moment(value[0]));
253
- }
254
- return row[dataField] == value[0];
255
- });
256
- break;
257
- case "!=":
258
- processedData = processedData.filter((row) => {
259
- if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
260
- return !moment(row[dataField]).isSame(moment(value[0]), "day");
261
- }
262
- else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
263
- return !moment(row[dataField]).isSame(moment(value[0]));
264
- }
265
- return row[dataField] != value[0];
266
- });
267
- break;
268
- case ">":
269
- processedData = processedData.filter((row) => {
270
- if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
271
- return moment(row[dataField]).isAfter(moment(value[0]), "day");
272
- }
273
- else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
274
- return moment(row[dataField]).isAfter(moment(value[0]));
275
- }
276
- return row[dataField] > value[0];
277
- });
278
- break;
279
- case "<":
280
- processedData = processedData.filter((row) => {
281
- if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
282
- return moment(row[dataField]).isBefore(moment(value[0]), "day");
283
- }
284
- else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
285
- return moment(row[dataField]).isBefore(moment(value[0]));
286
- }
287
- return row[dataField] < value[0];
288
- });
289
- break;
290
- case ">=":
291
- processedData = processedData.filter((row) => {
292
- if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
293
- return moment(row[dataField]).isSameOrAfter(moment(value[0]), "day");
294
- }
295
- else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
296
- return moment(row[dataField]).isSameOrAfter(moment(value[0]));
297
- }
298
- return row[dataField] >= value[0];
299
- });
300
- break;
301
- case "<=":
302
- processedData = processedData.filter((row) => {
303
- if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
304
- return moment(row[dataField]).isSameOrBefore(moment(value[0]), "day");
305
- }
306
- else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
307
- return moment(row[dataField]).isSameOrBefore(moment(value[0]));
308
- }
309
- return row[dataField] <= value[0];
310
- });
311
- break;
312
- case "between":
313
- processedData = processedData.filter((row) => {
314
- if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
315
- return moment(row[dataField]).isBetween(moment(value === null || value === void 0 ? void 0 : value[0]), moment(value === null || value === void 0 ? void 0 : value[1]), "day", "[]");
316
- }
317
- else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
318
- return moment(row[dataField]).isBetween(moment(value === null || value === void 0 ? void 0 : value[0]), moment(value === null || value === void 0 ? void 0 : value[1]), undefined, "[]");
319
- }
320
- return (row[dataField] >= value[0] &&
321
- row[dataField] <= value[1]);
322
- });
323
- break;
324
- case "notBetween":
325
- processedData = processedData.filter((row) => {
326
- if ((column === null || column === void 0 ? void 0 : column.dataType) === "date") {
327
- return !moment(row[dataField]).isBetween(moment(value === null || value === void 0 ? void 0 : value[0]), moment(value === null || value === void 0 ? void 0 : value[1]), "day", "[]");
328
- }
329
- else if ((column === null || column === void 0 ? void 0 : column.dataType) === "datetime") {
330
- return !moment(row[dataField]).isBetween(moment(value === null || value === void 0 ? void 0 : value[0]), moment(value === null || value === void 0 ? void 0 : value[1]), undefined, "[]");
331
- }
332
- return (row[dataField] < value[0] ||
333
- row[dataField] > value[1]);
334
- });
335
- break;
336
- case "contains":
337
- processedData = processedData.filter((row) => {
338
- var _a, _b;
339
- return (_a = row[dataField]) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes((_b = value[0]) === null || _b === void 0 ? void 0 : _b.toString().toLowerCase());
340
- });
341
- break;
342
- case "doesNotContain":
343
- processedData = processedData.filter((row) => {
344
- var _a, _b;
345
- return !((_a = row[dataField]) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes((_b = value[0]) === null || _b === void 0 ? void 0 : _b.toString().toLowerCase()));
346
- });
347
- break;
348
- case "in":
349
- if (!Array.isArray(value)) {
350
- break;
351
- }
352
- else if (value.length === 0) {
353
- break;
354
- }
355
- processedData = processedData.filter((row) => {
356
- return value.find((v) => v == row[dataField]);
357
- });
358
- break;
359
- case "nin":
360
- if (!Array.isArray(value)) {
361
- break;
362
- }
363
- else if (value.length === 0) {
364
- break;
365
- }
366
- processedData = processedData.filter((row) => {
367
- return !value.find((v) => v == row[dataField]);
368
- });
369
- break;
370
- default:
371
- break;
372
- }
355
+ return data;
356
+ if (combinator === "or") {
357
+ return data.filter((row) => rules.some((rule) => rowMatchesRule(row, rule)));
373
358
  }
374
- return processedData;
359
+ return data.filter((row) => rules.every((rule) => rowMatchesRule(row, rule)));
375
360
  };
376
361
  const toggleColumnVisibility = (dataField) => {
377
362
  const newColumnState = columnState.map((col) => {
@@ -386,8 +371,8 @@ const TableProvider = (_a) => {
386
371
  setCompactState((prev) => !prev);
387
372
  };
388
373
  const getColumnVisibility = (dataField) => {
389
- var _a;
390
- return (((_a = columnState.find((col) => col.dataField === dataField)) === null || _a === void 0 ? void 0 : _a.visible) || true);
374
+ var _a, _b;
375
+ return ((_b = (_a = columnState.find((col) => col.dataField === dataField)) === null || _a === void 0 ? void 0 : _a.visible) !== null && _b !== void 0 ? _b : true);
391
376
  };
392
377
  const saveSelectionState = (selectionState) => {
393
378
  if (stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.enabled) {
@@ -396,38 +381,50 @@ const TableProvider = (_a) => {
396
381
  }
397
382
  }
398
383
  };
384
+ const getRowKey = (row) => {
385
+ const key = !!keyField ? row[keyField] : row.__key;
386
+ return String(key);
387
+ };
399
388
  const selectRow = (row) => {
400
- var _a;
401
- const key = !!props.keyField ? row[props.keyField] : row.__key;
402
- const keyField = !!props.keyField ? props.keyField : "__key";
389
+ const key = getRowKey(row);
403
390
  const newSelectionState = {
404
391
  selectedRowKeys,
405
392
  excludedRowKeys,
406
393
  selectionStatus,
407
394
  totalSelected: 0,
408
395
  };
409
- if (props.data.length === selectedRowKeys.length + 1) {
410
- newSelectionState.selectionStatus = SelectionStatus.All;
396
+ if (selectionStatus === SelectionStatus.All ||
397
+ selectionStatus === SelectionStatus.SomeExcluded) {
398
+ const nextExcluded = excludedRowKeys.filter((k) => k !== key);
399
+ newSelectionState.excludedRowKeys = nextExcluded;
400
+ newSelectionState.selectedRowKeys = [];
401
+ newSelectionState.selectionStatus =
402
+ nextExcluded.length === 0
403
+ ? SelectionStatus.All
404
+ : SelectionStatus.SomeExcluded;
411
405
  }
412
406
  else {
413
- newSelectionState.selectionStatus = SelectionStatus.SomeIncluded;
407
+ const nextSelected = selectedRowKeys.includes(key)
408
+ ? selectedRowKeys
409
+ : [...selectedRowKeys, key];
410
+ newSelectionState.selectedRowKeys = nextSelected;
411
+ newSelectionState.excludedRowKeys = excludedRowKeys.filter((k) => k !== key);
412
+ newSelectionState.selectionStatus =
413
+ nextSelected.length === 0
414
+ ? SelectionStatus.None
415
+ : nextSelected.length === data.length
416
+ ? SelectionStatus.All
417
+ : SelectionStatus.SomeIncluded;
414
418
  }
415
- newSelectionState.selectedRowKeys = [
416
- ...newSelectionState.selectedRowKeys,
417
- key,
418
- ];
419
- newSelectionState.excludedRowKeys =
420
- newSelectionState.excludedRowKeys.filter((k) => k !== key);
421
- newSelectionState.totalSelected = calculateSelectionTotal(newSelectionState, props === null || props === void 0 ? void 0 : props.totalRecords, props.data.length);
419
+ newSelectionState.totalSelected = calculateSelectionTotal(newSelectionState, totalRecords, data.length);
422
420
  setSelectionStatus(newSelectionState.selectionStatus);
423
421
  setSelectedRowKeys(newSelectionState.selectedRowKeys);
424
422
  setExcludedRowKeys(newSelectionState.excludedRowKeys);
425
423
  saveSelectionState(newSelectionState);
426
- (_a = props.onSelectionChange) === null || _a === void 0 ? void 0 : _a.call(props, newSelectionState);
424
+ onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(newSelectionState);
427
425
  };
428
426
  const deselectRow = (row) => {
429
- var _a;
430
- const key = !!props.keyField ? props.keyField : "__key";
427
+ const key = getRowKey(row);
431
428
  const newSelectionState = {
432
429
  selectedRowKeys,
433
430
  excludedRowKeys,
@@ -436,27 +433,34 @@ const TableProvider = (_a) => {
436
433
  };
437
434
  if (selectionStatus === SelectionStatus.All ||
438
435
  selectionStatus === SelectionStatus.SomeExcluded) {
439
- newSelectionState.selectionStatus = SelectionStatus.SomeExcluded;
440
- newSelectionState.excludedRowKeys = [
441
- ...newSelectionState.excludedRowKeys,
442
- row[key],
443
- ];
436
+ const nextExcluded = excludedRowKeys.includes(key)
437
+ ? excludedRowKeys
438
+ : [...excludedRowKeys, key];
439
+ const totalSelectableRows = totalRecords || data.length;
440
+ newSelectionState.selectedRowKeys = [];
441
+ newSelectionState.excludedRowKeys = nextExcluded;
442
+ newSelectionState.selectionStatus =
443
+ nextExcluded.length >= totalSelectableRows
444
+ ? SelectionStatus.None
445
+ : SelectionStatus.SomeExcluded;
444
446
  }
445
- if (selectedRowKeys.length === 1) {
446
- newSelectionState.selectionStatus = SelectionStatus.None;
447
+ else {
448
+ const nextSelected = selectedRowKeys.filter((k) => k !== key);
449
+ newSelectionState.selectedRowKeys = nextSelected;
450
+ newSelectionState.selectionStatus =
451
+ nextSelected.length === 0
452
+ ? SelectionStatus.None
453
+ : SelectionStatus.SomeIncluded;
447
454
  }
448
- newSelectionState.selectedRowKeys =
449
- newSelectionState.selectedRowKeys.filter((k) => k !== row[key]);
450
- newSelectionState.totalSelected = calculateSelectionTotal(newSelectionState, props === null || props === void 0 ? void 0 : props.totalRecords, props.data.length);
455
+ newSelectionState.totalSelected = calculateSelectionTotal(newSelectionState, totalRecords, data.length);
451
456
  setSelectionStatus(newSelectionState.selectionStatus);
452
457
  setSelectedRowKeys(newSelectionState.selectedRowKeys);
453
458
  setExcludedRowKeys(newSelectionState.excludedRowKeys);
454
459
  saveSelectionState(newSelectionState);
455
- (_a = props.onSelectionChange) === null || _a === void 0 ? void 0 : _a.call(props, newSelectionState);
460
+ onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(newSelectionState);
456
461
  };
457
462
  const selectAllRows = () => {
458
- var _a, _b;
459
- const keys = ((_a = props.data) === null || _a === void 0 ? void 0 : _a.map((row) => !!props.keyField ? row[props.keyField] : row.__key)) || [];
463
+ const keys = (data === null || data === void 0 ? void 0 : data.map((row) => getRowKey(row))) || [];
460
464
  const newSelectionState = {
461
465
  selectedRowKeys,
462
466
  excludedRowKeys,
@@ -466,15 +470,14 @@ const TableProvider = (_a) => {
466
470
  newSelectionState.selectedRowKeys = keys;
467
471
  newSelectionState.excludedRowKeys = [];
468
472
  newSelectionState.selectionStatus = SelectionStatus.All;
469
- newSelectionState.totalSelected = calculateSelectionTotal(newSelectionState, props === null || props === void 0 ? void 0 : props.totalRecords, props.data.length);
473
+ newSelectionState.totalSelected = calculateSelectionTotal(newSelectionState, totalRecords, data.length);
470
474
  setSelectionStatus(newSelectionState.selectionStatus);
471
475
  setSelectedRowKeys(newSelectionState.selectedRowKeys);
472
476
  setExcludedRowKeys(newSelectionState.excludedRowKeys);
473
477
  saveSelectionState(newSelectionState);
474
- (_b = props.onSelectionChange) === null || _b === void 0 ? void 0 : _b.call(props, newSelectionState);
478
+ onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(newSelectionState);
475
479
  };
476
480
  const clearSelections = () => {
477
- var _a;
478
481
  const newSelectionState = {
479
482
  selectedRowKeys,
480
483
  excludedRowKeys,
@@ -484,16 +487,16 @@ const TableProvider = (_a) => {
484
487
  newSelectionState.selectedRowKeys = [];
485
488
  newSelectionState.excludedRowKeys = [];
486
489
  newSelectionState.selectionStatus = SelectionStatus.None;
487
- newSelectionState.totalSelected = calculateSelectionTotal(newSelectionState, props === null || props === void 0 ? void 0 : props.totalRecords, props.data.length);
490
+ newSelectionState.totalSelected = calculateSelectionTotal(newSelectionState, totalRecords, data.length);
488
491
  setSelectionStatus(newSelectionState.selectionStatus);
489
492
  setSelectedRowKeys(newSelectionState.selectedRowKeys);
490
493
  setExcludedRowKeys(newSelectionState.excludedRowKeys);
491
- (_a = props.onSelectionChange) === null || _a === void 0 ? void 0 : _a.call(props, newSelectionState);
494
+ onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(newSelectionState);
492
495
  saveSelectionState(newSelectionState);
493
496
  };
494
497
  const getSelectedRows = () => {
495
- return props.data.filter((row) => {
496
- const key = !!props.keyField ? row[props.keyField] : row.__key;
498
+ return data.filter((row) => {
499
+ const key = getRowKey(row);
497
500
  return selectedRowKeys.includes(key);
498
501
  });
499
502
  };
@@ -501,7 +504,7 @@ const TableProvider = (_a) => {
501
504
  return selectedRowKeys;
502
505
  };
503
506
  const isRowSelected = (row) => {
504
- const key = !!props.keyField ? row[props.keyField] : row.__key;
507
+ const key = getRowKey(row);
505
508
  switch (selectionStatus) {
506
509
  case SelectionStatus.All:
507
510
  return true;
@@ -516,7 +519,7 @@ const TableProvider = (_a) => {
516
519
  }
517
520
  };
518
521
  const isRowFocused = (row) => {
519
- const key = !!props.keyField ? row[props.keyField] : row.__key;
522
+ const key = getRowKey(row);
520
523
  return focusedRowId === key;
521
524
  };
522
525
  if (tableInstanceRef) {
@@ -546,33 +549,30 @@ const TableProvider = (_a) => {
546
549
  },
547
550
  sortState,
548
551
  searchState: search,
549
- filterState,
552
+ _filterState,
550
553
  };
551
554
  },
552
555
  };
553
556
  }
554
557
  const _data = useMemo(() => {
555
- let processedData = props.data;
556
- if (props.manualSorting !== true) {
558
+ let processedData = data; // create a new array to avoid mutating the original data
559
+ if (manualSorting !== true) {
557
560
  processedData = sortData(sortState);
558
561
  }
559
- if (props.manualFiltering !== true && filterState) {
560
- processedData = filterData(filterState);
562
+ if (manualFiltering !== true && _filterState) {
563
+ processedData = filterData(_filterState);
561
564
  }
562
- if (props.manualSearch !== true && search) {
565
+ if (manualSearch !== true && search) {
563
566
  processedData = searchData(search);
564
567
  }
565
568
  return processedData;
566
- }, [props.data, columnState, search, sortState, filterState]);
567
- return (_jsx(TableContext.Provider, { value: Object.assign(Object.assign({ columnState,
569
+ }, [data, columnState, search, sortState, _filterState]);
570
+ return (_jsx(TableContext.Provider, { value: Object.assign({ columnState,
568
571
  setColumnState,
569
- sortState, searchState: search, handleColumnReorder,
570
- handleColumnHeaderClick, selectionState: {
571
- selectedRowKeys,
572
- excludedRowKeys,
573
- selectionStatus,
574
- totalSelected: getCalculatedSelectionTotal(),
575
- }, selectRow,
572
+ sortState, searchState: search, totalRecords,
573
+ keyField,
574
+ handleColumnReorder,
575
+ handleColumnHeaderClick, selectionState: _selectionState, selectRow,
576
576
  deselectRow,
577
577
  isRowSelected,
578
578
  isRowFocused,
@@ -583,10 +583,15 @@ const TableProvider = (_a) => {
583
583
  toggleColumnVisibility,
584
584
  runSearch,
585
585
  clearSearch,
586
- handleFilterChange,
587
- filterState,
588
- compactState,
586
+ handleFilterChange, filterState: _filterState, compactState,
589
587
  toggleCompact,
590
- getCalculatedSelectionTotal, tableHeight: height, tableMaxHeight: maxHeight, tableMinHeight: minHeight }, props), { onRowUpdated: (props === null || props === void 0 ? void 0 : props.onRowUpdated) || (() => { }), data: _data }), children: children }));
588
+ getCalculatedSelectionTotal,
589
+ focusedRowId,
590
+ manualSorting,
591
+ manualSearch,
592
+ stateStorage, tableHeight: height, tableMaxHeight: maxHeight, tableMinHeight: minHeight, compact, tableElement: tableElement, headerRowElm: headerRowElm, tableDimensions: tableDimensions, targetElm: targetElm, listElm: listElm, enableColumnResize,
593
+ onSelectionChange,
594
+ onColumnStateChange,
595
+ onColumnReorder, onRowUpdated: onRowUpdated || (() => { }), tableMenuOptions, data: _data }, props), children: children }));
591
596
  };
592
597
  export default TableProvider;