@progress/kendo-angular-grid 19.3.0-develop.23 → 19.3.0-develop.25

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 (63) hide show
  1. package/columns/columns-container.d.ts +2 -0
  2. package/common/data-layout-mode.d.ts +19 -0
  3. package/common/stacked-layout-settings.d.ts +24 -0
  4. package/directives.d.ts +4 -3
  5. package/editing-directives/editing-directive-base.d.ts +3 -0
  6. package/esm2022/columns/column-base.mjs +4 -4
  7. package/esm2022/columns/column.component.mjs +1 -1
  8. package/esm2022/columns/columns-container.mjs +3 -0
  9. package/esm2022/common/column-info.service.mjs +1 -1
  10. package/esm2022/common/data-layout-mode.mjs +5 -0
  11. package/esm2022/common/stacked-layout-settings.mjs +5 -0
  12. package/esm2022/directives.mjs +3 -1
  13. package/esm2022/editing-directives/editing-directive-base.mjs +17 -2
  14. package/esm2022/editing-directives/in-cell-editing.directive.mjs +2 -1
  15. package/esm2022/filtering/filter-row.component.mjs +5 -2
  16. package/esm2022/grid.component.mjs +111 -33
  17. package/esm2022/grid.module.mjs +101 -100
  18. package/esm2022/grouping/group-header.component.mjs +39 -4
  19. package/esm2022/index.mjs +1 -0
  20. package/esm2022/localization/messages.mjs +2 -2
  21. package/esm2022/navigation/default-focusable-element.mjs +14 -2
  22. package/esm2022/navigation/focusable.directive.mjs +1 -1
  23. package/esm2022/navigation/navigation-cursor.mjs +7 -1
  24. package/esm2022/navigation/navigation-metadata.mjs +3 -1
  25. package/esm2022/navigation/navigation.service.mjs +136 -5
  26. package/esm2022/package-metadata.mjs +2 -2
  27. package/esm2022/pdf/export-element.mjs +14 -5
  28. package/esm2022/pdf/pdf.component.mjs +3 -1
  29. package/esm2022/rendering/cell.component.mjs +466 -188
  30. package/esm2022/rendering/common/col-group.component.mjs +20 -7
  31. package/esm2022/rendering/footer/footer.component.mjs +117 -54
  32. package/esm2022/rendering/header/header.component.mjs +5 -2
  33. package/esm2022/rendering/list.component.mjs +13 -8
  34. package/esm2022/rendering/table-body.component.mjs +384 -171
  35. package/esm2022/rendering/toolbar/tools/ai-assistant/ai-assistant.component.mjs +7 -3
  36. package/esm2022/rendering/toolbar/tools/select-all-command-tool.directive.mjs +93 -0
  37. package/esm2022/row-reordering/row-reorder.service.mjs +2 -2
  38. package/esm2022/row-reordering/utils.mjs +6 -4
  39. package/esm2022/selection/cell-selection.service.mjs +6 -3
  40. package/fesm2022/progress-kendo-angular-grid.mjs +1514 -566
  41. package/filtering/filter-row.component.d.ts +1 -0
  42. package/grid.component.d.ts +22 -1
  43. package/grid.module.d.ts +100 -99
  44. package/grouping/group-header.component.d.ts +1 -0
  45. package/index.d.ts +3 -0
  46. package/localization/messages.d.ts +2 -2
  47. package/navigation/default-focusable-element.d.ts +3 -1
  48. package/navigation/focus-group.d.ts +1 -1
  49. package/navigation/navigation-metadata.d.ts +2 -1
  50. package/navigation/navigation.service.d.ts +6 -0
  51. package/package.json +21 -21
  52. package/rendering/cell.component.d.ts +32 -17
  53. package/rendering/common/col-group.component.d.ts +5 -0
  54. package/rendering/footer/footer.component.d.ts +4 -1
  55. package/rendering/header/header.component.d.ts +1 -0
  56. package/rendering/list.component.d.ts +4 -1
  57. package/rendering/table-body.component.d.ts +2 -1
  58. package/rendering/toolbar/tools/ai-assistant/ai-assistant.component.d.ts +1 -0
  59. package/rendering/toolbar/tools/select-all-command-tool.directive.d.ts +36 -0
  60. package/row-reordering/row-reorder.service.d.ts +1 -1
  61. package/row-reordering/utils.d.ts +1 -1
  62. package/schematics/ngAdd/index.js +4 -4
  63. package/selection/cell-selection.service.d.ts +1 -0
