1
- import React , { useState , useRef , useMemo } from 'react'
1
+ import React , { useState , useRef , useMemo , useEffect } from 'react'
2
2
import PropTypes from 'prop-types'
3
3
import classNames from 'classnames'
4
4
import CPagination from '../pagination/CPagination'
@@ -144,9 +144,12 @@ const CDataTable = props => {
144
144
}
145
145
state . asc = ! ( columnRepeated && state . asc )
146
146
setSorterState ( { ...state } )
147
- onSorterValueChange && onSorterValueChange ( sorterState )
148
147
}
149
148
149
+ useEffect ( ( ) => {
150
+ onSorterValueChange && onSorterValueChange ( sorterState )
151
+ } , [ JSON . stringify ( sorterState ) ] )
152
+
150
153
const paginationChange = e => {
151
154
onPaginationChange && onPaginationChange ( Number ( e . target . value ) )
152
155
! itemsPerPageSelect . external && setPerPageItems ( Number ( e . target . value ) )
@@ -159,18 +162,24 @@ const CDataTable = props => {
159
162
}
160
163
const newState = { ...columnFilterState , [ `${ colName } ` ] : value }
161
164
setColumnFilterState ( newState )
162
- onColumnFilterChange && onColumnFilterChange ( newState )
163
165
}
164
166
167
+ useEffect ( ( ) => {
168
+ onColumnFilterChange && onColumnFilterChange ( columnFilterState )
169
+ } , [ JSON . stringify ( columnFilterState ) ] )
170
+
165
171
const tableFilterChange = ( value , type ) => {
166
172
const isLazy = tableFilter && tableFilter . lazy === true
167
173
if ( isLazy && type === 'input' || ! isLazy && type === 'change' ) {
168
174
return
169
175
}
170
176
setTableFilterState ( value )
171
- onTableFilterChange && onTableFilterChange ( value )
172
177
}
173
178
179
+ useEffect ( ( ) => {
180
+ onTableFilterChange && onTableFilterChange ( tableFilterState )
181
+ } , [ tableFilterState ] )
182
+
174
183
const getClickedColumnName = ( e , detailsClick ) => {
175
184
if ( detailsClick ) {
176
185
return 'details'
@@ -239,11 +248,10 @@ const CDataTable = props => {
239
248
tableFilterState ,
240
249
JSON . stringify ( tableFilter )
241
250
] )
242
-
251
+
243
252
const sortedItems = useMemo ( ( ) => {
244
253
const col = sorterState . column
245
- if ( ! col || ! itemsDataColumns . includes ( col ) || sorter . external ) {
246
- onFilteredItemsChange && onFilteredItemsChange ( tableFiltered )
254
+ if ( ! col || ! itemsDataColumns . includes ( col ) || ( sorter && sorter . external ) ) {
247
255
return tableFiltered
248
256
}
249
257
//if values in column are to be sorted by numeric value they all have to be type number
@@ -255,14 +263,17 @@ const CDataTable = props => {
255
263
const b = typeof value2 === 'number' ? value2 : String ( value2 ) . toLowerCase ( )
256
264
return a > b ? 1 * flip : b > a ? - 1 * flip : 0
257
265
} )
258
- ! compData . firstRun && onFilteredItemsChange && onFilteredItemsChange ( tableFiltered )
259
266
return sorted
260
267
} , [
261
268
JSON . stringify ( tableFiltered ) ,
262
269
JSON . stringify ( sorterState ) ,
263
270
JSON . stringify ( sorter )
264
271
] )
265
272
273
+ useEffect ( ( ) => {
274
+ ! compData . firstRun && onFilteredItemsChange && onFilteredItemsChange ( sortedItems )
275
+ } , [ JSON . stringify ( sortedItems ) ] )
276
+
266
277
const tableClasses = [
267
278
'table' ,
268
279
{
0 commit comments