cozy-ui 128.10.1 → 130.0.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,29 @@
1
+ # [130.0.0](https://github.com/cozy/cozy-ui/compare/v129.0.0...v130.0.0) (2025-09-18)
2
+
3
+
4
+ ### Features
5
+
6
+ * **VirtualizedTable:** defaultOrder become an object to change the sorted direction ([11edbe7](https://github.com/cozy/cozy-ui/commit/11edbe7))
7
+
8
+
9
+ ### BREAKING CHANGES
10
+
11
+ * **VirtualizedTable:** - VirtualizedTable: When using `cozy-ui/transpiled/react/table/virtualized`, you need to pass `defaultOrder` as an object `{by: 'columnName', direction: 'asc'}` and not a string anymore `defaultOrder='columnName'`
12
+
13
+ # [129.0.0](https://github.com/cozy/cozy-ui/compare/v128.10.1...v129.0.0) (2025-09-17)
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * **SelectionProvider:** Replace `item`by `itemId` and don't rely on `._id` anymore ([f6086d3](https://github.com/cozy/cozy-ui/commit/f6086d3))
19
+ * **VirtualizedTable:** Now don't sort anything if no `defaultOrder` set ([707d62d](https://github.com/cozy/cozy-ui/commit/707d62d))
20
+ * **VirtualizedTable:** Prop `onSortChange` is now longer required ([31188a6](https://github.com/cozy/cozy-ui/commit/31188a6))
21
+
22
+
23
+ ### BREAKING CHANGES
24
+
25
+ * **SelectionProvider:** If you use `cozy-ui/transpiled/react/providers/Selection` you have to replace prop object by its `id` value. For example replace `isSelectedItem(item)` by `isSelectedItem(item.id)` or `toggleSelectAllItems(items)` by `toggleSelectAllItems(items.map(item => item.id))`
26
+
1
27
  ## [128.10.1](https://github.com/cozy/cozy-ui/compare/v128.10.0...v128.10.1) (2025-09-16)
2
28
 
3
29
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cozy-ui",
3
- "version": "128.10.1",
3
+ "version": "130.0.0",
4
4
  "description": "Cozy apps UI SDK",
5
5
  "main": "./index.js",
6
6
  "bin": {
@@ -1,8 +1,11 @@
1
1
  ### React-Virtuoso
2
2
 
3
3
  ```jsx
4
+ import { useState } from 'react'
4
5
  import VirtualizedTable from 'cozy-ui/transpiled/react/Table/Virtualized'
5
6
  import Variants from 'cozy-ui/docs/components/Variants'
7
+ import Typography from 'cozy-ui/transpiled/react/Typography'
8
+ import SelectionProvider, { useSelection } from 'cozy-ui/transpiled/react/providers/Selection'
6
9
 
7
10
  const createData = (id, name, calories, fat, carbs, protein) => {
8
11
  return { id, name, calories, fat, carbs, protein }
@@ -10,18 +13,18 @@ const createData = (id, name, calories, fat, carbs, protein) => {
10
13
 
11
14
  const rows = [
12
15
  createData(0, 'Cupcake', 305, 3.7, 67, 4.3),
13
- createData(1, 'Donut', 452, 25.0, 51, 4.9),
14
- createData(2, 'Eclair', 262, 16.0, 24, 6.0),
15
- createData(3, 'Frozen yoghurt', 159, 6.0, 24, 4.0),
16
- createData(4, 'Gingerbread', 356, 16.0, 49, 3.9),
17
- createData(5, 'Honeycomb', 408, 3.2, 87, 6.5),
18
- createData(6, 'Ice cream sandwich', 237, 9.0, 37, 4.3),
16
+ createData(1, 'Frozen yoghurt', 159, 6.0, 24, 4.0),
17
+ createData(2, 'Donut', 452, 25.0, 51, 4.9),
18
+ createData(3, 'Eclair', 262, 16.0, 24, 6.0),
19
+ createData(4, 'Ice cream sandwich', 237, 9.0, 37, 4.3),
20
+ createData(5, 'Gingerbread', 356, 16.0, 49, 3.9),
21
+ createData(6, 'Honeycomb', 408, 3.2, 87, 6.5),
19
22
  createData(7, 'Jelly Bean', 375, 0.0, 94, 0.0),
20
23
  createData(8, 'KitKat', 518, 26.0, 65, 7.0),
21
- createData(9, 'Lollipop', 392, 0.2, 98, 0.0),
24
+ createData(9, 'Oreo', 437, 18.0, 63, 4.0),
22
25
  createData(10, 'Marshmallow', 318, 0, 81, 2.0),
23
- createData(11, 'Nougat', 360, 19.0, 9, 37.0),
24
- createData(12, 'Oreo', 437, 18.0, 63, 4.0),
26
+ createData(11, 'Lollipop', 392, 0.2, 98, 0.0),
27
+ createData(12, 'Nougat', 360, 19.0, 9, 37.0),
25
28
  createData(
26
29
  13,
27
30
  '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',
@@ -70,59 +73,30 @@ const columns = [
70
73
  }
71
74
  ]
72
75
 
73
- initialState = { selectedItemsId: [] }
74
-
75
- const isSelectedItem = row => state.selectedItemsId.some(selectedItem => selectedItem === row.id)
76
- const addSelected = row => setState(prev => {
77
- const arr = prev.selectedItemsId
78
- arr.push(row.id)
79
- return { selectedItemsId: arr }
80
- })
81
- const removeSelected = (row) => setState(prev => {
82
- const arr = prev.selectedItemsId
83
- arr.splice(arr.indexOf(row.id), 1)
84
- return { selectedItemsId: arr }
85
- })
86
- const onSelect = row => {
87
- if (isSelectedItem(row)) {
88
- removeSelected(row)
89
- } else {
90
- addSelected(row)
91
- }
92
- }
93
- const onSelectAll = rows => {
94
- const ids = rows.map(row => row.id)
95
- if (state.selectedItemsId.length === ids.length) {
96
- setState({ selectedItemsId: [] })
97
- } else {
98
- setState({ selectedItemsId: ids })
99
- }
100
- }
101
-
102
76
  const initialVariants = [{ grouped: false }]
103
77
 
104
- const makeGroups = () => ({ groupLabels: ['C', 'D', 'Others'], groupCounts: [1,1,12] })
78
+ // Very basic usage only works when Dessert is sorted "asc"
79
+ // Ideally you have to create a logic to create groups with sorted data
80
+ const makeGroups = () => ({ groupLabels: ['C', 'D', 'E', 'Others'], groupCounts: [1,1,1,11] })
105
81
 
106
- /**
107
- * @param order
108
- * @param orderBy
109
- */
110
- const onSortChange = ({ order, orderBy }) => {
111
- setState({ order, orderBy })
112
- }
82
+ const ExampleTable = ({ variant, ...props }) => {
83
+ const { selectedItemsId, isSelectedItem, toggleSelectedItem, toggleSelectAllItems } = useSelection()
113
84
 
114
- <Variants initialVariants={initialVariants} screenshotAllVariants>
115
- {variant => (
85
+ const onSortChange = ({ order, orderBy }) => {
86
+ console.info('order:', order, 'oderBy:', orderBy)
87
+ }
88
+
89
+ return (
116
90
  <div style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%" }}>
117
91
  <VirtualizedTable
92
+ {...props}
118
93
  rows={rows}
119
94
  columns={columns}
120
95
  groups={variant.grouped ? makeGroups : undefined}
121
- defaultOrder={columns[0].id}
122
- selectedItems={state.selectedItemsId}
123
- isSelectedItem={row => isSelectedItem(row)}
124
- onSelect={onSelect}
125
- onSelectAll={onSelectAll}
96
+ selectedItems={selectedItemsId}
97
+ isSelectedItem={row => isSelectedItem(row.id)}
98
+ onSelect={(row, event, index) => toggleSelectedItem(row.id)}
99
+ onSelectAll={rows => toggleSelectAllItems(rows.map(item => item.id))}
126
100
  onSortChange={onSortChange}
127
101
  componentsProps={{
128
102
  rowContent: {
@@ -132,6 +106,25 @@ const onSortChange = ({ order, orderBy }) => {
132
106
  }}
133
107
  />
134
108
  </div>
109
+ )
110
+ }
111
+
112
+ <Variants initialVariants={initialVariants} screenshotAllVariants>
113
+ {variant => (
114
+ <>
115
+ <Typography variant="h4">Not sorted table</Typography>
116
+ <div className="u-mt-half" style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%" }}>
117
+ <SelectionProvider>
118
+ <ExampleTable variant={variant} />
119
+ </SelectionProvider>
120
+ </div>
121
+ <Typography className="u-mt-1" variant="h4">Sorted table</Typography>
122
+ <div className="u-mt-half" style={{ border: "1px solid var(--borderMainColor)", height: 400, width: "100%" }}>
123
+ <SelectionProvider>
124
+ <ExampleTable variant={variant} defaultOrder={{by: columns[0].id, direction: 'asc'}} />
125
+ </SelectionProvider>
126
+ </div>
127
+ </>
135
128
  )}
136
129
  </Variants>
137
130
  ```
@@ -23,7 +23,7 @@ const useStyles = makeStyles({
23
23
 
24
24
  const FixedHeaderContent = ({
25
25
  columns,
26
- order,
26
+ orderDirection,
27
27
  orderBy,
28
28
  rowCount,
29
29
  context,
@@ -52,7 +52,7 @@ const FixedHeaderContent = ({
52
52
  key={column.id}
53
53
  className={classes.visuallyHidden}
54
54
  column={column}
55
- order={order}
55
+ orderDirection={orderDirection}
56
56
  orderBy={orderBy}
57
57
  onClick={() => onClick(column.id)}
58
58
  />
@@ -11,7 +11,13 @@ const useStyles = makeStyles({
11
11
  }
12
12
  })
13
13
 
14
- const TableHeadCell = ({ className, column, orderBy, order, onClick }) => {
14
+ const TableHeadCell = ({
15
+ className,
16
+ column,
17
+ orderBy,
18
+ orderDirection,
19
+ onClick
20
+ }) => {
15
21
  const classes = useStyles({ column })
16
22
 
17
23
  return (
@@ -20,18 +26,20 @@ const TableHeadCell = ({ className, column, orderBy, order, onClick }) => {
20
26
  classes={classes}
21
27
  align={column.textAlign ?? 'left'}
22
28
  padding={column.disablePadding ? 'none' : 'normal'}
23
- sortDirection={orderBy === column.id ? order : false}
29
+ sortDirection={orderBy === column.id ? orderDirection : false}
24
30
  >
25
31
  {column.sortable !== false ? (
26
32
  <TableSortLabel
27
33
  active={orderBy === column.id}
28
- direction={orderBy === column.id ? order : 'asc'}
34
+ direction={orderBy === column.id ? orderDirection : 'asc'}
29
35
  onClick={onClick}
30
36
  >
31
37
  {column.label}
32
38
  {orderBy === column.id && (
33
39
  <span className={className}>
34
- {order === 'desc' ? 'sorted descending' : 'sorted ascending'}
40
+ {orderDirection === 'desc'
41
+ ? 'sorted descending'
42
+ : 'sorted ascending'}
35
43
  </span>
36
44
  )}
37
45
  </TableSortLabel>
@@ -1,6 +1,6 @@
1
1
  import get from 'lodash/get'
2
2
 
3
- const descendingComparator = ({ a, b, order, orderBy, lang }) => {
3
+ const descendingComparator = ({ a, b, orderDirection, orderBy, lang }) => {
4
4
  const aValue = get(a, orderBy, '')
5
5
  const bValue = get(b, orderBy, '')
6
6
 
@@ -17,7 +17,7 @@ const descendingComparator = ({ a, b, order, orderBy, lang }) => {
17
17
  }
18
18
 
19
19
  const { compare } = Intl.Collator(lang || 'en', {
20
- caseFirst: order === 'asc' ? 'upper' : 'lower'
20
+ caseFirst: orderDirection === 'asc' ? 'upper' : 'lower'
21
21
  })
22
22
 
23
23
  return compare(bValue, aValue)
@@ -26,10 +26,10 @@ const descendingComparator = ({ a, b, order, orderBy, lang }) => {
26
26
  return bValue - aValue
27
27
  }
28
28
 
29
- export const getComparator = (order, orderBy, lang) => {
30
- return order === 'desc'
31
- ? (a, b) => descendingComparator({ a, b, order, orderBy, lang })
32
- : (a, b) => -descendingComparator({ a, b, order, orderBy, lang })
29
+ export const getComparator = (orderDirection, orderBy, lang) => {
30
+ return orderDirection === 'desc'
31
+ ? (a, b) => descendingComparator({ a, b, orderDirection, orderBy, lang })
32
+ : (a, b) => -descendingComparator({ a, b, orderDirection, orderBy, lang })
33
33
  }
34
34
 
35
35
  export const stableSort = (array, comparator) => {
@@ -28,10 +28,14 @@ const VirtualizedTable = forwardRef(
28
28
  },
29
29
  ref
30
30
  ) => {
31
- const [order, setOrder] = useState('asc')
32
- const [orderBy, setOrderBy] = useState(defaultOrder)
31
+ const [orderDirection, setOrderDirection] = useState(
32
+ defaultOrder?.direction ?? 'asc'
33
+ )
34
+ const [orderBy, setOrderBy] = useState(defaultOrder?.by ?? undefined)
33
35
 
34
- const sortedData = stableSort(rows, getComparator(order, orderBy))
36
+ const sortedData = orderBy
37
+ ? stableSort(rows, getComparator(orderDirection, orderBy))
38
+ : rows
35
39
  const data = secondarySort ? secondarySort(sortedData) : sortedData
36
40
  const { groupLabels, groupCounts } = groups?.(data) || {}
37
41
  const isGroupedTable = !!groupCounts
@@ -43,11 +47,11 @@ const VirtualizedTable = forwardRef(
43
47
  }
44
48
 
45
49
  const handleSort = property => {
46
- const isAsc = orderBy === property && order === 'asc'
50
+ const isAsc = orderBy === property && orderDirection === 'asc'
47
51
  const newOrder = isAsc ? 'desc' : 'asc'
48
- setOrder(newOrder)
52
+ setOrderDirection(newOrder)
49
53
  setOrderBy(property)
50
- onSortChange({ order: newOrder, orderBy: property })
54
+ onSortChange?.({ order: newOrder, orderBy: property })
51
55
  }
52
56
 
53
57
  const handleSelectAll = event => {
@@ -74,7 +78,7 @@ const VirtualizedTable = forwardRef(
74
78
  columns={columns}
75
79
  rowCount={rows.length}
76
80
  context={_context}
77
- order={order}
81
+ orderDirection={orderDirection}
78
82
  orderBy={orderBy}
79
83
  onClick={handleSort}
80
84
  onSelectAllClick={handleSelectAll}
@@ -115,10 +119,29 @@ VirtualizedTable.defaultProps = {
115
119
  }
116
120
 
117
121
  VirtualizedTable.propTypes = {
118
- /**
119
- Returned object is: PropTypes.shape({ groupLabels: PropTypes.array, groupCounts: PropTypes.array })
120
- */
121
- groups: PropTypes.func
122
+ /** Rows to display in the table */
123
+ rows: PropTypes.array,
124
+ /** Column configuration */
125
+ columns: PropTypes.array,
126
+ /** Returned object is: PropTypes.shape({ groupLabels: PropTypes.array, groupCounts: PropTypes.array }) */
127
+ groups: PropTypes.func,
128
+ /** Default sorting configuration */
129
+ defaultOrder: PropTypes.shape({
130
+ direction: PropTypes.oneOf(['asc', 'desc']),
131
+ by: PropTypes.string
132
+ }),
133
+ /** Sort files by type to put directory and trash before files */
134
+ secondarySort: PropTypes.func,
135
+ /** Array of selected items */
136
+ selectedItems: PropTypes.array,
137
+ /** Callback function when a row is selected */
138
+ onSelect: PropTypes.func,
139
+ /** Callback function when all rows are selected/deselected */
140
+ onSelectAll: PropTypes.func,
141
+ /** Function to determine if a row is selected */
142
+ isSelectedItem: PropTypes.func,
143
+ /** Callback called after the sort */
144
+ onSortChange: PropTypes.func
122
145
  }
123
146
 
124
147
  export default VirtualizedTable
@@ -12,8 +12,8 @@ const Component = () => {
12
12
  return (
13
13
  <>
14
14
  <Typography>selectedItemsId : {JSON.stringify(selectedItemsId)}</Typography>
15
- <Button label="Add Item" onClick={() => addSelectedItem({ _id: '01' })} />
16
- <Button label="Remove Item" onClick={() => removeSelectedItem({ _id: '01' })} />
15
+ <Button label="Add Item" onClick={() => addSelectedItem('01')} />
16
+ <Button label="Remove Item" onClick={() => removeSelectedItem('01')} />
17
17
  </>
18
18
  )
19
19
  }
@@ -18,48 +18,47 @@ export const useSelection = () => {
18
18
  const SelectionProvider = ({ children }) => {
19
19
  const [selectedItemsId, setSelectedItemsId] = useState([])
20
20
 
21
- const isSelectedItem = item => {
22
- return selectedItemsId.some(selectedItemId => selectedItemId === item._id)
21
+ const isSelectedItem = itemId => {
22
+ return selectedItemsId.some(selectedItemId => selectedItemId === itemId)
23
23
  }
24
24
 
25
25
  const isSelectionEnabled = selectedItemsId.length > 0
26
26
 
27
- const addSelectedItem = item => {
28
- setSelectedItemsId(prev => [...prev, item._id])
27
+ const addSelectedItem = itemId => {
28
+ setSelectedItemsId(prev => [...prev, itemId])
29
29
  }
30
30
 
31
- const removeSelectedItem = item => {
32
- setSelectedItemsId(prev => prev.filter(el => el !== item._id))
31
+ const removeSelectedItem = itemId => {
32
+ setSelectedItemsId(prev => prev.filter(el => el !== itemId))
33
33
  }
34
34
 
35
- const toggleSelectedItem = item => {
36
- if (isSelectedItem(item)) {
37
- removeSelectedItem(item)
35
+ const toggleSelectedItem = itemId => {
36
+ if (isSelectedItem(itemId)) {
37
+ removeSelectedItem(itemId)
38
38
  } else {
39
- addSelectedItem(item)
39
+ addSelectedItem(itemId)
40
40
  }
41
41
  }
42
42
 
43
- const selectAll = items => {
44
- const ids = items.map(item => item._id)
45
- setSelectedItemsId(ids)
43
+ const selectAll = itemsId => {
44
+ setSelectedItemsId(itemsId)
46
45
  }
47
46
 
48
47
  const unselectAll = () => {
49
48
  setSelectedItemsId([])
50
49
  }
51
50
 
52
- const isSelectedAllItems = items => {
51
+ const isSelectedAllItems = itemsId => {
53
52
  const a = selectedItemsId.sort()
54
- const b = items.map(item => item._id).sort()
53
+ const b = itemsId.sort()
55
54
  return isEqual(a, b)
56
55
  }
57
56
 
58
- const toggleSelectAllItems = items => {
59
- if (isSelectedAllItems(items)) {
57
+ const toggleSelectAllItems = itemsId => {
58
+ if (isSelectedAllItems(itemsId)) {
60
59
  unselectAll()
61
60
  } else {
62
- selectAll(items)
61
+ selectAll(itemsId)
63
62
  }
64
63
  }
65
64
 
@@ -1,7 +1,7 @@
1
1
  export default FixedHeaderContent;
2
- declare function FixedHeaderContent({ columns, order, orderBy, rowCount, context, onClick, onSelectAllClick }: {
2
+ declare function FixedHeaderContent({ columns, orderDirection, orderBy, rowCount, context, onClick, onSelectAllClick }: {
3
3
  columns: any;
4
- order: any;
4
+ orderDirection: any;
5
5
  orderBy: any;
6
6
  rowCount: any;
7
7
  context: any;
@@ -21,7 +21,7 @@ var useStyles = makeStyles({
21
21
 
22
22
  var FixedHeaderContent = function FixedHeaderContent(_ref) {
23
23
  var columns = _ref.columns,
24
- order = _ref.order,
24
+ orderDirection = _ref.orderDirection,
25
25
  orderBy = _ref.orderBy,
26
26
  rowCount = _ref.rowCount,
27
27
  context = _ref.context,
@@ -48,7 +48,7 @@ var FixedHeaderContent = function FixedHeaderContent(_ref) {
48
48
  key: column.id,
49
49
  className: classes.visuallyHidden,
50
50
  column: column,
51
- order: order,
51
+ orderDirection: orderDirection,
52
52
  orderBy: orderBy,
53
53
  onClick: function onClick() {
54
54
  return _onClick(column.id);
@@ -1,8 +1,8 @@
1
1
  export default TableHeadCell;
2
- declare function TableHeadCell({ className, column, orderBy, order, onClick }: {
2
+ declare function TableHeadCell({ className, column, orderBy, orderDirection, onClick }: {
3
3
  className: any;
4
4
  column: any;
5
5
  orderBy: any;
6
- order: any;
6
+ orderDirection: any;
7
7
  onClick: any;
8
8
  }): JSX.Element;
@@ -21,7 +21,7 @@ var TableHeadCell = function TableHeadCell(_ref3) {
21
21
  var className = _ref3.className,
22
22
  column = _ref3.column,
23
23
  orderBy = _ref3.orderBy,
24
- order = _ref3.order,
24
+ orderDirection = _ref3.orderDirection,
25
25
  onClick = _ref3.onClick;
26
26
  var classes = useStyles({
27
27
  column: column
@@ -31,14 +31,14 @@ var TableHeadCell = function TableHeadCell(_ref3) {
31
31
  classes: classes,
32
32
  align: (_column$textAlign = column.textAlign) !== null && _column$textAlign !== void 0 ? _column$textAlign : 'left',
33
33
  padding: column.disablePadding ? 'none' : 'normal',
34
- sortDirection: orderBy === column.id ? order : false
34
+ sortDirection: orderBy === column.id ? orderDirection : false
35
35
  }, column.sortable !== false ? /*#__PURE__*/React.createElement(TableSortLabel, {
36
36
  active: orderBy === column.id,
37
- direction: orderBy === column.id ? order : 'asc',
37
+ direction: orderBy === column.id ? orderDirection : 'asc',
38
38
  onClick: onClick
39
39
  }, column.label, orderBy === column.id && /*#__PURE__*/React.createElement("span", {
40
40
  className: className
41
- }, order === 'desc' ? 'sorted descending' : 'sorted ascending')) : column.label);
41
+ }, orderDirection === 'desc' ? 'sorted descending' : 'sorted ascending')) : column.label);
42
42
  };
43
43
 
44
44
  export default TableHeadCell;
@@ -1,2 +1,2 @@
1
- export function getComparator(order: any, orderBy: any, lang: any): (a: any, b: any) => number;
1
+ export function getComparator(orderDirection: any, orderBy: any, lang: any): (a: any, b: any) => number;
2
2
  export function stableSort(array: any, comparator: any): any;
@@ -3,7 +3,7 @@ import get from 'lodash/get';
3
3
  var descendingComparator = function descendingComparator(_ref) {
4
4
  var a = _ref.a,
5
5
  b = _ref.b,
6
- order = _ref.order,
6
+ orderDirection = _ref.orderDirection,
7
7
  orderBy = _ref.orderBy,
8
8
  lang = _ref.lang;
9
9
  var aValue = get(a, orderBy, '');
@@ -22,7 +22,7 @@ var descendingComparator = function descendingComparator(_ref) {
22
22
  }
23
23
 
24
24
  var _Intl$Collator = Intl.Collator(lang || 'en', {
25
- caseFirst: order === 'asc' ? 'upper' : 'lower'
25
+ caseFirst: orderDirection === 'asc' ? 'upper' : 'lower'
26
26
  }),
27
27
  compare = _Intl$Collator.compare;
28
28
 
@@ -32,12 +32,12 @@ var descendingComparator = function descendingComparator(_ref) {
32
32
  return bValue - aValue;
33
33
  };
34
34
 
35
- export var getComparator = function getComparator(order, orderBy, lang) {
36
- return order === 'desc' ? function (a, b) {
35
+ export var getComparator = function getComparator(orderDirection, orderBy, lang) {
36
+ return orderDirection === 'desc' ? function (a, b) {
37
37
  return descendingComparator({
38
38
  a: a,
39
39
  b: b,
40
- order: order,
40
+ orderDirection: orderDirection,
41
41
  orderBy: orderBy,
42
42
  lang: lang
43
43
  });
@@ -45,7 +45,7 @@ export var getComparator = function getComparator(order, orderBy, lang) {
45
45
  return -descendingComparator({
46
46
  a: a,
47
47
  b: b,
48
- order: order,
48
+ orderDirection: orderDirection,
49
49
  orderBy: orderBy,
50
50
  lang: lang
51
51
  });
@@ -17,6 +17,8 @@ import { stableSort, getComparator } from "cozy-ui/transpiled/react/Table/Virtua
17
17
  import virtuosoComponents from "cozy-ui/transpiled/react/Table/Virtualized/virtuosoComponents";
18
18
  import TableCell from "cozy-ui/transpiled/react/TableCell";
19
19
  var VirtualizedTable = /*#__PURE__*/forwardRef(function (_ref, ref) {
20
+ var _defaultOrder$directi, _defaultOrder$by;
21
+
20
22
  var rows = _ref.rows,
21
23
  columns = _ref.columns,
22
24
  groups = _ref.groups,
@@ -32,17 +34,17 @@ var VirtualizedTable = /*#__PURE__*/forwardRef(function (_ref, ref) {
32
34
  onSortChange = _ref.onSortChange,
33
35
  props = _objectWithoutProperties(_ref, _excluded);
34
36
 
35
- var _useState = useState('asc'),
37
+ var _useState = useState((_defaultOrder$directi = defaultOrder === null || defaultOrder === void 0 ? void 0 : defaultOrder.direction) !== null && _defaultOrder$directi !== void 0 ? _defaultOrder$directi : 'asc'),
36
38
  _useState2 = _slicedToArray(_useState, 2),
37
- order = _useState2[0],
38
- setOrder = _useState2[1];
39
+ orderDirection = _useState2[0],
40
+ setOrderDirection = _useState2[1];
39
41
 
40
- var _useState3 = useState(defaultOrder),
42
+ var _useState3 = useState((_defaultOrder$by = defaultOrder === null || defaultOrder === void 0 ? void 0 : defaultOrder.by) !== null && _defaultOrder$by !== void 0 ? _defaultOrder$by : undefined),
41
43
  _useState4 = _slicedToArray(_useState3, 2),
42
44
  orderBy = _useState4[0],
43
45
  setOrderBy = _useState4[1];
44
46
 
45
- var sortedData = stableSort(rows, getComparator(order, orderBy));
47
+ var sortedData = orderBy ? stableSort(rows, getComparator(orderDirection, orderBy)) : rows;
46
48
  var data = secondarySort ? secondarySort(sortedData) : sortedData;
47
49
 
48
50
  var _ref2 = (groups === null || groups === void 0 ? void 0 : groups(data)) || {},
@@ -60,11 +62,11 @@ var VirtualizedTable = /*#__PURE__*/forwardRef(function (_ref, ref) {
60
62
  });
61
63
 
62
64
  var handleSort = function handleSort(property) {
63
- var isAsc = orderBy === property && order === 'asc';
65
+ var isAsc = orderBy === property && orderDirection === 'asc';
64
66
  var newOrder = isAsc ? 'desc' : 'asc';
65
- setOrder(newOrder);
67
+ setOrderDirection(newOrder);
66
68
  setOrderBy(property);
67
- onSortChange({
69
+ onSortChange === null || onSortChange === void 0 ? void 0 : onSortChange({
68
70
  order: newOrder,
69
71
  orderBy: property
70
72
  });
@@ -93,7 +95,7 @@ var VirtualizedTable = /*#__PURE__*/forwardRef(function (_ref, ref) {
93
95
  columns: columns,
94
96
  rowCount: rows.length,
95
97
  context: _context,
96
- order: order,
98
+ orderDirection: orderDirection,
97
99
  orderBy: orderBy,
98
100
  onClick: handleSort,
99
101
  onSelectAllClick: handleSelectAll
@@ -129,9 +131,37 @@ VirtualizedTable.defaultProps = {
129
131
  onSelectAll: function onSelectAll() {}
130
132
  };
131
133
  VirtualizedTable.propTypes = {
132
- /**
133
- Returned object is: PropTypes.shape({ groupLabels: PropTypes.array, groupCounts: PropTypes.array })
134
- */
135
- groups: PropTypes.func
134
+ /** Rows to display in the table */
135
+ rows: PropTypes.array,
136
+
137
+ /** Column configuration */
138
+ columns: PropTypes.array,
139
+
140
+ /** Returned object is: PropTypes.shape({ groupLabels: PropTypes.array, groupCounts: PropTypes.array }) */
141
+ groups: PropTypes.func,
142
+
143
+ /** Default sorting configuration */
144
+ defaultOrder: PropTypes.shape({
145
+ direction: PropTypes.oneOf(['asc', 'desc']),
146
+ by: PropTypes.string
147
+ }),
148
+
149
+ /** Sort files by type to put directory and trash before files */
150
+ secondarySort: PropTypes.func,
151
+
152
+ /** Array of selected items */
153
+ selectedItems: PropTypes.array,
154
+
155
+ /** Callback function when a row is selected */
156
+ onSelect: PropTypes.func,
157
+
158
+ /** Callback function when all rows are selected/deselected */
159
+ onSelectAll: PropTypes.func,
160
+
161
+ /** Function to determine if a row is selected */
162
+ isSelectedItem: PropTypes.func,
163
+
164
+ /** Callback called after the sort */
165
+ onSortChange: PropTypes.func
136
166
  };
137
167
  export default VirtualizedTable;
@@ -24,60 +24,55 @@ var SelectionProvider = function SelectionProvider(_ref) {
24
24
  selectedItemsId = _useState2[0],
25
25
  setSelectedItemsId = _useState2[1];
26
26
 
27
- var isSelectedItem = function isSelectedItem(item) {
27
+ var isSelectedItem = function isSelectedItem(itemId) {
28
28
  return selectedItemsId.some(function (selectedItemId) {
29
- return selectedItemId === item._id;
29
+ return selectedItemId === itemId;
30
30
  });
31
31
  };
32
32
 
33
33
  var isSelectionEnabled = selectedItemsId.length > 0;
34
34
 
35
- var addSelectedItem = function addSelectedItem(item) {
35
+ var addSelectedItem = function addSelectedItem(itemId) {
36
36
  setSelectedItemsId(function (prev) {
37
- return [].concat(_toConsumableArray(prev), [item._id]);
37
+ return [].concat(_toConsumableArray(prev), [itemId]);
38
38
  });
39
39
  };
40
40
 
41
- var removeSelectedItem = function removeSelectedItem(item) {
41
+ var removeSelectedItem = function removeSelectedItem(itemId) {
42
42
  setSelectedItemsId(function (prev) {
43
43
  return prev.filter(function (el) {
44
- return el !== item._id;
44
+ return el !== itemId;
45
45
  });
46
46
  });
47
47
  };
48
48
 
49
- var toggleSelectedItem = function toggleSelectedItem(item) {
50
- if (isSelectedItem(item)) {
51
- removeSelectedItem(item);
49
+ var toggleSelectedItem = function toggleSelectedItem(itemId) {
50
+ if (isSelectedItem(itemId)) {
51
+ removeSelectedItem(itemId);
52
52
  } else {
53
- addSelectedItem(item);
53
+ addSelectedItem(itemId);
54
54
  }
55
55
  };
56
56
 
57
- var selectAll = function selectAll(items) {
58
- var ids = items.map(function (item) {
59
- return item._id;
60
- });
61
- setSelectedItemsId(ids);
57
+ var selectAll = function selectAll(itemsId) {
58
+ setSelectedItemsId(itemsId);
62
59
  };
63
60
 
64
61
  var unselectAll = function unselectAll() {
65
62
  setSelectedItemsId([]);
66
63
  };
67
64
 
68
- var isSelectedAllItems = function isSelectedAllItems(items) {
65
+ var isSelectedAllItems = function isSelectedAllItems(itemsId) {
69
66
  var a = selectedItemsId.sort();
70
- var b = items.map(function (item) {
71
- return item._id;
72
- }).sort();
67
+ var b = itemsId.sort();
73
68
  return isEqual(a, b);
74
69
  };
75
70
 
76
- var toggleSelectAllItems = function toggleSelectAllItems(items) {
77
- if (isSelectedAllItems(items)) {
71
+ var toggleSelectAllItems = function toggleSelectAllItems(itemsId) {
72
+ if (isSelectedAllItems(itemsId)) {
78
73
  unselectAll();
79
74
  } else {
80
- selectAll(items);
75
+ selectAll(itemsId);
81
76
  }
82
77
  };
83
78