@progress/kendo-angular-grid 19.3.0-develop.3 → 19.3.0-develop.30

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.
Files changed (101) hide show
  1. package/columns/columns-container.d.ts +2 -0
  2. package/common/data-layout-mode.d.ts +19 -0
  3. package/common/provider.service.d.ts +2 -0
  4. package/common/stacked-layout-settings.d.ts +24 -0
  5. package/data/data-mapping.service.d.ts +3 -1
  6. package/directives.d.ts +7 -4
  7. package/editing-directives/editing-directive-base.d.ts +3 -0
  8. package/esm2022/adaptiveness/adaptive-renderer.component.mjs +1 -2
  9. package/esm2022/column-menu/column-list.component.mjs +10 -10
  10. package/esm2022/column-menu/column-menu.component.mjs +1 -1
  11. package/esm2022/columns/column-base.mjs +4 -4
  12. package/esm2022/columns/column.component.mjs +1 -1
  13. package/esm2022/columns/columns-container.mjs +3 -0
  14. package/esm2022/common/column-info.service.mjs +1 -1
  15. package/esm2022/common/data-layout-mode.mjs +5 -0
  16. package/esm2022/common/provider.service.mjs +1 -0
  17. package/esm2022/common/stacked-layout-settings.mjs +5 -0
  18. package/esm2022/common/toolbar-tool-base.directive.mjs +3 -2
  19. package/esm2022/data/data-mapping.service.mjs +14 -3
  20. package/esm2022/directives.mjs +8 -1
  21. package/esm2022/editing/form/form-formfield.component.mjs +2 -2
  22. package/esm2022/editing-directives/editing-directive-base.mjs +17 -2
  23. package/esm2022/editing-directives/in-cell-editing.directive.mjs +3 -1
  24. package/esm2022/filtering/cell/boolean-filter-cell.component.mjs +1 -1
  25. package/esm2022/filtering/cell/date-filter-cell.component.mjs +1 -1
  26. package/esm2022/filtering/cell/filter-cell-operators.component.mjs +1 -2
  27. package/esm2022/filtering/cell/numeric-filter-cell.component.mjs +1 -1
  28. package/esm2022/filtering/cell/string-filter-cell.component.mjs +1 -1
  29. package/esm2022/filtering/filter-row.component.mjs +6 -3
  30. package/esm2022/filtering/menu/boolean-filter-menu.component.mjs +1 -2
  31. package/esm2022/filtering/menu/date-filter-menu-input.component.mjs +1 -1
  32. package/esm2022/filtering/menu/date-filter-menu.component.mjs +1 -1
  33. package/esm2022/filtering/menu/filter-menu-input-wrapper.component.mjs +1 -1
  34. package/esm2022/filtering/menu/filter-menu.component.mjs +1 -1
  35. package/esm2022/filtering/menu/numeric-filter-menu-input.component.mjs +1 -1
  36. package/esm2022/filtering/menu/numeric-filter-menu.component.mjs +1 -1
  37. package/esm2022/filtering/menu/string-filter-menu-input.component.mjs +1 -1
  38. package/esm2022/filtering/menu/string-filter-menu.component.mjs +1 -1
  39. package/esm2022/grid.component.mjs +190 -39
  40. package/esm2022/grid.module.mjs +103 -100
  41. package/esm2022/grouping/group-header.component.mjs +39 -4
  42. package/esm2022/grouping/group-panel.component.mjs +7 -3
  43. package/esm2022/highlight/highlight-item.mjs +5 -0
  44. package/esm2022/highlight/highlight.directive.mjs +132 -0
  45. package/esm2022/index.mjs +4 -0
  46. package/esm2022/localization/messages.mjs +57 -3
  47. package/esm2022/navigation/default-focusable-element.mjs +14 -2
  48. package/esm2022/navigation/focusable.directive.mjs +1 -1
  49. package/esm2022/navigation/navigation-cursor.mjs +7 -1
  50. package/esm2022/navigation/navigation-metadata.mjs +3 -1
  51. package/esm2022/navigation/navigation.service.mjs +136 -5
  52. package/esm2022/navigation/toolbar-tool-name.mjs +2 -1
  53. package/esm2022/package-metadata.mjs +2 -2
  54. package/esm2022/pdf/export-element.mjs +14 -5
  55. package/esm2022/pdf/pdf.component.mjs +3 -1
  56. package/esm2022/rendering/cell.component.mjs +466 -188
  57. package/esm2022/rendering/common/col-group.component.mjs +20 -7
  58. package/esm2022/rendering/footer/footer.component.mjs +117 -54
  59. package/esm2022/rendering/header/header.component.mjs +5 -2
  60. package/esm2022/rendering/list.component.mjs +14 -9
  61. package/esm2022/rendering/table-body.component.mjs +388 -171
  62. package/esm2022/rendering/toolbar/tools/ai-assistant/ai-assistant.component.mjs +290 -0
  63. package/esm2022/rendering/toolbar/tools/ai-assistant/ai-tool.directive.mjs +269 -0
  64. package/esm2022/rendering/toolbar/tools/ai-assistant/utils.mjs +47 -0
  65. package/esm2022/rendering/toolbar/tools/select-all-command-tool.directive.mjs +93 -0
  66. package/esm2022/row-reordering/row-reorder.service.mjs +2 -2
  67. package/esm2022/row-reordering/utils.mjs +6 -4
  68. package/esm2022/selection/cell-selection.service.mjs +6 -3
  69. package/esm2022/selection/pair-set.mjs +87 -10
  70. package/esm2022/utils.mjs +0 -4
  71. package/fesm2022/progress-kendo-angular-grid.mjs +2460 -599
  72. package/filtering/filter-row.component.d.ts +1 -0
  73. package/grid.component.d.ts +29 -1
  74. package/grid.module.d.ts +102 -99
  75. package/grouping/group-header.component.d.ts +1 -0
  76. package/highlight/highlight-item.d.ts +17 -0
  77. package/highlight/highlight.directive.d.ts +56 -0
  78. package/index.d.ts +7 -0
  79. package/localization/messages.d.ts +39 -3
  80. package/navigation/default-focusable-element.d.ts +3 -1
  81. package/navigation/focus-group.d.ts +1 -1
  82. package/navigation/navigation-metadata.d.ts +2 -1
  83. package/navigation/navigation.service.d.ts +6 -0
  84. package/navigation/toolbar-tool-name.d.ts +1 -0
  85. package/package.json +22 -21
  86. package/rendering/cell.component.d.ts +30 -15
  87. package/rendering/common/col-group.component.d.ts +5 -0
  88. package/rendering/footer/footer.component.d.ts +4 -1
  89. package/rendering/header/header.component.d.ts +1 -0
  90. package/rendering/list.component.d.ts +4 -1
  91. package/rendering/table-body.component.d.ts +3 -1
  92. package/rendering/toolbar/tools/ai-assistant/ai-assistant.component.d.ts +50 -0
  93. package/rendering/toolbar/tools/ai-assistant/ai-tool.directive.d.ts +119 -0
  94. package/rendering/toolbar/tools/ai-assistant/utils.d.ts +110 -0
  95. package/rendering/toolbar/tools/select-all-command-tool.directive.d.ts +36 -0
  96. package/row-reordering/row-reorder.service.d.ts +1 -1
  97. package/row-reordering/utils.d.ts +1 -1
  98. package/schematics/ngAdd/index.js +4 -4
  99. package/selection/cell-selection.service.d.ts +1 -0
  100. package/selection/pair-set.d.ts +36 -8
  101. package/utils.d.ts +0 -4
