@coveord/plasma-mantine 49.3.5 → 49.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/.turbo/turbo-test.log +29 -29
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/cjs/components/table/Table.js +8 -10
  5. package/dist/cjs/components/table/Table.js.map +1 -1
  6. package/dist/cjs/components/table/Table.types.js +6 -0
  7. package/dist/cjs/components/table/Table.types.js.map +1 -0
  8. package/dist/cjs/components/table/TableActions.js +3 -3
  9. package/dist/cjs/components/table/TableActions.js.map +1 -1
  10. package/dist/cjs/components/table/TableContext.js +18 -3
  11. package/dist/cjs/components/table/TableContext.js.map +1 -1
  12. package/dist/cjs/components/table/TableDateRangePicker.js +2 -2
  13. package/dist/cjs/components/table/TableDateRangePicker.js.map +1 -1
  14. package/dist/cjs/components/table/TableFilter.js +2 -2
  15. package/dist/cjs/components/table/TableFilter.js.map +1 -1
  16. package/dist/cjs/components/table/TableHeader.js +2 -2
  17. package/dist/cjs/components/table/TableHeader.js.map +1 -1
  18. package/dist/cjs/components/table/TablePagination.js +2 -2
  19. package/dist/cjs/components/table/TablePagination.js.map +1 -1
  20. package/dist/cjs/components/table/TablePerPage.js +2 -2
  21. package/dist/cjs/components/table/TablePerPage.js.map +1 -1
  22. package/dist/cjs/components/table/TablePredicate.js +2 -2
  23. package/dist/cjs/components/table/TablePredicate.js.map +1 -1
  24. package/dist/cjs/components/table/index.js +7 -1
  25. package/dist/cjs/components/table/index.js.map +1 -1
  26. package/dist/cjs/components/table/useRowSelection.js +27 -17
  27. package/dist/cjs/components/table/useRowSelection.js.map +1 -1
  28. package/dist/cjs/index.js.map +1 -1
  29. package/dist/definitions/components/table/Table.d.ts +1 -98
  30. package/dist/definitions/components/table/Table.d.ts.map +1 -1
  31. package/dist/definitions/components/table/Table.types.d.ts +177 -0
  32. package/dist/definitions/components/table/Table.types.d.ts.map +1 -0
  33. package/dist/definitions/components/table/TableActions.d.ts.map +1 -1
  34. package/dist/definitions/components/table/TableContext.d.ts +4 -71
  35. package/dist/definitions/components/table/TableContext.d.ts.map +1 -1
  36. package/dist/definitions/components/table/TableFilter.d.ts.map +1 -1
  37. package/dist/definitions/components/table/TablePagination.d.ts.map +1 -1
  38. package/dist/definitions/components/table/TablePerPage.d.ts.map +1 -1
  39. package/dist/definitions/components/table/TablePredicate.d.ts.map +1 -1
  40. package/dist/definitions/components/table/index.d.ts +2 -2
  41. package/dist/definitions/components/table/index.d.ts.map +1 -1
  42. package/dist/definitions/components/table/useRowSelection.d.ts +4 -1
  43. package/dist/definitions/components/table/useRowSelection.d.ts.map +1 -1
  44. package/dist/definitions/index.d.ts +1 -1
  45. package/dist/definitions/index.d.ts.map +1 -1
  46. package/dist/esm/components/table/Table.js +9 -11
  47. package/dist/esm/components/table/Table.js.map +1 -1
  48. package/dist/esm/components/table/Table.types.js +3 -0
  49. package/dist/esm/components/table/Table.types.js.map +1 -0
  50. package/dist/esm/components/table/TableActions.js +2 -2
  51. package/dist/esm/components/table/TableActions.js.map +1 -1
  52. package/dist/esm/components/table/TableContext.js +8 -1
  53. package/dist/esm/components/table/TableContext.js.map +1 -1
  54. package/dist/esm/components/table/TableDateRangePicker.js +1 -1
  55. package/dist/esm/components/table/TableDateRangePicker.js.map +1 -1
  56. package/dist/esm/components/table/TableFilter.js +1 -1
  57. package/dist/esm/components/table/TableFilter.js.map +1 -1
  58. package/dist/esm/components/table/TableHeader.js +1 -1
  59. package/dist/esm/components/table/TableHeader.js.map +1 -1
  60. package/dist/esm/components/table/TablePagination.js +1 -1
  61. package/dist/esm/components/table/TablePagination.js.map +1 -1
  62. package/dist/esm/components/table/TablePerPage.js +1 -1
  63. package/dist/esm/components/table/TablePerPage.js.map +1 -1
  64. package/dist/esm/components/table/TablePredicate.js +2 -2
  65. package/dist/esm/components/table/TablePredicate.js.map +1 -1
  66. package/dist/esm/components/table/index.js +1 -1
  67. package/dist/esm/components/table/index.js.map +1 -1
  68. package/dist/esm/components/table/useRowSelection.js +26 -17
  69. package/dist/esm/components/table/useRowSelection.js.map +1 -1
  70. package/dist/esm/index.js.map +1 -1
  71. package/package.json +5 -4
  72. package/src/components/table/Table.tsx +16 -117
  73. package/src/components/table/Table.types.ts +203 -0
  74. package/src/components/table/TableActions.tsx +10 -3
  75. package/src/components/table/TableContext.tsx +9 -70
  76. package/src/components/table/TableDateRangePicker.tsx +1 -1
  77. package/src/components/table/TableFilter.tsx +2 -3
  78. package/src/components/table/TableHeader.tsx +1 -1
  79. package/src/components/table/TablePagination.tsx +3 -3
  80. package/src/components/table/TablePerPage.tsx +2 -3
  81. package/src/components/table/TablePredicate.tsx +3 -2
  82. package/src/components/table/__tests__/Table.spec.tsx +59 -22
  83. package/src/components/table/index.ts +2 -2
  84. package/src/components/table/useRowSelection.ts +36 -21
  85. package/src/index.ts +2 -0
  86. package/dist/cjs/components/table/useTable.js +0 -21
  87. package/dist/cjs/components/table/useTable.js.map +0 -1
  88. package/dist/definitions/components/table/useTable.d.ts +0 -16
  89. package/dist/definitions/components/table/useTable.d.ts.map +0 -1
  90. package/dist/esm/components/table/useTable.js +0 -11
  91. package/dist/esm/components/table/useTable.js.map +0 -1
  92. package/src/components/table/useTable.tsx +0 -11
