@vaadin/grid 25.3.0-alpha7 → 25.3.0-alpha9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -214,11 +214,7 @@ export const ColumnAutoWidthMixin = (superClass) =>
214
214
  }
215
215
  });
216
216
 
217
- if (autoWidth) {
218
- this.$.scroller.setAttribute('measuring-auto-width', '');
219
- } else {
220
- this.$.scroller.removeAttribute('measuring-auto-width');
221
- }
217
+ this.$.scroller.toggleAttribute('measuring-auto-width', autoWidth);
222
218
  }
223
219
 
224
220
  /**
@@ -311,10 +307,9 @@ export const ColumnAutoWidthMixin = (superClass) =>
311
307
  // of the virtualizer update loop, ensuring the grid eventually reaches a stable state.
312
308
  const hasRowsWithUndefinedIndex = [...this.$.items.children].some((row) => row.index === undefined);
313
309
 
314
- const debouncingHiddenChanged = this._debouncerHiddenChanged && this._debouncerHiddenChanged.isActive();
310
+ const debouncingHiddenChanged = this._debouncerHiddenChanged?.isActive();
315
311
 
316
- const debouncingUpdateFrozenColumn =
317
- this.__debounceUpdateFrozenColumn && this.__debounceUpdateFrozenColumn.isActive();
312
+ const debouncingUpdateFrozenColumn = this.__debounceUpdateFrozenColumn?.isActive();
318
313
 
319
314
  // When using a percentage-based height, the grid's effective height may
320
315
  // be 0 until the resize observer in grid-mixin calculates a min-height.
@@ -57,7 +57,7 @@ export const GridColumnGroupMixin = (superClass) =>
57
57
  '_groupFrozenChanged(frozen, _rootColumns)',
58
58
  '_groupFrozenToEndChanged(frozenToEnd, _rootColumns)',
59
59
  '_groupHiddenChanged(hidden)',
60
- '_colSpanChanged(_colSpan, _headerCell, _footerCell)',
60
+ '_colSpanChanged(_colSpan)',
61
61
  '_groupOrderChanged(_order, _rootColumns)',
62
62
  '_groupReorderStatusChanged(_reorderStatus, _rootColumns)',
63
63
  '_groupResizableChanged(resizable, _rootColumns)',
@@ -74,9 +74,7 @@ export const GridColumnGroupMixin = (superClass) =>
74
74
  /** @protected */
75
75
  disconnectedCallback() {
76
76
  super.disconnectedCallback();
77
- if (this._observer) {
78
- this._observer.disconnect();
79
- }
77
+ this._observer?.disconnect();
80
78
  }
81
79
 
82
80
  /**
@@ -307,19 +305,8 @@ export const GridColumnGroupMixin = (superClass) =>
307
305
  }
308
306
 
309
307
  /** @private */
