@coveord/plasma-mantine 48.22.3 → 48.23.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 (90) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/.turbo/turbo-test.log +12 -12
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/cjs/components/code-editor/CodeEditor.js +1 -3
  5. package/dist/cjs/components/code-editor/CodeEditor.js.map +1 -1
  6. package/dist/cjs/components/collection/Collection.js +15 -17
  7. package/dist/cjs/components/collection/Collection.js.map +1 -1
  8. package/dist/cjs/components/table/Table.js +48 -45
  9. package/dist/cjs/components/table/Table.js.map +1 -1
  10. package/dist/cjs/components/table/TableActions.js +4 -4
  11. package/dist/cjs/components/table/TableActions.js.map +1 -1
  12. package/dist/cjs/components/table/TableCollapsibleColumn.js +1 -1
  13. package/dist/cjs/components/table/TableCollapsibleColumn.js.map +1 -1
  14. package/dist/cjs/components/table/TableContext.js.map +1 -1
  15. package/dist/cjs/components/table/TableFilter.js +4 -0
  16. package/dist/cjs/components/table/TableFilter.js.map +1 -1
  17. package/dist/cjs/components/table/TableHeader.js +36 -4
  18. package/dist/cjs/components/table/TableHeader.js.map +1 -1
  19. package/dist/cjs/components/table/TablePerPage.js +3 -2
  20. package/dist/cjs/components/table/TablePerPage.js.map +1 -1
  21. package/dist/cjs/components/table/TableSelectableColumn.js +46 -0
  22. package/dist/cjs/components/table/TableSelectableColumn.js.map +1 -0
  23. package/dist/cjs/components/table/Th.js +5 -15
  24. package/dist/cjs/components/table/Th.js.map +1 -1
  25. package/dist/cjs/components/table/useRowSelection.js +58 -0
  26. package/dist/cjs/components/table/useRowSelection.js.map +1 -0
  27. package/dist/cjs/theme/Theme.js +15 -10
  28. package/dist/cjs/theme/Theme.js.map +1 -1
  29. package/dist/definitions/components/code-editor/CodeEditor.d.ts.map +1 -1
  30. package/dist/definitions/components/collection/Collection.d.ts.map +1 -1
  31. package/dist/definitions/components/table/Table.d.ts +12 -2
  32. package/dist/definitions/components/table/Table.d.ts.map +1 -1
  33. package/dist/definitions/components/table/TableActions.d.ts +3 -3
  34. package/dist/definitions/components/table/TableActions.d.ts.map +1 -1
  35. package/dist/definitions/components/table/TableCollapsibleColumn.d.ts +1 -1
  36. package/dist/definitions/components/table/TableContext.d.ts +6 -1
  37. package/dist/definitions/components/table/TableContext.d.ts.map +1 -1
  38. package/dist/definitions/components/table/TableFilter.d.ts.map +1 -1
  39. package/dist/definitions/components/table/TableHeader.d.ts.map +1 -1
  40. package/dist/definitions/components/table/TableSelectableColumn.d.ts +6 -0
  41. package/dist/definitions/components/table/TableSelectableColumn.d.ts.map +1 -0
  42. package/dist/definitions/components/table/Th.d.ts.map +1 -1
  43. package/dist/definitions/components/table/useRowSelection.d.ts +7 -0
  44. package/dist/definitions/components/table/useRowSelection.d.ts.map +1 -0
  45. package/dist/definitions/components/table/useTable.d.ts +2 -0
  46. package/dist/definitions/components/table/useTable.d.ts.map +1 -1
  47. package/dist/definitions/theme/Theme.d.ts.map +1 -1
  48. package/dist/esm/components/code-editor/CodeEditor.js +1 -3
  49. package/dist/esm/components/code-editor/CodeEditor.js.map +1 -1
  50. package/dist/esm/components/collection/Collection.js +15 -17
  51. package/dist/esm/components/collection/Collection.js.map +1 -1
  52. package/dist/esm/components/table/Table.js +48 -45
  53. package/dist/esm/components/table/Table.js.map +1 -1
  54. package/dist/esm/components/table/TableActions.js +4 -4
  55. package/dist/esm/components/table/TableActions.js.map +1 -1
  56. package/dist/esm/components/table/TableCollapsibleColumn.js +2 -2
  57. package/dist/esm/components/table/TableCollapsibleColumn.js.map +1 -1
  58. package/dist/esm/components/table/TableContext.js.map +1 -1
  59. package/dist/esm/components/table/TableFilter.js +4 -0
  60. package/dist/esm/components/table/TableFilter.js.map +1 -1
  61. package/dist/esm/components/table/TableHeader.js +38 -6
  62. package/dist/esm/components/table/TableHeader.js.map +1 -1
  63. package/dist/esm/components/table/TablePerPage.js +3 -2
  64. package/dist/esm/components/table/TablePerPage.js.map +1 -1
  65. package/dist/esm/components/table/TableSelectableColumn.js +38 -0
  66. package/dist/esm/components/table/TableSelectableColumn.js.map +1 -0
  67. package/dist/esm/components/table/Th.js +5 -15
  68. package/dist/esm/components/table/Th.js.map +1 -1
  69. package/dist/esm/components/table/useRowSelection.js +48 -0
  70. package/dist/esm/components/table/useRowSelection.js.map +1 -0
  71. package/dist/esm/theme/Theme.js +15 -10
  72. package/dist/esm/theme/Theme.js.map +1 -1
  73. package/package.json +1 -1
  74. package/src/components/code-editor/CodeEditor.tsx +1 -3
  75. package/src/components/collection/Collection.tsx +8 -10
  76. package/src/components/table/Table.tsx +91 -62
  77. package/src/components/table/TableActions.tsx +7 -7
  78. package/src/components/table/TableCollapsibleColumn.tsx +2 -2
  79. package/src/components/table/TableContext.tsx +6 -1
  80. package/src/components/table/TableFilter.tsx +7 -1
  81. package/src/components/table/TableHeader.tsx +24 -4
  82. package/src/components/table/TablePerPage.tsx +1 -1
  83. package/src/components/table/TableSelectableColumn.tsx +33 -0
  84. package/src/components/table/Th.tsx +6 -19
  85. package/src/components/table/__tests__/Table.spec.tsx +100 -7
  86. package/src/components/table/__tests__/TableActions.spec.tsx +21 -0
  87. package/src/components/table/__tests__/TableFilter.spec.tsx +48 -1
  88. package/src/components/table/__tests__/TablePerPage.spec.tsx +24 -0
  89. package/src/components/table/useRowSelection.ts +45 -0
  90. package/src/theme/Theme.tsx +14 -7
