@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.
- package/README.md +1 -1
- package/dist/cjs/components/breadcrumb/CBreadcrumbItem.d.ts +9 -2
- package/dist/cjs/components/breadcrumb/CBreadcrumbItem.js +2 -2
- package/dist/cjs/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
- package/dist/cjs/components/form/CFormSelect.d.ts +1 -0
- package/dist/cjs/components/form/CFormSelect.js.map +1 -1
- package/dist/cjs/components/grid/CRow.js +1 -1
- package/dist/cjs/components/grid/CRow.js.map +1 -1
- package/dist/cjs/components/picker/CPicker.js +1 -0
- package/dist/cjs/components/picker/CPicker.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTable.js +81 -66
- package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTableBody.js +1 -0
- package/dist/cjs/components/smart-table/CSmartTableBody.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTableHead.d.ts +1 -1
- package/dist/cjs/components/smart-table/CSmartTableHead.js +4 -1
- package/dist/cjs/components/smart-table/CSmartTableHead.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTableInterface.d.ts +5 -4
- package/dist/cjs/components/smart-table/types.d.ts +5 -4
- package/dist/cjs/components/smart-table/utils.d.ts +12 -18
- package/dist/cjs/components/smart-table/utils.js +104 -96
- package/dist/cjs/components/smart-table/utils.js.map +1 -1
- package/dist/cjs/components/tabs/CTab.d.ts +4 -0
- package/dist/cjs/components/tabs/CTab.js +1 -0
- package/dist/cjs/components/tabs/CTab.js.map +1 -1
- package/dist/cjs/components/toast/CToast.d.ts +1 -1
- package/dist/cjs/components/toast/CToast.js +6 -3
- package/dist/cjs/components/toast/CToast.js.map +1 -1
- package/dist/cjs/components/toast/CToaster.js +1 -1
- package/dist/cjs/components/toast/CToaster.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +2 -1
- package/dist/cjs/utils/isEqual.d.ts +2 -0
- package/dist/esm/components/breadcrumb/CBreadcrumbItem.d.ts +9 -2
- package/dist/esm/components/breadcrumb/CBreadcrumbItem.js +2 -2
- package/dist/esm/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
- package/dist/esm/components/form/CFormSelect.d.ts +1 -0
- package/dist/esm/components/form/CFormSelect.js.map +1 -1
- package/dist/esm/components/grid/CRow.js +2 -2
- package/dist/esm/components/grid/CRow.js.map +1 -1
- package/dist/esm/components/picker/CPicker.js +1 -0
- package/dist/esm/components/picker/CPicker.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTable.js +82 -67
- package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTableBody.js +1 -0
- package/dist/esm/components/smart-table/CSmartTableBody.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTableHead.d.ts +1 -1
- package/dist/esm/components/smart-table/CSmartTableHead.js +4 -1
- package/dist/esm/components/smart-table/CSmartTableHead.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTableInterface.d.ts +5 -4
- package/dist/esm/components/smart-table/types.d.ts +5 -4
- package/dist/esm/components/smart-table/utils.d.ts +12 -18
- package/dist/esm/components/smart-table/utils.js +104 -98
- package/dist/esm/components/smart-table/utils.js.map +1 -1
- package/dist/esm/components/tabs/CTab.d.ts +4 -0
- package/dist/esm/components/tabs/CTab.js +1 -0
- package/dist/esm/components/tabs/CTab.js.map +1 -1
- package/dist/esm/components/toast/CToast.d.ts +1 -1
- package/dist/esm/components/toast/CToast.js +6 -3
- package/dist/esm/components/toast/CToast.js.map +1 -1
- package/dist/esm/components/toast/CToaster.js +1 -1
- package/dist/esm/components/toast/CToaster.js.map +1 -1
- package/dist/esm/utils/index.d.ts +2 -1
- package/dist/esm/utils/isEqual.d.ts +2 -0
- package/package.json +9 -9
- package/src/components/breadcrumb/CBreadcrumbItem.tsx +36 -21
- package/src/components/form/CFormSelect.tsx +1 -0
- package/src/components/grid/CRow.tsx +1 -1
- package/src/components/picker/CPicker.tsx +1 -0
- package/src/components/smart-table/CSmartTable.tsx +94 -71
- package/src/components/smart-table/CSmartTableBody.tsx +2 -1
- package/src/components/smart-table/CSmartTableHead.tsx +5 -2
- package/src/components/smart-table/CSmartTableInterface.tsx +5 -4
- package/src/components/smart-table/types.ts +5 -4
- package/src/components/smart-table/utils.ts +154 -123
- package/src/components/tabs/CTab.tsx +5 -0
- package/src/components/toast/CToast.tsx +7 -4
- package/src/components/toast/CToaster.tsx +1 -1
- package/src/utils/index.ts +2 -0
- 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
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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,
|
|
@@ -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
|
)
|
|
@@ -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,
|
|
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
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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(
|
|
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
|
-
|
|
154
|
-
|
|
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,
|
|
192
|
+
[columnFilterState, _items],
|
|
193
193
|
)
|
|
194
194
|
|
|
195
195
|
const filteredTable: Item[] = useMemo(
|
|
196
196
|
() => filterTable(filteredColumns, tableFilter, tableFilterState, itemsDataColumns),
|
|
197
|
-
[tableFilterState,
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
306
|
-
const
|
|
303
|
+
const existingColumnState = sorterState.find((x) => x.column === column)
|
|
304
|
+
const multiple = typeof columnSorter === 'object' && columnSorter.multiple
|
|
307
305
|
|
|
308
|
-
|
|
309
|
-
|
|
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
|
-
|
|
313
|
-
if (
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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
|
-
|
|
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
|
-
|
|
324
|
-
|
|
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
|
|
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) ||
|
|
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
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
* -
|
|
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
|
|
73
|
-
state
|
|
73
|
+
column: string
|
|
74
|
+
state: 'asc' | 'desc' | 0
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
export type TableFilter = {
|