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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/columns/columns-container.d.ts +2 -0
  2. package/common/data-layout-mode.d.ts +19 -0
  3. package/common/provider.service.d.ts +2 -0
  4. package/common/stacked-layout-settings.d.ts +24 -0
  5. package/data/data-mapping.service.d.ts +3 -1
  6. package/directives.d.ts +7 -4
  7. package/editing-directives/editing-directive-base.d.ts +3 -0
  8. package/esm2022/adaptiveness/adaptive-renderer.component.mjs +1 -2
  9. package/esm2022/column-menu/column-list.component.mjs +10 -10
  10. package/esm2022/column-menu/column-menu.component.mjs +1 -1
  11. package/esm2022/columns/column-base.mjs +4 -4
  12. package/esm2022/columns/column.component.mjs +1 -1
  13. package/esm2022/columns/columns-container.mjs +3 -0
  14. package/esm2022/common/column-info.service.mjs +1 -1
  15. package/esm2022/common/data-layout-mode.mjs +5 -0
  16. package/esm2022/common/provider.service.mjs +1 -0
  17. package/esm2022/common/stacked-layout-settings.mjs +5 -0
  18. package/esm2022/common/toolbar-tool-base.directive.mjs +3 -2
  19. package/esm2022/data/data-mapping.service.mjs +14 -3
  20. package/esm2022/directives.mjs +8 -1
  21. package/esm2022/editing/form/form-formfield.component.mjs +2 -2
  22. package/esm2022/editing-directives/editing-directive-base.mjs +17 -2
  23. package/esm2022/editing-directives/in-cell-editing.directive.mjs +3 -1
  24. package/esm2022/filtering/cell/boolean-filter-cell.component.mjs +1 -1
  25. package/esm2022/filtering/cell/date-filter-cell.component.mjs +1 -1
  26. package/esm2022/filtering/cell/filter-cell-operators.component.mjs +1 -2
  27. package/esm2022/filtering/cell/numeric-filter-cell.component.mjs +1 -1
  28. package/esm2022/filtering/cell/string-filter-cell.component.mjs +1 -1
  29. package/esm2022/filtering/filter-row.component.mjs +6 -3
  30. package/esm2022/filtering/menu/boolean-filter-menu.component.mjs +1 -2
  31. package/esm2022/filtering/menu/date-filter-menu-input.component.mjs +1 -1
  32. package/esm2022/filtering/menu/date-filter-menu.component.mjs +1 -1
  33. package/esm2022/filtering/menu/filter-menu-input-wrapper.component.mjs +1 -1
  34. package/esm2022/filtering/menu/filter-menu.component.mjs +1 -1
  35. package/esm2022/filtering/menu/numeric-filter-menu-input.component.mjs +1 -1
  36. package/esm2022/filtering/menu/numeric-filter-menu.component.mjs +1 -1
  37. package/esm2022/filtering/menu/string-filter-menu-input.component.mjs +1 -1
  38. package/esm2022/filtering/menu/string-filter-menu.component.mjs +1 -1
  39. package/esm2022/grid.component.mjs +190 -39
  40. package/esm2022/grid.module.mjs +103 -100
  41. package/esm2022/grouping/group-header.component.mjs +39 -4
  42. package/esm2022/grouping/group-panel.component.mjs +7 -3
  43. package/esm2022/highlight/highlight-item.mjs +5 -0
  44. package/esm2022/highlight/highlight.directive.mjs +132 -0
  45. package/esm2022/index.mjs +4 -0
  46. package/esm2022/localization/messages.mjs +57 -3
  47. package/esm2022/navigation/default-focusable-element.mjs +14 -2
  48. package/esm2022/navigation/focusable.directive.mjs +1 -1
  49. package/esm2022/navigation/navigation-cursor.mjs +7 -1
  50. package/esm2022/navigation/navigation-metadata.mjs +3 -1
  51. package/esm2022/navigation/navigation.service.mjs +136 -5
  52. package/esm2022/navigation/toolbar-tool-name.mjs +2 -1
  53. package/esm2022/package-metadata.mjs +2 -2
  54. package/esm2022/pdf/export-element.mjs +14 -5
  55. package/esm2022/pdf/pdf.component.mjs +3 -1
  56. package/esm2022/rendering/cell.component.mjs +466 -188
  57. package/esm2022/rendering/common/col-group.component.mjs +20 -7
  58. package/esm2022/rendering/footer/footer.component.mjs +117 -54
  59. package/esm2022/rendering/header/header.component.mjs +5 -2
  60. package/esm2022/rendering/list.component.mjs +14 -9
  61. package/esm2022/rendering/table-body.component.mjs +388 -171
  62. package/esm2022/rendering/toolbar/tools/ai-assistant/ai-assistant.component.mjs +290 -0
  63. package/esm2022/rendering/toolbar/tools/ai-assistant/ai-tool.directive.mjs +269 -0
  64. package/esm2022/rendering/toolbar/tools/ai-assistant/utils.mjs +47 -0
  65. package/esm2022/rendering/toolbar/tools/select-all-command-tool.directive.mjs +93 -0
  66. package/esm2022/row-reordering/row-reorder.service.mjs +2 -2
  67. package/esm2022/row-reordering/utils.mjs +6 -4
  68. package/esm2022/selection/cell-selection.service.mjs +6 -3
  69. package/esm2022/selection/pair-set.mjs +87 -10
  70. package/esm2022/utils.mjs +0 -4
  71. package/fesm2022/progress-kendo-angular-grid.mjs +2460 -599
  72. package/filtering/filter-row.component.d.ts +1 -0
  73. package/grid.component.d.ts +29 -1
  74. package/grid.module.d.ts +102 -99
  75. package/grouping/group-header.component.d.ts +1 -0
  76. package/highlight/highlight-item.d.ts +17 -0
  77. package/highlight/highlight.directive.d.ts +56 -0
  78. package/index.d.ts +7 -0
  79. package/localization/messages.d.ts +39 -3
  80. package/navigation/default-focusable-element.d.ts +3 -1
  81. package/navigation/focus-group.d.ts +1 -1
  82. package/navigation/navigation-metadata.d.ts +2 -1
  83. package/navigation/navigation.service.d.ts +6 -0
  84. package/navigation/toolbar-tool-name.d.ts +1 -0
  85. package/package.json +22 -21
  86. package/rendering/cell.component.d.ts +30 -15
  87. package/rendering/common/col-group.component.d.ts +5 -0
  88. package/rendering/footer/footer.component.d.ts +4 -1
  89. package/rendering/header/header.component.d.ts +1 -0
  90. package/rendering/list.component.d.ts +4 -1
  91. package/rendering/table-body.component.d.ts +3 -1
  92. package/rendering/toolbar/tools/ai-assistant/ai-assistant.component.d.ts +50 -0
  93. package/rendering/toolbar/tools/ai-assistant/ai-tool.directive.d.ts +119 -0
  94. package/rendering/toolbar/tools/ai-assistant/utils.d.ts +110 -0
  95. package/rendering/toolbar/tools/select-all-command-tool.directive.d.ts +36 -0
  96. package/row-reordering/row-reorder.service.d.ts +1 -1
  97. package/row-reordering/utils.d.ts +1 -1
  98. package/schematics/ngAdd/index.js +4 -4
  99. package/selection/cell-selection.service.d.ts +1 -0
  100. package/selection/pair-set.d.ts +36 -8
  101. package/utils.d.ts +0 -4
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { Component, ContentChildren, ElementRef, EventEmitter, HostBinding, Input, Output, Renderer2, QueryList, ViewChild, isDevMode, NgZone, ViewChildren, ChangeDetectorRef, ViewEncapsulation, ViewContainerRef } from '@angular/core';
5
+ import { Component, ContentChildren, ElementRef, EventEmitter, HostBinding, Input, Output, Renderer2, QueryList, ViewChild, isDevMode, NgZone, ViewChildren, ChangeDetectorRef, ViewEncapsulation, ViewContainerRef, ContentChild } from '@angular/core';
6
6
  import { ZoneAwareEventEmitter } from './common/event-emitter';