310
- _colSpanChanged(colSpan, headerCell, footerCell) {
311
- if (headerCell) {
312
- headerCell.setAttribute('colspan', colSpan);
313
- if (this._grid) {
314
- this._grid.__a11yUpdateCellColspan(headerCell, colSpan);
315
- }
316
- }
317
- if (footerCell) {
318
- footerCell.setAttribute('colspan', colSpan);
319
- if (this._grid) {
320
- this._grid.__a11yUpdateCellColspan(footerCell, colSpan);
321
- }
322
- }
308
+ _colSpanChanged() {
309
+ this._grid?.__scheduleRenderHeaderFooter?.();
323
310
  }
324
311
 
325
312
  /**
@@ -344,9 +331,7 @@ export const GridColumnGroupMixin = (superClass) =>
344
331
  this._preventHiddenSynchronization = false;
345
332
 
346
333
  // Update the column tree
347
- if (this._grid && this._grid._debounceUpdateColumnTree) {
348
- this._grid._debounceUpdateColumnTree();
349
- }
334
+ this._grid?._debounceUpdateColumnTree?.();
350
335
  });
351
336
  this._observer.flush();
352
337
  }
@@ -12,7 +12,7 @@ export type GridBodyRenderer<TItem, Column extends GridColumnMixin<TItem, Column
12
12
  model: GridItemModel<TItem>,
13
13
  ) => void;
14
14
 
15
- export type GridColumnTextAlign = 'center' | 'end' | 'start' | null;
15
+ export type GridColumnTextAlign = 'center' | 'end' | 'left' | 'right' | 'start' | null;
16
16
 
17
17
  export type GridHeaderFooterRenderer<TItem, Column extends ColumnBaseMixinClass<TItem, Column>> = (
18
18
  root: HTMLElement,
@@ -71,8 +71,8 @@ export declare class ColumnBaseMixinClass<TItem, Column extends ColumnBaseMixinC
71
71
 
72
72
  /**
73
73
  * Aligns the columns cell content horizontally.
74
- * Supported values: "start", "center" and "end".
75
- * @attr {start|center|end} text-align
74
+ *
75
+ * @attr {start|center|end|left|right} text-align
76
76
  */
77
77
  textAlign: GridColumnTextAlign | null | undefined;
78
78
 
@@ -93,8 +93,8 @@ export const ColumnBaseMixin = (superClass) =>
93
93
 
94
94
  /**
95
95
  * Aligns the columns cell content horizontally.
96
- * Supported values: "start", "center" and "end".
97
- * @attr {start|center|end} text-align
96
+ *
97
+ * @attr {start|center|end|left|right} text-align
98
98
  */
99
99
  textAlign: {
100
100
  type: String,
@@ -261,11 +261,11 @@ export const ColumnBaseMixin = (superClass) =>
261
261
 
262
262
  static get observers() {
263
263
  return [
264
- '_widthChanged(width, _headerCell, _footerCell, _cells)',
264
+ '_widthChanged(width, _cells)',
265
265
  '_frozenChanged(frozen, _headerCell, _footerCell, _cells)',
266
266
  '_frozenToEndChanged(frozenToEnd, _headerCell, _footerCell, _cells)',
267
- '_flexGrowChanged(flexGrow, _headerCell, _footerCell, _cells)',
268
- '_textAlignChanged(textAlign, _cells, _headerCell, _footerCell)',
267
+ '_flexGrowChanged(flexGrow, _cells)',
268
+ '_textAlignChanged(textAlign, _cells)',
269
269
  '_lastFrozenChanged(_lastFrozen)',
270
270
  '_firstFrozenToEndChanged(_firstFrozenToEnd)',
271
271
  '_onRendererOrBindingChanged(_renderer, _cells, _bodyContentHidden, path)',
@@ -275,7 +275,7 @@ export const ColumnBaseMixin = (superClass) =>
275
275
  '_reorderStatusChanged(_reorderStatus, _headerCell, _footerCell, _cells)',
276
276
  '_hiddenChanged(hidden, _headerCell, _footerCell, _cells)',
277
277
  '_rowHeaderChanged(rowHeader, _cells)',
278
- '__headerFooterPartNameChanged(_headerCell, _footerCell, headerPartName, footerPartName)',
278
+ '__headerFooterPartNameChanged(headerPartName, footerPartName)',
279
279
  ];
280
280
  }
281
281
 
@@ -347,9 +347,7 @@ export const ColumnBaseMixin = (superClass) =>
347
347
  }
348
348
 
349
349
  this._cells?.forEach((cell) => {
350
- if (cell._content.parentNode) {
351
- cell._content.parentNode.removeChild(cell._content);
352
- }
350
+ cell._content.parentNode?.removeChild(cell._content);
353
351
  });
354
352
  });
355
353
 
@@ -378,46 +376,40 @@ export const ColumnBaseMixin = (superClass) =>
378
376
 
379
377
  /** @private */
