cozy-ui 139.0.2 → 139.2.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/CHANGELOG.md CHANGED
@@ -1,3 +1,28 @@
1
+ # [139.2.0](https://github.com/cozy/cozy-ui/compare/v139.1.0...v139.2.0) (2026-06-09)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Remove override for table that fixed table layout ([a898f1d](https://github.com/cozy/cozy-ui/commit/a898f1d))
7
+
8
+
9
+ ### Features
10
+
11
+ * Remove useless overrides for checkboxes in tables ([5fd8270](https://github.com/cozy/cozy-ui/commit/5fd8270))
12
+
13
+ # [139.1.0](https://github.com/cozy/cozy-ui/compare/v139.0.2...v139.1.0) (2026-06-03)
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * **Table:** No need colSpan + 1 anymore, checkbox has been removed ([4329e35](https://github.com/cozy/cozy-ui/commit/4329e35))
19
+
20
+
21
+ ### Features
22
+
23
+ * **Table:** Add `noWrap` column prop to enable ellipsis on cells content ([5ebd5c0](https://github.com/cozy/cozy-ui/commit/5ebd5c0))
24
+ * **Table:** Apply tableLayout fixed for ellipsis support ([00663fa](https://github.com/cozy/cozy-ui/commit/00663fa))
25
+
1
26
  ## [139.0.2](https://github.com/cozy/cozy-ui/compare/v139.0.1...v139.0.2) (2026-06-02)
2
27
 
3
28
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cozy-ui",
3
- "version": "139.0.2",
3
+ "version": "139.2.0",
4
4
  "description": "Cozy apps UI SDK",
5
5
  "main": "./index.js",
6
6
  "bin": {
@@ -516,23 +516,7 @@ export const makeLightOverrides = theme => ({
516
516
  },
517
517
  MuiTableHead: {
518
518
  root: {
519
- backgroundColor: theme.palette.background.paper,
520
- '&.virtualized': {
521
- '& .virtualizedCheckbox': {
522
- opacity: 0,
523
- '&.checked': {
524
- opacity: 1
525
- },
526
- '&:hover': {
527
- opacity: 1
528
- }
529
- },
530
- '&:hover': {
531
- '& .virtualizedCheckbox': {
532
- opacity: 0.5
533
- }
534
- }
535
- }
519
+ backgroundColor: theme.palette.background.paper
536
520
  }
537
521
  },
538
522
  MuiTableRow: {
@@ -544,25 +528,6 @@ export const makeLightOverrides = theme => ({
544
528
  cursor: 'pointer',
545
529
  pointerEvents: 'none',
546
530
  opacity: 0.5
547
- },
548
- '&.virtualized': {
549
- '& .virtualizedCheckbox': {
550
- opacity: 0,
551
- '&.visible': {
552
- opacity: 0.5
553
- },
554
- '&.checked': {
555
- opacity: 1
556
- },
557
- '&:hover': {
558
- opacity: 1
559
- }
560
- },
561
- '&:hover': {
562
- '& .virtualizedCheckbox': {
563
- opacity: 0.5
564
- }
565
- }
566
531
  }
567
532
  }
568
533
  },
@@ -41,7 +41,10 @@ const columns = [
41
41
  {
42
42
  id: 'name',
43
43
  disablePadding: false,
44
- label: 'Dessert'
44
+ label: 'Dessert',
45
+ width: 300,
46
+ maxWidth: 300,
47
+ noWrap: true
45
48
  },
46
49
  {
47
50
  id: 'calories',
@@ -75,7 +78,7 @@ const columns = [
75
78
  }
76
79
  ]
77
80
 
78
- const initialVariants = [{ grouped: false}]
81
+ const initialVariants = [{ grouped: false }]
79
82
 
80
83
  // Very basic usage only works when Dessert is sorted "asc"
81
84
  // Ideally you have to create a logic to create groups with sorted data
@@ -89,62 +92,69 @@ const ExampleTable = ({ variant, ...props }) => {
89
92
  }
90
93
 
91
94
  return (
92
- <div>
93
- <Button
95
+ <VirtualizedTable
96
+ {...props}
97
+ rows={rows}
98
+ columns={columns}
99
+ groups={variant.grouped ? makeGroups : undefined}
100
+ selectedItems={selectedItemsId}
101
+ isSelectedItem={row => isSelectedItem(row.id)}
102
+ onSortChange={onSortChange}
103
+ componentsProps={{
104
+ rowContent: {
105
+ onClick: (row, column) => {
106
+ row.id !== 1
107
+ ? toggleSelectedItem(row.id)
108
+ : undefined
109
+ },
110
+ onDoubleClick: (row, column) => {
111
+ row.id !== 1
112
+ ? console.info(`double click on cell. Row ${row['id']}, Column ${column['id']}`)
113
+ : undefined
114
+ },
115
+ onLongPress: (row, column) => {
116
+ row.id !== 1
117
+ ? console.info(`long press on cell. Row ${row['id']}, Column ${column['id']}`)
118
+ : undefined
119
+ }
120
+ }
121
+ }}
122
+ />
123
+ )
124
+ }
125
+
126
+ const SelectButton = () => {
127
+ const { toggleSelectAllItems } = useSelection()
128
+
129
+ return (
130
+ <Button
94
131
  className="u-mt-1 u-mb-1"
95
132
  variant="ghost"
96
133
  label="Select all"
97
134
  onClick={() => toggleSelectAllItems(rows.map(item => item.id !== 1 ? item.id : undefined))}
98
- />
99
- <div style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%" }}>
100
- <VirtualizedTable
101
- {...props}
102
- rows={rows}
103
- columns={columns}
104
- groups={variant.grouped ? makeGroups : undefined}
105
- selectedItems={selectedItemsId}
106
- isSelectedItem={row => isSelectedItem(row.id)}
107
- onSortChange={onSortChange}
108
- componentsProps={{
109
- rowContent: {
110
- onClick: (row, column) => {
111
- row.id !== 1
112
- ? toggleSelectedItem(row.id)
113
- : undefined
114
- },
115
- onDoubleClick: (row, column) => {
116
- row.id !== 1
117
- ? console.info(`double click on cell. Row ${row['id']}, Column ${column['id']}`)
118
- : undefined
119
- },
120
- onLongPress: (row, column) => {
121
- row.id !== 1
122
- ? console.info(`long press on cell. Row ${row['id']}, Column ${column['id']}`)
123
- : undefined
124
- }
125
- }
126
- }}
127
- />
128
- </div>
129
- </div>
135
+ />
130
136
  )
131
137
  }
132
138
 
139
+ ;
140
+
133
141
  <Variants initialVariants={initialVariants} screenshotAllVariants>
134
142
  {variant => (
135
143
  <>
136
- <Typography variant="h4">Not sorted table</Typography>
137
- <div className="u-mt-half" style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%", marginBottom: "6rem" }}>
138
- <SelectionProvider>
144
+ <SelectionProvider>
145
+ <Typography className="u-mt-1" variant="h4">Not sorted table</Typography>
146
+ <SelectButton />
147
+ <div style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%" }}>
139
148
  <ExampleTable variant={variant} />
140
- </SelectionProvider>
141
- </div>
142
- <Typography className="u-mt-1" variant="h4">Sorted table</Typography>
143
- <div className="u-mt-half" style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%" }}>
144
- <SelectionProvider>
149
+ </div>
150
+ </SelectionProvider>
151
+ <SelectionProvider>
152
+ <Typography className="u-mt-1" variant="h4">Sorted table</Typography>
153
+ <SelectButton />
154
+ <div style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%" }}>
145
155
  <ExampleTable variant={variant} defaultOrder={{by: columns[0].id, direction: 'asc'}} />
146
- </SelectionProvider>
147
- </div>
156
+ </div>
157
+ </SelectionProvider>
148
158
  </>
149
159
  )}
150
160
  </Variants>
@@ -175,10 +185,18 @@ const rows = [
175
185
  createData(7, 'Jelly Bean', 375, 0.0, 94, 0.0),
176
186
  createData(8, 'KitKat', 518, 26.0, 65, 7.0),
177
187
  createData(9, 'Oreo', 437, 18.0, 63, 4.0),
188
+ createData(
189
+ 10,
190
+ 'Ice cream with a very long list of ingredient to see how the table can handle this kind of item, and this is the end',
191
+ 237,
192
+ 9.0,
193
+ 37,
194
+ 4.3
195
+ )
178
196
  ]
179
197
 
180
198
  const columns = [
181
- { id: 'name', disablePadding: false, label: 'Dessert' },
199
+ { id: 'name', disablePadding: false, label: 'Dessert', noWrap: true },
182
200
  { id: 'calories', disablePadding: false, width: 80, label: 'Calories', textAlign: 'left' },
183
201
  { id: 'fat', disablePadding: false, width: 85, label: 'Fat (g)', textAlign: 'right' },
184
202
  { id: 'carbs', disablePadding: false, width: 115, label: 'Carbs (g)', textAlign: 'right' },
@@ -199,36 +217,32 @@ const DndExample = () => {
199
217
  }
200
218
 
201
219
  return (
202
- <div style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%" }}>
203
- <VirtualizedTableDnd
204
- rows={rows}
205
- columns={columns}
206
- dragProps={dragProps}
207
- selectedItems={selectedItemsId}
208
- isSelectedItem={row => isSelectedItem(row._id)}
209
- componentsProps={{
210
- rowContent: {
211
- onClick: (row, column) => toggleSelectedItem(row._id),
212
- onDoubleClick: (row, column) => {
213
- console.info(`double click on cell. Row ${row['_id']}, Column ${column['id']}`)
214
- },
215
- onLongPress: (row, column) => { console.info(`long press on cell. Row ${row['_id']}, Column ${column['id']}`) },
220
+ <VirtualizedTableDnd
221
+ rows={rows}
222
+ columns={columns}
223
+ dragProps={dragProps}
224
+ selectedItems={selectedItemsId}
225
+ isSelectedItem={row => isSelectedItem(row._id)}
226
+ componentsProps={{
227
+ rowContent: {
228
+ onClick: (row, column) => toggleSelectedItem(row._id),
229
+ onDoubleClick: (row, column) => {
230
+ console.info(`double click on cell. Row ${row['_id']}, Column ${column['id']}`)
216
231
  },
217
- }}
218
- />
219
- </div>
232
+ onLongPress: (row, column) => { console.info(`long press on cell. Row ${row['_id']}, Column ${column['id']}`) },
233
+ },
234
+ }}
235
+ />
220
236
  )
221
237
  }
222
238
 
223
239
  ;
224
240
 
225
- <>
226
- <div className="u-mt-half" style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%" }}>
227
- <SelectionProvider>
228
- <DndProvider backend={HTML5Backend}>
229
- <DndExample />
230
- </DndProvider>
231
- </SelectionProvider>
232
- </div>
233
- </>
241
+ <SelectionProvider>
242
+ <DndProvider backend={HTML5Backend}>
243
+ <div className="u-mt-half" style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%" }}>
244
+ <DndExample />
245
+ </div>
246
+ </DndProvider>
247
+ </SelectionProvider>
234
248
  ```
@@ -67,6 +67,7 @@ const Cell = ({
67
67
  key={column.id}
68
68
  ref={longPressRef}
69
69
  classes={classes}
70
+ className={column.noWrap ? 'u-ellipsis' : undefined}
70
71
  align={column.textAlign ?? 'left'}
71
72
  padding={column.disablePadding ? 'none' : 'normal'}
72
73
  onClick={handleClick}
@@ -24,6 +24,7 @@ const TableHeadCell = ({
24
24
  <TableCell
25
25
  key={column.id}
26
26
  classes={classes}
27
+ className={column.noWrap ? 'u-ellipsis' : undefined}
27
28
  align={column.textAlign ?? 'left'}
28
29
  padding={column.disablePadding ? 'none' : 'normal'}
29
30
  sortDirection={orderBy === column.id ? orderDirection : false}
@@ -77,7 +77,7 @@ const VirtualizedTable = forwardRef(
77
77
  )}
78
78
  {...(isGroupedTable && {
79
79
  groupContent: index => (
80
- <TableCell colSpan={columns.length + 1} size="small">
80
+ <TableCell colSpan={columns.length} size="small">
81
81
  {groupLabels[index]}
82
82
  </TableCell>
83
83
  )
@@ -93,7 +93,6 @@ const VirtualizedTable = forwardRef(
93
93
  {componentsProps?.rowContent?.children}
94
94
  </RowContent>
95
95
  )}
96
- rowSpan={2}
97
96
  />
98
97
  )
99
98
  }
@@ -1407,6 +1407,25 @@ import Stepper from 'cozy-ui/transpiled/react/Stepper'
1407
1407
  import Table from 'cozy-ui/transpiled/react/Table'
1408
1408
  ```
1409
1409
 
1410
+ **Example:**
1411
+
1412
+ ```jsx
1413
+ import { useState } from 'react'
1414
+ import VirtualizedTableDnd from 'cozy-ui/transpiled/react/Table/Virtualized/Dnd'
1415
+ import Typography from 'cozy-ui/transpiled/react/Typography'
1416
+ import SelectionProvider, { useSelection } from 'cozy-ui/transpiled/react/providers/Selection'
1417
+ import { DndProvider } from 'react-dnd'
1418
+ import { HTML5Backend } from 'react-dnd-html5-backend'
1419
+
1420
+ <SelectionProvider>
1421
+ <DndProvider backend={HTML5Backend}>
1422
+ <div className="u-mt-half" style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%" }}>
1423
+ <DndExample />
1424
+ </div>
1425
+ </DndProvider>
1426
+ </SelectionProvider>
1427
+ ```
1428
+
1410
1429
 
1411
1430
  ### Thumbnail
1412
1431
 
@@ -589,22 +589,6 @@ export function makeDarkOverrides(theme: any): {
589
589
  MuiTableHead: {
590
590
  root: {
591
591
  backgroundColor: any;
592
- '&.virtualized': {
593
- '& .virtualizedCheckbox': {
594
- opacity: number;
595
- '&.checked': {
596
- opacity: number;
597
- };
598
- '&:hover': {
599
- opacity: number;
600
- };
601
- };
602
- '&:hover': {
603
- '& .virtualizedCheckbox': {
604
- opacity: number;
605
- };
606
- };
607
- };
608
592
  };
609
593
  };
610
594
  MuiTableRow: {
@@ -617,25 +601,6 @@ export function makeDarkOverrides(theme: any): {
617
601
  pointerEvents: string;
618
602
  opacity: number;
619
603
  };
620
- '&.virtualized': {
621
- '& .virtualizedCheckbox': {
622
- opacity: number;
623
- '&.visible': {
624
- opacity: number;
625
- };
626
- '&.checked': {
627
- opacity: number;
628
- };
629
- '&:hover': {
630
- opacity: number;
631
- };
632
- };
633
- '&:hover': {
634
- '& .virtualizedCheckbox': {
635
- opacity: number;
636
- };
637
- };
638
- };
639
604
  };
640
605
  };
641
606
  MuiTableCell: {
@@ -589,22 +589,6 @@ export function makeLightOverrides(theme: any): {
589
589
  MuiTableHead: {
590
590
  root: {
591
591
  backgroundColor: any;
592
- '&.virtualized': {
593
- '& .virtualizedCheckbox': {
594
- opacity: number;
595
- '&.checked': {
596
- opacity: number;
597
- };
598
- '&:hover': {
599
- opacity: number;
600
- };
601
- };
602
- '&:hover': {
603
- '& .virtualizedCheckbox': {
604
- opacity: number;
605
- };
606
- };
607
- };
608
592
  };
609
593
  };
610
594
  MuiTableRow: {
@@ -617,25 +601,6 @@ export function makeLightOverrides(theme: any): {
617
601
  pointerEvents: string;
618
602
  opacity: number;
619
603
  };
620
- '&.virtualized': {
621
- '& .virtualizedCheckbox': {
622
- opacity: number;
623
- '&.visible': {
624
- opacity: number;
625
- };
626
- '&.checked': {
627
- opacity: number;
628
- };
629
- '&:hover': {
630
- opacity: number;
631
- };
632
- };
633
- '&:hover': {
634
- '& .virtualizedCheckbox': {
635
- opacity: number;
636
- };
637
- };
638
- };
639
604
  };
640
605
  };
641
606
  MuiTableCell: {
@@ -490,23 +490,7 @@ export var makeLightOverrides = function makeLightOverrides(theme) {
490
490
  },
491
491
  MuiTableHead: {
492
492
  root: {
493
- backgroundColor: theme.palette.background.paper,
494
- '&.virtualized': {
495
- '& .virtualizedCheckbox': {
496
- opacity: 0,
497
- '&.checked': {
498
- opacity: 1
499
- },
500
- '&:hover': {
501
- opacity: 1
502
- }
503
- },
504
- '&:hover': {
505
- '& .virtualizedCheckbox': {
506
- opacity: 0.5
507
- }
508
- }
509
- }
493
+ backgroundColor: theme.palette.background.paper
510
494
  }
511
495
  },
512
496
  MuiTableRow: {
@@ -518,25 +502,6 @@ export var makeLightOverrides = function makeLightOverrides(theme) {
518
502
  cursor: 'pointer',
519
503
  pointerEvents: 'none',
520
504
  opacity: 0.5
521
- },
522
- '&.virtualized': {
523
- '& .virtualizedCheckbox': {
524
- opacity: 0,
525
- '&.visible': {
526
- opacity: 0.5
527
- },
528
- '&.checked': {
529
- opacity: 1
530
- },
531
- '&:hover': {
532
- opacity: 1
533
- }
534
- },
535
- '&:hover': {
536
- '& .virtualizedCheckbox': {
537
- opacity: 0.5
538
- }
539
- }
540
505
  }
541
506
  }
542
507
  },
@@ -84,6 +84,7 @@ var Cell = function Cell(_ref4) {
84
84
  key: column.id,
85
85
  ref: longPressRef,
86
86
  classes: classes,
87
+ className: column.noWrap ? 'u-ellipsis' : undefined,
87
88
  align: (_column$textAlign = column.textAlign) !== null && _column$textAlign !== void 0 ? _column$textAlign : 'left',
88
89
  padding: column.disablePadding ? 'none' : 'normal',
89
90
  onClick: handleClick,
@@ -29,6 +29,7 @@ var TableHeadCell = function TableHeadCell(_ref3) {
29
29
  return /*#__PURE__*/React.createElement(TableCell, {
30
30
  key: column.id,
31
31
  classes: classes,
32
+ className: column.noWrap ? 'u-ellipsis' : undefined,
32
33
  align: (_column$textAlign = column.textAlign) !== null && _column$textAlign !== void 0 ? _column$textAlign : 'left',
33
34
  padding: column.disablePadding ? 'none' : 'normal',
34
35
  sortDirection: orderBy === column.id ? orderDirection : false
@@ -92,7 +92,7 @@ var VirtualizedTable = /*#__PURE__*/forwardRef(function (_ref, ref) {
92
92
  }, isGroupedTable && {
93
93
  groupContent: function groupContent(index) {
94
94
  return /*#__PURE__*/React.createElement(TableCell, {
95
- colSpan: columns.length + 1,
95
+ colSpan: columns.length,
96
96
  size: "small"
97
97
  }, groupLabels[index]);
98
98
  }
@@ -106,8 +106,7 @@ var VirtualizedTable = /*#__PURE__*/forwardRef(function (_ref, ref) {
106
106
  columns: columns,
107
107
  context: _context
108
108
  }), componentsProps === null || componentsProps === void 0 ? void 0 : (_componentsProps$rowC = componentsProps.rowContent) === null || _componentsProps$rowC === void 0 ? void 0 : _componentsProps$rowC.children);
109
- },
110
- rowSpan: 2
109
+ }
111
110
  }));
112
111
  });
113
112
  VirtualizedTable.displayName = 'VirtualizedTable';