@@ -160,108 +160,153 @@ export function checkColumnPopupPosition(gridElement, selector) {
160
160
161
161
export function enableColumnResizing ( gridElement ) {
162
162
const columns = [ ] ;
163
- let min = 75 ;
164
- let headerBeingResized ;
165
- let resizeHandle ;
166
-
167
163
const headers = gridElement . querySelectorAll ( '.column-header.resizable' ) ;
168
164
169
165
if ( headers . length === 0 ) {
170
166
return ;
171
167
}
172
168
173
- headers . forEach ( header => {
169
+ const isRTL = getComputedStyle ( gridElement ) . direction === 'rtl' ;
170
+ const isGrid = gridElement . classList . contains ( 'grid' )
171
+
172
+ let tableHeight = gridElement . offsetHeight ;
173
+ if ( tableHeight < 70 ) {
174
+ //get the aria rowcount attribute
175
+ const rowCount = gridElement . getAttribute ( 'aria-rowcount' ) ;
176
+ if ( rowCount ) {
177
+ const rowHeight = gridElement . querySelector ( 'thead tr th' ) . offsetHeight ;
178
+ // and multiply by the itemsize (== height of the header cells)
179
+ tableHeight = rowCount * rowHeight ;
180
+ }
181
+ }
182
+
183
+ headers . forEach ( ( header ) => {
174
184
columns . push ( {
175
185
header,
176
- size : `minmax( ${ minWidth } px,auto) ` ,
186
+ size : `${ header . clientWidth } px` ,
177
187
} ) ;
178
188
179
- const onPointerMove = ( e ) => requestAnimationFrame ( ( ) => {
180
- if ( ! headerBeingResized ) {
181
- return ;
182
- }
183
- gridElement . style . tableLayout = "fixed" ;
189
+ const div = createDiv ( tableHeight , isRTL ) ;
190
+ header . appendChild ( div ) ;
191
+ header . style . position = 'relative' ;
192
+ setListeners ( div , isRTL ) ;
193
+ } ) ;
184
194
185
- const horizontalScrollOffset = document . documentElement . scrollLeft ;
186
- let width ;
195
+ let initialWidths ;
196
+ if ( gridElement . style . gridTemplateColumns ) {
197
+ initialWidths = gridElement . style . gridTemplateColumns ;
198
+ } else {
199
+ initialWidths = columns . map ( ( { size } ) => size ) . join ( ' ' ) ;
187
200
188
- if ( document . body . dir === '' || document . body . dir === 'ltr' ) {
189
- width = ( horizontalScrollOffset + e . clientX ) - headerBeingResized . getClientRects ( ) [ 0 ] . x ;
190
- }
191
- else {
192
- width = headerBeingResized . getClientRects ( ) [ 0 ] . x + headerBeingResized . clientWidth - ( horizontalScrollOffset + e . clientX ) ;
193
- }
201
+ if ( isGrid ) {
202
+ gridElement . style . gridTemplateColumns = initialWidths ;
203
+ }
204
+ }
194
205
195
- const column = columns . find ( ( { header } ) => header === headerBeingResized ) ;
196
- column . size = Math . max ( minWidth , width ) + 'px' ;
206
+ const id = gridElement . id ;
207
+ grids . push ( {
208
+ id,
209
+ columns,
210
+ initialWidths,
211
+ } ) ;
197
212
198
- columns . forEach ( ( column ) => {
199
- if ( column . size . startsWith ( 'minmax' ) ) {
200
- column . size = parseInt ( column . header . clientWidth , 10 ) + 'px' ;
201
- }
202
- } ) ;
213
+ function setListeners ( div , isRTL ) {
214
+ let pageX , curCol , curColWidth ;
215
+
216
+ div . addEventListener ( 'pointerdown' , function ( e ) {
217
+ curCol = e . target . parentElement ;
218
+ pageX = e . pageX ;
219
+
220
+ const padding = paddingDiff ( curCol ) ;
203
221
204
- gridElement . style . gridTemplateColumns = columns
205
- . map ( ( { size } ) => size )
206
- . join ( ' ' ) ;
222
+ curColWidth = curCol . offsetWidth - padding ;
207
223
} ) ;
208
224
209
- const onPointerUp = ( e ) => {
225
+ div . addEventListener ( 'pointerover' , function ( e ) {
226
+ e . target . style . borderInlineEnd = '2px solid var(--neutral-stroke-focus)' ;
227
+ } ) ;
210
228
211
- window . removeEventListener ( 'pointermove' , onPointerMove ) ;
212
- window . removeEventListener ( 'pointerup' , onPointerUp ) ;
213
- window . removeEventListener ( 'pointercancel' , onPointerUp ) ;
214
- window . removeEventListener ( 'pointerleave' , onPointerUp ) ;
229
+ div . addEventListener ( 'pointerup' , removeBorder ) ;
230
+ div . addEventListener ( 'pointercancel' , removeBorder ) ;
231
+ div . addEventListener ( 'pointerleave' , removeBorder ) ;
215
232
216
- headerBeingResized . classList . remove ( 'header-being-resized' ) ;
217
- headerBeingResized = null ;
233
+ document . addEventListener ( 'pointermove' , ( e ) =>
234
+ requestAnimationFrame ( ( ) => {
235
+ gridElement . style . tableLayout = 'fixed' ;
218
236
219
- if ( e . target . hasPointerCapture ( e . pointerId ) ) {
220
- e . target . releasePointerCapture ( e . pointerId ) ;
221
- }
222
- } ;
237
+ if ( curCol ) {
238
+ const diffX = isRTL ? pageX - e . pageX : e . pageX - pageX ;
239
+ const column = columns . find ( ( { header } ) => header === curCol ) ;
223
240
224
- const initResize = ( { target, pointerId } ) => {
225
- headerBeingResized = target . parentNode ;
226
- headerBeingResized . classList . add ( 'header-being-resized' ) ;
241
+ column . size = parseInt ( Math . max ( minWidth , curColWidth + diffX ) , 10 ) + 'px' ;
227
242
243
+ columns . forEach ( ( col ) => {
244
+ if ( col . size . startsWith ( 'minmax' ) ) {
245
+ col . size = parseInt ( col . header . clientWidth , 10 ) + 'px' ;
246
+ }
247
+ } ) ;
228
248
229
- window . addEventListener ( 'pointermove' , onPointerMove ) ;
230
- window . addEventListener ( 'pointerup' , onPointerUp ) ;
231
- window . addEventListener ( 'pointercancel' , onPointerUp ) ;
232
- window . addEventListener ( 'pointerleave' , onPointerUp ) ;
249
+ if ( isGrid ) {
250
+ gridElement . style . gridTemplateColumns = columns
251
+ . map ( ( { size } ) => size )
252
+ . join ( ' ' ) ;
253
+ }
254
+ else {
255
+ curCol . style . width = column . size ;
256
+ }
257
+ }
258
+ } )
259
+ ) ;
233
260
234
- if ( resizeHandle ) {
235
- resizeHandle . setPointerCapture ( pointerId ) ;
236
- }
237
- } ;
261
+ document . addEventListener ( 'pointerup' , function ( ) {
262
+ curCol = undefined ;
263
+ curColWidth = undefined ;
264
+ pageX = undefined ;
265
+ } ) ;
266
+ }
238
267
239
- header . querySelector ( '.resize-handle' ) . addEventListener ( 'pointerdown' , initResize ) ;
268
+ function createDiv ( height , isRTL ) {
269
+ const div = document . createElement ( 'div' ) ;
270
+ div . style . top = '5px' ;
271
+ div . style . position = 'absolute' ;
272
+ div . style . cursor = 'col-resize' ;
273
+ div . style . userSelect = 'none' ;
274
+ div . style . height = height + 'px' ;
275
+ div . style . width = '5px' ;
276
+
277
+ if ( isRTL ) {
278
+ div . style . left = '0px' ;
279
+ div . style . right = 'unset' ;
280
+ } else {
281
+ div . style . left = 'unset' ;
282
+ div . style . right = '0px' ;
283
+ }
284
+ return div ;
285
+ }
240
286
241
- } ) ;
287
+ function paddingDiff ( col ) {
288
+ if ( getStyleVal ( col , 'box-sizing' ) === 'border-box' ) {
289
+ return 0 ;
290
+ }
242
291
243
- let initialWidths ;
244
- if ( gridElement . style . gridTemplateColumns ) {
245
- initialWidths = gridElement . style . gridTemplateColumns ;
292
+ const padLeft = getStyleVal ( col , 'padding-left' ) ;
293
+ const padRight = getStyleVal ( col , 'padding-right' ) ;
294
+ return parseInt ( padLeft ) + parseInt ( padRight ) ;
246
295
}
247
- else {
248
- initialWidths = columns
249
- . map ( ( { header, size } ) => size )
250
- . join ( ' ' ) ;
251
296
252
- gridElement . style . gridTemplateColumns = initialWidths ;
297
+ function getStyleVal ( elm , css ) {
298
+ return window . getComputedStyle ( elm , null ) . getPropertyValue ( css ) ;
253
299
}
254
300
255
- let id = gridElement . id ;
256
- grids . push ( {
257
- id,
258
- columns,
259
- initialWidths
260
- } ) ;
301
+ function removeBorder ( e ) {
302
+ e . target . style . borderInlineEnd = '' ;
303
+ }
261
304
}
262
305
263
- export function resetColumnWidths ( gridElement ) {
264
306
307
+
308
+ export function resetColumnWidths ( gridElement ) {
309
+ const isGrid = gridElement . classList . contains ( 'grid' ) ;
265
310
const grid = grids . find ( ( { id } ) => id === gridElement . id ) ;
266
311
if ( ! grid ) {
267
312
return ;
@@ -270,11 +315,19 @@ export function resetColumnWidths(gridElement) {
270
315
const columnsWidths = grid . initialWidths . split ( ' ' ) ;
271
316
272
317
grid . columns . forEach ( ( column , index ) => {
273
- column . size = columnsWidths [ index ] ;
318
+ if ( isGrid ) {
319
+ column . size = columnsWidths [ index ] ;
320
+ } else {
321
+ column . header . style . width = columnsWidths [ index ] ;
322
+ }
274
323
} ) ;
275
324
276
- gridElement . style . gridTemplateColumns = grid . initialWidths ;
277
- gridElement . dispatchEvent ( new CustomEvent ( 'closecolumnresize' , { bubbles : true } ) ) ;
325
+ if ( isGrid ) {
326
+ gridElement . style . gridTemplateColumns = grid . initialWidths ;
327
+ }
328
+ gridElement . dispatchEvent (
329
+ new CustomEvent ( 'closecolumnresize' , { bubbles : true } )
330
+ ) ;
278
331
gridElement . focus ( ) ;
279
332
}
280
333
@@ -308,7 +361,7 @@ export function resizeColumnDiscrete(gridElement, column, change) {
308
361
}
309
362
else {
310
363
if ( column . size . startsWith ( 'minmax' ) ) {
311
- column . size = parseInt ( column . header . clientWidth , 10 ) + 'px' ;
364
+ column . size = parseInt ( column . header . clientWidth , 10 ) + 'px' ;
312
365
}
313
366
}
314
367
columns . push ( column . size ) ;
0 commit comments