@@ -82,9 +82,12 @@ export class StickyStyler {
8282 }
8383 }
8484
85- for ( const element of elementsToClear ) {
86- this . _removeStickyStyle ( element , stickyDirections ) ;
87- }
85+ // Coalesce with sticky row/column updates (and potentially other changes like column resize).
86+ this . _coalescedStyleScheduler . schedule ( ( ) => {
87+ for ( const element of elementsToClear ) {
88+ this . _removeStickyStyle ( element , stickyDirections ) ;
89+ }
90+ } ) ;
8891 }
8992
9093 /**
@@ -110,63 +113,61 @@ export class StickyStyler {
110113 ! ( stickyStartStates . some ( state => state ) || stickyEndStates . some ( state => state ) )
111114 ) {
112115 if ( this . _positionListener ) {
113- this . _coalescedStyleScheduler . scheduleWrite ( ( ) => {
114- this . _positionListener ! . stickyColumnsUpdated ( { sizes : [ ] } ) ;
115- this . _positionListener ! . stickyEndColumnsUpdated ( { sizes : [ ] } ) ;
116- } ) ;
116+ this . _positionListener . stickyColumnsUpdated ( { sizes : [ ] } ) ;
117+ this . _positionListener . stickyEndColumnsUpdated ( { sizes : [ ] } ) ;
117118 }
118119
119120 return ;
120121 }
121122
122- this . _coalescedStyleScheduler . scheduleEarlyRead ( ( ) => {
123+ // Coalesce with sticky row updates (and potentially other changes like column resize).
124+ this . _coalescedStyleScheduler . schedule ( ( ) => {
123125 const firstRow = rows [ 0 ] ;
124126 const numCells = firstRow . children . length ;
125- const lastStickyStart = stickyStartStates . lastIndexOf ( true ) ;
126- const firstStickyEnd = stickyEndStates . indexOf ( true ) ;
127+ const cellWidths : number [ ] = this . _getCellWidths ( firstRow , recalculateCellWidths ) ;
127128
128- const cellWidths = this . _getCellWidths ( firstRow , recalculateCellWidths ) ;
129129 const startPositions = this . _getStickyStartColumnPositions ( cellWidths , stickyStartStates ) ;
130130 const endPositions = this . _getStickyEndColumnPositions ( cellWidths , stickyEndStates ) ;
131131
132- this . _coalescedStyleScheduler . scheduleWrite ( ( ) => {
133- const isRtl = this . direction === 'rtl' ;
134- const start = isRtl ? 'right' : 'left' ;
135- const end = isRtl ? 'left' : 'right' ;
136-
137- for ( const row of rows ) {
138- for ( let i = 0 ; i < numCells ; i ++ ) {
139- const cell = row . children [ i ] as HTMLElement ;
140- if ( stickyStartStates [ i ] ) {
141- this . _addStickyStyle ( cell , start , startPositions ! [ i ] , i === lastStickyStart ) ;
142- }
143-
144- if ( stickyEndStates [ i ] ) {
145- this . _addStickyStyle ( cell , end , endPositions ! [ i ] , i === firstStickyEnd ) ;
146- }
132+ const lastStickyStart = stickyStartStates . lastIndexOf ( true ) ;
133+ const firstStickyEnd = stickyEndStates . indexOf ( true ) ;
134+
135+ const isRtl = this . direction === 'rtl' ;
136+ const start = isRtl ? 'right' : 'left' ;
137+ const end = isRtl ? 'left' : 'right' ;
138+
139+ for ( const row of rows ) {
140+ for ( let i = 0 ; i < numCells ; i ++ ) {
141+ const cell = row . children [ i ] as HTMLElement ;
142+ if ( stickyStartStates [ i ] ) {
143+ this . _addStickyStyle ( cell , start , startPositions [ i ] , i === lastStickyStart ) ;
147144 }
148- }
149145
150- if ( this . _positionListener ) {
151- this . _positionListener . stickyColumnsUpdated ( {
152- sizes :
153- lastStickyStart === - 1
154- ? [ ]
155- : cellWidths !
156- . slice ( 0 , lastStickyStart + 1 )
157- . map ( ( width , index ) => ( stickyStartStates [ index ] ? width : null ) ) ,
158- } ) ;
159- this . _positionListener . stickyEndColumnsUpdated ( {
160- sizes :
161- firstStickyEnd === - 1
162- ? [ ]
163- : cellWidths !
164- . slice ( firstStickyEnd )
165- . map ( ( width , index ) => ( stickyEndStates [ index + firstStickyEnd ] ? width : null ) )
166- . reverse ( ) ,
167- } ) ;
146+ if ( stickyEndStates [ i ] ) {
147+ this . _addStickyStyle ( cell , end , endPositions [ i ] , i === firstStickyEnd ) ;
148+ }
168149 }
169- } ) ;
150+ }
151+
152+ if ( this . _positionListener ) {
153+ this . _positionListener . stickyColumnsUpdated ( {
154+ sizes :
155+ lastStickyStart === - 1
156+ ? [ ]
157+ : cellWidths
158+ . slice ( 0 , lastStickyStart + 1 )
159+ . map ( ( width , index ) => ( stickyStartStates [ index ] ? width : null ) ) ,
160+ } ) ;
161+ this . _positionListener . stickyEndColumnsUpdated ( {
162+ sizes :
163+ firstStickyEnd === - 1
164+ ? [ ]
165+ : cellWidths
166+ . slice ( firstStickyEnd )
167+ . map ( ( width , index ) => ( stickyEndStates [ index + firstStickyEnd ] ? width : null ) )
168+ . reverse ( ) ,
169+ } ) ;
170+ }
170171 } ) ;
171172 }
172173
@@ -187,7 +188,9 @@ export class StickyStyler {
187188 return ;
188189 }
189190
190- this . _coalescedStyleScheduler . scheduleEarlyRead ( ( ) => {
191+ // Coalesce with other sticky row updates (top/bottom), sticky columns updates
192+ // (and potentially other changes like column resize).
193+ this . _coalescedStyleScheduler . schedule ( ( ) => {
191194 // If positioning the rows to the bottom, reverse their order when evaluating the sticky
192195 // position such that the last row stuck will be "bottom: 0px" and so on. Note that the
193196 // sticky states need to be reversed as well.
@@ -216,33 +219,32 @@ export class StickyStyler {
216219 }
217220
218221 const borderedRowIndex = states . lastIndexOf ( true ) ;
219- this . _coalescedStyleScheduler . scheduleWrite ( ( ) => {
220- for ( let rowIndex = 0 ; rowIndex < rows . length ; rowIndex ++ ) {
221- if ( ! states [ rowIndex ] ) {
222- continue ;
223- }
224222
225- const offset = stickyOffsets [ rowIndex ] ;
226- const isBorderedRowIndex = rowIndex === borderedRowIndex ;
227- for ( const element of elementsToStick [ rowIndex ] ) {
228- this . _addStickyStyle ( element , position , offset , isBorderedRowIndex ) ;
229- }
223+ for ( let rowIndex = 0 ; rowIndex < rows . length ; rowIndex ++ ) {
224+ if ( ! states [ rowIndex ] ) {
225+ continue ;
230226 }
231227
232- if ( position === 'top' ) {
233- this . _positionListener ?. stickyHeaderRowsUpdated ( {
234- sizes : stickyCellHeights ,
235- offsets : stickyOffsets ,
236- elements : elementsToStick ,
237- } ) ;
238- } else {
239- this . _positionListener ?. stickyFooterRowsUpdated ( {
240- sizes : stickyCellHeights ,
241- offsets : stickyOffsets ,
242- elements : elementsToStick ,
243- } ) ;
228+ const offset = stickyOffsets [ rowIndex ] ;
229+ const isBorderedRowIndex = rowIndex === borderedRowIndex ;
230+ for ( const element of elementsToStick [ rowIndex ] ) {
231+ this . _addStickyStyle ( element , position , offset , isBorderedRowIndex ) ;
244232 }
245- } ) ;
233+ }
234+
235+ if ( position === 'top' ) {
236+ this . _positionListener ?. stickyHeaderRowsUpdated ( {
237+ sizes : stickyCellHeights ,
238+ offsets : stickyOffsets ,
239+ elements : elementsToStick ,
240+ } ) ;
241+ } else {
242+ this . _positionListener ?. stickyFooterRowsUpdated ( {
243+ sizes : stickyCellHeights ,
244+ offsets : stickyOffsets ,
245+ elements : elementsToStick ,
246+ } ) ;
247+ }
246248 } ) ;
247249 }
248250
@@ -258,7 +260,7 @@ export class StickyStyler {
258260 }
259261
260262 // Coalesce with other sticky updates (and potentially other changes like column resize).
261- this . _coalescedStyleScheduler . scheduleWrite ( ( ) => {
263+ this . _coalescedStyleScheduler . schedule ( ( ) => {
262264 const tfoot = tableElement . querySelector ( 'tfoot' ) ! ;
263265
264266 if ( stickyStates . some ( state => ! state ) ) {
0 commit comments