@coveord/plasma-mantine 56.8.1 → 56.9.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.
- package/.turbo/turbo-build.log +4 -4
- package/.turbo/turbo-test.log +107 -106
- package/dist/.tsbuildinfo +1 -1
- package/dist/cjs/components/Table/Table.d.ts +2 -12
- package/dist/cjs/components/Table/Table.d.ts.map +1 -1
- package/dist/cjs/components/Table/Table.js +0 -3
- package/dist/cjs/components/Table/Table.js.map +1 -1
- package/dist/cjs/components/Table/table-column/TableActionsColumn.d.ts +15 -0
- package/dist/cjs/components/Table/table-column/TableActionsColumn.d.ts.map +1 -1
- package/dist/cjs/components/Table/table-column/TableActionsColumn.js +14 -1
- package/dist/cjs/components/Table/table-column/TableActionsColumn.js.map +1 -1
- package/dist/cjs/components/Table/table-columns-selector/TableColumnsSelector.d.ts +11 -32
- package/dist/cjs/components/Table/table-columns-selector/TableColumnsSelector.d.ts.map +1 -1
- package/dist/cjs/components/Table/table-columns-selector/TableColumnsSelector.js +101 -97
- package/dist/cjs/components/Table/table-columns-selector/TableColumnsSelector.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/components/Table/Table.d.ts +2 -12
- package/dist/esm/components/Table/Table.d.ts.map +1 -1
- package/dist/esm/components/Table/Table.js +0 -3
- package/dist/esm/components/Table/Table.js.map +1 -1
- package/dist/esm/components/Table/table-column/TableActionsColumn.d.ts +15 -0
- package/dist/esm/components/Table/table-column/TableActionsColumn.d.ts.map +1 -1
- package/dist/esm/components/Table/table-column/TableActionsColumn.js +12 -1
- package/dist/esm/components/Table/table-column/TableActionsColumn.js.map +1 -1
- package/dist/esm/components/Table/table-columns-selector/TableColumnsSelector.d.ts +11 -32
- package/dist/esm/components/Table/table-columns-selector/TableColumnsSelector.d.ts.map +1 -1
- package/dist/esm/components/Table/table-columns-selector/TableColumnsSelector.js +94 -84
- package/dist/esm/components/Table/table-columns-selector/TableColumnsSelector.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/package.json +3 -3
- package/src/components/Table/Table.tsx +4 -9
- package/src/components/Table/__tests__/TableColumnsSelectorHeader.spec.tsx +325 -0
- package/src/components/Table/table-column/TableActionsColumn.tsx +28 -1
- package/src/components/Table/table-columns-selector/TableColumnsSelector.tsx +96 -125
- package/src/index.ts +1 -0
- package/src/components/Table/__tests__/TableColumnsSelector.spec.tsx +0 -352
|
@@ -1,352 +0,0 @@
|
|
|
1
|
-
import {Box} from '@mantine/core';
|
|
2
|
-
import {ColumnDef, createColumnHelper} from '@tanstack/table-core';
|
|
3
|
-
import {render, screen, userEvent, waitFor, within} from '@test-utils';
|
|
4
|
-
import {Table} from '../Table.js';
|
|
5
|
-
import {TableColumnsSelector} from '../table-columns-selector/TableColumnsSelector.js';
|
|
6
|
-
import {useTable} from '../use-table.js';
|
|
7
|
-
|
|
8
|
-
const mockData = [
|
|
9
|
-
{
|
|
10
|
-
name: 'John Doe',
|
|
11
|
-
age: 30,
|
|
12
|
-
email: 'john.doe@example.com',
|
|
13
|
-
phone: '123-456-7890',
|
|
14
|
-
body: 'coucou',
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
name: 'Jane Doe',
|
|
18
|
-
age: 25,
|
|
19
|
-
email: 'jane.doe@example.com',
|
|
20
|
-
phone: '098-765-4321',
|
|
21
|
-
body: 'coucou 2',
|
|
22
|
-
},
|
|
23
|
-
];
|
|
24
|
-
|
|
25
|
-
type RowData = {
|
|
26
|
-
name: string;
|
|
27
|
-
age: number;
|
|
28
|
-
email: string;
|
|
29
|
-
phone: string;
|
|
30
|
-
body: string;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const columnHelper = createColumnHelper<RowData>();
|
|
34
|
-
const baseColumns: Array<ColumnDef<RowData>> = [
|
|
35
|
-
columnHelper.accessor('name', {header: 'Name', enableSorting: false}),
|
|
36
|
-
columnHelper.accessor('age', {header: 'Age', enableSorting: false}),
|
|
37
|
-
columnHelper.accessor('email', {header: 'Email', enableSorting: false}),
|
|
38
|
-
columnHelper.accessor('phone', {header: 'Phone', enableSorting: false}),
|
|
39
|
-
Table.CollapsibleColumn as ColumnDef<RowData>,
|
|
40
|
-
];
|
|
41
|
-
|
|
42
|
-
describe('TableColumnsSelector', () => {
|
|
43
|
-
it('render the edit button in the table header', () => {
|
|
44
|
-
const Fixture = () => {
|
|
45
|
-
const store = useTable<RowData>();
|
|
46
|
-
return (
|
|
47
|
-
<Table store={store} data={mockData} columns={baseColumns}>
|
|
48
|
-
<Table.Header>
|
|
49
|
-
<TableColumnsSelector />
|
|
50
|
-
</Table.Header>
|
|
51
|
-
</Table>
|
|
52
|
-
);
|
|
53
|
-
};
|
|
54
|
-
render(<Fixture />);
|
|
55
|
-
|
|
56
|
-
expect(screen.getByRole('button', {name: 'Edit columns'})).toBeVisible();
|
|
57
|
-
expect(screen.queryByRole('button', {name: 'Edit columns (4)'})).not.toBeInTheDocument();
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it('renders the custom label when defined', () => {
|
|
61
|
-
const Fixture = () => {
|
|
62
|
-
const store = useTable<RowData>();
|
|
63
|
-
return (
|
|
64
|
-
<Table store={store} data={mockData} columns={baseColumns}>
|
|
65
|
-
<Table.Header>
|
|
66
|
-
<TableColumnsSelector label="Custom label" />
|
|
67
|
-
</Table.Header>
|
|
68
|
-
</Table>
|
|
69
|
-
);
|
|
70
|
-
};
|
|
71
|
-
render(<Fixture />);
|
|
72
|
-
|
|
73
|
-
expect(screen.getByRole('button', {name: 'Custom label'})).toBeVisible();
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it('renders the count of visible columns if showVisibleCountLabel is true', () => {
|
|
77
|
-
const Fixture = () => {
|
|
78
|
-
const store = useTable<RowData>();
|
|
79
|
-
return (
|
|
80
|
-
<Table store={store} data={mockData} columns={baseColumns}>
|
|
81
|
-
<Table.Header>
|
|
82
|
-
<TableColumnsSelector showVisibleCountLabel />
|
|
83
|
-
</Table.Header>
|
|
84
|
-
</Table>
|
|
85
|
-
);
|
|
86
|
-
};
|
|
87
|
-
render(<Fixture />);
|
|
88
|
-
|
|
89
|
-
expect(screen.getByRole('button', {name: 'Edit columns (4)'})).toBeVisible();
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('renders all columns in the dropdown, except the collapsible and the multiselectRow by default', async () => {
|
|
93
|
-
const user = userEvent.setup();
|
|
94
|
-
const Fixture = () => {
|
|
95
|
-
const store = useTable<RowData>({enableMultiRowSelection: true});
|
|
96
|
-
return (
|
|
97
|
-
<Table
|
|
98
|
-
store={store}
|
|
99
|
-
data={mockData}
|
|
100
|
-
columns={baseColumns}
|
|
101
|
-
getRowExpandedContent={(datum) => <Box py="xs">{datum.body}</Box>}
|
|
102
|
-
>
|
|
103
|
-
<Table.Header>
|
|
104
|
-
<TableColumnsSelector />
|
|
105
|
-
</Table.Header>
|
|
106
|
-
</Table>
|
|
107
|
-
);
|
|
108
|
-
};
|
|
109
|
-
render(<Fixture />);
|
|
110
|
-
|
|
111
|
-
await user.click(screen.getByRole('button', {name: 'Edit columns'}));
|
|
112
|
-
const dropdown = await screen.findByRole('dialog', {name: 'Edit columns'});
|
|
113
|
-
const columnsCheckboxes = within(dropdown).getAllByRole('checkbox');
|
|
114
|
-
|
|
115
|
-
expect(columnsCheckboxes).toHaveLength(4);
|
|
116
|
-
expect(columnsCheckboxes[0]).toHaveAccessibleName('Name');
|
|
117
|
-
expect(columnsCheckboxes[1]).toHaveAccessibleName('Age');
|
|
118
|
-
expect(columnsCheckboxes[2]).toHaveAccessibleName('Email');
|
|
119
|
-
expect(columnsCheckboxes[3]).toHaveAccessibleName('Phone');
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('renders all checkboxes checked by default', async () => {
|
|
123
|
-
const user = userEvent.setup();
|
|
124
|
-
const Fixture = () => {
|
|
125
|
-
const store = useTable<RowData>();
|
|
126
|
-
return (
|
|
127
|
-
<Table store={store} data={mockData} columns={baseColumns}>
|
|
128
|
-
<Table.Header>
|
|
129
|
-
<TableColumnsSelector />
|
|
130
|
-
</Table.Header>
|
|
131
|
-
</Table>
|
|
132
|
-
);
|
|
133
|
-
};
|
|
134
|
-
render(<Fixture />);
|
|
135
|
-
|
|
136
|
-
await user.click(screen.getByRole('button', {name: 'Edit columns'}));
|
|
137
|
-
|
|
138
|
-
expect(await screen.findByRole('checkbox', {name: 'Name'})).toBeChecked();
|
|
139
|
-
expect(screen.getByRole('checkbox', {name: 'Age'})).toBeChecked();
|
|
140
|
-
expect(screen.getByRole('checkbox', {name: 'Email'})).toBeChecked();
|
|
141
|
-
expect(screen.getByRole('checkbox', {name: 'Phone'})).toBeChecked();
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
it('renders a disabled checked checkbox for columns that are always visible', async () => {
|
|
145
|
-
const columns: Array<ColumnDef<RowData>> = [
|
|
146
|
-
columnHelper.accessor('name', {header: 'Name', enableSorting: false}),
|
|
147
|
-
columnHelper.accessor('age', {header: 'Age', enableSorting: false, enableHiding: false}),
|
|
148
|
-
columnHelper.accessor('email', {header: 'Email', enableSorting: false}),
|
|
149
|
-
columnHelper.accessor('phone', {header: 'Phone', enableSorting: false}),
|
|
150
|
-
];
|
|
151
|
-
const user = userEvent.setup();
|
|
152
|
-
const Fixture = () => {
|
|
153
|
-
const store = useTable<RowData>();
|
|
154
|
-
return (
|
|
155
|
-
<Table store={store} data={mockData} columns={columns}>
|
|
156
|
-
<Table.Header>
|
|
157
|
-
<TableColumnsSelector />
|
|
158
|
-
</Table.Header>
|
|
159
|
-
</Table>
|
|
160
|
-
);
|
|
161
|
-
};
|
|
162
|
-
render(<Fixture />);
|
|
163
|
-
|
|
164
|
-
await user.click(screen.getByRole('button', {name: 'Edit columns'}));
|
|
165
|
-
|
|
166
|
-
expect(await screen.findByRole('checkbox', {name: 'Name'})).toBeChecked();
|
|
167
|
-
expect(screen.getByRole('checkbox', {name: 'Email'})).toBeChecked();
|
|
168
|
-
expect(screen.getByRole('checkbox', {name: 'Phone'})).toBeChecked();
|
|
169
|
-
|
|
170
|
-
const ageColumn = screen.getByRole('checkbox', {name: 'Age'});
|
|
171
|
-
expect(ageColumn).toBeChecked();
|
|
172
|
-
expect(ageColumn).toBeDisabled();
|
|
173
|
-
await user.hover(ageColumn.parentElement);
|
|
174
|
-
await waitFor(() => {
|
|
175
|
-
expect(screen.getByRole('tooltip', {name: 'This column is always visible.'})).toBeVisible();
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it('renders unchecked checkboxes for the columns that are not visible in the inital state of the table', async () => {
|
|
180
|
-
const user = userEvent.setup();
|
|
181
|
-
const Fixture = () => {
|
|
182
|
-
const store = useTable<RowData>({initialState: {columnVisibility: {email: false}}});
|
|
183
|
-
return (
|
|
184
|
-
<Table store={store} data={mockData} columns={baseColumns}>
|
|
185
|
-
<Table.Header>
|
|
186
|
-
<TableColumnsSelector />
|
|
187
|
-
</Table.Header>
|
|
188
|
-
</Table>
|
|
189
|
-
);
|
|
190
|
-
};
|
|
191
|
-
render(<Fixture />);
|
|
192
|
-
|
|
193
|
-
await user.click(screen.getByRole('button', {name: 'Edit columns'}));
|
|
194
|
-
|
|
195
|
-
expect(await screen.findByRole('checkbox', {name: 'Name'})).toBeChecked();
|
|
196
|
-
expect(screen.getByRole('checkbox', {name: 'Age'})).toBeChecked();
|
|
197
|
-
expect(screen.getByRole('checkbox', {name: 'Email'})).not.toBeChecked();
|
|
198
|
-
expect(screen.getByRole('checkbox', {name: 'Phone'})).toBeChecked();
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('renders disabled checkboxes when the maxSelectableColumns is set and the maximum number of columns is checked', async () => {
|
|
202
|
-
const user = userEvent.setup();
|
|
203
|
-
const Fixture = () => {
|
|
204
|
-
const store = useTable<RowData>({initialState: {columnVisibility: {email: false}}});
|
|
205
|
-
return (
|
|
206
|
-
<Table store={store} data={mockData} columns={baseColumns}>
|
|
207
|
-
<Table.Header>
|
|
208
|
-
<TableColumnsSelector maxSelectableColumns={3} />
|
|
209
|
-
</Table.Header>
|
|
210
|
-
</Table>
|
|
211
|
-
);
|
|
212
|
-
};
|
|
213
|
-
render(<Fixture />);
|
|
214
|
-
|
|
215
|
-
await user.click(screen.getByRole('button', {name: 'Edit columns'}));
|
|
216
|
-
|
|
217
|
-
const nameCheckBox = await screen.findByRole('checkbox', {name: /name/i});
|
|
218
|
-
const ageCheckBox = screen.getByRole('checkbox', {name: /age/i});
|
|
219
|
-
const emailCheckBox = screen.getByRole('checkbox', {name: /email/i});
|
|
220
|
-
const phoneCheckBox = screen.getByRole('checkbox', {name: /phone/i});
|
|
221
|
-
|
|
222
|
-
expect(nameCheckBox).toBeChecked();
|
|
223
|
-
expect(nameCheckBox).toBeEnabled();
|
|
224
|
-
expect(ageCheckBox).toBeChecked();
|
|
225
|
-
expect(ageCheckBox).toBeEnabled();
|
|
226
|
-
expect(emailCheckBox).not.toBeChecked();
|
|
227
|
-
expect(emailCheckBox).toBeDisabled();
|
|
228
|
-
expect(phoneCheckBox).toBeChecked();
|
|
229
|
-
expect(phoneCheckBox).toBeEnabled();
|
|
230
|
-
|
|
231
|
-
await user.click(nameCheckBox);
|
|
232
|
-
|
|
233
|
-
expect(nameCheckBox).toBeEnabled();
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
it('renders a tooltip when the maxSelectableColumns is set and the maximum number of columns is checked and the user hover a disabled checkbox', async () => {
|
|
237
|
-
const user = userEvent.setup();
|
|
238
|
-
const Fixture = () => {
|
|
239
|
-
const store = useTable<RowData>({initialState: {columnVisibility: {email: false}}});
|
|
240
|
-
return (
|
|
241
|
-
<Table store={store} data={mockData} columns={baseColumns}>
|
|
242
|
-
<Table.Header>
|
|
243
|
-
<TableColumnsSelector
|
|
244
|
-
maxSelectableColumns={3}
|
|
245
|
-
limitReachedTooltip="You can display up to 3 columns"
|
|
246
|
-
/>
|
|
247
|
-
</Table.Header>
|
|
248
|
-
</Table>
|
|
249
|
-
);
|
|
250
|
-
};
|
|
251
|
-
render(<Fixture />);
|
|
252
|
-
|
|
253
|
-
await user.click(screen.getByRole('button', {name: 'Edit columns'}));
|
|
254
|
-
|
|
255
|
-
const emailCheckBoxWrapper = (await screen.findByRole('checkbox', {name: /email/i})).parentElement;
|
|
256
|
-
|
|
257
|
-
await user.hover(emailCheckBoxWrapper);
|
|
258
|
-
|
|
259
|
-
await waitFor(() => expect(screen.getByText('You can display up to 3 columns')).toBeVisible());
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
describe('footer', () => {
|
|
263
|
-
it('does not render the footer when maxSelectableColumns is not defined', async () => {
|
|
264
|
-
const user = userEvent.setup();
|
|
265
|
-
const Fixture = () => {
|
|
266
|
-
const store = useTable<RowData>();
|
|
267
|
-
return (
|
|
268
|
-
<Table store={store} data={mockData} columns={baseColumns}>
|
|
269
|
-
<Table.Header>
|
|
270
|
-
<TableColumnsSelector />
|
|
271
|
-
</Table.Header>
|
|
272
|
-
</Table>
|
|
273
|
-
);
|
|
274
|
-
};
|
|
275
|
-
render(<Fixture />);
|
|
276
|
-
|
|
277
|
-
await user.click(screen.getByRole('button', {name: 'Edit columns'}));
|
|
278
|
-
|
|
279
|
-
expect(screen.queryByText('You can display up to 3 columns')).not.toBeInTheDocument();
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
it('renders the footer when maxSelectableColumns is defined and footer is defined', async () => {
|
|
283
|
-
const user = userEvent.setup();
|
|
284
|
-
const Fixture = () => {
|
|
285
|
-
const store = useTable<RowData>();
|
|
286
|
-
return (
|
|
287
|
-
<Table store={store} data={mockData} columns={baseColumns}>
|
|
288
|
-
<Table.Header>
|
|
289
|
-
<TableColumnsSelector maxSelectableColumns={3} footer="You can display so many patate" />
|
|
290
|
-
</Table.Header>
|
|
291
|
-
</Table>
|
|
292
|
-
);
|
|
293
|
-
};
|
|
294
|
-
render(<Fixture />);
|
|
295
|
-
|
|
296
|
-
await user.click(screen.getByRole('button', {name: 'Edit columns'}));
|
|
297
|
-
|
|
298
|
-
await waitFor(() => expect(screen.getByText('You can display so many patate')).toBeVisible());
|
|
299
|
-
});
|
|
300
|
-
});
|
|
301
|
-
|
|
302
|
-
describe('when url sync is activated', () => {
|
|
303
|
-
afterEach(() => {
|
|
304
|
-
window.history.replaceState(null, '', '/');
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
it('sets the current visible column ids in the url', async () => {
|
|
308
|
-
const user = userEvent.setup();
|
|
309
|
-
const Fixture = () => {
|
|
310
|
-
const store = useTable<RowData>({
|
|
311
|
-
syncWithUrl: true,
|
|
312
|
-
initialState: {columnVisibility: {email: false, phone: true}},
|
|
313
|
-
});
|
|
314
|
-
return (
|
|
315
|
-
<Table store={store} data={mockData} columns={baseColumns}>
|
|
316
|
-
<Table.Header>
|
|
317
|
-
<TableColumnsSelector />
|
|
318
|
-
</Table.Header>
|
|
319
|
-
</Table>
|
|
320
|
-
);
|
|
321
|
-
};
|
|
322
|
-
render(<Fixture />);
|
|
323
|
-
await user.click(screen.getByRole('button', {name: 'Edit columns'}));
|
|
324
|
-
const emailCheckBox = await screen.findByRole('checkbox', {name: /email/i});
|
|
325
|
-
await user.click(emailCheckBox);
|
|
326
|
-
await user.click(screen.getByRole('checkbox', {name: /phone/i}));
|
|
327
|
-
expect(window.location.search).toBe('?show=email&hide=phone');
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
it('determines the initial visible columns from the url', async () => {
|
|
331
|
-
window.history.replaceState(null, '', '?show=email%2Cphone');
|
|
332
|
-
const user = userEvent.setup();
|
|
333
|
-
const Fixture = () => {
|
|
334
|
-
const store = useTable<RowData>({
|
|
335
|
-
syncWithUrl: true,
|
|
336
|
-
initialState: {columnVisibility: {email: false, phone: false}},
|
|
337
|
-
});
|
|
338
|
-
return (
|
|
339
|
-
<Table store={store} data={mockData} columns={baseColumns}>
|
|
340
|
-
<Table.Header>
|
|
341
|
-
<TableColumnsSelector />
|
|
342
|
-
</Table.Header>
|
|
343
|
-
</Table>
|
|
344
|
-
);
|
|
345
|
-
};
|
|
346
|
-
render(<Fixture />);
|
|
347
|
-
await user.click(screen.getByRole('button', {name: 'Edit columns'}));
|
|
348
|
-
expect(await screen.findByRole('checkbox', {name: /email/i})).toBeChecked();
|
|
349
|
-
expect(screen.getByRole('checkbox', {name: /phone/i})).toBeChecked();
|
|
350
|
-
});
|
|
351
|
-
});
|
|
352
|
-
});
|