@@ -82,9 +82,12 @@ export class StickyStyler {
82
82
}
83
83
}
84
84
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
+ } ) ;
88
91
}
89
92
90
93
/**
@@ -110,63 +113,61 @@ export class StickyStyler {
110
113
! ( stickyStartStates . some ( state => state ) || stickyEndStates . some ( state => state ) )
111
114
) {
112
115
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 : [ ] } ) ;
117
118
}
118
119
119
120
return ;
120
121
}
121
122
122
- this . _coalescedStyleScheduler . scheduleEarlyRead ( ( ) => {
123
+ // Coalesce with sticky row updates (and potentially other changes like column resize).
124
+ this . _coalescedStyleScheduler . schedule ( ( ) => {
123
125
const firstRow = rows [ 0 ] ;
124
126
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 ) ;
127
128
128
- const cellWidths = this . _getCellWidths ( firstRow , recalculateCellWidths ) ;
129
129
const startPositions = this . _getStickyStartColumnPositions ( cellWidths , stickyStartStates ) ;
130
130
const endPositions = this . _getStickyEndColumnPositions ( cellWidths , stickyEndStates ) ;
131
131
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 ) ;
147
144
}
148
- }
149
145
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
+ }
168
149
}
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
+ }
170
171
} ) ;
171
172
}
172
173
@@ -187,7 +188,9 @@ export class StickyStyler {
187
188
return ;
188
189
}
189
190
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 ( ( ) => {
191
194
// If positioning the rows to the bottom, reverse their order when evaluating the sticky
192
195
// position such that the last row stuck will be "bottom: 0px" and so on. Note that the
193
196
// sticky states need to be reversed as well.
@@ -216,33 +219,32 @@ export class StickyStyler {
216
219
}
217
220
218
221
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
- }
224
222
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 ;
230
226
}
231
227
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 ) ;
244
232
}
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
+ }
246
248
} ) ;
247
249
}
248
250
@@ -258,7 +260,7 @@ export class StickyStyler {
258
260
}
259
261
260
262
// Coalesce with other sticky updates (and potentially other changes like column resize).
261
- this . _coalescedStyleScheduler . scheduleWrite ( ( ) => {
263
+ this . _coalescedStyleScheduler . schedule ( ( ) => {
262
264
const tfoot = tableElement . querySelector ( 'tfoot' ) ! ;
263
265
264
266
if ( stickyStates . some ( state => ! state ) ) {
0 commit comments