@coreui/react-pro 5.5.0 → 5.6.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 (79) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/breadcrumb/CBreadcrumbItem.d.ts +9 -2
  3. package/dist/cjs/components/breadcrumb/CBreadcrumbItem.js +2 -2
  4. package/dist/cjs/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  5. package/dist/cjs/components/form/CFormSelect.d.ts +1 -0
  6. package/dist/cjs/components/form/CFormSelect.js.map +1 -1
  7. package/dist/cjs/components/grid/CRow.js +1 -1
  8. package/dist/cjs/components/grid/CRow.js.map +1 -1
  9. package/dist/cjs/components/picker/CPicker.js +1 -0
  10. package/dist/cjs/components/picker/CPicker.js.map +1 -1
  11. package/dist/cjs/components/smart-table/CSmartTable.js +81 -66
  12. package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
  13. package/dist/cjs/components/smart-table/CSmartTableBody.js +1 -0
  14. package/dist/cjs/components/smart-table/CSmartTableBody.js.map +1 -1
  15. package/dist/cjs/components/smart-table/CSmartTableHead.d.ts +1 -1
  16. package/dist/cjs/components/smart-table/CSmartTableHead.js +4 -1
  17. package/dist/cjs/components/smart-table/CSmartTableHead.js.map +1 -1
  18. package/dist/cjs/components/smart-table/CSmartTableInterface.d.ts +5 -4
  19. package/dist/cjs/components/smart-table/types.d.ts +5 -4
  20. package/dist/cjs/components/smart-table/utils.d.ts +12 -18
  21. package/dist/cjs/components/smart-table/utils.js +104 -96
  22. package/dist/cjs/components/smart-table/utils.js.map +1 -1
  23. package/dist/cjs/components/tabs/CTab.d.ts +4 -0
  24. package/dist/cjs/components/tabs/CTab.js +1 -0
  25. package/dist/cjs/components/tabs/CTab.js.map +1 -1
  26. package/dist/cjs/components/toast/CToast.d.ts +1 -1
  27. package/dist/cjs/components/toast/CToast.js +6 -3
  28. package/dist/cjs/components/toast/CToast.js.map +1 -1
  29. package/dist/cjs/components/toast/CToaster.js +1 -1
  30. package/dist/cjs/components/toast/CToaster.js.map +1 -1
  31. package/dist/cjs/utils/index.d.ts +2 -1
  32. package/dist/cjs/utils/isEqual.d.ts +2 -0
  33. package/dist/esm/components/breadcrumb/CBreadcrumbItem.d.ts +9 -2
  34. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js +2 -2
  35. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  36. package/dist/esm/components/form/CFormSelect.d.ts +1 -0
  37. package/dist/esm/components/form/CFormSelect.js.map +1 -1
  38. package/dist/esm/components/grid/CRow.js +2 -2
  39. package/dist/esm/components/grid/CRow.js.map +1 -1
  40. package/dist/esm/components/picker/CPicker.js +1 -0
  41. package/dist/esm/components/picker/CPicker.js.map +1 -1
  42. package/dist/esm/components/smart-table/CSmartTable.js +82 -67
  43. package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
  44. package/dist/esm/components/smart-table/CSmartTableBody.js +1 -0
  45. package/dist/esm/components/smart-table/CSmartTableBody.js.map +1 -1
  46. package/dist/esm/components/smart-table/CSmartTableHead.d.ts +1 -1
  47. package/dist/esm/components/smart-table/CSmartTableHead.js +4 -1
  48. package/dist/esm/components/smart-table/CSmartTableHead.js.map +1 -1
  49. package/dist/esm/components/smart-table/CSmartTableInterface.d.ts +5 -4
  50. package/dist/esm/components/smart-table/types.d.ts +5 -4
  51. package/dist/esm/components/smart-table/utils.d.ts +12 -18
  52. package/dist/esm/components/smart-table/utils.js +104 -98
  53. package/dist/esm/components/smart-table/utils.js.map +1 -1
  54. package/dist/esm/components/tabs/CTab.d.ts +4 -0
  55. package/dist/esm/components/tabs/CTab.js +1 -0
  56. package/dist/esm/components/tabs/CTab.js.map +1 -1
  57. package/dist/esm/components/toast/CToast.d.ts +1 -1
  58. package/dist/esm/components/toast/CToast.js +6 -3
  59. package/dist/esm/components/toast/CToast.js.map +1 -1
  60. package/dist/esm/components/toast/CToaster.js +1 -1
  61. package/dist/esm/components/toast/CToaster.js.map +1 -1
  62. package/dist/esm/utils/index.d.ts +2 -1
  63. package/dist/esm/utils/isEqual.d.ts +2 -0
  64. package/package.json +9 -9
  65. package/src/components/breadcrumb/CBreadcrumbItem.tsx +36 -21
  66. package/src/components/form/CFormSelect.tsx +1 -0
  67. package/src/components/grid/CRow.tsx +1 -1
  68. package/src/components/picker/CPicker.tsx +1 -0
  69. package/src/components/smart-table/CSmartTable.tsx +94 -71
  70. package/src/components/smart-table/CSmartTableBody.tsx +2 -1
  71. package/src/components/smart-table/CSmartTableHead.tsx +5 -2
  72. package/src/components/smart-table/CSmartTableInterface.tsx +5 -4
  73. package/src/components/smart-table/types.ts +5 -4
  74. package/src/components/smart-table/utils.ts +154 -123
  75. package/src/components/tabs/CTab.tsx +5 -0
  76. package/src/components/toast/CToast.tsx +7 -4
  77. package/src/components/toast/CToaster.tsx +1 -1
  78. package/src/utils/index.ts +2 -0
  79. package/src/utils/isEqual.ts +58 -0