7
7
  import { FormControl, FormGroup } from '@angular/forms';
8
8
  import { merge } from 'rxjs';
@@ -71,7 +71,7 @@ import { CellLoadingTemplateDirective } from './rendering/cell-loading.template.
71
71
  import { ContextService } from './common/provider.service';
72
72
  import { LoadingTemplateDirective } from './rendering/loading-template.directive';
73
73
  import { SizingOptionsService } from './layout/sizing-options.service';
74
- import { DraggableDirective, WatermarkOverlayComponent, guid, shouldShowValidationUI } from '@progress/kendo-angular-common';
74
+ import { DraggableDirective, WatermarkOverlayComponent, guid, shouldShowValidationUI, getLicenseMessage } from '@progress/kendo-angular-common';
75
75
  import { DragTargetContainerDirective, DropTargetContainerDirective } from '@progress/kendo-angular-utils';
76
76
  import { RowReorderService } from './row-reordering/row-reorder.service';
77
77
  import { StatusBarTemplateDirective } from './aggregates/status-bar-template.directive';
@@ -101,6 +101,7 @@ import { AdaptiveRendererComponent } from './adaptiveness/adaptive-renderer.comp
101
101
  import { ColumnMenuService } from './column-menu/column-menu.service';
102
102
  import { MenuTabbingService } from './filtering/menu/menu-tabbing.service';
103
103
  import { DataMappingService } from './data/data-mapping.service';
104
+ import { AIAssistantToolbarDirective } from './rendering/toolbar/tools/ai-assistant/ai-tool.directive';
104
105
  import * as i0 from "@angular/core";
105
106
  import * as i1 from "./layout/browser-support.service";
106
107
  import * as i2 from "./selection/selection.service";
@@ -141,7 +142,7 @@ const handleExpandCollapseGroupsService = (service, expandEmitter, collapseEmitt
141
142
  .subscribe((x) => x.expand ? expandEmitter.emit(map(x)) : collapseEmitter.emit(map(x))));
142
143
  const handleExpandCollapseDetailsService = (service, expandEmitter, collapseEmitter, map) => (service.changes.pipe(filter(({ dataItem }) => isPresent(dataItem)))
143
144
  .subscribe((x) => x.expand ? expandEmitter.emit(map(x)) : collapseEmitter.emit(map(x))));
144
- const isInEditedCell = (element, gridElement) => closest(element, matchesClasses('k-grid-edit-cell')) &&
145
+ const isInEditedCell = (element, gridElement, isStacked = false) => (closest(element, matchesClasses('k-grid-edit-cell')) || (isStacked && closest(element, matchesClasses('k-grid-stack-edit-cell')))) &&
145
146
  closest(element, matchesNodeName('kendo-grid')) === gridElement;
146
147
  const NOTIFY_DELAY = 500;
147
148
  /**
@@ -388,7 +389,7 @@ export class GridComponent {
388
389
  * @hidden
389
390
  */
390
391
  get isLocked() {
391
- return this.lockedLeafColumns.length > 0;
392
+ return (this.lockedLeafColumns.length > 0 && !this.isStacked);
392
393
  }
393
394
  /**
394
395
  * @hidden
@@ -414,7 +415,9 @@ export class GridComponent {
414
415
  * @hidden
415
416
  */
416
417
  get showGroupPanel() {
417
- return this.groupable && this.groupable.enabled !== false;
418
+ const isGroupable = this.groupable && this.groupable.enabled !== false;
419
+ const isGrouped = this.group?.length > 0;
420
+ return this.isStacked ? isGroupable && isGrouped : isGroupable;
418
421
  }
419
422
  /**
420
423
  * @hidden
@@ -692,6 +695,12 @@ export class GridComponent {
692
695
  get isGroupExpanded() {
693
696
  return this.groupsService.userCallback;
694
697
  }
698
+ /**
699
+ * Sets the Grid data layout display mode.
700
+ *
701
+ * @default 'columns'
702
+ */
703
+ dataLayoutMode = 'columns';
695
704
  /**
696
705
  * Fires when the Grid data is filtered through the UI and the filter descriptor changes.
697
706
  */