@@ -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,9 +565,9 @@ 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
572
  [class.k-selected]="isSelectable({ dataItem: item.data, index: $any(item).index }) && isRowSelected(item)"
530
573
  [class.k-highlighted]="item.isHighlighted">
@@ -532,7 +575,7 @@ export class TableBodyComponent {
532
575
  <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups" role="presentation"></td>
533
576
  </ng-container>
534
577
  <td class="k-hierarchy-cell k-table-td"
535
- *ngIf="detailTemplate?.templateRef"
578
+ *ngIf="detailTemplate?.templateRef && !isStackedMode"
536
579
  kendoGridLogicalCell
537
580
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
538
581
  [logicalColIndex]="0"
@@ -551,18 +594,42 @@ export class TableBodyComponent {
551
594
  [svgIcon]="detailButtonSvgIcon(item)"></kendo-icon-wrapper>
552
595
  </a>
553
596
  </td>
554
- <ng-container *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;">
555
- <td *ngIf="!item.cells?.[lockedColumnsCount + columnIndex]?.skip"
556
- 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
557
623
  [rowIndex]="$any(item).index"
558
624
  [columnIndex]="lockedColumnsCount + columnIndex"
559
625
  [attr.data-kendo-grid-column-index]="lockedColumnsCount + columnIndex"
560
626
  [column]="column"
627
+ [columns]="allColumns"
561
628
  [dataItem]="item.data"
562
629
  [isLoading]="isLoading"
563
630
  [isVirtual]="isVirtual"
564
631
  [loadingTemplate]="cellLoadingTemplate"
565
- kendoGridLogicalCell
632
+ kendoGridLogicalCell
566
633
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
567
634
  [logicalColIndex]="logicalColIndex(column)"
568
635
  [dataRowIndex]="$any(item).index"
@@ -575,50 +642,75 @@ export class TableBodyComponent {
575
642
  [attr.aria-selected]="lockedColumnsCount < 1 && isSelectable({ dataItem: item.data, index: $any(item).index }) ? isAriaSelected(item, column) : undefined"
576
643
  [class.k-grid-content-sticky]="column.sticky"
577
644
  [class.k-touch-action-none]="isSelectable({ dataItem: item.data, index: $any(item).index }) && $any(selectable).drag"
578
- [ngClass]="column.cssClass"
579
- [class.k-grid-edit-cell]="isEditingCell($any(item).index, column)"
580
- [ngStyle]="column.sticky ? addStickyColumnStyles(column) : column.style"
581
- [attr.colspan]="column.colspan"
582
- [class.k-selected]="isSelectable && cellSelectionService.isCellSelected(item, column)"
583
- [class.k-highlighted]="item.cells[lockedColumnsCount + columnIndex]?.isHighlighted">
584
- </td>
585
- </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>
586
654
  </tr>
587
655
  <tr *ngIf="item.showDetailRow"
588
656
  class="k-detail-row"
589
657
  kendoGridLogicalRow
590
658
  [dataRowIndex]="$any(item).index"
591
659
  [dataItem]="item.data"
592
- [logicalRowIndex]="logicalRowIndex(rowIndex) + 1"
660
+ [logicalRowIndex]="isStackedMode ? logicalRowIndex(rowIndex) : logicalRowIndex(rowIndex) + 1"
593
661
  [logicalSlaveRow]="false"
594
662
  [logicalCellsCount]="1">
595
- <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups"></td>
596
- <td class="k-hierarchy-cell k-table-td"></td>
597
- <td class="k-detail-cell k-table-td"
598
- [attr.colspan]="columnsSpan"
599
- kendoGridLogicalCell
600
- [logicalRowIndex]="logicalRowIndex(rowIndex) + 1"
601
- [logicalColIndex]="0"
602
- [dataRowIndex]="$any(item).index"
603
- [dataItem]="item.data"
604
- [colIndex]="0"
605
- [colSpan]="allColumnsSpan + 1"
606
- role="gridcell" aria-selected="false">
607
- <ng-template
608
- [ngTemplateOutlet]="detailTemplate.templateRef"
609
- [ngTemplateOutletContext]="{
610
- dataItem: item.data,
611
- rowIndex: $any(item).index,
612
- $implicit: item.data
613
- }">
614
- </ng-template>
615
- </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>
616
708
  </tr>
617
709
  <tr *ngIf="item.type === 'footer'"
618
710
  class="k-group-footer"
619
711
  kendoGridLogicalRow
620
712
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
621
- [logicalSlaveRow]="lockedColumnsCount > 0"
713
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
622
714
  [totalColumns]="totalColumns"
623
715
  [logicalCellsCount]="columns.length"
624
716
  [logicalSlaveCellsCount]="unlockedColumnsCount(item)">
@@ -626,33 +718,61 @@ export class TableBodyComponent {
626
718
  <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups"></td>
627
719
  </ng-container>
628
720
  <td class="k-hierarchy-cell k-table-td"
629
- *ngIf="detailTemplate?.templateRef"
721
+ *ngIf="detailTemplate?.templateRef && !isStackedMode"
630
722
  kendoGridLogicalCell
631
723
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
632
724
  [logicalColIndex]="0"
633
725
  aria-selected="false">
634
726
  </td>
635
- <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
636
750
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
637
- [logicalColIndex]="logicalColIndex(column)"
638
- [attr.data-skip]="skipGroupDecoration"
639
- class="k-table-td"
640
- *ngFor="let column of footerColumns; let columnIndex = index; trackBy: trackByColumns;">
641
- <ng-template
642
- [templateContext]="{
643
- templateRef: $any(column).groupFooterTemplateRef,
644
- group: $any(item.data),
645
- field: $any(column).field,
646
- column: column,
647
- aggregates: $any(item.data)?.aggregates,
648
- $implicit: $any(item.data)?.aggregates
649
- }">
650
- </ng-template>
651
- </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>
652
772
  </tr>
653
773
  </ng-container>
654
774
  <kendo-resize-sensor *ngIf="rowSticky" (resize)="resizeHandler()"></kendo-resize-sensor>
655
- `, 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"] }] });
656
776
  }
657
777
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableBodyComponent, decorators: [{
658
778
  type: Component,
@@ -663,7 +783,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
663
783
  <tr class="k-grid-add-row k-grid-edit-row k-master-row"
664
784
  kendoGridLogicalRow
665
785
  [logicalRowIndex]="addRowLogicalIndex()"
666
- [logicalSlaveRow]="lockedColumnsCount > 0"
786
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
667
787
  [logicalCellsCount]="columns.length"
668
788
  [logicalSlaveCellsCount]="unlockedColumnsCount()"
669
789
  [totalColumns]="totalColumns">
@@ -671,32 +791,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
671
791
  <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups" role="presentation"></td>
672
792
  </ng-container>
673
793
  <td class="k-hierarchy-cell k-table-td"
674
- *ngIf="detailTemplate?.templateRef"
794
+ *ngIf="detailTemplate?.templateRef && !isStackedMode"
675
795
  kendoGridLogicalCell
676
796
  [logicalRowIndex]="addRowLogicalIndex()"
677
797
  [logicalColIndex]="0"
678
798
  aria-selected="false"
679
799
  >
680
800
  </td>
681
- <td *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;"
682
- class="k-table-td"
683
- kendoGridCell
684
- [rowIndex]="-1"
685
- [columnIndex]="lockedColumnsCount + columnIndex"
686
- [isNew]="true"
687
- [column]="column"
688
- [dataItem]="newDataItem"
689
- [class.k-grid-content-sticky]="column.sticky"
690
- [ngClass]="column.cssClass"
691
- [style.left]="column.sticky ? '0' : undefined"
692
- [ngStyle]="column.sticky ? addStickyColumnStyles(column) : column.style"
693
- [attr.colspan]="column.colspan"
694
- [attr.role]="column.tableCellsRole"
695
- kendoGridLogicalCell
696
- [logicalRowIndex]="addRowLogicalIndex()"
697
- [logicalColIndex]="logicalColIndex(column)"
698
- [colSpan]="column.colspan">
699
- </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>
700
836
  </tr>
701
837
  </ng-container>
702
838
  <tr *ngIf="!rowsToRender?.length" class="k-grid-norecords" role="row">
@@ -726,7 +862,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
726
862
  [totalColumnsCount]="totalColumnsCount"
727
863
  kendoGridLogicalRow
728
864
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
729
- [logicalSlaveRow]="lockedColumnsCount > 0"
865
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
730
866
  [totalColumns]="totalColumns"
731
867
  [logicalCellsCount]="columns.length"
732
868
  [logicalSlaveCellsCount]="groupHeaderSlaveCellsCount">
@@ -736,7 +872,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
736
872
  [dataRowIndex]="$any(item).index"
737
873
  [dataItem]="item.data"
738
874
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
739
- [logicalSlaveRow]="lockedColumnsCount > 0"
875
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
740
876
  [totalColumns]="totalColumns"
741
877
  [logicalCellsCount]="columns.length"
742
878
  [logicalSlaveCellsCount]="unlockedColumnsCount(item)"
@@ -744,9 +880,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
744
880
  [class.k-grid-row-sticky]="rowSticky ? rowSticky({ dataItem: item.data, index: $any(item).index }) : false"
745
881
  [ngClass]="rowClass({ dataItem: item.data, index: $any(item).index })"
746
882
  [class.k-master-row]="true"
747
- [class.k-expanded]="item.isExpanded"
883
+ [class.k-expanded]="item.isExpanded && !isStackedMode"
748
884
  [class.k-grid-edit-row]="isEditingRow($any(item).index)"
749
- [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"
750
886
  [attr.data-kendo-grid-item-index]="$any(item).index"
751
887
  [class.k-selected]="isSelectable({ dataItem: item.data, index: $any(item).index }) && isRowSelected(item)"
752
888
  [class.k-highlighted]="item.isHighlighted">
@@ -754,7 +890,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
754
890
  <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups" role="presentation"></td>
755
891
  </ng-container>
756
892
  <td class="k-hierarchy-cell k-table-td"
757
- *ngIf="detailTemplate?.templateRef"
893
+ *ngIf="detailTemplate?.templateRef && !isStackedMode"
758
894
  kendoGridLogicalCell
759
895
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
760
896
  [logicalColIndex]="0"
@@ -773,18 +909,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
773
909
  [svgIcon]="detailButtonSvgIcon(item)"></kendo-icon-wrapper>
774
910
  </a>
775
911
  </td>
776
- <ng-container *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;">
777
- <td *ngIf="!item.cells?.[lockedColumnsCount + columnIndex]?.skip"
778
- 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
779
938
  [rowIndex]="$any(item).index"
780
939
  [columnIndex]="lockedColumnsCount + columnIndex"
781
940
  [attr.data-kendo-grid-column-index]="lockedColumnsCount + columnIndex"
782
941
  [column]="column"
942
+ [columns]="allColumns"
783
943
  [dataItem]="item.data"
784
944
  [isLoading]="isLoading"
785
945
  [isVirtual]="isVirtual"
786
946
  [loadingTemplate]="cellLoadingTemplate"
787
- kendoGridLogicalCell
947
+ kendoGridLogicalCell
788
948
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
789
949
  [logicalColIndex]="logicalColIndex(column)"
790
950
  [dataRowIndex]="$any(item).index"
@@ -797,50 +957,75 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
797
957
  [attr.aria-selected]="lockedColumnsCount < 1 && isSelectable({ dataItem: item.data, index: $any(item).index }) ? isAriaSelected(item, column) : undefined"
798
958
  [class.k-grid-content-sticky]="column.sticky"
799
959
  [class.k-touch-action-none]="isSelectable({ dataItem: item.data, index: $any(item).index }) && $any(selectable).drag"
800
- [ngClass]="column.cssClass"
801
- [class.k-grid-edit-cell]="isEditingCell($any(item).index, column)"
802
- [ngStyle]="column.sticky ? addStickyColumnStyles(column) : column.style"
803
- [attr.colspan]="column.colspan"
804
- [class.k-selected]="isSelectable && cellSelectionService.isCellSelected(item, column)"
805
- [class.k-highlighted]="item.cells[lockedColumnsCount + columnIndex]?.isHighlighted">
806
- </td>
807
- </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>
808
969
  </tr>
809
970
  <tr *ngIf="item.showDetailRow"
810
971
  class="k-detail-row"
811
972
  kendoGridLogicalRow
812
973
  [dataRowIndex]="$any(item).index"
813
974
  [dataItem]="item.data"
814
- [logicalRowIndex]="logicalRowIndex(rowIndex) + 1"
975
+ [logicalRowIndex]="isStackedMode ? logicalRowIndex(rowIndex) : logicalRowIndex(rowIndex) + 1"
815
976
  [logicalSlaveRow]="false"
816
977
  [logicalCellsCount]="1">
817
- <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups"></td>
818
- <td class="k-hierarchy-cell k-table-td"></td>
819
- <td class="k-detail-cell k-table-td"
820
- [attr.colspan]="columnsSpan"
821
- kendoGridLogicalCell
822
- [logicalRowIndex]="logicalRowIndex(rowIndex) + 1"
823
- [logicalColIndex]="0"
824
- [dataRowIndex]="$any(item).index"
825
- [dataItem]="item.data"
826
- [colIndex]="0"
827
- [colSpan]="allColumnsSpan + 1"
828
- role="gridcell" aria-selected="false">
829
- <ng-template
830
- [ngTemplateOutlet]="detailTemplate.templateRef"
831
- [ngTemplateOutletContext]="{
832
- dataItem: item.data,
833
- rowIndex: $any(item).index,
834
- $implicit: item.data
835
- }">
836
- </ng-template>
837
- </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>
838
1023
  </tr>
839
1024
  <tr *ngIf="item.type === 'footer'"
840
1025
  class="k-group-footer"
841
1026
  kendoGridLogicalRow
842
1027
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
843
- [logicalSlaveRow]="lockedColumnsCount > 0"
1028
+ [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
844
1029
  [totalColumns]="totalColumns"
845
1030
  [logicalCellsCount]="columns.length"
846
1031
  [logicalSlaveCellsCount]="unlockedColumnsCount(item)">
@@ -848,29 +1033,57 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
848
1033
  <td class="k-group-cell k-table-td k-table-group-td" *ngFor="let g of groups"></td>
849
1034
  </ng-container>
850
1035
  <td class="k-hierarchy-cell k-table-td"
851
- *ngIf="detailTemplate?.templateRef"
1036
+ *ngIf="detailTemplate?.templateRef && !isStackedMode"
852
1037
  kendoGridLogicalCell
853
1038
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
854
1039
  [logicalColIndex]="0"
855
1040
  aria-selected="false">
856
1041
  </td>
857
- <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
858
1065
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
859
- [logicalColIndex]="logicalColIndex(column)"
860
- [attr.data-skip]="skipGroupDecoration"
861
- class="k-table-td"
862
- *ngFor="let column of footerColumns; let columnIndex = index; trackBy: trackByColumns;">
863
- <ng-template
864
- [templateContext]="{
865
- templateRef: $any(column).groupFooterTemplateRef,
866
- group: $any(item.data),
867
- field: $any(column).field,
868
- column: column,
869
- aggregates: $any(item.data)?.aggregates,
870
- $implicit: $any(item.data)?.aggregates
871
- }">
872
- </ng-template>
873
- </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>
874
1087
  </tr>
875
1088
  </ng-container>
876
1089
  <kendo-resize-sensor *ngIf="rowSticky" (resize)="resizeHandler()"></kendo-resize-sensor>