@progress/kendo-angular-grid 19.3.0-develop.9 → 19.3.0

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