@@ -3,9 +3,9 @@ import {render, screen, userEvent, waitFor, within} from '@test-utils';
3
3
  import {FunctionComponent} from 'react';
4
4
 
5
5
  import {Table} from '../Table';
6
- import {useTable} from '../useTable';
6
+ import {useTable} from '../TableContext';
7
7
 
8
- type RowData = {firstName: string; lastName?: string};
8
+ type RowData = {id: string; firstName: string; lastName?: string};
9
9
 
10
10
  const columnHelper = createColumnHelper<RowData>();
11
11
  const columns: Array<ColumnDef<RowData>> = [
@@ -15,7 +15,13 @@ const columns: Array<ColumnDef<RowData>> = [
15
15
 
16
16
  describe('Table', () => {
17
17
  it('renders the data', () => {
18
- render(<Table data={[{firstName: 'first', lastName: 'last'}]} columns={columns} />);
18
+ render(
19
+ <Table
20
+ getRowId={({id}) => id}
21
+ data={[{id: '🆔', firstName: 'first', lastName: 'last'}]}
22
+ columns={columns}
23
+ />
24
+ );
19
25
 
20
26
  expect(screen.getByRole('columnheader', {name: 'firstName'})).toBeVisible();
21
27
  expect(screen.getByRole('columnheader', {name: 'lastName'})).toBeVisible();
@@ -45,7 +51,7 @@ describe('Table', () => {
45
51
  enableSorting: false,
46
52
  }),
47
53
  ];
48
- render(<Table data={[{firstName: 'first', lastName: 'last'}]} columns={customColumns} />);
54
+ render(<Table data={[{id: '🆔', firstName: 'first', lastName: 'last'}]} columns={customColumns} />);
49
55
 
50
56
  expect(screen.getByRole('columnheader', {name: 'First Name'})).toBeVisible();
51
57
  expect(screen.getByRole('columnheader', {name: 'Last Name'})).toBeVisible();
@@ -141,7 +147,8 @@ describe('Table', () => {
141
147
  ];
142
148
  render(
143
149
  <Table
144
- data={[{firstName: 'first', lastName: 'last'}]}
150
+ getRowId={({id}) => id}
151
+ data={[{id: '🆔', firstName: 'first', lastName: 'last'}]}
145
152
  getExpandChildren={(row: RowData) => <Fixture row={row} />}
146
153
  columns={customColumns}
147
154
  />
@@ -172,10 +179,11 @@ describe('Table', () => {
172
179
  ];
173
180
  render(
174
181
  <Table
182
+ getRowId={({id}) => id}
175
183
  data={[
176
- {firstName: 'Luke', lastName: 'Skywalker'},
177
- {firstName: 'Lea', lastName: 'Skywalker'},
178
- {firstName: 'Han', lastName: 'Solo'},
184
+ {id: '🆔-1', firstName: 'Luke', lastName: 'Skywalker'},
185
+ {id: '🆔-2', firstName: 'Lea', lastName: 'Skywalker'},
186
+ {id: '🆔-3', firstName: 'Han', lastName: 'Solo'},
179
187
  ]}
180
188
  getExpandChildren={(row: RowData) => (row.lastName === 'Skywalker' ? <Fixture row={row} /> : null)}
181
189
  columns={customColumns}
@@ -200,9 +208,10 @@ describe('Table', () => {
200
208
  ];
201
209
  render(
202
210
  <Table
211
+ getRowId={({id}) => id}
203
212
  data={[
204
- {firstName: 'Jack', lastName: 'Russel'},
205
- {firstName: 'Golden', lastName: 'Retriever'},
213
+ {id: '🆔-1', firstName: 'Jack', lastName: 'Russel'},
214
+ {id: '🆔-2', firstName: 'Golden', lastName: 'Retriever'},
206
215
  ]}
207
216
  getExpandChildren={(row: RowData) => <Fixture row={row} />}
208
217
  columns={customColumns}
@@ -234,14 +243,18 @@ describe('Table', () => {
234
243
  const doubleClickSpy = vi.fn();
235
244
  render(
236
245
  <Table<RowData>
237
- data={[{firstName: 'Mario'}, {firstName: 'Luigi'}]}
246
+ getRowId={({id}) => id}
247
+ data={[
248
+ {id: '🆔-1', firstName: 'Mario'},
249
+ {id: '🆔-2', firstName: 'Luigi'},
250
+ ]}
238
251
  columns={columns}
239
252
  doubleClickAction={doubleClickSpy}
240
253
  ></Table>
241
254
  );
242
255
  await user.dblClick(screen.getByRole('cell', {name: 'Mario'}));
243
256
  expect(doubleClickSpy).toHaveBeenCalledTimes(1);
244
- expect(doubleClickSpy).toHaveBeenCalledWith({firstName: 'Mario'});
257
+ expect(doubleClickSpy).toHaveBeenCalledWith({id: '🆔-1', firstName: 'Mario'});
245
258
  });
246
259
 
247
260
  it('reset row selection when user click outside the table', async () => {
@@ -250,9 +263,10 @@ describe('Table', () => {
250
263
  <div>
251
264
  <div>I'm a header</div>
252
265
  <Table
266
+ getRowId={({id}) => id}
253
267
  data={[
254
- {firstName: 'first', lastName: 'last'},
255
- {firstName: 'patate', lastName: 'king'},
268
+ {id: '🆔-1', firstName: 'first', lastName: 'last'},
269
+ {id: '🆔-2', firstName: 'patate', lastName: 'king'},
256
270
  ]}
257
271
  columns={columns}
258
272
  />
@@ -276,9 +290,10 @@ describe('Table', () => {
276
290
  it('displays a checkbox as the first cell of each row', () => {
277
291
  render(
278
292
  <Table
293
+ getRowId={({id}) => id}
279
294
  data={[
280
- {firstName: 'John', lastName: 'Smith'},
281
- {firstName: 'Jane', lastName: 'Doe'},
295
+ {id: '🆔-1', firstName: 'John', lastName: 'Smith'},
296
+ {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'},
282
297
  ]}
283
298
  columns={columns}
284
299
  multiRowSelectionEnabled
@@ -293,13 +308,33 @@ describe('Table', () => {
293
308
  });
294
309
  });
295
310
 
311
+ it('selects the rows specified in the initial state on mount', () => {
312
+ render(
313
+ <Table
314
+ getRowId={({id}) => id}
315
+ data={[
316
+ {id: '🆔-1', firstName: 'John', lastName: 'Smith'},
317
+ {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'},
318
+ ]}
319
+ columns={columns}
320
+ multiRowSelectionEnabled
321
+ initialState={{
322
+ rowSelection: {'🆔-2': {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'}},
323
+ }}
324
+ />
325
+ );
326
+
327
+ expect(screen.getByRole('row', {name: /jane doe/i, selected: true})).toBeInTheDocument();
328
+ });
329
+
296
330
  it('selects all rows of the current page when clicking on the checkbox that is in the column header', async () => {
297
331
  const user = userEvent.setup({delay: null});
298
332
  render(
299
333
  <Table
334
+ getRowId={({id}) => id}
300
335
  data={[
301
- {firstName: 'John', lastName: 'Smith'},
302
- {firstName: 'Jane', lastName: 'Doe'},
336
+ {id: '🆔-1', firstName: 'John', lastName: 'Smith'},
337
+ {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'},
303
338
  ]}
304
339
  columns={columns}
305
340
  multiRowSelectionEnabled
@@ -321,9 +356,10 @@ describe('Table', () => {
321
356
  <div>
322
357
  <div>I'm a header</div>
323
358
  <Table
359
+ getRowId={({id}) => id}
324
360
  data={[
325
- {firstName: 'first', lastName: 'last'},
326
- {firstName: 'patate', lastName: 'king'},
361
+ {id: '🆔-1', firstName: 'first', lastName: 'last'},
362
+ {id: '🆔-2', firstName: 'patate', lastName: 'king'},
327
363
  ]}
328
364
  columns={columns}
329
365
  multiRowSelectionEnabled
@@ -348,9 +384,10 @@ describe('Table', () => {
348
384
  const user = userEvent.setup({delay: null});
349
385
  render(
350
386
  <Table
387
+ getRowId={({id}) => id}
351
388
  data={[
352
- {firstName: 'John', lastName: 'Smith'},
353
- {firstName: 'Jane', lastName: 'Doe'},
389
+ {id: '🆔-1', firstName: 'John', lastName: 'Smith'},
390
+ {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'},
354
391
  ]}
355
392
  columns={columns}
356
393
  multiRowSelectionEnabled
@@ -1,3 +1,3 @@
1
1
  export * from './Table';
2
- export {type onTableChangeEvent} from './TableContext';
3
- export * from './useTable';
2
+ export {useTable} from './TableContext';
3
+ export {type onTableChangeEvent, type InitialTableState, type TableState, type TableProps} from './Table.types';
@@ -1,29 +1,48 @@
1
- import {functionalUpdate, Table} from '@tanstack/table-core';
2
- import {useState} from 'react';
1
+ import {useClickOutside} from '@mantine/hooks';
2
+ import {functionalUpdate, RowSelectionState, Table} from '@tanstack/table-core';
3
+ import isEqual from 'fast-deep-equal';
3
4
 
4
- export const useRowSelection = <T>(table: Table<T>) => {
5
- const [rowSelection, setRowSelection] = useState<Record<string, T>>({});
5
+ import {RowSelectionWithData, TableProps, TableState} from './Table.types';
6
+
7
+ export const useRowSelection = <T>(
8
+ table: Table<T>,
9
+ {multiRowSelectionEnabled}: Pick<TableProps<T>, 'multiRowSelectionEnabled'>
10
+ ) => {
11
+ const outsideClickRef = useClickOutside(() => {
12
+ if (!multiRowSelectionEnabled) {
13
+ clearSelection();
14
+ }
15
+ });
6
16
 
7
17
  table.setOptions((prev) => ({
8
18
  ...prev,
9
19
  onRowSelectionChange: (rowSelectionUpdater) => {
10
20
  table.setState((old) => {
11
- const selectedRowsIds = functionalUpdate(rowSelectionUpdater, old['rowSelection']);
12
- setRowSelection((current) => {
13
- const currentRowsById = table.getRowModel().rowsById;
14
- return Object.keys(selectedRowsIds).reduce((memo, rowId) => {
15
- if (current[rowId]) {
16
- memo[rowId] = current[rowId];
17
- } else {
18
- memo[rowId] = currentRowsById[rowId].original;
21
+ const newRowSelection = functionalUpdate(
22
+ rowSelectionUpdater,
23
+ old['rowSelection']
24
+ ) as RowSelectionWithData<T>;
25
+
26
+ if (isEqual(old['rowSelection'], newRowSelection)) {
27
+ return old;
28
+ }
29
+
30
+ const rows = table.getRowModel().rowsById;
31
+
32
+ Object.keys(newRowSelection).forEach((rowId) => {
33
+ if (newRowSelection[rowId] === true) {
34
+ if (!rows[rowId]) {
35
+ console.error(
36
+ 'The table was not initialized properly, the rowSelection state should contain an object of type Record<string, TData>.'
37
+ );
19
38
  }
20
- return memo;
21
- }, {} as Record<string, T>);
39
+ newRowSelection[rowId] = rows[rowId]?.original ?? (true as T);
40
+ }
22
41
  });
23
42
 
24
43
  return {
25
44
  ...old,
26
- rowSelection: selectedRowsIds,
45
+ rowSelection: newRowSelection as RowSelectionState,
27
46
  };
28
47
  });
29
48
  },
@@ -33,13 +52,9 @@ export const useRowSelection = <T>(table: Table<T>) => {
33
52
  table.resetRowSelection(true);
34
53
  };
35
54
 
36
- const getSelectedRows = () => Object.values(rowSelection);
55
+ const getSelectedRows = () => Object.values((table.getState() as TableState<T>).rowSelection);
37
56
 
38
57
  const getSelectedRow = () => getSelectedRows()[0] ?? null;
39
58
 
40
- return {
41
- clearSelection,
42
- getSelectedRow,
43
- getSelectedRows,
44
- };
59
+ return {clearSelection, getSelectedRow, getSelectedRows, outsideClickRef};
45
60
  };
package/src/index.ts CHANGED
@@ -15,6 +15,8 @@ export {
15
15
  Header,
16
16
  Table,
17
17
  type TableProps,
18
+ type TableState,
19
+ type InitialTableState,
18
20
  type HeaderProps,
19
21
  Modal,
20
22
  Button,
@@ -1,21 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "useTable", {
6
- enumerable: true,
7
- get: function() {
8
- return useTable;
9
- }
10
- });
11
- var _react = require("react");
12
- var _tableContext = require("./TableContext");
13
- var useTable = function() {
14
- var ctx = (0, _react.useContext)(_tableContext.TableContext);
15
- if (ctx === null) {
16
- throw new Error("useTable must be used inside of a TableContext.Provider");
17
- }
18
- return ctx;
19
- };
20
-
21
- //# sourceMappingURL=useTable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/table/useTable.tsx"],"sourcesContent":["import {useContext} from 'react';\nimport {TableContext} from './TableContext';\n\nexport const useTable = () => {\n const ctx = useContext(TableContext);\n if (ctx === null) {\n throw new Error('useTable must be used inside of a TableContext.Provider');\n }\n\n return ctx;\n};\n"],"names":["useTable","ctx","useContext","TableContext","Error"],"mappings":";;;;+BAGaA;;;eAAAA;;;qBAHY;4BACE;AAEpB,IAAMA,WAAW,WAAM;IAC1B,IAAMC,MAAMC,IAAAA,iBAAU,EAACC,0BAAY;IACnC,IAAIF,QAAQ,IAAI,EAAE;QACd,MAAM,IAAIG,MAAM,2DAA2D;IAC/E,CAAC;IAED,OAAOH;AACX"}
@@ -1,16 +0,0 @@
1
- /// <reference types="react" />
2
- export declare const useTable: () => {
3
- onChange: () => void;
4
- state: import("@tanstack/table-core").TableState;
5
- setState: import("react").Dispatch<(prevState: import("@tanstack/table-core").TableState) => import("@tanstack/table-core").TableState>;
6
- isFiltered: boolean;
7
- clearFilters: () => void;
8
- getSelectedRow: () => any;
9
- getSelectedRows: () => any[];
10
- clearSelection: () => void;
11
- form: import("@mantine/form").UseFormReturnType<import("./TableContext").TableFormType, (values: import("./TableContext").TableFormType) => import("./TableContext").TableFormType>;
12
- containerRef: import("react").RefObject<HTMLDivElement>;
13
- multiRowSelectionEnabled: boolean;
14
- getPageCount: () => number;
15
- };
16
- //# sourceMappingURL=useTable.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTable.d.ts","sourceRoot":"","sources":["../../../../src/components/table/useTable.tsx"],"names":[],"mappings":";AAGA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;CAOpB,CAAC"}
@@ -1,11 +0,0 @@
1
- import { useContext } from "react";
2
- import { TableContext } from "./TableContext";
3
- export var useTable = function() {
4
- var ctx = useContext(TableContext);
5
- if (ctx === null) {
6
- throw new Error("useTable must be used inside of a TableContext.Provider");
7
- }
8
- return ctx;
9
- };
10
-
11
- //# sourceMappingURL=useTable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/table/useTable.tsx"],"sourcesContent":["import {useContext} from 'react';\nimport {TableContext} from './TableContext';\n\nexport const useTable = () => {\n const ctx = useContext(TableContext);\n if (ctx === null) {\n throw new Error('useTable must be used inside of a TableContext.Provider');\n }\n\n return ctx;\n};\n"],"names":["useContext","TableContext","useTable","ctx","Error"],"mappings":"AAAA,SAAQA,UAAU,QAAO,QAAQ;AACjC,SAAQC,YAAY,QAAO,iBAAiB;AAE5C,OAAO,IAAMC,WAAW,WAAM;IAC1B,IAAMC,MAAMH,WAAWC;IACvB,IAAIE,QAAQ,IAAI,EAAE;QACd,MAAM,IAAIC,MAAM,2DAA2D;IAC/E,CAAC;IAED,OAAOD;AACX,EAAE"}
@@ -1,11 +0,0 @@
1
- import {useContext} from 'react';
2
- import {TableContext} from './TableContext';
3
-
4
- export const useTable = () => {
5
- const ctx = useContext(TableContext);
6
- if (ctx === null) {
7
- throw new Error('useTable must be used inside of a TableContext.Provider');
8
- }
9
-
10
- return ctx;
11
- };