@@ -11,7 +11,7 @@ import { isChanged, isPresent } from '../utils';
11
11
  import { NoRecordsTemplateDirective } from './no-records-template.directive';
12
12
  import { EditService } from '../editing/edit.service';
13
13
  import { columnsSpan, columnsToRender } from "../columns/column-common";
14
- import { closest, closestInScope, hasClasses, isFocusableWithTabKey, matchesClasses, matchesNodeName } from './common/dom-queries';
14
+ import { closest, closestInScope, findElement, hasClasses, isFocusableWithTabKey, matchesClasses, matchesNodeName } from './common/dom-queries';
15
15
  import { DomEventsService } from '../common/dom-events.service';
16
16
  import { SelectionService } from "../selection/selection.service";
17
17
  import { ColumnInfoService } from "../common/column-info.service";
@@ -134,8 +134,8 @@ export class TableBodyComponent {
134
134
  allColumnsCount += column.colspan - 1;
135
135
  }
136
136
  });
137
- const contentColumnsCount = this.totalColumnsCount - this.lockedColumnsCount - allColumnsCount;
138
- const headerFooterColumnsCount = this.totalColumnsCount - this.lockedColumnsCount - allColumns.length;
137
+ const contentColumnsCount = this.totalColumnsCount - (this.isStackedMode ? 0 : this.lockedColumnsCount) - allColumnsCount;
138
+ const headerFooterColumnsCount = this.totalColumnsCount - (this.isStackedMode ? 0 : this.lockedColumnsCount) - allColumns.length;
139
139
  return item && item.type === 'data' ? contentColumnsCount : headerFooterColumnsCount;
140
140
  }