380
378
  _flexGrowChanged(flexGrow) {
381
- if (this.parentElement && this.parentElement._columnPropChanged) {
382
- this.parentElement._columnPropChanged('flexGrow');
383
- }
379
+ this.parentElement?._columnPropChanged?.('flexGrow');
384
380
 
385
- this._allCells.forEach((cell) => {
381
+ this._grid?.__scheduleRenderHeaderFooter?.();
382
+
383
+ this._cells?.forEach((cell) => {
386
384
  cell.style.flexGrow = flexGrow;
387
385
  });
388
386
  }
389
387
 
390
388
  /** @private */
391
389
  _widthChanged(width) {
392
- if (this.parentElement && this.parentElement._columnPropChanged) {
393
- this.parentElement._columnPropChanged('width');
394
- }
390
+ this.parentElement?._columnPropChanged?.('width');
395
391
 
396
- this._allCells.forEach((cell) => {
392
+ this._grid?.__scheduleRenderHeaderFooter?.();
393
+
394
+ this._cells?.forEach((cell) => {
397
395
  cell.style.width = width;
398
396
  });
399
397
  }
400
398
 
401
399
  /** @private */
402
400
  _frozenChanged(frozen) {
403
- if (this.parentElement && this.parentElement._columnPropChanged) {
404
- this.parentElement._columnPropChanged('frozen', frozen);
405
- }
401
+ this.parentElement?._columnPropChanged?.('frozen', frozen);
406
402
 
407
403
  this._allCells.forEach((cell) => {
408
404
  updateCellState(cell, 'frozen', frozen);
409
405
  });
410
406
 
411
- if (this._grid && this._grid._frozenCellsChanged) {
412
- this._grid._frozenCellsChanged();
413
- }
407
+ this._grid?._frozenCellsChanged?.();
414
408
  }
415
409
 
416
410
  /** @private */
417
411
  _frozenToEndChanged(frozenToEnd) {
418
- if (this.parentElement && this.parentElement._columnPropChanged) {
419
- this.parentElement._columnPropChanged('frozenToEnd', frozenToEnd);
420
- }
412
+ this.parentElement?._columnPropChanged?.('frozenToEnd', frozenToEnd);
421
413
 
422
414
  this._allCells.forEach((cell) => {
423
415
  // Skip sizer cells to keep correct scrollWidth.
@@ -428,9 +420,7 @@ export const ColumnBaseMixin = (superClass) =>
428
420
  updateCellState(cell, 'frozen-to-end', frozenToEnd);
429
421
  });
430
422
 
431
- if (this._grid && this._grid._frozenCellsChanged) {
432
- this._grid._frozenCellsChanged();
433
- }
423
+ this._grid?._frozenCellsChanged?.();
434
424
  }
435
425
 
436
426
  /** @private */
@@ -462,11 +452,7 @@ export const ColumnBaseMixin = (superClass) =>
462
452
 
463
453
  /** @private */
464
454
  _rowHeaderChanged(rowHeader, cells) {
465
- if (!cells) {
466
- return;
467
- }
468
-
469
- cells.forEach((cell) => {
455
+ cells?.forEach((cell) => {
470
456
  cell.setAttribute('role', rowHeader ? 'rowheader' : 'gridcell');
471
457
  });
472
458
  }
@@ -500,59 +486,46 @@ export const ColumnBaseMixin = (superClass) =>
500
486
 
501
487
  /** @private */
502
488
  _resizableChanged(resizable) {
503
- if (resizable === undefined || this._grid === undefined) {
489
+ if (resizable === undefined) {
504
490
  return;
505
491
  }
506
492
 
507
- this._grid.__scheduleRenderHeaderFooter?.();
493
+ this._grid?.__scheduleRenderHeaderFooter?.();
508
494
  }
509
495
 
510
496
  /** @private */
511
497
  _textAlignChanged(textAlign) {
512
- if (textAlign === undefined || this._grid === undefined) {
513
- return;
514
- }
515
- if (['start', 'end', 'center'].indexOf(textAlign) === -1) {
516
- console.warn('textAlign can only be set as "start", "end" or "center"');
498
+ if (textAlign === undefined) {
517
499
  return;
518
500
  }
519
501
 
520
- this._allCells.forEach((cell) => {
502
+ this._grid?.__scheduleRenderHeaderFooter?.();
503
+
504
+ this._cells?.forEach((cell) => {
521
505
  cell._content.style.textAlign = textAlign;
522
506
  });
523
507
  }
524
508
 
525
509
  /** @private */
526
510
  _hiddenChanged(hidden) {
527
- if (this.parentElement && this.parentElement._columnPropChanged) {
528
- this.parentElement._columnPropChanged('hidden', hidden);
529
- }
511
+ this.parentElement?._columnPropChanged?.('hidden', hidden);
530
512
 
531
513
  if (!!hidden !== !!this._previousHidden && this._grid) {
532
514
  if (hidden === true) {
533
515
  this._cells?.forEach((cell) => {
534
- if (cell._content.parentNode) {
535
- cell._content.parentNode.removeChild(cell._content);
536
- }
516
+ cell._content.parentNode?.removeChild(cell._content);
537
517
  });
538
518
  }
539
519
  this._grid._debouncerHiddenChanged = Debouncer.debounce(
540
520
  this._grid._debouncerHiddenChanged,
541
521
  animationFrame,
542
522
  () => {
543
- if (this._grid && this._grid._renderColumnTree) {
544
- this._grid._renderColumnTree(this._grid._columnTree);
545
- }
523
+ this._grid?._renderColumnTree?.(this._grid._columnTree);
546
524
  },
547
525
  );
548
526
 
549
- if (this._grid._debounceUpdateFrozenColumn) {
550
- this._grid._debounceUpdateFrozenColumn();
551
- }
552
-
553
- if (this._grid._resetKeyboardNavigation) {
554
- this._grid._resetKeyboardNavigation();
555
- }
527
+ this._grid._debounceUpdateFrozenColumn?.();
528
+ this._grid._resetKeyboardNavigation?.();
556
529
  }
557
530
  this._previousHidden = hidden;
558
531
  }
@@ -632,7 +605,7 @@ export const ColumnBaseMixin = (superClass) =>
632
605
 
633
606
  this.__renderCellsContent(headerRenderer, [headerCell]);
634
607
 
635
- this._grid?.__scheduleRenderHeaderFooter();
608
+ this._grid?.__scheduleRenderHeaderFooter?.();
636
609
  }
637
610
 
638
611
  /** @protected */
@@ -641,19 +614,8 @@ export const ColumnBaseMixin = (superClass) =>
641
614
  }
642
615
 
643
616
  /** @private */
644
- __headerFooterPartNameChanged(headerCell, footerCell, headerPartName, footerPartName) {
645
- [
646
- { cell: headerCell, partName: headerPartName },
647
- { cell: footerCell, partName: footerPartName },
648
- ].forEach(({ cell, partName }) => {
649
- if (cell) {
650
- const customParts = cell.__customParts || [];
651
- cell.part.remove(...customParts);
652
-
653
- cell.__customParts = partName ? partName.trim().split(' ') : [];
654
- cell.part.add(...cell.__customParts);
655
- }
656
- });
617
+ __headerFooterPartNameChanged() {
618
+ this._grid?.__scheduleRenderHeaderFooter?.();
657
619
  }
658
620
 
659
621
  /**
@@ -688,7 +650,7 @@ export const ColumnBaseMixin = (superClass) =>
688
650
 
689
651
  this.__renderCellsContent(footerRenderer, [footerCell]);
690
652
 
691
- this._grid?.__scheduleRenderHeaderFooter();
653
+ this._grid?.__scheduleRenderHeaderFooter?.();
692
654
  }
693
655
 
694
656
  /** @protected */
@@ -457,9 +457,12 @@ export const ColumnReorderingMixin = (superClass) =>
457
457
  }
458
458
  });
459
459
 
460
+ [...this.$.items.children, this.$.sizer].forEach((row) => {
461
+ this._updateFirstAndLastColumnForRow(row);
462
+ });
463
+
460
464
  this.__scheduleRenderHeaderFooter();
461
465
  this._debounceUpdateFrozenColumn();
462
- this._updateFirstAndLastColumn();
463
466
  }
464
467
 
465
468
  /**
@@ -98,6 +98,10 @@ export const ColumnResizingMixin = (superClass) =>
98
98
  cell._column.flexGrow = 0;
99
99
  });
100
100
 
101
+ // Flush the scheduled header/footer render to apply the new widths
102
+ // to the cells before measuring the layout below
103
+ this.__renderHeaderFooterDebouncer?.flush();
104
+
101
105
  const cellFrozenToEnd = this._frozenToEndCells[0];
102
106
 
103
107
  // When handle moves below the cell frozen to end, scroll into view.
@@ -214,7 +214,7 @@ export const DataProviderMixin = (superClass) =>
214
214
  * @protected
215
215
  */
216
216
  _isExpanded(item) {
217
- return this.__expandedKeys && this.__expandedKeys.has(this.getItemId(item));
217
+ return this.__expandedKeys?.has(this.getItemId(item));
218
218
  }
219
219
 
220
220
  /**
@@ -4,6 +4,7 @@
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import { isChrome, isSafari } from '@vaadin/component-base/src/browser-utils.js';
7
+ import { setOrRemoveAttribute } from '@vaadin/component-base/src/dom-utils.js';
7
8
  import {
8
9
  getBodyRowCells,
9
10
  iterateChildren,
@@ -494,11 +495,7 @@ export const DragAndDropMixin = (superClass) =>
494
495
  const draggableAttribute = isChrome ? 'draggable-source' : 'draggable';
495
496
 
496
497
  iterateRowCells(row, (cell) => {
497
- if (dragDisabled) {
498
- cell._content.removeAttribute(draggableAttribute);
499
- } else {
500
- cell._content.setAttribute(draggableAttribute, true);
501
- }
498
+ setOrRemoveAttribute(cell._content, draggableAttribute, !dragDisabled);
502
499
  });
503
500
 
504
501
  updateBooleanRowStates(row, {
@@ -143,11 +143,6 @@ export const DynamicColumnsMixin = (superClass) =>
143
143
  });
144
144
  }
145
145
 
146
- /** @protected */
147
- _updateFirstAndLastColumn() {
148
- Array.from(this.shadowRoot.querySelectorAll('tr')).forEach((row) => this._updateFirstAndLastColumnForRow(row));
149
- }
150
-
151
146
  /**
152
147
  * @param {!HTMLElement} row
153
148
  * @protected
@@ -37,7 +37,7 @@ export const GridFilterColumnMixin = (superClass) =>
37
37
  */
38
38
  _defaultHeaderRenderer(root, _column) {
39
39
  let filter = root.firstElementChild;
40
- let textField = filter ? filter.firstElementChild : undefined;
40
+ let textField = filter?.firstElementChild;
41
41
 
42
42
  if (!filter) {
43
43
  filter = document.createElement('vaadin-grid-filter');
@@ -71,8 +71,6 @@ export const GridFilterElementMixin = (superClass) =>
71
71
  }
72
72
 
73
73
  focus() {
74
- if (this._textField) {
75
- this._textField.focus();
76
- }
74
+ this._textField?.focus();
77
75
  }
78
76
  };
@@ -37,6 +37,7 @@ import { GridFilterElementMixin } from './vaadin-grid-filter-element-mixin.js';
37
37
  *
38
38
  * @fires {CustomEvent} value-changed - Fired when the `value` property changes.
39
39
  *
40
+ * @attr {string} theme - The theme variants to apply to the component.
40
41
  * @customElement vaadin-grid-filter
41
42
  * @extends HTMLElement
42
43
  */