@@ -11,6 +11,7 @@ import isUndefined from 'lodash.isundefined';
1111import merge from 'lodash.merge' ;
1212import PropTypes from 'prop-types' ;
1313import React from 'react' ;
14+ import { flushSync } from 'react-dom' ;
1415import DefaultTableBody from './components/TableBody' ;
1516import DefaultTableFilter from './components/TableFilter' ;
1617import DefaultTableFilterList from './components/TableFilterList' ;
@@ -1227,113 +1228,119 @@ class MUIDataTable extends React.Component {
12271228 }
12281229
12291230 toggleSortColumn = index => {
1230- this . setState (
1231- prevState => {
1232- let columns = cloneDeep ( prevState . columns ) ;
1233- let data = prevState . data ;
1234- let newOrder = columns [ index ] . sortDescFirst ? 'desc' : 'asc' ; // default
1235-
1236- let sequenceOrder = [ 'asc' , 'desc' ] ;
1237- if ( columns [ index ] . sortDescFirst ) {
1238- sequenceOrder = [ 'desc' , 'asc' ] ;
1239- }
1240- if ( columns [ index ] . sortThirdClickReset ) {
1241- sequenceOrder . push ( 'none' ) ;
1242- }
1231+ flushSync ( ( ) => {
1232+ this . setState (
1233+ prevState => {
1234+ let columns = cloneDeep ( prevState . columns ) ;
1235+ let data = prevState . data ;
1236+ let newOrder = columns [ index ] . sortDescFirst ? 'desc' : 'asc' ; // default
12431237
1244- if ( columns [ index ] . name === this . state . sortOrder . name ) {
1245- let pos = sequenceOrder . indexOf ( this . state . sortOrder . direction ) ;
1246- if ( pos !== - 1 ) {
1247- pos ++ ;
1248- if ( pos >= sequenceOrder . length ) pos = 0 ;
1249- newOrder = sequenceOrder [ pos ] ;
1238+ let sequenceOrder = [ 'asc' , 'desc' ] ;
1239+ if ( columns [ index ] . sortDescFirst ) {
1240+ sequenceOrder = [ 'desc' , 'asc' ] ;
1241+ }
1242+ if ( columns [ index ] . sortThirdClickReset ) {
1243+ sequenceOrder . push ( 'none' ) ;
12501244 }
1251- }
12521245
1253- const newSortOrder = {
1254- name : columns [ index ] . name ,
1255- direction : newOrder ,
1256- } ;
1246+ if ( columns [ index ] . name === this . state . sortOrder . name ) {
1247+ let pos = sequenceOrder . indexOf ( this . state . sortOrder . direction ) ;
1248+ if ( pos !== - 1 ) {
1249+ pos ++ ;
1250+ if ( pos >= sequenceOrder . length ) pos = 0 ;
1251+ newOrder = sequenceOrder [ pos ] ;
1252+ }
1253+ }
12571254
1258- const orderLabel = this . getSortDirectionLabel ( newSortOrder ) ;
1259- const announceText = `Table now sorted by ${ columns [ index ] . name } : ${ orderLabel } ` ;
1255+ const newSortOrder = {
1256+ name : columns [ index ] . name ,
1257+ direction : newOrder ,
1258+ } ;
12601259
1261- let newState = {
1262- columns : columns ,
1263- announceText : announceText ,
1264- activeColumn : index ,
1265- } ;
1260+ const orderLabel = this . getSortDirectionLabel ( newSortOrder ) ;
1261+ const announceText = `Table now sorted by ${ columns [ index ] . name } : ${ orderLabel } ` ;
12661262
1267- if ( this . options . serverSide ) {
1268- newState = {
1269- ...newState ,
1270- data : prevState . data ,
1271- displayData : prevState . displayData ,
1272- selectedRows : prevState . selectedRows ,
1273- sortOrder : newSortOrder ,
1263+ let newState = {
1264+ columns : columns ,
1265+ announceText : announceText ,
1266+ activeColumn : index ,
12741267 } ;
1275- } else {
1276- const sortedData = this . sortTable ( data , index , newOrder , columns [ index ] . sortCompare ) ;
1277-
1278- newState = {
1279- ...newState ,
1280- data : sortedData . data ,
1281- displayData : this . getDisplayData (
1282- columns ,
1283- sortedData . data ,
1284- prevState . filterList ,
1285- prevState . searchText ,
1286- null ,
1287- this . props ,
1288- ) ,
1289- selectedRows : sortedData . selectedRows ,
1290- sortOrder : newSortOrder ,
1291- previousSelectedRow : null ,
1292- } ;
1293- }
12941268
1295- return newState ;
1296- } ,
1297- ( ) => {
1298- this . setTableAction ( 'sort' ) ;
1269+ if ( this . options . serverSide ) {
1270+ newState = {
1271+ ...newState ,
1272+ data : prevState . data ,
1273+ displayData : prevState . displayData ,
1274+ selectedRows : prevState . selectedRows ,
1275+ sortOrder : newSortOrder ,
1276+ } ;
1277+ } else {
1278+ const sortedData = this . sortTable ( data , index , newOrder , columns [ index ] . sortCompare ) ;
1279+
1280+ newState = {
1281+ ...newState ,
1282+ data : sortedData . data ,
1283+ displayData : this . getDisplayData (
1284+ columns ,
1285+ sortedData . data ,
1286+ prevState . filterList ,
1287+ prevState . searchText ,
1288+ null ,
1289+ this . props ,
1290+ ) ,
1291+ selectedRows : sortedData . selectedRows ,
1292+ sortOrder : newSortOrder ,
1293+ previousSelectedRow : null ,
1294+ } ;
1295+ }
12991296
1300- if ( this . options . onColumnSortChange ) {
1301- this . options . onColumnSortChange ( this . state . sortOrder . name , this . state . sortOrder . direction ) ;
1302- }
1303- } ,
1304- ) ;
1297+ return newState ;
1298+ } ,
1299+ ( ) => {
1300+ this . setTableAction ( 'sort' ) ;
1301+
1302+ if ( this . options . onColumnSortChange ) {
1303+ this . options . onColumnSortChange ( this . state . sortOrder . name , this . state . sortOrder . direction ) ;
1304+ }
1305+ } ,
1306+ ) ;
1307+ } ) ;
13051308 } ;
13061309
13071310 changeRowsPerPage = rows => {
13081311 const rowCount = this . options . count || this . state . displayData . length ;
13091312
1310- this . setState (
1311- ( ) => ( {
1312- rowsPerPage : rows ,
1313- page : getPageValue ( rowCount , rows , this . state . page ) ,
1314- } ) ,
1315- ( ) => {
1316- this . setTableAction ( 'changeRowsPerPage' ) ;
1313+ flushSync ( ( ) => {
1314+ this . setState (
1315+ ( ) => ( {
1316+ rowsPerPage : rows ,
1317+ page : getPageValue ( rowCount , rows , this . state . page ) ,
1318+ } ) ,
1319+ ( ) => {
1320+ this . setTableAction ( 'changeRowsPerPage' ) ;
13171321
1318- if ( this . options . onChangeRowsPerPage ) {
1319- this . options . onChangeRowsPerPage ( this . state . rowsPerPage ) ;
1320- }
1321- } ,
1322- ) ;
1322+ if ( this . options . onChangeRowsPerPage ) {
1323+ this . options . onChangeRowsPerPage ( this . state . rowsPerPage ) ;
1324+ }
1325+ } ,
1326+ ) ;
1327+ } ) ;
13231328 } ;
13241329
13251330 changePage = page => {
1326- this . setState (
1327- ( ) => ( {
1328- page : page ,
1329- } ) ,
1330- ( ) => {
1331- this . setTableAction ( 'changePage' ) ;
1332- if ( this . options . onChangePage ) {
1333- this . options . onChangePage ( this . state . page ) ;
1334- }
1335- } ,
1336- ) ;
1331+ flushSync ( ( ) => {
1332+ this . setState (
1333+ ( ) => ( {
1334+ page : page ,
1335+ } ) ,
1336+ ( ) => {
1337+ this . setTableAction ( 'changePage' ) ;
1338+ if ( this . options . onChangePage ) {
1339+ this . options . onChangePage ( this . state . page ) ;
1340+ }
1341+ } ,
1342+ ) ;
1343+ } ) ;
13371344 } ;
13381345
13391346 searchClose = ( ) => {
0 commit comments