@@ -1,14 +1,22 @@
1
- import React, { forwardRef, HTMLAttributes } from 'react'
1
+ import React, { ElementType, forwardRef, HTMLAttributes } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import classNames from 'classnames'
4
4
 
5
5
  import { CLink } from '../link/CLink'
6
6
 
7
+ import { PolymorphicRefForwardingComponent } from '../../helpers'
8
+
7
9
  export interface CBreadcrumbItemProps extends HTMLAttributes<HTMLLIElement> {
8
10
  /**
9
11
  * Toggle the active state for the component.
10
12
  */
11
13
  active?: boolean
14
+ /**
15
+ * Component used for the root node. Either a string to use a HTML element or a component.
16
+ *
17
+ * @since 5.4.0
18
+ */
19
+ as?: ElementType
12
20
  /**
13
21
  * A string of all className you want applied to the base component.
14
22
  */
@@ -19,26 +27,33 @@ export interface CBreadcrumbItemProps extends HTMLAttributes<HTMLLIElement> {
19
27
  href?: string
20
28
  }
21
29
 
22
- export const CBreadcrumbItem = forwardRef<HTMLLIElement, CBreadcrumbItemProps>(
23
- ({ children, active, className, href, ...rest }, ref) => {
24
- return (
25
- <li
26
- className={classNames(
27
- 'breadcrumb-item',
28
- {
29
- active: active,
30
- },
31
- className,
32
- )}
33
- {...(active && { 'aria-current': 'page' })}
34
- {...rest}
35
- ref={ref}
36
- >
37
- {href ? <CLink href={href}>{children}</CLink> : children}
38
- </li>
39
- )
40
- },
41
- )
30
+ export const CBreadcrumbItem: PolymorphicRefForwardingComponent<'li', CBreadcrumbItemProps> =
31
+ forwardRef<HTMLLIElement, CBreadcrumbItemProps>(
32
+ ({ children, active, as, className, href, ...rest }, ref) => {
33
+ return (
34
+ <li
35
+ className={classNames(
36
+ 'breadcrumb-item',
37
+ {
38
+ active: active,
39
+ },
40
+ className,
41
+ )}
42
+ {...(active && { 'aria-current': 'page' })}
43
+ {...rest}
44
+ ref={ref}
45
+ >
46
+ {href ? (
47
+ <CLink as={as} href={href}>
48
+ {children}
49
+ </CLink>
50
+ ) : (
51
+ children
52
+ )}
53
+ </li>
54
+ )
55
+ },
56
+ )
42
57
 
43
58
  CBreadcrumbItem.propTypes = {
44
59
  active: PropTypes.bool,
@@ -7,6 +7,7 @@ import { CFormControlWrapper, CFormControlWrapperProps } from './CFormControlWra
7
7
  type Option = {
8
8
  disabled?: boolean
9
9
  label?: string
10
+ selected?: boolean
10
11
  value?: string
11
12
  }
12
13
 
@@ -91,7 +91,7 @@ export const CRow = forwardRef<HTMLDivElement, CRowProps>(
91
91
  })
92
92
 
93
93
  return (
94
- <div className={classNames('row', repsonsiveClassNames, className)} ref={ref}>
94
+ <div className={classNames('row', repsonsiveClassNames, className)} {...rest} ref={ref}>
95
95
  {children}
96
96
  </div>
97
97
  )
@@ -176,4 +176,5 @@ CPicker.propTypes = {
176
176
  onHide: PropTypes.func,
177
177
  onShow: PropTypes.func,
178
178
  toggler: PropTypes.node,
179
+ visible: PropTypes.bool,
179
180
  }
@@ -39,7 +39,7 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
39
39
  elementCover,
40
40
  footer,
41
41
  header = true,
42
- items,
42
+ items = [],
43
43
  itemsNumber,
44
44
  itemsPerPage = 10,
45
45
  itemsPerPageLabel = 'Items per page:',
@@ -71,7 +71,7 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
71
71
  tableFilter,
72
72
  tableFilterLabel = 'Filter:',
73
73
  tableFilterPlaceholder = 'type string...',
74
- tableFilterValue, // TODO: consider to use only tableFilter prop
74
+ tableFilterValue,
75
75
  tableHeadProps,
76
76
  tableProps,
77
77
  ...rest
@@ -79,46 +79,45 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
79
79
  ref,
80
80
  ) => {
81
81
  const mountedRef = useRef(false)
82
+
82
83
  const [_activePage, setActivePage] = useState(activePage)
83
84
  const [_items, setItems] = useState<Item[]>([])
84
- const [_itemsNumber, setItemsNumber] = useState(itemsNumber)
85
85
  const [_itemsPerPage, setItemsPerPage] = useState(itemsPerPage)
86
86
  const [_selected, setSelected] = useState<Item[]>([])
87
87
  const [columnFilterState, setColumnFilterState] = useState<ColumnFilterValue>({})
88
88
  const [selectedAll, setSelectedAll] = useState<boolean | string>()
89
- const [sorterState, setSorterState] = useState<SorterValue>({})
89
+ const [sorterState, setSorterState] = useState<SorterValue[]>([])
90
90
  const [tableFilterState, setTableFilterState] = useState<string>(tableFilterValue ?? '')
91
91
 
92
+ const _itemsNumber = useMemo(() => itemsNumber ?? items.length, [itemsNumber, items.length])
93
+
92
94
  useEffect(() => {
93
95
  setActivePage(activePage)
94
96
  }, [activePage])
95
97
 
96
98
  useEffect(() => {
97
- if (items && items.length < _itemsPerPage * _activePage - _itemsPerPage) {
99
+ if (items.length < _itemsPerPage * _activePage - _itemsPerPage) {
98
100
  setActivePage(1)
99
101
  }
100
102
 
101
103
  const selected: Item[] = []
102
104
 
103
- items &&
104
- items.forEach((item: Item) => {
105
- if (item._selected) {
106
- const _item = { ...item }
107
- for (const key of ITEM_INTERNAL_KEYS ) {
108
- delete _item[key]
109
- }
110
- selected.push(_item)
105
+ for (const item of items) {
106
+ if (item._selected) {
107
+ const _item = { ...item }
108
+ for (const key of ITEM_INTERNAL_KEYS) {
109
+ delete _item[key] // Remove internal keys
111
110
  }
112
- })
111
+ selected.push(_item) // Add cleaned item to selected array
112
+ }
113
+ }
113
114
 
114
115
  if (selected.length > 0) {
115
116
  setSelected([..._selected, ...selected])
116
117
  }
117
118
 
118
119
  if (Array.isArray(items)) {
119
- setItems(items)
120
- // eslint-disable-next-line unicorn/explicit-length-check
121
- setItemsNumber(itemsNumber || items.length)
120
+ setItems([...items])
122
121
  }
123
122
  }, [JSON.stringify(items)])
124
123
 
@@ -126,16 +125,12 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
126
125
  Array.isArray(selected) && setSelected(selected)
127
126
  }, [JSON.stringify(selected)])
128
127
 
129
- useEffect(() => {
130
- itemsNumber && setItemsNumber(itemsNumber)
131
- }, [itemsNumber])
132
-
133
128
  useEffect(() => {
134
129
  columnFilterValue && setColumnFilterState(columnFilterValue)
135
130
  }, [JSON.stringify(columnFilterValue)])
136
131
 
137
132
  useEffect(() => {
138
- setSorterState({ ...sorterValue })
133
+ sorterValue && setSorterState(Array.isArray(sorterValue) ? sorterValue : [sorterValue])
139
134
  }, [JSON.stringify(sorterValue)])
140
135
 
141
136
  useEffect(() => setItemsPerPage(itemsPerPage), [itemsPerPage])
@@ -150,8 +145,12 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
150
145
  }, [_itemsPerPage])