@@ -34,4 +34,25 @@ describe('Table.Actions', () => {
34
34
  expect(screen.queryByRole('button', {name: 'Eat fruit'})).not.toBeInTheDocument();
35
35
  expect(screen.getByRole('button', {name: 'Eat vegetable'})).toBeVisible();
36
36
  });
37
+
38
+ describe('when multi row selection is enabled', () => {
39
+ it('passes down an array of selected rows', async () => {
40
+ const user = userEvent.setup({delay: null});
41
+ const renderSpy = jest.fn().mockImplementation(() => <div />);
42
+ render(
43
+ <Table<RowData>
44
+ data={[{name: 'fruit'}, {name: 'vegetable'}, {name: 'bread'}]}
45
+ columns={columns}
46
+ multiRowSelectionEnabled
47
+ >
48
+ <Table.Header>
49
+ <Table.Actions>{renderSpy}</Table.Actions>
50
+ </Table.Header>
51
+ </Table>
52
+ );
53
+ await user.click(screen.getByRole('cell', {name: 'fruit'}));
54
+ await user.click(screen.getByRole('cell', {name: 'vegetable'}));
55
+ expect(renderSpy).toHaveBeenCalledWith([{name: 'fruit'}, {name: 'vegetable'}]);
56
+ });
57
+ });
37
58
  });
@@ -1,5 +1,5 @@
1
1
  import {ColumnDef, createColumnHelper} from '@tanstack/table-core';
2
- import {render, screen, userEvent} from '@test-utils';
2
+ import {render, screen, userEvent, within} from '@test-utils';
3
3
 
4
4
  import {Table} from '../Table';
5
5
 
@@ -37,4 +37,51 @@ describe('Table.Filter', () => {
37
37
 
38
38
  expect(onChange).toHaveBeenCalledWith(expect.objectContaining({globalFilter: 'vegetable'}));
39
39
  });
40
+
41
+ it('goes back to the first page when changing the filter', async () => {
42
+ const user = userEvent.setup({delay: null});
43
+ const onChange = jest.fn();
44
+ render(
45
+ <Table data={[{name: 'fruit'}, {name: 'vegetable'}]} columns={columns} onChange={onChange}>
46
+ <Table.Header>
47
+ <Table.Filter />
48
+ </Table.Header>
49
+ <Table.Footer>
50
+ <Table.PerPage />
51
+ <Table.Pagination totalPages={2} />
52
+ </Table.Footer>
53
+ </Table>
54
+ );
55
+
56
+ await user.type(screen.getByRole('textbox'), 'veg');
57
+
58
+ expect(onChange).toHaveBeenCalledWith(
59
+ expect.objectContaining({globalFilter: 'veg', pagination: {pageIndex: 0, pageSize: 50}})
60
+ );
61
+ });
62
+
63
+ describe('when multi row selection is enabled', () => {
64
+ it('does not unselect rows that get filtered out', async () => {
65
+ const user = userEvent.setup({delay: null});
66
+ const onChange = jest.fn();
67
+ render(
68
+ <Table
69
+ data={[{name: 'fruit'}, {name: 'vegetable'}]}
70
+ columns={columns}
71
+ onChange={onChange}
72
+ multiRowSelectionEnabled
73
+ >
74
+ <Table.Header>
75
+ <Table.Filter />
76
+ </Table.Header>
77
+ </Table>
78
+ );
79
+
80
+ await user.click(
81
+ within(screen.getByRole('row', {name: /fruit/i})).getByRole('checkbox', {name: /select row/i})
82
+ );
83
+ await user.type(screen.getByRole('textbox'), 'veg');
84
+ expect(screen.getByRole('button', {name: /1 selected/i})).toBeInTheDocument();
85
+ });
86
+ });
40
87
  });