141
141
  isAriaSelected(item, column) {
@@ -206,10 +206,10 @@ export class TableBodyComponent {
206
206
  }
207
207
  logicalRowIndex(rowIndex) {
208
208
  let pos = this.skip + rowIndex;
209
- if (this.hasDetailTemplate) {
209
+ if (this.hasDetailTemplate && !this.isStackedMode) {
210
210
  pos *= 2;
211
211
  }
212
- const absoluteRowIndex = 1 + pos;
212
+ const absoluteRowIndex = this.isStackedMode ? pos : 1 + pos;
213
213
  const addRowOffset = this.editService.hasNewItem ? 1 : 0;
214
214
  const filterRowOffset = hasFilterRow(this.filterable) ? 1 : 0;
215
215
  const headerRowCount = this.columnInfoService.totalLevels + filterRowOffset + addRowOffset;
@@ -272,6 +272,9 @@ export class TableBodyComponent {
272
272
  isEditingRow(index) {
273
273
  return this.editService.isEditing() && this.editService.hasEdited(index);
274
274
  }
275
+ get isStackedMode() {
276
+ return this.ctx.grid?.isStacked;
277
+ }
275
278
  get hasGroupHeaderColumn() {
276
279
  return this.columnsContainer.hasGroupHeaderColumn;
277
280
  }
@@ -315,7 +318,8 @@ export class TableBodyComponent {
315
318
  if (!selectionEnabled) {
316
319
  return;
317
320
  }
318
- const isCellFocused = closest(target, matchesNodeName('td'))?.classList.contains('k-focus');
321
+ const cellComparer = this.isStackedMode ? closest(target, matchesNodeName('td')) : closest(target, (el) => { matchesNodeName('td') && hasClasses(el, 'k-grid-stack-content'); });
322
+ const isCellFocused = cellComparer?.classList.contains('k-focus');
319
323
  const isShiftOrCtrlPressed = eventArg.shiftKey || eventArg.ctrlKey || eventArg.metaKey;
320
324
  if (isCellFocused && !isShiftOrCtrlPressed) {
321
325
  eventArg.preventDefault();
@@ -327,7 +331,7 @@ export class TableBodyComponent {
327
331
  if (!gridTbody) {
328
332
  return;
329
333
  }
330
- const cell = closest(currentTarget, (el) => {
334
+ let cell = closest(currentTarget, (el) => {
331
335
  if (!matchesNodeName('td')(el)) {
332
336
  return false;
333
337
  }
@@ -345,11 +349,30 @@ export class TableBodyComponent {
345
349
  if (cell && !hasClasses(cell, NON_DATA_CELL_CLASSES) &&
346
350
  !hasClasses(row, NON_DATA_ROW_CLASSES) &&
347
351
  body === element && !gridElement) {
352
+ const isCellTarget = hasClasses(currentTarget, 'k-grid-stack-cell');
353
+ if (this.isStackedMode) {
354
+ cell = closest(currentTarget, (el) => {
355
+ if (!closestInScope(target, matchesClasses('k-grid-stack-row'), cell)) {
356
+ return false;
357
+ }
358
+ const parentRow = isCellTarget ? currentTarget : el.parentElement;
359
+ return (parentRow && hasClasses(parentRow, 'k-grid-stack-cell'));
360
+ });
361
+ if (isCellTarget) {
362
+ cell = findElement(currentTarget, (el) => hasClasses(el, 'k-grid-stack-content'));
363
+ }
364
+ if (cell) {
365
+ row = cell.parentElement.parentElement;
366
+ }
367
+ }
348
368
  this.editService.preventCellClose();
349
- const focusable = target !== cell && isFocusableWithTabKey(target, false);
350
- if (!focusable && !matchesNodeName('label')(target) && !hasClasses(target, IGNORE_TARGET_CLASSSES) &&
351
- !closestInScope(target, matchesClasses(IGNORE_CONTAINER_CLASSES), cell)) {
369
+ const focusable = (!isCellTarget && target !== cell) && isFocusableWithTabKey(target, false);
370
+ const ignoreContainer = isCellTarget ? true : !closestInScope(target, matchesClasses(IGNORE_CONTAINER_CLASSES), cell);
371
+ if (!focusable && !matchesNodeName('label')(target) && !hasClasses(target, IGNORE_TARGET_CLASSSES) && ignoreContainer) {
352
372
  const args = this.cellClickArgs(cell, row, eventArg);
373
+ if (!args) {
374
+ return;
375
+ }
353
376
  if (selectionEnabled && !this.isRowSelectable({ index: args.rowIndex, dataItem: args.dataItem })) {
354
377
  return;
355
378
  }
@@ -380,15 +403,19 @@ export class TableBodyComponent {
380
403
  }));
381
404
  }
382
405
  cellKeydownHandler(args) {
383
- if (args.keyCode === Keys.Enter || args.keyCode === Keys.Space) {
406
+ if (args.keyCode === Keys.Enter || args.keyCode === Keys.Space || (this.navigationService.tableCellEntered && args.keyCode === Keys.F2)) {
384
407
  this.clickHandler(args);
385
408
  }
386
409
  }
387
410
  cellClickArgs(cell, row, eventArg) {
388
- const index = columnCellIndex(cell, row.cells);
411
+ const cells = this.isStackedMode ? row.querySelectorAll('.k-grid-stack-cell > .k-grid-stack-content') : row.cells;
412
+ const index = columnCellIndex(cell, cells);
413
+ if (!isPresent(index)) {
414
+ return;
415
+ }
389
416
  const column = this.columns.toArray()[index];
390
- const columnIndex = this.lockedColumnsCount + index;
391
- let rowIndex = row.getAttribute('data-kendo-grid-item-index');
417
+ const columnIndex = (this.isStackedMode ? 0 : this.lockedColumnsCount) + index;
418
+ let rowIndex = (this.isStackedMode ? row.parentElement.parentElement : row).getAttribute('data-kendo-grid-item-index');
392
419
  rowIndex = rowIndex ? parseInt(rowIndex, 10) : -1;
393
420
  const dataItem = rowIndex === -1 ? this.editService.newDataItem : this.rowsToRender.find(item => +item.index === rowIndex && item.type === 'data')?.data;
394
421
  const isEditedColumn = this.editService.isEditedColumn(rowIndex, column);
@@ -441,7 +468,7 @@ export class TableBodyComponent {
441
468
  <tr class="k-grid-add-row k-grid-edit-row k-master-row"
442
469
  kendoGridLogicalRow
443
470
  [logicalRowIndex]="addRowLogicalIndex()"
444
- [logicalSlaveRow]="lockedColumnsCount > 0"
471
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
445
472
  [logicalCellsCount]="columns.length"
446
473
  [logicalSlaveCellsCount]="unlockedColumnsCount()"
447
474
  [totalColumns]="totalColumns">
@@ -449,32 +476,48 @@ export class TableBodyComponent {
449
476
  <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups" role="presentation"></td>
450
477
  </ng-container>
451
478
  <td class="k-hierarchy-cell k-table-td"
452
- *ngIf="detailTemplate?.templateRef"
479
+ *ngIf="detailTemplate?.templateRef && !isStackedMode"
453
480
  kendoGridLogicalCell
454
481
  [logicalRowIndex]="addRowLogicalIndex()"
455
482
  [logicalColIndex]="0"
456
483
  aria-selected="false"
457
484
  >
458
485
  </td>
459
- <td *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;"
460
- class="k-table-td"
461
- kendoGridCell
462
- [rowIndex]="-1"
463
- [columnIndex]="lockedColumnsCount + columnIndex"
464
- [isNew]="true"
465
- [column]="column"
466
- [dataItem]="newDataItem"
467
- [class.k-grid-content-sticky]="column.sticky"
468
- [ngClass]="column.cssClass"
469
- [style.left]="column.sticky ? '0' : undefined"
470
- [ngStyle]="column.sticky ? addStickyColumnStyles(column) : column.style"
471
- [attr.colspan]="column.colspan"
472
- [attr.role]="column.tableCellsRole"
473
- kendoGridLogicalCell
474
- [logicalRowIndex]="addRowLogicalIndex()"
475
- [logicalColIndex]="logicalColIndex(column)"
476
- [colSpan]="column.colspan">
477
- </td>
486
+ <ng-container *ngIf="isStackedMode; else columnsTemplate">
487
+ <td *ngFor="let item of rowsToRender; trackBy: trackByWrapper; let rowIndex = index;"
488
+ class="k-table-td"
489
+ kendoGridCell
490
+ [rowIndex]="-1"
491
+ [columnIndex]="0"
492
+ [isNew]="true"
493
+ [columns]="allColumns"
494
+ [dataItem]="newDataItem"
495
+ kendoGridLogicalCell
496
+ [logicalRowIndex]="addRowLogicalIndex()"
497
+ [logicalColIndex]="0">
498
+ </td>
499
+ </ng-container>
500
+ <ng-template #columnsTemplate>
501
+ <td *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;"
502
+ class="k-table-td"
503
+ kendoGridCell
504
+ [rowIndex]="-1"
505
+ [columnIndex]="lockedColumnsCount + columnIndex"
506
+ [isNew]="true"
507
+ [column]="column"
508
+ [dataItem]="newDataItem"
509
+ [class.k-grid-content-sticky]="column.sticky"
510
+ [ngClass]="column.cssClass"
511
+ [style.left]="column.sticky ? '0' : undefined"
512
+ [ngStyle]="column.sticky ? addStickyColumnStyles(column) : column.style"
513
+ [attr.colspan]="column.colspan"
514
+ [attr.role]="column.tableCellsRole"
515
+ kendoGridLogicalCell
516
+ [logicalRowIndex]="addRowLogicalIndex()"
517
+ [logicalColIndex]="logicalColIndex(column)"
518
+ [colSpan]="column.colspan">
519
+ </td>
520
+ </ng-template>
478
521
  </tr>
479
522
  </ng-container>
480
523
  <tr *ngIf="!rowsToRender?.length" class="k-grid-norecords" role="row">
@@ -504,7 +547,7 @@ export class TableBodyComponent {
504
547
  [totalColumnsCount]="totalColumnsCount"
505
548
  kendoGridLogicalRow
506
549
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
507
- [logicalSlaveRow]="lockedColumnsCount > 0"
550
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
508
551
  [totalColumns]="totalColumns"
509
552
  [logicalCellsCount]="columns.length"
510
553
  [logicalSlaveCellsCount]="groupHeaderSlaveCellsCount">
@@ -514,7 +557,7 @@ export class TableBodyComponent {
514
557
  [dataRowIndex]="$any(item).index"
515
558
  [dataItem]="item.data"
516
559
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
517
- [logicalSlaveRow]="lockedColumnsCount > 0"
560
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
518
561
  [totalColumns]="totalColumns"
519
562
  [logicalCellsCount]="columns.length"
520
563
  [logicalSlaveCellsCount]="unlockedColumnsCount(item)"
@@ -522,16 +565,17 @@ export class TableBodyComponent {
522
565
  [class.k-grid-row-sticky]="rowSticky ? rowSticky({ dataItem: item.data, index: $any(item).index }) : false"
523
566
  [ngClass]="rowClass({ dataItem: item.data, index: $any(item).index })"
524
567
  [class.k-master-row]="true"
525
- [class.k-expanded]="item.isExpanded"
568
+ [class.k-expanded]="item.isExpanded && !isStackedMode"
526
569
  [class.k-grid-edit-row]="isEditingRow($any(item).index)"
527
- [attr.aria-selected]="lockedColumnsCount < 1 ? isSelectable({ dataItem: item.data, index: $any(item).index }) && isRowSelected(item) : undefined"
570
+ [attr.aria-selected]="(lockedColumnsCount < 1 || isStackedMode) ? isSelectable({ dataItem: item.data, index: $any(item).index }) && isRowSelected(item) : undefined"
528
571
  [attr.data-kendo-grid-item-index]="$any(item).index"
529
- [class.k-selected]="isSelectable({ dataItem: item.data, index: $any(item).index }) && isRowSelected(item)">
572
+ [class.k-selected]="isSelectable({ dataItem: item.data, index: $any(item).index }) && isRowSelected(item)"
573
+ [class.k-highlighted]="item.isHighlighted">
530
574
  <ng-container *ngIf="!skipGroupDecoration">
531
575
  <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups" role="presentation"></td>
532
576
  </ng-container>
533
577
  <td class="k-hierarchy-cell k-table-td"
534
- *ngIf="detailTemplate?.templateRef"
578
+ *ngIf="detailTemplate?.templateRef && !isStackedMode"
535
579
  kendoGridLogicalCell
536
580
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
537
581
  [logicalColIndex]="0"
@@ -550,18 +594,42 @@ export class TableBodyComponent {
550
594
  [svgIcon]="detailButtonSvgIcon(item)"></kendo-icon-wrapper>
551
595
  </a>
552
596
  </td>
553
- <ng-container *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;">
554
- <td *ngIf="!item.cells?.[lockedColumnsCount + columnIndex]?.skip"
555
- kendoGridCell
597
+ <ng-container *ngIf="isStackedMode; else columnsTemplate">
598
+ <td kendoGridCell
599
+ [rowIndex]="$any(item).index"
600
+ [detailTemplate]="detailTemplate"
601
+ [item]="item"
602
+ [columnIndex]="0"
603
+ [attr.data-kendo-grid-column-index]="0"
604
+ [columns]="columns"
605
+ [dataItem]="item.data"
606
+ [isLoading]="isLoading"
607
+ [isVirtual]="isVirtual"
608
+ [loadingTemplate]="cellLoadingTemplate"
609
+ kendoGridLogicalCell
610
+ [logicalRowIndex]="logicalRowIndex(rowIndex)"
611
+ [logicalColIndex]="0"
612
+ [dataRowIndex]="$any(item).index"
613
+ [dataItem]="item.data"
614
+ [colIndex]="0"
615
+ class="k-table-td"
616
+ [class.k-touch-action-none]="isSelectable({ dataItem: item.data, index: $any(item).index }) && $any(selectable).drag">
617
+ </td>
618
+ </ng-container>
619
+ <ng-template #columnsTemplate>
620
+ <ng-container *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;">
621
+ <td *ngIf="!item.cells?.[lockedColumnsCount + columnIndex]?.skip"
622
+ kendoGridCell
556
623
  [rowIndex]="$any(item).index"
557
624
  [columnIndex]="lockedColumnsCount + columnIndex"
558
625
  [attr.data-kendo-grid-column-index]="lockedColumnsCount + columnIndex"
559
626
  [column]="column"
627
+ [columns]="allColumns"
560
628
  [dataItem]="item.data"
561
629
  [isLoading]="isLoading"
562
630
  [isVirtual]="isVirtual"
563
631
  [loadingTemplate]="cellLoadingTemplate"
564
- kendoGridLogicalCell
632
+ kendoGridLogicalCell
565
633
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
566
634
  [logicalColIndex]="logicalColIndex(column)"
567
635
  [dataRowIndex]="$any(item).index"
@@ -574,49 +642,75 @@ export class TableBodyComponent {
574
642
  [attr.aria-selected]="lockedColumnsCount < 1 && isSelectable({ dataItem: item.data, index: $any(item).index }) ? isAriaSelected(item, column) : undefined"
575
643
  [class.k-grid-content-sticky]="column.sticky"
576
644
  [class.k-touch-action-none]="isSelectable({ dataItem: item.data, index: $any(item).index }) && $any(selectable).drag"
577
- [ngClass]="column.cssClass"
578
- [class.k-grid-edit-cell]="isEditingCell($any(item).index, column)"
579
- [ngStyle]="column.sticky ? addStickyColumnStyles(column) : column.style"
580
- [attr.colspan]="column.colspan"
581
- [class.k-selected]="isSelectable && cellSelectionService.isCellSelected(item, column)">
582
- </td>
583
- </ng-container>
645
+ [ngClass]="column.cssClass"
646
+ [class.k-grid-edit-cell]="isEditingCell($any(item).index, column)"
647
+ [ngStyle]="column.sticky ? addStickyColumnStyles(column) : column.style"
648
+ [attr.colspan]="column.colspan"
649
+ [class.k-selected]="isSelectable && cellSelectionService.isCellSelected(item, column)"
650
+ [class.k-highlighted]="item.cells[lockedColumnsCount + columnIndex]?.isHighlighted">
651
+ </td>
652
+ </ng-container>
653
+ </ng-template>
584
654
  </tr>
585
655
  <tr *ngIf="item.showDetailRow"
586
656
  class="k-detail-row"
587
657
  kendoGridLogicalRow
588
658
  [dataRowIndex]="$any(item).index"
589
659
  [dataItem]="item.data"
590
- [logicalRowIndex]="logicalRowIndex(rowIndex) + 1"
660
+ [logicalRowIndex]="isStackedMode ? logicalRowIndex(rowIndex) : logicalRowIndex(rowIndex) + 1"
591
661
  [logicalSlaveRow]="false"
592
662
  [logicalCellsCount]="1">
593
- <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups"></td>
594
- <td class="k-hierarchy-cell k-table-td"></td>
595
- <td class="k-detail-cell k-table-td"
596
- [attr.colspan]="columnsSpan"
597
- kendoGridLogicalCell
598
- [logicalRowIndex]="logicalRowIndex(rowIndex) + 1"
599
- [logicalColIndex]="0"
600
- [dataRowIndex]="$any(item).index"
601
- [dataItem]="item.data"
602
- [colIndex]="0"
603
- [colSpan]="allColumnsSpan + 1"
604
- role="gridcell" aria-selected="false">
605
- <ng-template
606
- [ngTemplateOutlet]="detailTemplate.templateRef"
607
- [ngTemplateOutletContext]="{
608
- dataItem: item.data,
609
- rowIndex: $any(item).index,
610
- $implicit: item.data
611
- }">
612
- </ng-template>
613
- </td>
663
+ <ng-container *ngIf="!isStackedMode">
664
+ <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups"></td>
665
+ <td class="k-hierarchy-cell k-table-td"></td>
666
+ <td class="k-detail-cell k-table-td"
667
+ [attr.colspan]="columnsSpan"
668
+ kendoGridLogicalCell
669
+ [logicalRowIndex]="logicalRowIndex(rowIndex) + 1"
670
+ [logicalColIndex]="0"
671
+ [dataRowIndex]="$any(item).index"
672
+ [dataItem]="item.data"
673
+ [colIndex]="0"
674
+ [colSpan]="allColumnsSpan + 1"
675
+ role="gridcell" aria-selected="false">
676
+ <ng-template
677
+ [ngTemplateOutlet]="detailTemplate.templateRef"
678
+ [ngTemplateOutletContext]="{
679
+ dataItem: item.data,
680
+ rowIndex: $any(item).index,
681
+ $implicit: item.data
682
+ }">
683
+ </ng-template>
684
+ </td>
685
+ </ng-container>
686
+ <ng-container *ngIf="isStackedMode">
687
+ <td class="k-detail-cell k-table-td"
688
+ [attr.colspan]="columnsSpan"
689
+ kendoGridLogicalCell
690
+ [logicalRowIndex]="logicalRowIndex(rowIndex)"
691
+ [logicalColIndex]="0"
692
+ [dataRowIndex]="$any(item).index"
693
+ [dataItem]="item.data"
694
+ [colIndex]="0"
695
+ [colSpan]="allColumnsSpan + 1"
696
+ role="gridcell"
697
+ aria-selected="false">
698
+ <ng-template
699
+ [ngTemplateOutlet]="detailTemplate.templateRef"
700
+ [ngTemplateOutletContext]="{
701
+ dataItem: item.data,
702
+ rowIndex: $any(item).index,
703
+ $implicit: item.data
704
+ }">
705
+ </ng-template>
706
+ </td>
707
+ </ng-container>
614
708
  </tr>
615
709
  <tr *ngIf="item.type === 'footer'"
616
710
  class="k-group-footer"
617
711
  kendoGridLogicalRow
618
712
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
619
- [logicalSlaveRow]="lockedColumnsCount > 0"
713
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
620
714
  [totalColumns]="totalColumns"
621
715
  [logicalCellsCount]="columns.length"
622
716
  [logicalSlaveCellsCount]="unlockedColumnsCount(item)">
@@ -624,33 +718,61 @@ export class TableBodyComponent {
624
718
  <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups"></td>
625
719
  </ng-container>
626
720
  <td class="k-hierarchy-cell k-table-td"
627
- *ngIf="detailTemplate?.templateRef"
721
+ *ngIf="detailTemplate?.templateRef && !isStackedMode"
628
722
  kendoGridLogicalCell
629
723
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
630
724
  [logicalColIndex]="0"
631
725
  aria-selected="false">
632
726
  </td>
633
- <td kendoGridLogicalCell
727
+
728
+ <ng-container *ngIf="!isStackedMode">
729
+ <td kendoGridLogicalCell
730
+ [logicalRowIndex]="logicalRowIndex(rowIndex)"
731
+ [logicalColIndex]="logicalColIndex(column)"
732
+ [attr.data-skip]="skipGroupDecoration"
733
+ class="k-table-td"
734
+ *ngFor="let column of footerColumns; let columnIndex = index; trackBy: trackByColumns;">
735
+ <ng-template
736
+ [templateContext]="{
737
+ templateRef: $any(column).groupFooterTemplateRef,
738
+ group: $any(item.data),
739
+ field: $any(column).field,
740
+ column: column,
741
+ aggregates: $any(item.data)?.aggregates,
742
+ $implicit: $any(item.data)?.aggregates
743
+ }">
744
+ </ng-template>
745
+ </td>
746
+ </ng-container>
747
+
748
+ <ng-container *ngIf="isStackedMode">
749
+ <td kendoGridLogicalCell
634
750
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
635
- [logicalColIndex]="logicalColIndex(column)"
636
- [attr.data-skip]="skipGroupDecoration"
637
- class="k-table-td"
638
- *ngFor="let column of footerColumns; let columnIndex = index; trackBy: trackByColumns;">
639
- <ng-template
640
- [templateContext]="{
641
- templateRef: $any(column).groupFooterTemplateRef,
642
- group: $any(item.data),
643
- field: $any(column).field,
644
- column: column,
645
- aggregates: $any(item.data)?.aggregates,
646
- $implicit: $any(item.data)?.aggregates
647
- }">
648
- </ng-template>
649
- </td>
751
+ [logicalColIndex]="hasDetailTemplate ? 1 : 0"
752
+ [attr.data-skip]="skipGroupDecoration"
753
+ class="k-table-td">
754
+ <div class="k-grid-column-template">
755
+ <ng-container *ngFor="let col of footerColumns">
756
+ <div class="k-column-template-item" *ngIf="$any(col).groupFooterTemplateRef">
757
+ <ng-template
758
+ [templateContext]="{
759
+ templateRef: $any(col).groupFooterTemplateRef,
760
+ group: $any(item.data),
761
+ field: $any(col).field,
762
+ column: col,
763
+ aggregates: $any(item.data)?.aggregates,
764
+ $implicit: $any(item.data)?.aggregates
765
+ }">
766
+ </ng-template>
767
+ </div>
768
+ </ng-container>
769
+ </div>
770
+ </td>
771
+ </ng-container>
650
772
  </tr>
651
773
  </ng-container>
652
774
  <kendo-resize-sensor *ngIf="rowSticky" (resize)="resizeHandler()"></kendo-resize-sensor>
653
- `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: LogicalRowDirective, selector: "[kendoGridLogicalRow]", inputs: ["logicalRowIndex", "logicalSlaveRow", "logicalCellsCount", "logicalSlaveCellsCount", "dataRowIndex", "dataItem", "totalColumns"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: LogicalCellDirective, selector: "[kendoGridLogicalCell]", inputs: ["logicalColIndex", "logicalRowIndex", "logicalSlaveCell", "colIndex", "colSpan", "rowSpan", "groupItem", "dataRowIndex", "dataItem", "detailExpandCell", "headerLabelText"] }, { kind: "component", type: CellComponent, selector: "[kendoGridCell]", inputs: ["column", "columnIndex", "isNew", "isLoading", "isVirtual", "loadingTemplate", "rowIndex", "dataItem"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { kind: "component", type: GroupHeaderComponent, selector: "[kendoGridGroupHeader]", inputs: ["rowIndex", "logicalRowIndex", "item", "skipGroupDecoration", "hasDetails", "totalColumnsCount", "hasGroupHeaderColumn", "groupHeaderColumns", "columns", "groups"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }] });
775
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: LogicalRowDirective, selector: "[kendoGridLogicalRow]", inputs: ["logicalRowIndex", "logicalSlaveRow", "logicalCellsCount", "logicalSlaveCellsCount", "dataRowIndex", "dataItem", "totalColumns"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: LogicalCellDirective, selector: "[kendoGridLogicalCell]", inputs: ["logicalColIndex", "logicalRowIndex", "logicalSlaveCell", "colIndex", "colSpan", "rowSpan", "groupItem", "dataRowIndex", "dataItem", "detailExpandCell", "headerLabelText"] }, { kind: "component", type: CellComponent, selector: "[kendoGridCell]", inputs: ["column", "columns", "columnIndex", "isNew", "isLoading", "isVirtual", "loadingTemplate", "detailTemplate", "item", "rowIndex", "dataItem"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { kind: "component", type: GroupHeaderComponent, selector: "[kendoGridGroupHeader]", inputs: ["rowIndex", "logicalRowIndex", "item", "skipGroupDecoration", "hasDetails", "totalColumnsCount", "hasGroupHeaderColumn", "groupHeaderColumns", "columns", "groups"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }] });
654
776
  }
655
777
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableBodyComponent, decorators: [{
656
778
  type: Component,
@@ -661,7 +783,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
661
783
  <tr class="k-grid-add-row k-grid-edit-row k-master-row"
662
784
  kendoGridLogicalRow
663
785
  [logicalRowIndex]="addRowLogicalIndex()"
664
- [logicalSlaveRow]="lockedColumnsCount > 0"
786
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
665
787
  [logicalCellsCount]="columns.length"
666
788
  [logicalSlaveCellsCount]="unlockedColumnsCount()"
667
789
  [totalColumns]="totalColumns">
@@ -669,32 +791,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
669
791
  <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups" role="presentation"></td>
670
792
  </ng-container>
671
793
  <td class="k-hierarchy-cell k-table-td"
672
- *ngIf="detailTemplate?.templateRef"
794
+ *ngIf="detailTemplate?.templateRef && !isStackedMode"
673
795
  kendoGridLogicalCell
674
796
  [logicalRowIndex]="addRowLogicalIndex()"
675
797
  [logicalColIndex]="0"
676
798
  aria-selected="false"
677
799
  >
678
800
  </td>
679
- <td *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;"
680
- class="k-table-td"
681
- kendoGridCell
682
- [rowIndex]="-1"
683
- [columnIndex]="lockedColumnsCount + columnIndex"
684
- [isNew]="true"
685
- [column]="column"
686
- [dataItem]="newDataItem"
687
- [class.k-grid-content-sticky]="column.sticky"
688
- [ngClass]="column.cssClass"
689
- [style.left]="column.sticky ? '0' : undefined"
690
- [ngStyle]="column.sticky ? addStickyColumnStyles(column) : column.style"
691
- [attr.colspan]="column.colspan"
692
- [attr.role]="column.tableCellsRole"
693
- kendoGridLogicalCell
694
- [logicalRowIndex]="addRowLogicalIndex()"
695
- [logicalColIndex]="logicalColIndex(column)"
696
- [colSpan]="column.colspan">
697
- </td>
801
+ <ng-container *ngIf="isStackedMode; else columnsTemplate">
802
+ <td *ngFor="let item of rowsToRender; trackBy: trackByWrapper; let rowIndex = index;"
803
+ class="k-table-td"
804
+ kendoGridCell
805
+ [rowIndex]="-1"
806
+ [columnIndex]="0"
807
+ [isNew]="true"
808
+ [columns]="allColumns"
809
+ [dataItem]="newDataItem"
810
+ kendoGridLogicalCell
811
+ [logicalRowIndex]="addRowLogicalIndex()"
812
+ [logicalColIndex]="0">
813
+ </td>
814
+ </ng-container>
815
+ <ng-template #columnsTemplate>
816
+ <td *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;"
817
+ class="k-table-td"
818
+ kendoGridCell
819
+ [rowIndex]="-1"
820
+ [columnIndex]="lockedColumnsCount + columnIndex"
821
+ [isNew]="true"
822
+ [column]="column"
823
+ [dataItem]="newDataItem"
824
+ [class.k-grid-content-sticky]="column.sticky"
825
+ [ngClass]="column.cssClass"
826
+ [style.left]="column.sticky ? '0' : undefined"
827
+ [ngStyle]="column.sticky ? addStickyColumnStyles(column) : column.style"
828
+ [attr.colspan]="column.colspan"
829
+ [attr.role]="column.tableCellsRole"
830
+ kendoGridLogicalCell
831
+ [logicalRowIndex]="addRowLogicalIndex()"
832
+ [logicalColIndex]="logicalColIndex(column)"
833
+ [colSpan]="column.colspan">
834
+ </td>
835
+ </ng-template>
698
836
  </tr>
699
837
  </ng-container>
700
838
  <tr *ngIf="!rowsToRender?.length" class="k-grid-norecords" role="row">
@@ -724,7 +862,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
724
862
  [totalColumnsCount]="totalColumnsCount"
725
863
  kendoGridLogicalRow
726
864
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
727
- [logicalSlaveRow]="lockedColumnsCount > 0"
865
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
728
866
  [totalColumns]="totalColumns"
729
867
  [logicalCellsCount]="columns.length"
730
868
  [logicalSlaveCellsCount]="groupHeaderSlaveCellsCount">
@@ -734,7 +872,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
734
872
  [dataRowIndex]="$any(item).index"
735
873
  [dataItem]="item.data"
736
874
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
737
- [logicalSlaveRow]="lockedColumnsCount > 0"
875
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
738
876
  [totalColumns]="totalColumns"
739
877
  [logicalCellsCount]="columns.length"
740
878
  [logicalSlaveCellsCount]="unlockedColumnsCount(item)"
@@ -742,16 +880,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
742
880
  [class.k-grid-row-sticky]="rowSticky ? rowSticky({ dataItem: item.data, index: $any(item).index }) : false"
743
881
  [ngClass]="rowClass({ dataItem: item.data, index: $any(item).index })"
744
882
  [class.k-master-row]="true"
745
- [class.k-expanded]="item.isExpanded"
883
+ [class.k-expanded]="item.isExpanded && !isStackedMode"
746
884
  [class.k-grid-edit-row]="isEditingRow($any(item).index)"
747
- [attr.aria-selected]="lockedColumnsCount < 1 ? isSelectable({ dataItem: item.data, index: $any(item).index }) && isRowSelected(item) : undefined"
885
+ [attr.aria-selected]="(lockedColumnsCount < 1 || isStackedMode) ? isSelectable({ dataItem: item.data, index: $any(item).index }) && isRowSelected(item) : undefined"
748
886
  [attr.data-kendo-grid-item-index]="$any(item).index"
749
- [class.k-selected]="isSelectable({ dataItem: item.data, index: $any(item).index }) && isRowSelected(item)">
887
+ [class.k-selected]="isSelectable({ dataItem: item.data, index: $any(item).index }) && isRowSelected(item)"
888
+ [class.k-highlighted]="item.isHighlighted">
750
889
  <ng-container *ngIf="!skipGroupDecoration">
751
890
  <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups" role="presentation"></td>
752
891
  </ng-container>
753
892
  <td class="k-hierarchy-cell k-table-td"
754
- *ngIf="detailTemplate?.templateRef"
893
+ *ngIf="detailTemplate?.templateRef && !isStackedMode"
755
894
  kendoGridLogicalCell
756
895
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
757
896
  [logicalColIndex]="0"
@@ -770,18 +909,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
770
909
  [svgIcon]="detailButtonSvgIcon(item)"></kendo-icon-wrapper>
771
910
  </a>
772
911
  </td>
773
- <ng-container *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;">
774
- <td *ngIf="!item.cells?.[lockedColumnsCount + columnIndex]?.skip"
775
- kendoGridCell
912
+ <ng-container *ngIf="isStackedMode; else columnsTemplate">
913
+ <td kendoGridCell
914
+ [rowIndex]="$any(item).index"
915
+ [detailTemplate]="detailTemplate"
916
+ [item]="item"
917
+ [columnIndex]="0"
918
+ [attr.data-kendo-grid-column-index]="0"
919
+ [columns]="columns"
920
+ [dataItem]="item.data"
921
+ [isLoading]="isLoading"
922
+ [isVirtual]="isVirtual"
923
+ [loadingTemplate]="cellLoadingTemplate"
924
+ kendoGridLogicalCell
925
+ [logicalRowIndex]="logicalRowIndex(rowIndex)"
926
+ [logicalColIndex]="0"
927
+ [dataRowIndex]="$any(item).index"
928
+ [dataItem]="item.data"
929
+ [colIndex]="0"
930
+ class="k-table-td"
931
+ [class.k-touch-action-none]="isSelectable({ dataItem: item.data, index: $any(item).index }) && $any(selectable).drag">
932
+ </td>
933
+ </ng-container>
934
+ <ng-template #columnsTemplate>
935
+ <ng-container *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;">
936
+ <td *ngIf="!item.cells?.[lockedColumnsCount + columnIndex]?.skip"
937
+ kendoGridCell
776
938
  [rowIndex]="$any(item).index"
777
939
  [columnIndex]="lockedColumnsCount + columnIndex"
778
940
  [attr.data-kendo-grid-column-index]="lockedColumnsCount + columnIndex"
779
941
  [column]="column"
942
+ [columns]="allColumns"
780
943
  [dataItem]="item.data"
781
944
  [isLoading]="isLoading"
782
945
  [isVirtual]="isVirtual"
783
946
  [loadingTemplate]="cellLoadingTemplate"
784
- kendoGridLogicalCell
947
+ kendoGridLogicalCell
785
948
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
786
949
  [logicalColIndex]="logicalColIndex(column)"
787
950
  [dataRowIndex]="$any(item).index"
@@ -794,49 +957,75 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
794
957
  [attr.aria-selected]="lockedColumnsCount < 1 && isSelectable({ dataItem: item.data, index: $any(item).index }) ? isAriaSelected(item, column) : undefined"
795
958
  [class.k-grid-content-sticky]="column.sticky"
796
959
  [class.k-touch-action-none]="isSelectable({ dataItem: item.data, index: $any(item).index }) && $any(selectable).drag"
797
- [ngClass]="column.cssClass"
798
- [class.k-grid-edit-cell]="isEditingCell($any(item).index, column)"
799
- [ngStyle]="column.sticky ? addStickyColumnStyles(column) : column.style"
800
- [attr.colspan]="column.colspan"
801
- [class.k-selected]="isSelectable && cellSelectionService.isCellSelected(item, column)">
802
- </td>
803
- </ng-container>
960
+ [ngClass]="column.cssClass"
961
+ [class.k-grid-edit-cell]="isEditingCell($any(item).index, column)"
962
+ [ngStyle]="column.sticky ? addStickyColumnStyles(column) : column.style"
963
+ [attr.colspan]="column.colspan"
964
+ [class.k-selected]="isSelectable && cellSelectionService.isCellSelected(item, column)"
965
+ [class.k-highlighted]="item.cells[lockedColumnsCount + columnIndex]?.isHighlighted">
966
+ </td>
967
+ </ng-container>
968
+ </ng-template>
804
969
  </tr>
805
970
  <tr *ngIf="item.showDetailRow"
806
971
  class="k-detail-row"
807
972
  kendoGridLogicalRow
808
973
  [dataRowIndex]="$any(item).index"
809
974
  [dataItem]="item.data"
810
- [logicalRowIndex]="logicalRowIndex(rowIndex) + 1"
975
+ [logicalRowIndex]="isStackedMode ? logicalRowIndex(rowIndex) : logicalRowIndex(rowIndex) + 1"
811
976
  [logicalSlaveRow]="false"
812
977
  [logicalCellsCount]="1">
813
- <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups"></td>
814
- <td class="k-hierarchy-cell k-table-td"></td>
815
- <td class="k-detail-cell k-table-td"
816
- [attr.colspan]="columnsSpan"
817
- kendoGridLogicalCell
818
- [logicalRowIndex]="logicalRowIndex(rowIndex) + 1"
819
- [logicalColIndex]="0"
820
- [dataRowIndex]="$any(item).index"
821
- [dataItem]="item.data"
822
- [colIndex]="0"
823
- [colSpan]="allColumnsSpan + 1"
824
- role="gridcell" aria-selected="false">
825
- <ng-template
826
- [ngTemplateOutlet]="detailTemplate.templateRef"
827
- [ngTemplateOutletContext]="{
828
- dataItem: item.data,
829
- rowIndex: $any(item).index,
830
- $implicit: item.data
831
- }">
832
- </ng-template>
833
- </td>
978
+ <ng-container *ngIf="!isStackedMode">
979
+ <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups"></td>
980
+ <td class="k-hierarchy-cell k-table-td"></td>
981
+ <td class="k-detail-cell k-table-td"
982
+ [attr.colspan]="columnsSpan"
983
+ kendoGridLogicalCell
984
+ [logicalRowIndex]="logicalRowIndex(rowIndex) + 1"
985
+ [logicalColIndex]="0"
986
+ [dataRowIndex]="$any(item).index"
987
+ [dataItem]="item.data"
988
+ [colIndex]="0"
989
+ [colSpan]="allColumnsSpan + 1"
990
+ role="gridcell" aria-selected="false">
991
+ <ng-template
992
+ [ngTemplateOutlet]="detailTemplate.templateRef"
993
+ [ngTemplateOutletContext]="{
994
+ dataItem: item.data,
995
+ rowIndex: $any(item).index,
996
+ $implicit: item.data
997
+ }">
998
+ </ng-template>
999
+ </td>
1000
+ </ng-container>
1001
+ <ng-container *ngIf="isStackedMode">
1002
+ <td class="k-detail-cell k-table-td"
1003
+ [attr.colspan]="columnsSpan"
1004
+ kendoGridLogicalCell
1005
+ [logicalRowIndex]="logicalRowIndex(rowIndex)"
1006
+ [logicalColIndex]="0"
1007
+ [dataRowIndex]="$any(item).index"
1008
+ [dataItem]="item.data"
1009
+ [colIndex]="0"
1010
+ [colSpan]="allColumnsSpan + 1"
1011
+ role="gridcell"
1012
+ aria-selected="false">
1013
+ <ng-template
1014
+ [ngTemplateOutlet]="detailTemplate.templateRef"
1015
+ [ngTemplateOutletContext]="{
1016
+ dataItem: item.data,
1017
+ rowIndex: $any(item).index,
1018
+ $implicit: item.data
1019
+ }">
1020
+ </ng-template>
1021
+ </td>
1022
+ </ng-container>
834
1023
  </tr>
835
1024
  <tr *ngIf="item.type === 'footer'"
836
1025
  class="k-group-footer"
837
1026
  kendoGridLogicalRow
838
1027
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
839
- [logicalSlaveRow]="lockedColumnsCount > 0"
1028
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
840
1029
  [totalColumns]="totalColumns"
841
1030
  [logicalCellsCount]="columns.length"
842
1031
  [logicalSlaveCellsCount]="unlockedColumnsCount(item)">
@@ -844,29 +1033,57 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
844
1033
  <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups"></td>
845
1034
  </ng-container>
846
1035
  <td class="k-hierarchy-cell k-table-td"
847
- *ngIf="detailTemplate?.templateRef"
1036
+ *ngIf="detailTemplate?.templateRef && !isStackedMode"
848
1037
  kendoGridLogicalCell
849
1038
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
850
1039
  [logicalColIndex]="0"
851
1040
  aria-selected="false">
852
1041
  </td>
853
- <td kendoGridLogicalCell
1042
+
1043
+ <ng-container *ngIf="!isStackedMode">
1044
+ <td kendoGridLogicalCell
1045
+ [logicalRowIndex]="logicalRowIndex(rowIndex)"
1046
+ [logicalColIndex]="logicalColIndex(column)"
1047
+ [attr.data-skip]="skipGroupDecoration"
1048
+ class="k-table-td"
1049
+ *ngFor="let column of footerColumns; let columnIndex = index; trackBy: trackByColumns;">
1050
+ <ng-template
1051
+ [templateContext]="{
1052
+ templateRef: $any(column).groupFooterTemplateRef,
1053
+ group: $any(item.data),
1054
+ field: $any(column).field,
1055
+ column: column,
1056
+ aggregates: $any(item.data)?.aggregates,
1057
+ $implicit: $any(item.data)?.aggregates
1058
+ }">
1059
+ </ng-template>
1060
+ </td>
1061
+ </ng-container>
1062
+
1063
+ <ng-container *ngIf="isStackedMode">
1064
+ <td kendoGridLogicalCell
854
1065
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
855
- [logicalColIndex]="logicalColIndex(column)"
856
- [attr.data-skip]="skipGroupDecoration"
857
- class="k-table-td"
858
- *ngFor="let column of footerColumns; let columnIndex = index; trackBy: trackByColumns;">
859
- <ng-template
860
- [templateContext]="{
861
- templateRef: $any(column).groupFooterTemplateRef,
862
- group: $any(item.data),
863
- field: $any(column).field,
864
- column: column,
865
- aggregates: $any(item.data)?.aggregates,
866
- $implicit: $any(item.data)?.aggregates
867
- }">
868
- </ng-template>
869
- </td>
1066
+ [logicalColIndex]="hasDetailTemplate ? 1 : 0"
1067
+ [attr.data-skip]="skipGroupDecoration"
1068
+ class="k-table-td">
1069
+ <div class="k-grid-column-template">
1070
+ <ng-container *ngFor="let col of footerColumns">
1071
+ <div class="k-column-template-item" *ngIf="$any(col).groupFooterTemplateRef">
1072
+ <ng-template
1073
+ [templateContext]="{
1074
+ templateRef: $any(col).groupFooterTemplateRef,
1075
+ group: $any(item.data),
1076
+ field: $any(col).field,
1077
+ column: col,
1078
+ aggregates: $any(item.data)?.aggregates,
1079
+ $implicit: $any(item.data)?.aggregates
1080
+ }">
1081
+ </ng-template>
1082
+ </div>
1083
+ </ng-container>
1084
+ </div>
1085
+ </td>
1086
+ </ng-container>
870
1087
  </tr>
871
1088
  </ng-container>
872
1089
  <kendo-resize-sensor *ngIf="rowSticky" (resize)="resizeHandler()"></kendo-resize-sensor>