151
146
 
152
147
  useEffect(() => {
153
- mountedRef.current && sorterState && onSorterChange && onSorterChange(sorterState)
154
- }, [JSON.stringify(sorterState)])
148
+ const multiple = typeof columnSorter === 'object' && columnSorter.multiple
149
+ mountedRef.current &&
150
+ sorterState &&
151
+ onSorterChange &&
152
+ onSorterChange(multiple ? sorterState : sorterState[0])
153
+ }, [sorterState])
155
154
 
156
155
  useEffect(() => {
157
156
  mountedRef.current && onColumnFilterChange && onColumnFilterChange(columnFilterState)
@@ -164,6 +163,7 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
164
163
  useEffect(() => {
165
164
  if (selectable) {
166
165
  onSelectedItemsChange && onSelectedItemsChange(_selected)
166
+
167
167
  if (_selected.length === _itemsNumber) {
168
168
  setSelectedAll(true)
169
169
  return
@@ -189,23 +189,17 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
189
189
 
190
190
  const filteredColumns: Item[] = useMemo(
191
191
  () => filterColumns(_items, columnFilter, columnFilterState, itemsDataColumns),
192
- [columnFilterState, JSON.stringify(_items)],
192
+ [columnFilterState, _items],
193
193
  )
194
194
 
195
195
  const filteredTable: Item[] = useMemo(
196
196
  () => filterTable(filteredColumns, tableFilter, tableFilterState, itemsDataColumns),
197
- [tableFilterState, JSON.stringify(tableFilterValue), JSON.stringify(filteredColumns)],
197
+ [tableFilterState, tableFilterValue, filteredColumns],
198
198
  )
199
199
 
200
200
  const sortedItems: Item[] = useMemo(
201
- () => sortItems(columnSorter, filteredTable, itemsDataColumns, sorterState),
202
- [
203
- JSON.stringify(filteredTable),
204
- JSON.stringify(sorterState),
205
- JSON.stringify(columnSorter),
206
- JSON.stringify(filteredColumns),
207
- JSON.stringify(_items),
208
- ],
201
+ () => sortItems(columns, columnSorter, filteredTable, itemsDataColumns, sorterState),
202
+ [columnSorter, sorterState, filteredTable],
209
203
  )
210
204
 
211
205
  const numberOfPages: number = _itemsPerPage ? Math.ceil(sortedItems.length / _itemsPerPage) : 1
@@ -223,7 +217,7 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
223
217
  const handleClean = (): void => {
224
218
  setTableFilterState('')
225
219
  setColumnFilterState({})
226
- setSorterState({})
220
+ setSorterState([])
227
221
  }
228
222
 
229
223
  const handleColumnFilterChange = (colName: string, value: any, type?: string): void => {
@@ -232,9 +226,17 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
232
226
  return
233
227
  }
234
228
 
235
- const newState = { ...columnFilterState, [`${colName}`]: value }
236
229
  setActivePage(1)
237
- setColumnFilterState(newState)
230
+ setColumnFilterState((prevState) => {
231
+ const newState = { ...prevState }
232
+ if (value === '') {
233
+ delete newState[colName]
234
+ } else {
235
+ newState[colName] = value
236
+ }
237
+
238
+ return newState
239
+ })
238
240
  }
239
241
 
240
242
  const handleItemsPerPageChange = (event: ChangeEvent<HTMLSelectElement>): void => {
@@ -247,19 +249,13 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
247
249
  }
248
250
 
249
251
  const handleRowChecked = (item: Item, value: boolean) => {
250
- if (
251
- value &&
252
- !isObjectInArray(_selected, item, ITEM_INTERNAL_KEYS)
253
- ) {
254
- setSelected([..._selected, item])
252
+ if (value && !isObjectInArray(_selected, item, ITEM_INTERNAL_KEYS)) {
253
+ setSelected((prevSelected) => [...prevSelected, item])
255
254
  return
256
255
  }
257
256
 
258
- setSelected(
259
- _selected.filter(
260
- (_item: Item) =>
261
- !isObjectInArray([_item], item, ITEM_INTERNAL_KEYS),
262
- ),
257
+ setSelected((prevSelected) =>
258
+ prevSelected.filter((_item: Item) => !isObjectInArray([_item], item, ITEM_INTERNAL_KEYS)),
263
259
  )
264
260
  }
265
261
 
@@ -275,7 +271,9 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
275
271
  return
276
272
  }
277
273
 
278
- const selectable = _items.filter((item) => item._selectable !== false || item._selected === true)
274
+ const selectable = _items.filter(
275
+ (item) => item._selectable !== false || item._selected === true,
276
+ )
279
277
 
280
278
  if (selectable.length === _selected.length) {
281
279
  setSelected(_items.filter((item) => item._selectable === false && item._selected === true))
@@ -288,10 +286,10 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
288
286
 
289
287
  setSelected(
290
288
  selected.map((item) => {
291
- for (const key of ITEM_INTERNAL_KEYS ) {
289
+ for (const key of ITEM_INTERNAL_KEYS) {
292
290
  delete item[key]
293
291
  }
294
-
292
+
295
293
  return item
296
294
  }),
297
295
  )
@@ -302,29 +300,42 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
302
300
  return
303
301
  }
304
302
 
305
- //if column changed or sort was descending change asc to true
306
- const state = sorterState ?? { column: '', state: '' }
303
+ const existingColumnState = sorterState.find((x) => x.column === column)
304
+ const multiple = typeof columnSorter === 'object' && columnSorter.multiple
307
305
 
308
- if (order) {
309
- state.state = order
310
- }
306
+ // If the column already has a sort state
307
+ if (existingColumnState) {
308
+ // No need to update if the order is already the same
309
+ if (existingColumnState.state === order) {
310
+ return
311
+ }
311
312
 
312
- if (state.column === column) {
313
- if (order) {
314
- state.state = order
315
- } else if (state.state === 0) {
316
- state.state = 'asc'
317
- } else if (state.state === 'asc') {
318
- state.state = 'desc'
313
+ // Remove the column from sorting if resetable and descending
314
+ if (
315
+ typeof columnSorter === 'object' &&
316
+ columnSorter.resetable &&
317
+ existingColumnState.state === 'desc' &&
318
+ order !== 'asc'
319
+ ) {
320
+ setSorterState(multiple ? sorterState.filter((x) => x.column !== column) : [])
319
321
  } else {
320
- state.state = typeof columnSorter === 'object' && !columnSorter.resetable ? 'asc' : 0
322
+ // Toggle between ascending and descending
323
+ const newState = {
324
+ column,
325
+ state: order || (existingColumnState.state === 'asc' ? 'desc' : 'asc'),
326
+ }
327
+
328
+ setSorterState(
329
+ multiple
330
+ ? sorterState.map((item) => (item.column === column ? newState : item))
331
+ : [newState],
332
+ )
321
333
  }
322
334
  } else {
323
- state.column = column
324
- state.state = order || 'asc'
335
+ // If the column is not yet sorted, add it with the default or provided order
336
+ const newSorter = { column, state: order || 'asc' }
337
+ setSorterState(multiple ? [...sorterState, newSorter] : [newSorter])
325
338
  }
326
-
327
- setSorterState({ ...state })
328
339
  }
329
340
 
330
341
  const handleTableFilterChange = (value: string, type: string): void => {
@@ -379,7 +390,7 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
379
390
  className="btn btn-transparent"
380
391
  {...(!(
381
392
  tableFilterState ||
382
- sorterState?.column ||
393
+ sorterState.length > 0 ||
383
394
  Object.values(columnFilterState).join('')
384
395
  ) && {
385
396
  disabled: true,
@@ -486,7 +497,8 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
486
497
  {(pagination || itemsPerPageSelect) && (
487
498
  <div className="row">
488
499
  <div className="col">
489
- {((pagination && numberOfPages > 1) || (paginationProps && paginationProps.pages > 1)) && (
500
+ {((pagination && numberOfPages > 1) ||
501
+ (paginationProps && paginationProps.pages > 1)) && (
490
502
  <CSmartPagination
491
503
  activePage={_activePage}
492
504
  onActivePageChange={(page) => {
@@ -556,7 +568,7 @@ CSmartTable.propTypes = {
556
568
  onRowClick: PropTypes.func,
557
569
  onSelectAll: PropTypes.func,
558
570
  onSelectedItemsChange: PropTypes.func,
559
- onSorterChange: PropTypes.func, // TODO: change to `onColumnSorterChange` in v5
571
+ onSorterChange: PropTypes.func, // TODO: change to `onColumnSorterChange` in v6
560
572
  onTableFilterChange: PropTypes.func,
561
573
  pagination: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
562
574
  paginationProps: PropTypes.any, // TODO: update
@@ -564,7 +576,18 @@ CSmartTable.propTypes = {
564
576
  selectable: PropTypes.bool,
565
577
  selectAll: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
566
578
  selected: PropTypes.array,
567
- sorterValue: PropTypes.object,
579
+ sorterValue: PropTypes.oneOfType([
580
+ PropTypes.shape({
581
+ column: PropTypes.string.isRequired,
582
+ state: PropTypes.oneOf<SorterValue['state']>(['asc', 'desc', 0]).isRequired,
583
+ }),
584
+ PropTypes.arrayOf(
585
+ PropTypes.shape({
586
+ column: PropTypes.string.isRequired,
587
+ state: PropTypes.oneOf<SorterValue['state']>(['asc', 'desc', 0]).isRequired,
588
+ }).isRequired,
589
+ ),
590
+ ]),
568
591
  sortingIcon: PropTypes.node,
569
592
  sortingIconAscending: PropTypes.node,
570
593
  sortingIconDescending: PropTypes.node,
@@ -72,7 +72,7 @@ export const CSmartTableBody = forwardRef<HTMLTableSectionElement, CSmartTableBo
72
72
  item,
73
73
  trIndex + firstItemOnActivePageIndex,
74
74
  getClickedColumnName(
75
- event.target as HTMLTextAreaElement,
75
+ event.target as HTMLElement,
76
76
  columnNames,
77
77
  selectable,
78
78
  ),
@@ -153,6 +153,7 @@ export const CSmartTableBody = forwardRef<HTMLTableSectionElement, CSmartTableBo
153
153
 
154
154
  CSmartTableBody.propTypes = {
155
155
  clickableRows: PropTypes.bool,
156
+ columns: PropTypes.array.isRequired,
156
157
  currentItems: PropTypes.array.isRequired,
157
158
  firstItemOnActivePageIndex: PropTypes.number.isRequired,
158
159
  noItemsLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
@@ -42,7 +42,7 @@ export interface CSmartTableHeadProps extends CTableHeadProps {
42
42
  selectAll?: boolean | { external?: boolean }
43
43
  selectedAll?: boolean | string
44
44
  showGroups?: boolean
45
- sorterState?: SorterValue
45
+ sorterState?: SorterValue[]
46
46
  sortingIcon?: ReactNode
47
47
  sortingIconAscending?: ReactNode
48
48
  sortingIconDescending?: ReactNode
@@ -250,14 +250,17 @@ CSmartTableHead.propTypes = {
250
250
  columnSorter: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
251
251
  children: PropTypes.node,
252
252
  columns: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.any, PropTypes.string])).isRequired, // TODO: improve this Prop Type,
253
+ handleOnCustomFilterChange: PropTypes.func,
253
254
  handleFilterOnChange: PropTypes.func,
254
255
  handleFilterOnInput: PropTypes.func,
255
256
  handleSelectAllChecked: PropTypes.func,
256
257
  handleSort: PropTypes.func,
258
+ items: PropTypes.array,
257
259
  selectable: PropTypes.bool,
258
260
  selectAll: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
259
261
  selectedAll: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
260
- sorterState: PropTypes.object,
262
+ showGroups: PropTypes.bool,
263
+ sorterState: PropTypes.array,
261
264
  sortingIcon: PropTypes.node,
262
265
  sortingIconAscending: PropTypes.node,
263
266
  sortingIconDescending: PropTypes.node,
@@ -64,8 +64,9 @@ export interface CSmartTableProps extends HTMLAttributes<HTMLDivElement> {
64
64
  * Enables table sorting by column value. Sorting will be performed corectly only if values in column are of one type: string (case insensitive) or number.
65
65
  *
66
66
  * Sorter can be customized, by passing prop as object with additional options as keys. Available options:
67
- * - external (Boolean) - Disables automatic sorting inside component.
68
- * - resetable (Boolean) - If set to true clicking on sorter have three states: ascending, descending and null. That means that third click on sorter will reset sorting, and restore table to original order.
67
+ * - external (Boolean) - Disables automatic sorting inside the component, allowing for external sorting control.
68
+ * - multiple (Boolean) - Enables sorting by multiple columns simultaneously. The sorting order will be maintained across multiple columns based on the order of interaction.
69
+ * - resetable (Boolean) - If set to true, clicking on the sorter cycles through three states: ascending, descending, and null (no sorting). The third click on the sorter will reset the sorting and restore the table to its original order.
69
70
  */
70
71
  columnSorter?: boolean | Sorter
71
72
  /**
@@ -159,7 +160,7 @@ export interface CSmartTableProps extends HTMLAttributes<HTMLDivElement> {
159
160
  /**
160
161
  * Sorter value change callback.
161
162
  */
162
- onSorterChange?: (value: SorterValue) => void
163
+ onSorterChange?: (value: SorterValue | SorterValue[]) => void
163
164
  /**
164
165
  * Table filter change callback.
165
166
  */
@@ -200,7 +201,7 @@ export interface CSmartTableProps extends HTMLAttributes<HTMLDivElement> {
200
201
  /**
201
202
  * State of the sorter. Name key is column name, direction can be 'asc' or 'desc'.
202
203
  */
203
- sorterValue?: SorterValue
204
+ sorterValue?: SorterValue | SorterValue[]
204
205
  /**
205
206
  * Sorter icon when items are unsorted.
206
207
  */
@@ -10,7 +10,7 @@ export type Column = {
10
10
  group?: string
11
11
  key: string
12
12
  label?: string
13
- sorter?: boolean
13
+ sorter?: boolean | ((a: any, b: any) => number)
14
14
  _style?: any
15
15
  _props?: CTableHeaderCellProps
16
16
  _colStyle?: any
@@ -59,8 +59,9 @@ export type Pagination = {
59
59
  }
60
60
 
61
61
  export type Sorter = {
62
- resetable?: boolean
63
62
  external?: boolean
63
+ multiple?: boolean
64
+ resetable?: boolean
64
65
  }
65
66
 
66
67
  export type ScopedColumns = {
@@ -69,8 +70,8 @@ export type ScopedColumns = {
69
70
  }
70
71
 
71
72
  export type SorterValue = {
72
- column?: string
73
- state?: number | string
73
+ column: string
74
+ state: 'asc' | 'desc' | 0
74
75
  }
75
76
 
76
77
  export type TableFilter = {