@@ -79,4 +79,28 @@ describe('Table.PerPage', () => {
79
79
  expect.objectContaining({pagination: expect.objectContaining({pageSize: 100})})
80
80
  );
81
81
  });
82
+
83
+ it('resets page index when changing the number of items per page', async () => {
84
+ const user = userEvent.setup({delay: null});
85
+ const onChange = jest.fn();
86
+ render(
87
+ <Table
88
+ data={[{name: 'fruit'}, {name: 'vegetable'}]}
89
+ columns={columns}
90
+ onChange={onChange}
91
+ initialState={{pagination: {pageIndex: 1, pageSize: 50}}}
92
+ >
93
+ <Table.Footer>
94
+ <Table.Pagination totalPages={2} />
95
+ <Table.PerPage />
96
+ </Table.Footer>
97
+ </Table>
98
+ );
99
+
100
+ await user.click(screen.queryByRole('radio', {name: '100'}));
101
+
102
+ expect(onChange).toHaveBeenCalledWith(
103
+ expect.objectContaining({pagination: expect.objectContaining({pageIndex: 0})})
104
+ );
105
+ });
82
106
  });
@@ -0,0 +1,45 @@
1
+ import {functionalUpdate, Table} from '@tanstack/table-core';
2
+ import {useState} from 'react';
3
+
4
+ export const useRowSelection = <T>(table: Table<T>) => {
5
+ const [rowSelection, setRowSelection] = useState<Record<string, T>>({});
6
+
7
+ table.setOptions((prev) => ({
8
+ ...prev,
9
+ onRowSelectionChange: (rowSelectionUpdater) => {
10
+ 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;
19
+ }
20
+ return memo;
21
+ }, {} as Record<string, T>);
22
+ });
23
+
24
+ return {
25
+ ...old,
26
+ rowSelection: selectedRowsIds,
27
+ };
28
+ });
29
+ },
30
+ }));
31
+
32
+ const clearSelection = () => {
33
+ table.resetRowSelection(true);
34
+ };
35
+
36
+ const getSelectedRows = () => Object.values(rowSelection);
37
+
38
+ const getSelectedRow = () => getSelectedRows()[0] ?? null;
39
+
40
+ return {
41
+ clearSelection,
42
+ getSelectedRow,
43
+ getSelectedRows,
44
+ };
45
+ };
@@ -5,6 +5,7 @@ import {ButtonStylesParams, MantineThemeOverride, ModalStylesParams} from '@mant
5
5
  import {PlasmaColors} from './PlasmaColors';
6
6
 
7
7
  export const plasmaTheme: MantineThemeOverride = {
8
+ // These are overrides over https://github.com/mantinedev/mantine/blob/master/src/mantine-styles/src/theme/default-theme.ts
8
9
  colorScheme: 'light',
9
10
  fontFamily: 'canada-type-gibson, sans-serif',
10
11
  black: color.primary.gray[9],
@@ -59,7 +60,7 @@ export const plasmaTheme: MantineThemeOverride = {
59
60
  Button: {
60
61
  styles: (theme, params: ButtonStylesParams) => ({
61
62
  root: {
62
- '&': {fontWeight: 400},
63
+ fontWeight: 400,
63
64
  backgroundColor: params.variant === 'outline' ? 'white' : undefined,
64
65
  },
65
66
  }),
@@ -81,17 +82,23 @@ export const plasmaTheme: MantineThemeOverride = {
81
82
  defaultProps: {
82
83
  withAsterisk: false,
83
84
  },
85
+ styles: (theme) => ({
86
+ label: {
87
+ marginBottom: theme.spacing.xs,
88
+ lineHeight: '20px',
89
+ },
90
+ description: {
91
+ lineHeight: '20px',
92
+ fontSize: theme.fontSizes.sm,
93
+ color: theme.colors.gray[7],
94
+ marginBottom: theme.spacing.xs,
95
+ },
96
+ }),
84
97
  },
85
98
  TextInput: {
86
99
  defaultProps: {
87
100
  radius: 8,
88
101
  },
89
- styles: (theme) => ({
90
- description: {
91
- fontSize: 'inherit',
92
- paddingBottom: theme.spacing.xs,
93
- },
94
- }),
95
102
  },
96
103
  Tooltip: {
97
104
  defaultProps: {