@@ -819,8 +828,11 @@ export class GridComponent {
819
828
  get sizeMediumClass() {
820
829
  return this.size === 'medium' || !this.size;
821
830
  }
831
+ get stackedClass() {
832
+ return this.dataLayoutMode === 'stacked';
833
+ }
822
834
  get lockedClasses() {
823
- return this.lockedLeafColumns.length > 0;
835
+ return this.lockedLeafColumns.length > 0 && !this.isStacked;
824
836
  }
825
837
  get virtualClasses() {
826
838
  return this.isVirtual;
@@ -914,6 +926,7 @@ export class GridComponent {
914
926
  this._customToolbarTemplate = customToolbarTemplate;
915
927
  }
916
928
  columnMenuTemplates;
929
+ aiAssistantToolbarTool;
917
930
  lockedHeader;
918
931
  header;
919
932
  footer = new QueryList();
@@ -921,6 +934,7 @@ export class GridComponent {
921
934
  dragTargetContainer;
922
935
  dropTargetContainer;
923
936
  dialogContainer;
937
+ windowContainer;
924
938
  adaptiveRenderer;
925
939
  listComponent;
926
940
  get scrollbarWidth() {
@@ -973,6 +987,10 @@ export class GridComponent {
973
987
  selectionDirective = false;
974
988
  ariaRootId = `k-${guid()}`;
975
989
  showLicenseWatermark = false;
990
+ /**
991
+ * @hidden
992
+ */
993
+ licenseMessage;
976
994
  columnsContainer = new ColumnsContainer(() => this.columnList.filterHierarchy(column => {
977
995
  if (!isUniversal()) {
978
996
  column.matchesMedia = this.matchesMedia(column);
@@ -1038,6 +1056,12 @@ export class GridComponent {
1038
1056
  get isScrollable() {
1039
1057
  return this.scrollable !== 'none';
1040
1058
  }
1059
+ /**
1060
+ * @hidden
1061
+ */
1062
+ get isStacked() {
1063
+ return typeof this.dataLayoutMode === 'string' ? this.dataLayoutMode !== 'columns' : this.dataLayoutMode.mode !== 'columns';
1064
+ }
1041
1065
  get visibleColumns() {
1042
1066
  return this.columnsContainer.allColumns;
1043
1067
  }
@@ -1075,11 +1099,14 @@ export class GridComponent {
1075
1099
  return this.nonLockedLeafColumns;
1076
1100
  }
1077
1101
  get lockedWidth() {
1102
+ if (this.isStacked) {
1103
+ return 0;
1104
+ }
1078
1105
  const groupCellsWidth = this.group.length * GROUP_CELL_WIDTH;
1079
1106
  return expandColumns(this.lockedLeafColumns.toArray()).reduce((prev, curr) => prev + (curr.width || 0), groupCellsWidth);
1080
1107
  }
1081
1108
  get nonLockedWidth() {
1082
- if ((!this.rtl && this.lockedLeafColumns.length) || this.virtualColumns) {
1109
+ if (((!this.rtl && this.lockedLeafColumns.length) || this.virtualColumns) && !this.isStacked) {
1083
1110
  return !this.virtualColumns ? this.columnsContainer.unlockedWidth :
1084
1111
  this.leafViewportColumns.reduce((acc, column) => acc + (column.width || 0), 0);
1085
1112
  }
@@ -1105,7 +1132,7 @@ export class GridComponent {
1105
1132
  * @hidden
1106
1133
  */
1107
1134
  getDefaultSelectors(type) {
1108
- return this.rowReorderService.defaultSelectors[type];
1135
+ return this.rowReorderService.defaultSelectors(this.isStacked)[type];
1109
1136
  }
1110
1137
  /**
1111
1138
  * @hidden
@@ -1176,8 +1203,10 @@ export class GridComponent {
1176
1203
  this.rowReorderService = rowReorderService;
1177
1204
  this.dataMappingService = dataMappingService;
1178
1205
  const isValid = validatePackage(packageMetadata);
1206
+ this.licenseMessage = getLicenseMessage(packageMetadata);
1179
1207
  this.showLicenseWatermark = shouldShowValidationUI(isValid);
1180
1208
  this.ctx.grid = this;
1209
+ this.ctx.navigable = typeof this.navigable === 'boolean' ? this.navigable : this.navigable.includes('table');
1181
1210
  this.groupChange = new ZoneAwareEventEmitter(this.ngZone);
1182
1211
  this.cellClick = new ZoneAwareEventEmitter(this.ngZone);
1183
1212
  this.columnResize = new ZoneAwareEventEmitter(this.ngZone);
@@ -1215,6 +1244,7 @@ export class GridComponent {
1215
1244
  this.columnReorderSubscription = this.columnReorderService
1216
1245
  .changes.subscribe(this.reorder.bind(this));
1217
1246
  this.columnRangeChangeSubscription = this.columnInfoService.columnRangeChange.subscribe(this.onColumnRangeChange.bind(this));
1247
+ this.columnsContainer.isStacked = this.isStacked;
1218
1248
  }
1219
1249
  /**
1220
1250
  * Expands the master row at the specified data row index ([see example]({% slug hierarchy_grid %})).
@@ -1335,6 +1365,15 @@ export class GridComponent {
1335
1365
  }
1336
1366
  }
1337
1367
  }
1368
+ if (isChanged('dataLayoutMode', changes)) {
1369
+ if (this.isStacked) {
1370
+ this.generateStackedColumns();
1371
+ }
1372
+ else {
1373
+ this.stackedColumns = { columns: [], areDefault: false };
1374
+ }
1375
+ this.columnsContainer.isStacked = this.isStacked;
1376
+ }
1338
1377
  }
1339
1378
  ngAfterContentInit() {
1340
1379
  this.shouldGenerateColumns = !this.columns.length;
@@ -1361,6 +1400,7 @@ export class GridComponent {
1361
1400
  if (this.navigable.length) {
1362
1401
  this.navigationService.init(this.navigationMetadata(), this.navigable);
1363
1402
  }
1403
+ this.isStacked && this.generateStackedColumns();
1364
1404
  }
1365
1405
  ngOnDestroy() {
1366
1406
  if (this.selectionSubscription) {
@@ -1531,7 +1571,7 @@ export class GridComponent {
1531
1571
  editCell(rowIndex, column, group) {
1532
1572
  const instance = this.columnInstance(column);
1533
1573
  this.editService.editCell(rowIndex, instance, group);
1534
- this.focusEditElement('.k-grid-edit-cell');
1574
+ this.focusEditElement(this.isStacked ? '.k-grid-stack-edit-cell' : '.k-grid-edit-cell');
1535
1575
  }
1536
1576
  /**
1537
1577
  * Closes the current cell in edit mode and fires the [`cellClose`]({% slug api_grid_gridcomponent %}#toc-cellclose) event.
@@ -1912,7 +1952,8 @@ export class GridComponent {
1912
1952
  isRowSelectable: this.isRowSelectable,
1913
1953
  selectable: this.selectable,
1914
1954
  view: this.view,
1915
- columns: cellSelectionMode ? this.columnList.toArray() : undefined
1955
+ columns: cellSelectionMode ? this.columnList.toArray() : undefined,
1956
+ isStacked: this.isStacked
1916
1957
  });
1917
1958
  if (!this.selectionDirective && !this.selectableSettings.enabled) {
1918
1959
  this.defaultSelection.reset();
@@ -1966,7 +2007,7 @@ export class GridComponent {
1966
2007
  if (this.lockedLeafColumns.length && !this.nonLockedLeafColumns.length) {
1967
2008
  console.warn(GridConfigurationErrorMessages.nonLockedColumnPresent);
1968
2009
  }
1969
- if ((locked || this.virtualColumns) && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {
2010
+ if (!this.isStacked && (locked || this.virtualColumns) && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {
1970
2011
  console.warn(ColumnConfigurationErrorMessages.requiredWidth(locked ? 'Locked' : 'Virtual'));
1971
2012
  }
1972
2013
  if (locked && !this.isScrollable) {
@@ -1990,7 +2031,7 @@ export class GridComponent {
1990
2031
  if (!this.detailRowHeight && this.isVirtual && this.detailTemplate) {
1991
2032
  console.warn(GridConfigurationErrorMessages.rowHeightVirtual);
1992
2033
  }
1993
- if (stickyColumns && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {
2034
+ if (!this.isStacked && stickyColumns && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {
1994
2035
  console.warn(ColumnConfigurationErrorMessages.requiredWidth('Sticky'));
1995
2036
  }
1996
2037
  if (this.rowSticky && this.scrollable === 'virtual') {
@@ -2014,6 +2055,47 @@ export class GridComponent {
2014
2055
  }));
2015
2056
  }
2016
2057
  }
2058
+ /**
2059
+ * @hidden
2060
+ */
2061
+ stackedColumns = { columns: [], areDefault: false };
2062
+ generateStackedColumns() {
2063
+ if (!this.isStacked || !isPresent(this.dataLayoutMode)) {
2064
+ return;
2065
+ }
2066
+ this.stackedColumns.columns = [];
2067
+ if (typeof this.dataLayoutMode === 'object') {
2068
+ if (this.dataLayoutMode.mode === 'stacked' && this.dataLayoutMode.stackedLayoutSettings?.cols) {
2069
+ const columns = this.dataLayoutMode.stackedLayoutSettings.cols;
2070
+ if (typeof columns === 'number') {
2071
+ for (let i = 0; i < columns; i++) {
2072
+ const currCol = { width: `${this.wrapper.nativeElement.clientWidth / columns}px` };
2073
+ this.stackedColumns.columns.push(currCol);
2074
+ }
2075
+ this.stackedColumns.areDefault = true;
2076
+ }
2077
+ else if (Array.isArray(columns)) {
2078
+ this.stackedColumns.columns = columns.map((colSize) => {
2079
+ const stackedColumn = {};
2080
+ if (typeof colSize === 'number') {
2081
+ stackedColumn.width = `${colSize}px`;
2082
+ }
2083
+ else if (typeof colSize === 'object' && colSize?.width) {
2084
+ stackedColumn.width = typeof colSize.width === 'number' ? `${colSize.width}px` : colSize.width;
2085
+ }
2086
+ else if (typeof colSize === 'string') {
2087
+ stackedColumn.width = colSize;
2088
+ }
2089
+ return stackedColumn;
2090
+ });
2091
+ this.stackedColumns.areDefault = false;
2092
+ }
2093
+ }
2094
+ }
2095
+ else {
2096
+ this.stackedColumns = { columns: [{ width: this.wrapper.nativeElement.clientWidth }], areDefault: true };
2097
+ }
2098
+ }
2017
2099
  attachStateChangesEmitter() {
2018
2100
  this.stateChangeSubscription =
2019
2101
  merge(this.pageChange.pipe(map(x => ({
@@ -2096,14 +2178,14 @@ export class GridComponent {
2096
2178
  !closest(args.target, matchesClasses('k-animation-container k-grid-ignore-click')) &&
2097
2179
  !(activeElement &&
2098
2180
  (closest(activeElement, matchesClasses('k-animation-container')) ||
2099
- isInEditedCell(activeElement, this.wrapper.nativeElement)))) {
2181
+ isInEditedCell(activeElement, this.wrapper.nativeElement, this.isStacked)))) {
2100
2182
  this.editService.closeCell(args);
2101
2183
  }
2102
2184
  });
2103
2185
  const windowBlurSubscription = this.renderer.listen('window', 'blur', (args) => {
2104
2186
  const activeElement = document.activeElement;
2105
2187
  if (activeElement && !(matchesNodeName('input')(activeElement) && activeElement.type === 'file' &&
2106
- isInEditedCell(activeElement, this.wrapper.nativeElement))) {
2188
+ isInEditedCell(activeElement, this.wrapper.nativeElement, this.isStacked))) {
2107
2189
  this.editService.closeCell(args);
2108
2190
  }
2109
2191
  this.domEvents.windowBlur.emit(args);
@@ -2222,8 +2304,8 @@ export class GridComponent {
2222
2304
  const dataRows = isVirtual ? this.view.total : pageSize;
2223
2305
  const addRowOffset = this.editService.hasNewItem ? 1 : 0;
2224
2306
  const filterRowOffset = hasFilterRow(this.filterable) ? 1 : 0;
2225
- const headerRows = this.totalColumnLevels + 1 + filterRowOffset + addRowOffset;
2226
- return new NavigationMetadata(dataRows, headerRows, isVirtual, this.hasPager, isPresent(this.detailTemplate), this.wrapper, this.virtualColumns, this.columnsContainer);
2307
+ const headerRows = this.isStacked ? 0 : this.totalColumnLevels + 1 + filterRowOffset + addRowOffset;
2308
+ return new NavigationMetadata(dataRows, headerRows, isVirtual, this.hasPager, isPresent(this.detailTemplate), this.wrapper, this.virtualColumns, this.columnsContainer, this.isStacked);
2227
2309
  }
2228
2310
  applyAutoSize() {
2229
2311
  const cols = this.columns.filter((c) => this.autoSize ? c.autoSize !== false : c.autoSize);
@@ -2328,7 +2410,7 @@ export class GridComponent {
2328
2410
  this.dropTargetContainer?.notify();
2329
2411
  }
2330
2412
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GridComponent, deps: [{ token: i1.BrowserSupportService }, { token: i2.SelectionService }, { token: i3.CellSelectionService }, { token: i0.ElementRef }, { token: i4.GroupInfoService }, { token: i5.GroupsService }, { token: i6.ChangeNotificationService }, { token: i7.DetailsService }, { token: i8.EditService }, { token: i9.FilterService }, { token: i10.PDFService }, { token: i11.ResponsiveService }, { token: i0.Renderer2 }, { token: i12.ExcelService }, { token: i0.NgZone }, { token: i13.ScrollSyncService }, { token: i14.DomEventsService }, { token: i15.ColumnResizingService }, { token: i0.ChangeDetectorRef }, { token: i16.ColumnReorderService }, { token: i17.ColumnInfoService }, { token: i18.NavigationService }, { token: i19.SortService }, { token: i20.ScrollRequestService }, { token: i21.LocalizationService }, { token: i22.ContextService }, { token: i23.SizingOptionsService }, { token: i24.AdaptiveGridService }, { token: i25.RowReorderService }, { token: i26.DataMappingService }], target: i0.ɵɵFactoryTarget.Component });
2331
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GridComponent, isStandalone: true, selector: "kendo-grid", inputs: { data: "data", pageSize: "pageSize", height: "height", rowHeight: "rowHeight", adaptiveMode: "adaptiveMode", detailRowHeight: "detailRowHeight", skip: "skip", scrollable: "scrollable", selectable: "selectable", sort: "sort", size: "size", trackBy: "trackBy", filter: "filter", group: "group", virtualColumns: "virtualColumns", filterable: "filterable", sortable: "sortable", pageable: "pageable", groupable: "groupable", gridResizable: "gridResizable", rowReorderable: "rowReorderable", navigable: "navigable", autoSize: "autoSize", rowClass: "rowClass", rowSticky: "rowSticky", rowSelected: "rowSelected", isRowSelectable: "isRowSelectable", cellSelected: "cellSelected", resizable: "resizable", reorderable: "reorderable", loading: "loading", columnMenu: "columnMenu", hideHeader: "hideHeader", showInactiveTools: "showInactiveTools", isDetailExpanded: "isDetailExpanded", isGroupExpanded: "isGroupExpanded" }, outputs: { filterChange: "filterChange", pageChange: "pageChange", groupChange: "groupChange", sortChange: "sortChange", selectionChange: "selectionChange", rowReorder: "rowReorder", dataStateChange: "dataStateChange", gridStateChange: "gridStateChange", groupExpand: "groupExpand", groupCollapse: "groupCollapse", detailExpand: "detailExpand", detailCollapse: "detailCollapse", edit: "edit", cancel: "cancel", save: "save", remove: "remove", add: "add", cellClose: "cellClose", cellClick: "cellClick", pdfExport: "pdfExport", excelExport: "excelExport", columnResize: "columnResize", columnReorder: "columnReorder", columnVisibilityChange: "columnVisibilityChange", columnLockedChange: "columnLockedChange", columnStickyChange: "columnStickyChange", scrollBottom: "scrollBottom", contentScroll: "contentScroll" }, host: { properties: { "attr.dir": "this.dir", "class.k-grid": "this.hostClass", "class.k-grid-sm": "this.sizeSmallClass", "class.k-grid-md": "this.sizeMediumClass", "class.k-grid-lockedcolumns": "this.lockedClasses", "class.k-grid-virtual": "this.virtualClasses", "class.k-grid-no-scrollbar": "this.noScrollbarClass", "class.k-grid-resizable": "this.isResizable", "style.minWidth": "this.minWidth", "style.maxWidth": "this.maxWidth", "style.minHeight": "this.minHeight", "style.maxHeight": "this.maxHeight" } }, providers: [
2413
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GridComponent, isStandalone: true, selector: "kendo-grid", inputs: { data: "data", pageSize: "pageSize", height: "height", rowHeight: "rowHeight", adaptiveMode: "adaptiveMode", detailRowHeight: "detailRowHeight", skip: "skip", scrollable: "scrollable", selectable: "selectable", sort: "sort", size: "size", trackBy: "trackBy", filter: "filter", group: "group", virtualColumns: "virtualColumns", filterable: "filterable", sortable: "sortable", pageable: "pageable", groupable: "groupable", gridResizable: "gridResizable", rowReorderable: "rowReorderable", navigable: "navigable", autoSize: "autoSize", rowClass: "rowClass", rowSticky: "rowSticky", rowSelected: "rowSelected", isRowSelectable: "isRowSelectable", cellSelected: "cellSelected", resizable: "resizable", reorderable: "reorderable", loading: "loading", columnMenu: "columnMenu", hideHeader: "hideHeader", showInactiveTools: "showInactiveTools", isDetailExpanded: "isDetailExpanded", isGroupExpanded: "isGroupExpanded", dataLayoutMode: "dataLayoutMode" }, outputs: { filterChange: "filterChange", pageChange: "pageChange", groupChange: "groupChange", sortChange: "sortChange", selectionChange: "selectionChange", rowReorder: "rowReorder", dataStateChange: "dataStateChange", gridStateChange: "gridStateChange", groupExpand: "groupExpand", groupCollapse: "groupCollapse", detailExpand: "detailExpand", detailCollapse: "detailCollapse", edit: "edit", cancel: "cancel", save: "save", remove: "remove", add: "add", cellClose: "cellClose", cellClick: "cellClick", pdfExport: "pdfExport", excelExport: "excelExport", columnResize: "columnResize", columnReorder: "columnReorder", columnVisibilityChange: "columnVisibilityChange", columnLockedChange: "columnLockedChange", columnStickyChange: "columnStickyChange", scrollBottom: "scrollBottom", contentScroll: "contentScroll" }, host: { properties: { "attr.dir": "this.dir", "class.k-grid": "this.hostClass", "class.k-grid-sm": "this.sizeSmallClass", "class.k-grid-md": "this.sizeMediumClass", "class.k-grid-stack": "this.stackedClass", "class.k-grid-lockedcolumns": "this.lockedClasses", "class.k-grid-virtual": "this.virtualClasses", "class.k-grid-no-scrollbar": "this.noScrollbarClass", "class.k-grid-resizable": "this.isResizable", "style.minWidth": "this.minWidth", "style.maxWidth": "this.maxWidth", "style.minHeight": "this.minHeight", "style.maxHeight": "this.maxHeight" } }, providers: [
2332
2414
  BrowserSupportService,
2333
2415
  LocalizationService,
2334
2416
  ColumnInfoService,
@@ -2379,7 +2461,7 @@ export class GridComponent {
2379
2461
  ColumnMenuService,
2380
2462
  MenuTabbingService,
2381
2463
  DataMappingService
2382
- ], queries: [{ propertyName: "columns", predicate: ColumnBase }, { propertyName: "detailTemplateChildren", predicate: DetailTemplateDirective }, { propertyName: "cellLoadingTemplateChildren", predicate: CellLoadingTemplateDirective }, { propertyName: "loadingTemplateChildren", predicate: LoadingTemplateDirective }, { propertyName: "statusBarTemplateChildren", predicate: StatusBarTemplateDirective }, { propertyName: "noRecordsTemplateChildren", predicate: NoRecordsTemplateDirective }, { propertyName: "pagerTemplateChildren", predicate: PagerTemplateDirective }, { propertyName: "toolbarTemplateChildren", predicate: ToolbarTemplateDirective }, { propertyName: "columnMenuTemplates", predicate: ColumnMenuTemplateDirective }], viewQueries: [{ propertyName: "lockedHeader", first: true, predicate: ["lockedHeader"], descendants: true }, { propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "ariaRoot", first: true, predicate: ["ariaRoot"], descendants: true, static: true }, { propertyName: "dragTargetContainer", first: true, predicate: DragTargetContainerDirective, descendants: true }, { propertyName: "dropTargetContainer", first: true, predicate: DropTargetContainerDirective, descendants: true }, { propertyName: "dialogContainer", first: true, predicate: ["dialogContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "adaptiveRenderer", first: true, predicate: AdaptiveRendererComponent, descendants: true }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "footer", predicate: ["footer"], descendants: true }], exportAs: ["kendoGrid"], usesOnChanges: true, ngImport: i0, template: `
2464
+ ], queries: [{ propertyName: "aiAssistantToolbarTool", first: true, predicate: AIAssistantToolbarDirective, descendants: true }, { propertyName: "columns", predicate: ColumnBase }, { propertyName: "detailTemplateChildren", predicate: DetailTemplateDirective }, { propertyName: "cellLoadingTemplateChildren", predicate: CellLoadingTemplateDirective }, { propertyName: "loadingTemplateChildren", predicate: LoadingTemplateDirective }, { propertyName: "statusBarTemplateChildren", predicate: StatusBarTemplateDirective }, { propertyName: "noRecordsTemplateChildren", predicate: NoRecordsTemplateDirective }, { propertyName: "pagerTemplateChildren", predicate: PagerTemplateDirective }, { propertyName: "toolbarTemplateChildren", predicate: ToolbarTemplateDirective }, { propertyName: "columnMenuTemplates", predicate: ColumnMenuTemplateDirective }], viewQueries: [{ propertyName: "lockedHeader", first: true, predicate: ["lockedHeader"], descendants: true }, { propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "ariaRoot", first: true, predicate: ["ariaRoot"], descendants: true, static: true }, { propertyName: "dragTargetContainer", first: true, predicate: DragTargetContainerDirective, descendants: true }, { propertyName: "dropTargetContainer", first: true, predicate: DropTargetContainerDirective, descendants: true }, { propertyName: "dialogContainer", first: true, predicate: ["dialogContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "windowContainer", first: true, predicate: ["windowContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "adaptiveRenderer", first: true, predicate: AdaptiveRendererComponent, descendants: true }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "footer", predicate: ["footer"], descendants: true }], exportAs: ["kendoGrid"], usesOnChanges: true, ngImport: i0, template: `
2383
2465
  <ng-container kendoGridLocalizedMessages
2384
2466
  i18n-groupPanelEmpty="kendo.grid.groupPanelEmpty|The label visible in the Grid group panel when it is empty"
2385
2467
  groupPanelEmpty="Drag a column header and drop it here to group by that column"
@@ -2612,10 +2694,10 @@ export class GridComponent {
2612
2694
  i18n-columnsReset="kendo.grid.columnsReset|The text shown in the column menu or column chooser for the columns reset button"
2613
2695
  columnsReset="Reset"
2614
2696
 
2615
- i18n-detailExpand="kendo.grid.detailExpand|The title of the expand icon of detail rows."
2697
+ i18n-detailExpand="kendo.grid.detailExpand|The title of the expand icon of detail rows. Applies also to the expand button text in stacked mode."
2616
2698
  detailExpand="Expand Details"
2617
2699
 
2618
- i18n-detailCollapse="kendo.grid.detailCollapse|The title of the collapse icon of detail rows."
2700
+ i18n-detailCollapse="kendo.grid.detailCollapse|The title of the collapse icon of detail rows. Applies also to the collapse button text in stacked mode."
2619
2701
  detailCollapse="Collapse Details"
2620
2702
 
2621
2703
  i18n-filterDateToday="kendo.grid.filterDateToday|The text of the Today button of the Date filter."
@@ -2725,6 +2807,33 @@ export class GridComponent {
2725
2807
 
2726
2808
  i18n-externalEditingCancelText="kendo.grid.externalEditingCancelText|The text of the external editing form Cancel button"
2727
2809
  externalEditingCancelText="Cancel"
2810
+
2811
+ i18n-aiAssistantToolbarToolText="kendo.grid.aiAssistantToolbarToolText|The text of the AI Assistant toolbar tool"
2812
+ aiAssistantToolbarToolText="AI Assistant"
2813
+
2814
+ i18n-aiAssistantWindowTitle="kendo.grid.aiAssistantWindowTitle|The text of the AI Assistant Window title"
2815
+ aiAssistantWindowTitle="AI Assistant"
2816
+
2817
+ i18n-aiAssistantApplyButtonText="kendo.grid.aiAssistantApplyButtonText|The text of the AI Assistant Apply button"
2818
+ aiAssistantApplyButtonText="Apply"
2819
+
2820
+ i18n-aiAssistantWindowCloseTitle="kendo.grid.aiAssistantWindowCloseTitle|The title of the AI Assistant Window close button"
2821
+ aiAssistantWindowCloseTitle="Close"
2822
+
2823
+ i18n-aiAssistantWindowMaximizeTitle="kendo.grid.aiAssistantWindowMaximizeTitle|The title of the AI Assistant Window maximize button"
2824
+ aiAssistantWindowMaximizeTitle="Maximize"
2825
+
2826
+ i18n-aiAssistantWindowMinimizeTitle="kendo.grid.aiAssistantWindowMinimizeTitle|The title of the AI Assistant Window minimize button"
2827
+ aiAssistantWindowMinimizeTitle="Minimize"
2828
+
2829
+ i18n-aiAssistantWindowRestoreTitle="kendo.grid.aiAssistantWindowRestoreTitle|The title of the AI Assistant Window restore button"
2830
+ aiAssistantWindowRestoreTitle="Restore"
2831
+
2832
+ i18n-aiAssistantOutputCardTitle="kendo.grid.aiAssistantOutputCardTitle|The title of the AI Assistant Prompt Output Card"
2833
+ aiAssistantOutputCardTitle="Generated with AI"
2834
+
2835
+ i18n-aiAssistantOutputCardBodyContent="kendo.grid.aiAssistantOutputCardBodyContent|The success message dispayed in the AI Assistant Prompt Output Card's body"
2836
+ aiAssistantOutputCardBodyContent="Operation is successful. Data is:"
2728
2837
  >
2729
2838
  </ng-container>
2730
2839
  <kendo-grid-toolbar
@@ -2810,7 +2919,7 @@ export class GridComponent {
2810
2919
  [attr.aria-rowcount]="ariaRowCount"
2811
2920
  [attr.aria-colcount]="ariaColCount">
2812
2921
  <ng-container *ngIf="isScrollable">
2813
- <div *ngIf="!hideHeader"
2922
+ <div *ngIf="!hideHeader && !isStacked"
2814
2923
  class="k-grid-header"
2815
2924
  [class.k-grid-draggable-header]="groupable || reorderable"
2816
2925
  role="presentation"
@@ -2934,7 +3043,7 @@ export class GridComponent {
2934
3043
  class="k-grid-footer"
2935
3044
  [style.padding]="headerPadding">
2936
3045
  <div
2937
- *ngIf="lockedLeafColumns.length"
3046
+ *ngIf="lockedLeafColumns.length && !isStacked"
2938
3047
  class="k-grid-footer-locked"
2939
3048
  [style.width.px]="lockedWidth">
2940
3049
  <table
@@ -2945,7 +3054,7 @@ export class GridComponent {
2945
3054
  [style.width.px]="lockedWidth"
2946
3055
  kendoGridTable
2947
3056
  [size]="size">
2948
- <colgroup kendoGridColGroup
3057
+ <colgroup kendoGridColGroup *ngIf="!isStacked"
2949
3058
  [columns]="$any(lockedLeafColumns)"
2950
3059
  [groups]="group"
2951
3060
  [detailTemplate]="detailTemplate">
@@ -2963,7 +3072,7 @@ export class GridComponent {
2963
3072
  </div>
2964
3073
  <div #footer
2965
3074
  class="k-grid-footer-wrap" data-scrollable
2966
- [kendoGridResizableContainer]="lockedLeafColumns.length > 0"
3075
+ [kendoGridResizableContainer]="lockedLeafColumns.length > 0 && !isStacked"
2967
3076
  [lockedWidth]="lockedWidth + scrollbarWidth + 3">
2968
3077
  <table
2969
3078
  role="presentation"
@@ -2972,7 +3081,7 @@ export class GridComponent {
2972
3081
  kendoGridTable
2973
3082
  kendoGridResizableTable
2974
3083
  [size]="size">
2975
- <colgroup kendoGridColGroup
3084
+ <colgroup kendoGridColGroup *ngIf="!isStacked"
2976
3085
  [columns]="$any(headerLeafColumns)"
2977
3086
  [groups]="isLocked ? [] : group"
2978
3087
  [detailTemplate]="detailTemplate">
@@ -2982,7 +3091,7 @@ export class GridComponent {
2982
3091
  [scrollable]="true"
2983
3092
  [groups]="isLocked ? [] : group"
2984
3093
  [columns]="$any(headerColumns)"
2985
- [lockedColumnsCount]="lockedLeafColumns.length"
3094
+ [lockedColumnsCount]="isStacked ? 0 : lockedLeafColumns.length"
2986
3095
  [detailTemplate]="detailTemplate"
2987
3096
  [totalColumns]="columnsContainer"
2988
3097
  [totalColumnsCount]="leafColumns.length">
@@ -3006,7 +3115,7 @@ export class GridComponent {
3006
3115
  [detailTemplate]="detailTemplate">
3007
3116
  </colgroup>
3008
3117
  <thead kendoGridHeader
3009
- *ngIf="!hideHeader"
3118
+ *ngIf="!hideHeader && !isStacked"
3010
3119
  class="k-grid-header"
3011
3120
  [class.k-grid-draggable-header]="groupable || reorderable"
3012
3121
  role="rowgroup"
@@ -3144,8 +3253,10 @@ export class GridComponent {
3144
3253
 
3145
3254
  <kendo-grid-adaptive-renderer *ngIf="isAdaptiveModeEnabled"></kendo-grid-adaptive-renderer>
3146
3255
 
3147
- <div kendoWatermarkOverlay *ngIf="showLicenseWatermark"></div>
3148
- `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoGridLocalizedMessages]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: GridToolbarComponent, selector: "kendo-grid-toolbar", inputs: ["position", "size", "navigable"] }, { kind: "component", type: GroupPanelComponent, selector: "kendo-grid-group-panel", inputs: ["text", "navigable", "groups"], outputs: ["change"] }, { kind: "directive", type: TableDirective, selector: "[kendoGridResizableTable]", inputs: ["locked", "virtualColumns"] }, { kind: "directive", type: GridTableDirective, selector: "[kendoGridTable]", inputs: ["size"] }, { kind: "component", type: ColGroupComponent, selector: "[kendoGridColGroup]", inputs: ["columns", "groups", "detailTemplate", "sort"] }, { kind: "component", type: HeaderComponent, selector: "[kendoGridHeader]", inputs: ["totalColumnLevels", "columns", "groups", "detailTemplate", "scrollable", "filterable", "sort", "filter", "sortable", "groupable", "lockedColumnsCount", "resizable", "reorderable", "columnMenu", "columnMenuTemplate", "totalColumnsCount", "totalColumns", "tabIndex", "size"] }, { kind: "directive", type: ResizableContainerDirective, selector: "[kendoGridResizableContainer]", inputs: ["lockedWidth", "kendoGridResizableContainer"] }, { kind: "component", type: ListComponent, selector: "kendo-grid-list", inputs: ["data", "groups", "total", "rowHeight", "detailRowHeight", "take", "skip", "columns", "detailTemplate", "noRecordsTemplate", "selectable", "groupable", "filterable", "rowClass", "rowSticky", "loading", "trackBy", "virtualColumns", "isVirtual", "cellLoadingTemplate", "loadingTemplate", "sort", "size"], outputs: ["contentScroll", "pageChange", "scrollBottom"] }, { kind: "directive", type: DragTargetContainerDirective, selector: "[kendoDragTargetContainer]", inputs: ["hint", "dragTargetFilter", "dragHandle", "dragDelay", "threshold", "dragTargetId", "dragData", "dragDisabled", "mode", "cursorStyle", "hintContext"], outputs: ["onDragReady", "onPress", "onDragStart", "onDrag", "onRelease", "onDragEnd"], exportAs: ["kendoDragTargetContainer"] }, { kind: "directive", type: DropTargetContainerDirective, selector: "[kendoDropTargetContainer]", inputs: ["dropTargetFilter", "dropDisabled"], outputs: ["onDragEnter", "onDragOver", "onDragLeave", "onDrop"], exportAs: ["kendoDropTargetContainer"] }, { kind: "directive", type: DraggableDirective, selector: "[kendoDraggable]", inputs: ["enableDrag"], outputs: ["kendoPress", "kendoDrag", "kendoRelease"] }, { kind: "directive", type: GridMarqueeDirective, selector: "[kendoGridSelectionMarquee]" }, { kind: "component", type: FooterComponent, selector: "[kendoGridFooter]", inputs: ["columns", "groups", "detailTemplate", "scrollable", "lockedColumnsCount", "logicalRowIndex", "totalColumns", "totalColumnsCount"] }, { kind: "component", type: TableBodyComponent, selector: "[kendoGridTableBody]", inputs: ["columns", "allColumns", "groups", "detailTemplate", "noRecordsTemplate", "rowsToRender", "skip", "selectable", "filterable", "noRecordsText", "isLocked", "isLoading", "isVirtual", "cellLoadingTemplate", "skipGroupDecoration", "lockedColumnsCount", "totalColumnsCount", "virtualColumns", "trackBy", "rowSticky", "totalColumns", "rowClass"] }, { kind: "component", type: LoadingComponent, selector: "[kendoGridLoading]", inputs: ["loadingTemplate"] }, { kind: "component", type: StatusBarComponent, selector: "kendo-grid-status-bar", inputs: ["statusBarTemplate"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "component", type: WatermarkOverlayComponent, selector: "div[kendoWatermarkOverlay]" }, { kind: "component", type: i27.CustomMessagesComponent, selector: "kendo-datapager-messages, kendo-pager-messages" }, { kind: "component", type: i27.PagerInfoComponent, selector: "kendo-datapager-info, kendo-pager-info" }, { kind: "component", type: i27.PagerInputComponent, selector: "kendo-datapager-input, kendo-pager-input", inputs: ["showPageText", "size"] }, { kind: "component", type: i27.PagerNextButtonsComponent, selector: "kendo-datapager-next-buttons, kendo-pager-next-buttons", inputs: ["size"] }, { kind: "component", type: i27.PagerNumericButtonsComponent, selector: "kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons", inputs: ["buttonCount", "size"] }, { kind: "component", type: i27.PagerPageSizesComponent, selector: "kendo-datapager-page-sizes, kendo-pager-page-sizes", inputs: ["showItemsText", "pageSizes", "size", "adaptiveMode"] }, { kind: "component", type: i27.PagerPrevButtonsComponent, selector: "kendo-datapager-prev-buttons, kendo-pager-prev-buttons", inputs: ["size"] }, { kind: "directive", type: i27.PagerTemplateDirective, selector: "[kendoDataPagerTemplate], [kendoPagerTemplate]" }, { kind: "component", type: i27.PagerComponent, selector: "kendo-datapager, kendo-pager", inputs: ["externalTemplate", "total", "skip", "pageSize", "buttonCount", "info", "type", "pageSizeValues", "previousNext", "navigable", "size", "responsive", "adaptiveMode"], outputs: ["pageChange", "pageSizeChange", "pagerInputVisibilityChange", "pageTextVisibilityChange", "itemsTextVisibilityChange"], exportAs: ["kendoDataPager", "kendoPager"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AdaptiveRendererComponent, selector: "kendo-grid-adaptive-renderer" }], encapsulation: i0.ViewEncapsulation.None });
3256
+ <div *ngIf="aiAssistantToolbarTool" #windowContainer></div>
3257
+
3258
+ <div kendoWatermarkOverlay *ngIf="showLicenseWatermark" [licenseMessage]="licenseMessage"></div>
3259
+ `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoGridLocalizedMessages]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: GridToolbarComponent, selector: "kendo-grid-toolbar", inputs: ["position", "size", "navigable"] }, { kind: "component", type: GroupPanelComponent, selector: "kendo-grid-group-panel", inputs: ["text", "navigable", "groups"], outputs: ["change"] }, { kind: "directive", type: TableDirective, selector: "[kendoGridResizableTable]", inputs: ["locked", "virtualColumns"] }, { kind: "directive", type: GridTableDirective, selector: "[kendoGridTable]", inputs: ["size"] }, { kind: "component", type: ColGroupComponent, selector: "[kendoGridColGroup]", inputs: ["columns", "groups", "detailTemplate", "sort"] }, { kind: "component", type: HeaderComponent, selector: "[kendoGridHeader]", inputs: ["totalColumnLevels", "columns", "groups", "detailTemplate", "scrollable", "filterable", "sort", "filter", "sortable", "groupable", "lockedColumnsCount", "resizable", "reorderable", "columnMenu", "columnMenuTemplate", "totalColumnsCount", "totalColumns", "tabIndex", "size"] }, { kind: "directive", type: ResizableContainerDirective, selector: "[kendoGridResizableContainer]", inputs: ["lockedWidth", "kendoGridResizableContainer"] }, { kind: "component", type: ListComponent, selector: "kendo-grid-list", inputs: ["data", "groups", "total", "rowHeight", "detailRowHeight", "take", "skip", "columns", "detailTemplate", "noRecordsTemplate", "selectable", "groupable", "filterable", "rowClass", "rowSticky", "loading", "trackBy", "virtualColumns", "isVirtual", "cellLoadingTemplate", "loadingTemplate", "sort", "size"], outputs: ["contentScroll", "pageChange", "scrollBottom"] }, { kind: "directive", type: DragTargetContainerDirective, selector: "[kendoDragTargetContainer]", inputs: ["hint", "dragTargetFilter", "dragHandle", "dragDelay", "threshold", "dragTargetId", "dragData", "dragDisabled", "mode", "cursorStyle", "hintContext"], outputs: ["onDragReady", "onPress", "onDragStart", "onDrag", "onRelease", "onDragEnd"], exportAs: ["kendoDragTargetContainer"] }, { kind: "directive", type: DropTargetContainerDirective, selector: "[kendoDropTargetContainer]", inputs: ["dropTargetFilter", "dropDisabled"], outputs: ["onDragEnter", "onDragOver", "onDragLeave", "onDrop"], exportAs: ["kendoDropTargetContainer"] }, { kind: "directive", type: DraggableDirective, selector: "[kendoDraggable]", inputs: ["enableDrag"], outputs: ["kendoPress", "kendoDrag", "kendoRelease"] }, { kind: "directive", type: GridMarqueeDirective, selector: "[kendoGridSelectionMarquee]" }, { kind: "component", type: FooterComponent, selector: "[kendoGridFooter]", inputs: ["columns", "groups", "detailTemplate", "scrollable", "lockedColumnsCount", "logicalRowIndex", "totalColumns", "totalColumnsCount"] }, { kind: "component", type: TableBodyComponent, selector: "[kendoGridTableBody]", inputs: ["columns", "allColumns", "groups", "detailTemplate", "noRecordsTemplate", "rowsToRender", "skip", "selectable", "filterable", "noRecordsText", "isLocked", "isLoading", "isVirtual", "cellLoadingTemplate", "skipGroupDecoration", "lockedColumnsCount", "totalColumnsCount", "virtualColumns", "trackBy", "rowSticky", "totalColumns", "rowClass"] }, { kind: "component", type: LoadingComponent, selector: "[kendoGridLoading]", inputs: ["loadingTemplate"] }, { kind: "component", type: StatusBarComponent, selector: "kendo-grid-status-bar", inputs: ["statusBarTemplate"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "component", type: WatermarkOverlayComponent, selector: "div[kendoWatermarkOverlay]", inputs: ["licenseMessage"] }, { kind: "component", type: i27.CustomMessagesComponent, selector: "kendo-datapager-messages, kendo-pager-messages" }, { kind: "component", type: i27.PagerInfoComponent, selector: "kendo-datapager-info, kendo-pager-info" }, { kind: "component", type: i27.PagerInputComponent, selector: "kendo-datapager-input, kendo-pager-input", inputs: ["showPageText", "size"] }, { kind: "component", type: i27.PagerNextButtonsComponent, selector: "kendo-datapager-next-buttons, kendo-pager-next-buttons", inputs: ["size"] }, { kind: "component", type: i27.PagerNumericButtonsComponent, selector: "kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons", inputs: ["buttonCount", "size"] }, { kind: "component", type: i27.PagerPageSizesComponent, selector: "kendo-datapager-page-sizes, kendo-pager-page-sizes", inputs: ["showItemsText", "pageSizes", "size", "adaptiveMode"] }, { kind: "component", type: i27.PagerPrevButtonsComponent, selector: "kendo-datapager-prev-buttons, kendo-pager-prev-buttons", inputs: ["size"] }, { kind: "directive", type: i27.PagerTemplateDirective, selector: "[kendoDataPagerTemplate], [kendoPagerTemplate]" }, { kind: "component", type: i27.PagerComponent, selector: "kendo-datapager, kendo-pager", inputs: ["externalTemplate", "total", "skip", "pageSize", "buttonCount", "info", "type", "pageSizeValues", "previousNext", "navigable", "size", "responsive", "adaptiveMode"], outputs: ["pageChange", "pageSizeChange", "pagerInputVisibilityChange", "pageTextVisibilityChange", "itemsTextVisibilityChange"], exportAs: ["kendoDataPager", "kendoPager"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AdaptiveRendererComponent, selector: "kendo-grid-adaptive-renderer" }], encapsulation: i0.ViewEncapsulation.None });
3149
3260
  }
3150
3261
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GridComponent, decorators: [{
3151
3262
  type: Component,
@@ -3438,10 +3549,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3438
3549
  i18n-columnsReset="kendo.grid.columnsReset|The text shown in the column menu or column chooser for the columns reset button"
3439
3550
  columnsReset="Reset"
3440
3551
 
3441
- i18n-detailExpand="kendo.grid.detailExpand|The title of the expand icon of detail rows."
3552
+ i18n-detailExpand="kendo.grid.detailExpand|The title of the expand icon of detail rows. Applies also to the expand button text in stacked mode."
3442
3553
  detailExpand="Expand Details"
3443
3554
 
3444
- i18n-detailCollapse="kendo.grid.detailCollapse|The title of the collapse icon of detail rows."
3555
+ i18n-detailCollapse="kendo.grid.detailCollapse|The title of the collapse icon of detail rows. Applies also to the collapse button text in stacked mode."
3445
3556
  detailCollapse="Collapse Details"
3446
3557
 
3447
3558
  i18n-filterDateToday="kendo.grid.filterDateToday|The text of the Today button of the Date filter."
@@ -3551,6 +3662,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3551
3662
 
3552
3663
  i18n-externalEditingCancelText="kendo.grid.externalEditingCancelText|The text of the external editing form Cancel button"
3553
3664
  externalEditingCancelText="Cancel"
3665
+
3666
+ i18n-aiAssistantToolbarToolText="kendo.grid.aiAssistantToolbarToolText|The text of the AI Assistant toolbar tool"
3667
+ aiAssistantToolbarToolText="AI Assistant"
3668
+
3669
+ i18n-aiAssistantWindowTitle="kendo.grid.aiAssistantWindowTitle|The text of the AI Assistant Window title"
3670
+ aiAssistantWindowTitle="AI Assistant"
3671
+
3672
+ i18n-aiAssistantApplyButtonText="kendo.grid.aiAssistantApplyButtonText|The text of the AI Assistant Apply button"
3673
+ aiAssistantApplyButtonText="Apply"
3674
+
3675
+ i18n-aiAssistantWindowCloseTitle="kendo.grid.aiAssistantWindowCloseTitle|The title of the AI Assistant Window close button"
3676
+ aiAssistantWindowCloseTitle="Close"
3677
+
3678
+ i18n-aiAssistantWindowMaximizeTitle="kendo.grid.aiAssistantWindowMaximizeTitle|The title of the AI Assistant Window maximize button"
3679
+ aiAssistantWindowMaximizeTitle="Maximize"
3680
+
3681
+ i18n-aiAssistantWindowMinimizeTitle="kendo.grid.aiAssistantWindowMinimizeTitle|The title of the AI Assistant Window minimize button"
3682
+ aiAssistantWindowMinimizeTitle="Minimize"
3683
+
3684
+ i18n-aiAssistantWindowRestoreTitle="kendo.grid.aiAssistantWindowRestoreTitle|The title of the AI Assistant Window restore button"
3685
+ aiAssistantWindowRestoreTitle="Restore"
3686
+
3687
+ i18n-aiAssistantOutputCardTitle="kendo.grid.aiAssistantOutputCardTitle|The title of the AI Assistant Prompt Output Card"
3688
+ aiAssistantOutputCardTitle="Generated with AI"
3689
+
3690
+ i18n-aiAssistantOutputCardBodyContent="kendo.grid.aiAssistantOutputCardBodyContent|The success message dispayed in the AI Assistant Prompt Output Card's body"
3691
+ aiAssistantOutputCardBodyContent="Operation is successful. Data is:"
3554
3692
  >
3555
3693
  </ng-container>
3556
3694
  <kendo-grid-toolbar
@@ -3636,7 +3774,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3636
3774
  [attr.aria-rowcount]="ariaRowCount"
3637
3775
  [attr.aria-colcount]="ariaColCount">
3638
3776
  <ng-container *ngIf="isScrollable">
3639
- <div *ngIf="!hideHeader"
3777
+ <div *ngIf="!hideHeader && !isStacked"
3640
3778
  class="k-grid-header"
3641
3779
  [class.k-grid-draggable-header]="groupable || reorderable"
3642
3780
  role="presentation"
@@ -3760,7 +3898,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3760
3898
  class="k-grid-footer"
3761
3899
  [style.padding]="headerPadding">
3762
3900
  <div
3763
- *ngIf="lockedLeafColumns.length"
3901
+ *ngIf="lockedLeafColumns.length && !isStacked"
3764
3902
  class="k-grid-footer-locked"
3765
3903
  [style.width.px]="lockedWidth">
3766
3904
  <table
@@ -3771,7 +3909,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3771
3909
  [style.width.px]="lockedWidth"
3772
3910
  kendoGridTable
3773
3911
  [size]="size">
3774
- <colgroup kendoGridColGroup
3912
+ <colgroup kendoGridColGroup *ngIf="!isStacked"
3775
3913
  [columns]="$any(lockedLeafColumns)"
3776
3914
  [groups]="group"
3777
3915
  [detailTemplate]="detailTemplate">
@@ -3789,7 +3927,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3789
3927
  </div>
3790
3928
  <div #footer
3791
3929
  class="k-grid-footer-wrap" data-scrollable
3792
- [kendoGridResizableContainer]="lockedLeafColumns.length > 0"
3930
+ [kendoGridResizableContainer]="lockedLeafColumns.length > 0 && !isStacked"
3793
3931
  [lockedWidth]="lockedWidth + scrollbarWidth + 3">
3794
3932
  <table
3795
3933
  role="presentation"
@@ -3798,7 +3936,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3798
3936
  kendoGridTable
3799
3937
  kendoGridResizableTable
3800
3938
  [size]="size">
3801
- <colgroup kendoGridColGroup
3939
+ <colgroup kendoGridColGroup *ngIf="!isStacked"
3802
3940
  [columns]="$any(headerLeafColumns)"
3803
3941
  [groups]="isLocked ? [] : group"
3804
3942
  [detailTemplate]="detailTemplate">
@@ -3808,7 +3946,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3808
3946
  [scrollable]="true"
3809
3947
  [groups]="isLocked ? [] : group"
3810
3948
  [columns]="$any(headerColumns)"
3811
- [lockedColumnsCount]="lockedLeafColumns.length"
3949
+ [lockedColumnsCount]="isStacked ? 0 : lockedLeafColumns.length"
3812
3950
  [detailTemplate]="detailTemplate"
3813
3951
  [totalColumns]="columnsContainer"
3814
3952
  [totalColumnsCount]="leafColumns.length">
@@ -3832,7 +3970,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3832
3970
  [detailTemplate]="detailTemplate">
3833
3971
  </colgroup>
3834
3972
  <thead kendoGridHeader
3835
- *ngIf="!hideHeader"
3973
+ *ngIf="!hideHeader && !isStacked"
3836
3974
  class="k-grid-header"
3837
3975
  [class.k-grid-draggable-header]="groupable || reorderable"
3838
3976
  role="rowgroup"
@@ -3970,7 +4108,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3970
4108
 
3971
4109
  <kendo-grid-adaptive-renderer *ngIf="isAdaptiveModeEnabled"></kendo-grid-adaptive-renderer>
3972
4110
 
3973
- <div kendoWatermarkOverlay *ngIf="showLicenseWatermark"></div>
4111
+ <div *ngIf="aiAssistantToolbarTool" #windowContainer></div>
4112
+
4113
+ <div kendoWatermarkOverlay *ngIf="showLicenseWatermark" [licenseMessage]="licenseMessage"></div>
3974
4114
  `,
3975
4115
  standalone: true,
3976
4116
  imports: [
@@ -4053,6 +4193,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4053
4193
  type: Input
4054
4194
  }], isGroupExpanded: [{
4055
4195
  type: Input
4196
+ }], dataLayoutMode: [{
4197
+ type: Input
4056
4198
  }], filterChange: [{
4057
4199
  type: Output
4058
4200
  }], pageChange: [{
@@ -4124,6 +4266,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4124
4266
  }], sizeMediumClass: [{
4125
4267
  type: HostBinding,
4126
4268
  args: ['class.k-grid-md']
4269
+ }], stackedClass: [{
4270
+ type: HostBinding,
4271
+ args: ['class.k-grid-stack']
4127
4272
  }], lockedClasses: [{
4128
4273
  type: HostBinding,
4129
4274
  args: ['class.k-grid-lockedcolumns']
@@ -4172,6 +4317,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4172
4317
  }], columnMenuTemplates: [{
4173
4318
  type: ContentChildren,
4174
4319
  args: [ColumnMenuTemplateDirective]
4320
+ }], aiAssistantToolbarTool: [{
4321
+ type: ContentChild,
4322
+ args: [AIAssistantToolbarDirective]
4175
4323
  }], lockedHeader: [{
4176
4324
  type: ViewChild,
4177
4325
  args: ['lockedHeader']
@@ -4193,6 +4341,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4193
4341
  }], dialogContainer: [{
4194
4342
  type: ViewChild,
4195
4343
  args: ['dialogContainer', { read: ViewContainerRef }]
4344
+ }], windowContainer: [{
4345
+ type: ViewChild,
4346
+ args: ['windowContainer', { read: ViewContainerRef }]
4196
4347
  }], adaptiveRenderer: [{
4197
4348
  type: ViewChild,
4198
4349
  args: [AdaptiveRendererComponent]