@progress/kendo-angular-grid 21.0.0-develop.9 → 21.0.1-develop.1

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 (36) hide show
  1. package/codemods/utils.js +485 -327
  2. package/codemods/v20/grid-kendogridgroupbinding.js +6 -6
  3. package/codemods/v21/grid-gridtoolbaraiopenevent.js +14 -0
  4. package/codemods/v21/grid-gridtoolbaraipromptrequestevent.js +14 -0
  5. package/codemods/v21/grid-gridtoolbaraipromptsettings.js +14 -0
  6. package/codemods/v21/grid-gridtoolbarairequestoptions.js +14 -0
  7. package/codemods/v21/grid-gridtoolbarairesponseerrorevent.js +14 -0
  8. package/codemods/v21/grid-gridtoolbaraiwindowsettings.js +14 -0
  9. package/column-menu/column-chooser.component.d.ts +0 -1
  10. package/common/id.service.d.ts +1 -0
  11. package/common/provider.service.d.ts +4 -0
  12. package/esm2022/column-menu/column-chooser.component.mjs +2 -7
  13. package/esm2022/columns/column-base.mjs +1 -1
  14. package/esm2022/common/id.service.mjs +3 -0
  15. package/esm2022/common/provider.service.mjs +2 -0
  16. package/esm2022/dragdrop/drag-hint.service.mjs +6 -2
  17. package/esm2022/excel/excel.component.mjs +13 -2
  18. package/esm2022/grid.component.mjs +18 -0
  19. package/esm2022/localization/messages.mjs +19 -1
  20. package/esm2022/navigation/navigation.service.mjs +47 -1
  21. package/esm2022/package-metadata.mjs +2 -2
  22. package/esm2022/pdf/pdf.component.mjs +6 -0
  23. package/esm2022/rendering/list.component.mjs +16 -5
  24. package/esm2022/rendering/toolbar/tools/ai-assistant/ai-assistant.component.mjs +557 -29
  25. package/esm2022/rendering/toolbar/tools/ai-assistant/models.mjs +2 -2
  26. package/esm2022/row-reordering/row-reorder.service.mjs +28 -0
  27. package/excel/excel.component.d.ts +6 -2
  28. package/fesm2022/progress-kendo-angular-grid.mjs +717 -49
  29. package/localization/messages.d.ts +13 -1
  30. package/navigation/navigation.service.d.ts +1 -0
  31. package/package.json +58 -25
  32. package/rendering/toolbar/tools/ai-assistant/ai-assistant.component.d.ts +26 -5
  33. package/rendering/toolbar/tools/ai-assistant/ai-tool.directive.d.ts +8 -8
  34. package/rendering/toolbar/tools/ai-assistant/models.d.ts +65 -33
  35. package/row-reordering/row-reorder.service.d.ts +10 -1
  36. package/schematics/ngAdd/index.js +7 -7
@@ -33,18 +33,18 @@ const utils_1 = require("../utils");
33
33
  const fs = __importStar(require("fs"));
34
34
  function default_1(fileInfo, api) {
35
35
  const filePath = fileInfo.path;
36
- // Check if the file is an HTML file
37
36
  if (filePath.endsWith('.html')) {
38
- let updatedContent = fileInfo.source;
39
- updatedContent = (0, utils_1.htmlAttributeTransformer)({ ...fileInfo, source: updatedContent }, 'kendo-grid', 'kendoGridGroupBinding', 'kendoGridBinding');
40
- // Only write to file once after all transformations
41
- fs.writeFileSync(filePath, updatedContent, 'utf-8');
37
+ if ((0, utils_1.hasKendoInTemplate)(fileInfo.source)) {
38
+ let updatedContent = fileInfo.source;
39
+ updatedContent = (0, utils_1.htmlAttributeTransformer)({ ...fileInfo, source: updatedContent }, 'kendo-grid', 'kendoGridGroupBinding', 'kendoGridBinding');
40
+ // Only write to file once after all transformations
41
+ fs.writeFileSync(filePath, updatedContent, 'utf-8');
42
+ }
42
43
  return;
43
44
  }
44
45
  const j = api.jscodeshift;
45
46
  const rootSource = j(fileInfo.source);
46
47
  (0, index_1.templateTransformer)(rootSource, j, (root) => {
47
- // Using node-html-parser to parse and manipulate the template: https://github.com/taoqf/node-html-parser
48
48
  (0, utils_1.templateAttributeTransformer)(root, 'kendo-grid', 'kendoGridGroupBinding', 'kendoGridBinding');
49
49
  });
50
50
  return rootSource.toSource();
@@ -0,0 +1,14 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ "use strict";
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.default = default_1;
8
+ const utils_1 = require("../utils");
9
+ function default_1(fileInfo, api) {
10
+ const j = api.jscodeshift;
11
+ const rootSource = j(fileInfo.source);
12
+ (0, utils_1.tsInterfaceTransformer)(fileInfo, rootSource, j, '@progress/kendo-angular-grid', 'GridToolbarAIOpenEvent', 'GridAIAssistantOpenEvent');
13
+ return rootSource.toSource();
14
+ }
@@ -0,0 +1,14 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ "use strict";
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.default = default_1;
8
+ const utils_1 = require("../utils");
9
+ function default_1(fileInfo, api) {
10
+ const j = api.jscodeshift;
11
+ const rootSource = j(fileInfo.source);
12
+ (0, utils_1.tsInterfaceTransformer)(fileInfo, rootSource, j, '@progress/kendo-angular-grid', 'GridToolbarAIPromptRequestEvent', 'GridAIAssistantRequestEvent');
13
+ return rootSource.toSource();
14
+ }
@@ -0,0 +1,14 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ "use strict";
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.default = default_1;
8
+ const utils_1 = require("../utils");
9
+ function default_1(fileInfo, api) {
10
+ const j = api.jscodeshift;
11
+ const rootSource = j(fileInfo.source);
12
+ (0, utils_1.tsInterfaceTransformer)(fileInfo, rootSource, j, '@progress/kendo-angular-grid', 'GridToolbarAIPromptSettings', 'GridAIAssistantPromptSettings');
13
+ return rootSource.toSource();
14
+ }
@@ -0,0 +1,14 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ "use strict";
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.default = default_1;
8
+ const utils_1 = require("../utils");
9
+ function default_1(fileInfo, api) {
10
+ const j = api.jscodeshift;
11
+ const rootSource = j(fileInfo.source);
12
+ (0, utils_1.tsInterfaceTransformer)(fileInfo, rootSource, j, '@progress/kendo-angular-grid', 'GridToolbarAIRequestOptions', 'GridAIRequestOptions');
13
+ return rootSource.toSource();
14
+ }
@@ -0,0 +1,14 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ "use strict";
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.default = default_1;
8
+ const utils_1 = require("../utils");
9
+ function default_1(fileInfo, api) {
10
+ const j = api.jscodeshift;
11
+ const rootSource = j(fileInfo.source);
12
+ (0, utils_1.tsInterfaceTransformer)(fileInfo, rootSource, j, '@progress/kendo-angular-grid', 'GridToolbarAIResponseErrorEvent', 'GridAIAssistantResponseErrorEvent');
13
+ return rootSource.toSource();
14
+ }
@@ -0,0 +1,14 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ "use strict";
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.default = default_1;
8
+ const utils_1 = require("../utils");
9
+ function default_1(fileInfo, api) {
10
+ const j = api.jscodeshift;
11
+ const rootSource = j(fileInfo.source);
12
+ (0, utils_1.tsInterfaceTransformer)(fileInfo, rootSource, j, '@progress/kendo-angular-grid', 'GridToolbarAIWindowSettings', 'GridAIAssistantWindowSettings');
13
+ return rootSource.toSource();
14
+ }
@@ -56,7 +56,6 @@ export declare class ColumnChooserComponent implements OnDestroy {
56
56
  */
57
57
  allowHideAll: boolean;
58
58
  private anchor;
59
- private columnList;
60
59
  get columns(): any[];
61
60
  columnsIcon: SVGIcon;
62
61
  popupRef: any;
@@ -13,6 +13,7 @@ export declare class IdService {
13
13
  cellId(rowIndex: number, colIndex: number): string;
14
14
  selectionCheckboxId(itemIndex: any): string;
15
15
  selectAllCheckboxId(): string;
16
+ columnId(colIndex: number): string;
16
17
  static ɵfac: i0.ɵɵFactoryDeclaration<IdService, never>;
17
18
  static ɵprov: i0.ɵɵInjectableDeclaration<IdService>;
18
19
  }
@@ -9,6 +9,8 @@ import { GridToolbarNavigationService } from '../rendering/toolbar/toolbar-navig
9
9
  import type { DataBindingDirective } from '../databinding.directive';
10
10
  import type { ScrollerService } from '../scrolling/scroller.service';
11
11
  import { HighlightDirective } from '../highlight/highlight.directive';
12
+ import type { ExcelComponent } from '../excel/excel.component';
13
+ import type { PDFComponent } from '../pdf/pdf.component';
12
14
  import * as i0 from "@angular/core";
13
15
  /**
14
16
  * @hidden
@@ -29,6 +31,8 @@ export declare class ContextService {
29
31
  scroller: ScrollerService;
30
32
  dataBindingDirective: DataBindingDirective;
31
33
  highlightDirective: HighlightDirective;
34
+ excelComponent?: ExcelComponent;
35
+ pdfComponent?: PDFComponent;
32
36
  constructor(renderer: Renderer2, localization: LocalizationService);
33
37
  static ɵfac: i0.ɵɵFactoryDeclaration<ContextService, never>;
34
38
  static ɵprov: i0.ɵɵInjectableDeclaration<ContextService>;
@@ -10,7 +10,6 @@ import { Keys, guid, isDocumentAvailable } from '@progress/kendo-angular-common'
10
10
  import { columnsIcon } from '@progress/kendo-svg-icons';
11
11
  import { ButtonComponent } from '@progress/kendo-angular-buttons';
12
12
  import { ContextService } from '../common/provider.service';
13
- import { ColumnListComponent } from './column-list.component';
14
13
  import { ColumnChooserContentComponent } from './column-chooser-content.component';
15
14
  import * as i0 from "@angular/core";
16
15
  import * as i1 from "../common/provider.service";
@@ -63,7 +62,6 @@ export class ColumnChooserComponent {
63
62
  */
64
63
  allowHideAll = true;
65
64
  anchor;
66
- columnList;
67
65
  get columns() {
68
66
  return this.columnInfoService.leafNamedColumns;
69
67
  }
@@ -158,7 +156,7 @@ export class ColumnChooserComponent {
158
156
  }
159
157
  }
160
158
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ColumnChooserComponent, deps: [{ token: i1.ContextService }, { token: i2.ColumnInfoService }, { token: i3.PopupService }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
161
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ColumnChooserComponent, isStandalone: true, selector: "kendo-grid-column-chooser", inputs: { autoSync: "autoSync", filterable: "filterable", showSelectAll: "showSelectAll", allowHideAll: "allowHideAll" }, viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true }, { propertyName: "columnList", first: true, predicate: ["columnList"], descendants: true }], ngImport: i0, template: `
159
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ColumnChooserComponent, isStandalone: true, selector: "kendo-grid-column-chooser", inputs: { autoSync: "autoSync", filterable: "filterable", showSelectAll: "showSelectAll", allowHideAll: "allowHideAll" }, viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true }], ngImport: i0, template: `
162
160
  <button #anchor
163
161
  kendoButton
164
162
  type="button"
@@ -216,7 +214,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
216
214
  </ng-template>
217
215
  `,
218
216
  standalone: true,
219
- imports: [ButtonComponent, ColumnListComponent, ColumnChooserContentComponent]
217
+ imports: [ButtonComponent, ColumnChooserContentComponent]
220
218
  }]
221
219
  }], ctorParameters: () => [{ type: i1.ContextService }, { type: i2.ColumnInfoService }, { type: i3.PopupService }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }], propDecorators: { autoSync: [{
222
220
  type: Input
@@ -229,7 +227,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
229
227
  }], anchor: [{
230
228
  type: ViewChild,
231
229
  args: ['anchor']
232
- }], columnList: [{
233
- type: ViewChild,
234
- args: ['columnList']
235
230
  }] } });
@@ -355,7 +355,7 @@ export class ColumnBase {
355
355
  if (parent && idService && parent.idService.gridId() === idService.gridId() && !isColumnContainer(parent)) {
356
356
  throw new Error(ColumnConfigurationErrorMessages.columnNested);
357
357
  }
358
- this._id = `k-grid-column-${columnId++}`;
358
+ this._id = this.idService?.columnId(columnId++);
359
359
  }
360
360
  ngAfterViewInit() {
361
361
  this.initialMinResizableWidth = this.minResizableWidth || 10;
@@ -26,6 +26,9 @@ export class IdService {
26
26
  selectAllCheckboxId() {
27
27
  return `${this.prefix}-select-all`;
28
28
  }
29
+ columnId(colIndex) {
30
+ return `${this.prefix}-col${colIndex}`;
31
+ }
29
32
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IdService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
30
33
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IdService });
31
34
  }
@@ -26,6 +26,8 @@ export class ContextService {
26
26
  scroller;
27
27
  dataBindingDirective;
28
28
  highlightDirective;
29
+ excelComponent;
30
+ pdfComponent;
29
31
  constructor(renderer, localization) {
30
32
  this.renderer = renderer;
31
33
  this.localization = localization;
@@ -39,7 +39,7 @@ const decorate = (element) => {
39
39
  };
40
40
  const svgIconsMarkup = (viewBox, content, safeTitle) => `
41
41
  <span class="k-icon k-svg-icon k-drag-status k-svg-i-cancel">
42
- <svg
42
+ <svg
43
43
  xmlns="http://www.w3.org/2000/svg"
44
44
  xmlns:xlink="http://www.w3.org/1999/xlink"
45
45
  viewBox="${viewBox}"
@@ -95,7 +95,11 @@ export class DragHintService {
95
95
  remove() {
96
96
  if (this.dom && this.dom.parentNode) {
97
97
  (function (el) {
98
- setTimeout(() => document.body.removeChild(el));
98
+ setTimeout(() => {
99
+ if (isDocumentAvailable()) {
100
+ document.body.removeChild(el);
101
+ }
102
+ });
99
103
  })(this.dom); // hack for IE + pointer events!
100
104
  this.dom = null;
101
105
  }
@@ -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, Input, ContentChildren, QueryList, NgZone } from '@angular/core';
5
+ import { Component, Input, ContentChildren, QueryList, NgZone, EventEmitter, Output } from '@angular/core';
6
6
  import { Observable } from 'rxjs';
7
7
  import { take } from 'rxjs/operators';
8
8
  import { saveAs } from '@progress/kendo-file-saver';
@@ -116,6 +116,10 @@ export class ExcelComponent {
116
116
  * Specifies if groups in the Excel file are collapsible.
117
117
  */
118
118
  collapsible;
119
+ /**
120
+ * @hidden
121
+ */
122
+ fileCreated = new EventEmitter();
119
123
  /**
120
124
  * @hidden
121
125
  */
@@ -126,12 +130,16 @@ export class ExcelComponent {
126
130
  this.ctx = ctx;
127
131
  this.zone = zone;
128
132
  this.saveSubscription = excelService.saveToExcel.subscribe(this.save.bind(this));
133
+ this.ctx.excelComponent = this;
129
134
  }
130
135
  ngOnDestroy() {
131
136
  this.saveSubscription.unsubscribe();
132
137
  if (this.dataSubscription) {
133
138
  this.dataSubscription.unsubscribe();
134
139
  }
140
+ if (this.ctx.excelComponent === this) {
141
+ this.ctx.excelComponent = undefined;
142
+ }
135
143
  }
136
144
  save(component) {
137
145
  const data = (this.fetchData || fetchComponentData)(component);
@@ -174,10 +182,11 @@ export class ExcelComponent {
174
182
  forceProxy: this.forceProxy,
175
183
  proxyURL: this.proxyURL
176
184
  });
185
+ this.fileCreated.emit();
177
186
  });
178
187
  }
179
188
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ExcelComponent, deps: [{ token: i1.ExcelService }, { token: i2.ContextService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
180
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ExcelComponent, isStandalone: true, selector: "kendo-grid-excel", inputs: { fileName: "fileName", filterable: "filterable", creator: "creator", date: "date", forceProxy: "forceProxy", proxyURL: "proxyURL", fetchData: "fetchData", paddingCellOptions: "paddingCellOptions", headerPaddingCellOptions: "headerPaddingCellOptions", collapsible: "collapsible" }, queries: [{ propertyName: "columns", predicate: ColumnBase, descendants: true }], ngImport: i0, template: ``, isInline: true });
189
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ExcelComponent, isStandalone: true, selector: "kendo-grid-excel", inputs: { fileName: "fileName", filterable: "filterable", creator: "creator", date: "date", forceProxy: "forceProxy", proxyURL: "proxyURL", fetchData: "fetchData", paddingCellOptions: "paddingCellOptions", headerPaddingCellOptions: "headerPaddingCellOptions", collapsible: "collapsible" }, outputs: { fileCreated: "fileCreated" }, queries: [{ propertyName: "columns", predicate: ColumnBase, descendants: true }], ngImport: i0, template: ``, isInline: true });
181
190
  }
182
191
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ExcelComponent, decorators: [{
183
192
  type: Component,
@@ -206,6 +215,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
206
215
  type: Input
207
216
  }], collapsible: [{
208
217
  type: Input
218
+ }], fileCreated: [{
219
+ type: Output
209
220
  }], columns: [{
210
221
  type: ContentChildren,
211
222
  args: [ColumnBase, { descendants: true }]
@@ -2884,6 +2884,15 @@ export class GridComponent {
2884
2884
  i18n-aiAssistantOutputCardBodyContent="kendo.grid.aiAssistantOutputCardBodyContent|The success message dispayed in the AI Assistant Prompt Output Card's body"
2885
2885
  aiAssistantOutputCardBodyContent="Operation is successful. Data is:"
2886
2886
 
2887
+ i18n-aiAssistantSelectionNotEnabled="kendo.grid.aiAssistantSelectionNotEnabled|The message shown when AI selection requires the Grid selectable option"
2888
+ aiAssistantSelectionNotEnabled="Selection can be applied only when the Grid selectable option is enabled."
2889
+
2890
+ i18n-aiAssistantSelectionRowModeRequired="kendo.grid.aiAssistantSelectionRowModeRequired|The message shown when AI selection requires row selection mode"
2891
+ aiAssistantSelectionRowModeRequired="Selection can be applied only when row selection mode is enabled."
2892
+
2893
+ i18n-aiAssistantSelectionCellModeRequired="kendo.grid.aiAssistantSelectionCellModeRequired|The message shown when AI selection requires cell selection mode"
2894
+ aiAssistantSelectionCellModeRequired="Selection can be applied only when cell selection mode is enabled."
2895
+
2887
2896
  i18n-columnChooserSelectedColumnsCount="kendo.grid.columnChooserSelectedColumnsCount|The text displayed in the Column Chooser for the number of selected columns"
2888
2897
  columnChooserSelectedColumnsCount="{{ '{selectedColumnsCount} Selected items' }}"
2889
2898
 
@@ -3753,6 +3762,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3753
3762
  i18n-aiAssistantOutputCardBodyContent="kendo.grid.aiAssistantOutputCardBodyContent|The success message dispayed in the AI Assistant Prompt Output Card's body"
3754
3763
  aiAssistantOutputCardBodyContent="Operation is successful. Data is:"
3755
3764
 
3765
+ i18n-aiAssistantSelectionNotEnabled="kendo.grid.aiAssistantSelectionNotEnabled|The message shown when AI selection requires the Grid selectable option"
3766
+ aiAssistantSelectionNotEnabled="Selection can be applied only when the Grid selectable option is enabled."
3767
+
3768
+ i18n-aiAssistantSelectionRowModeRequired="kendo.grid.aiAssistantSelectionRowModeRequired|The message shown when AI selection requires row selection mode"
3769
+ aiAssistantSelectionRowModeRequired="Selection can be applied only when row selection mode is enabled."
3770
+
3771
+ i18n-aiAssistantSelectionCellModeRequired="kendo.grid.aiAssistantSelectionCellModeRequired|The message shown when AI selection requires cell selection mode"
3772
+ aiAssistantSelectionCellModeRequired="Selection can be applied only when cell selection mode is enabled."
3773
+
3756
3774
  i18n-columnChooserSelectedColumnsCount="kendo.grid.columnChooserSelectedColumnsCount|The text displayed in the Column Chooser for the number of selected columns"
3757
3775
  columnChooserSelectedColumnsCount="{{ '{selectedColumnsCount} Selected items' }}"
3758
3776
 
@@ -166,6 +166,18 @@ export class GridMessages extends ComponentMessages {
166
166
  * The success message dispayed in the AI Assistant Prompt Output Card's body.
167
167
  */
168
168
  aiAssistantOutputCardBodyContent;
169
+ /**
170
+ * The message shown when AI selection requires the Grid selectable option.
171
+ */
172
+ aiAssistantSelectionNotEnabled;
173
+ /**
174
+ * The message shown when AI selection requires row selection mode.
175
+ */
176
+ aiAssistantSelectionRowModeRequired;
177
+ /**
178
+ * The message shown when AI selection requires cell selection mode.
179
+ */
180
+ aiAssistantSelectionCellModeRequired;
169
181
  /**
170
182
  * The title of the AI Assistant Window maximize button.
171
183
  */
@@ -604,7 +616,7 @@ export class GridMessages extends ComponentMessages {
604
616
  */
605
617
  multiCheckboxFilterSelectedItemsCount;
606
618
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GridMessages, deps: null, target: i0.ɵɵFactoryTarget.Directive });
607
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: GridMessages, selector: "kendo-grid-messages-base", inputs: { groupPanelEmpty: "groupPanelEmpty", noRecords: "noRecords", pagerLabel: "pagerLabel", pagerFirstPage: "pagerFirstPage", pagerLastPage: "pagerLastPage", pagerPreviousPage: "pagerPreviousPage", pagerNextPage: "pagerNextPage", pagerPage: "pagerPage", pagerItemsPerPage: "pagerItemsPerPage", pagerOf: "pagerOf", pagerItems: "pagerItems", pagerPageNumberInputTitle: "pagerPageNumberInputTitle", pagerInputLabel: "pagerInputLabel", pagerSelectPage: "pagerSelectPage", filter: "filter", filterInputLabel: "filterInputLabel", filterMenuTitle: "filterMenuTitle", filterMenuOperatorsDropDownLabel: "filterMenuOperatorsDropDownLabel", filterMenuLogicDropDownLabel: "filterMenuLogicDropDownLabel", filterCellOperatorLabel: "filterCellOperatorLabel", booleanFilterCellLabel: "booleanFilterCellLabel", aiAssistantApplyButtonText: "aiAssistantApplyButtonText", aiAssistantToolbarToolText: "aiAssistantToolbarToolText", aiAssistantWindowTitle: "aiAssistantWindowTitle", aiAssistantWindowCloseTitle: "aiAssistantWindowCloseTitle", aiAssistantOutputCardTitle: "aiAssistantOutputCardTitle", aiAssistantOutputCardBodyContent: "aiAssistantOutputCardBodyContent", aiAssistantWindowMaximizeTitle: "aiAssistantWindowMaximizeTitle", aiAssistantWindowMinimizeTitle: "aiAssistantWindowMinimizeTitle", aiAssistantWindowRestoreTitle: "aiAssistantWindowRestoreTitle", filterEqOperator: "filterEqOperator", filterNotEqOperator: "filterNotEqOperator", filterIsNullOperator: "filterIsNullOperator", filterIsNotNullOperator: "filterIsNotNullOperator", filterIsEmptyOperator: "filterIsEmptyOperator", filterIsNotEmptyOperator: "filterIsNotEmptyOperator", filterStartsWithOperator: "filterStartsWithOperator", filterContainsOperator: "filterContainsOperator", filterNotContainsOperator: "filterNotContainsOperator", filterEndsWithOperator: "filterEndsWithOperator", filterGteOperator: "filterGteOperator", filterGtOperator: "filterGtOperator", filterLteOperator: "filterLteOperator", filterLtOperator: "filterLtOperator", filterIsTrue: "filterIsTrue", filterIsFalse: "filterIsFalse", filterBooleanAll: "filterBooleanAll", adaptiveFilterOperatorsTitle: "adaptiveFilterOperatorsTitle", filterAfterOrEqualOperator: "filterAfterOrEqualOperator", filterAfterOperator: "filterAfterOperator", filterBeforeOperator: "filterBeforeOperator", filterBeforeOrEqualOperator: "filterBeforeOrEqualOperator", filterFilterButton: "filterFilterButton", filterClearButton: "filterClearButton", adaptiveCloseButtonTitle: "adaptiveCloseButtonTitle", adaptiveBackButtonTitle: "adaptiveBackButtonTitle", filterAndLogic: "filterAndLogic", filterOrLogic: "filterOrLogic", filterToolbarToolText: "filterToolbarToolText", loading: "loading", gridLabel: "gridLabel", columnMenu: "columnMenu", setColumnPosition: "setColumnPosition", columns: "columns", columnChooserSelectedColumnsCount: "columnChooserSelectedColumnsCount", columnsSubtitle: "columnsSubtitle", adaptiveFilterTitle: "adaptiveFilterTitle", adaptiveSortTitle: "adaptiveSortTitle", adaptiveGroupTitle: "adaptiveGroupTitle", filterClearAllButton: "filterClearAllButton", groupClearButton: "groupClearButton", sortClearButton: "sortClearButton", sortDoneButton: "sortDoneButton", groupDoneButton: "groupDoneButton", lock: "lock", unlock: "unlock", stick: "stick", unstick: "unstick", sortable: "sortable", sortAscending: "sortAscending", sortDescending: "sortDescending", autosizeThisColumn: "autosizeThisColumn", autosizeAllColumns: "autosizeAllColumns", sortedAscending: "sortedAscending", sortedDescending: "sortedDescending", sortedDefault: "sortedDefault", sortToolbarToolText: "sortToolbarToolText", columnsApply: "columnsApply", columnsReset: "columnsReset", detailExpand: "detailExpand", detailCollapse: "detailCollapse", filterDateToday: "filterDateToday", filterDateToggle: "filterDateToggle", filterNumericDecrement: "filterNumericDecrement", filterNumericIncrement: "filterNumericIncrement", selectionCheckboxLabel: "selectionCheckboxLabel", selectAllCheckboxLabel: "selectAllCheckboxLabel", groupCollapse: "groupCollapse", groupExpand: "groupExpand", topToolbarLabel: "topToolbarLabel", bottomToolbarLabel: "bottomToolbarLabel", editToolbarToolText: "editToolbarToolText", saveToolbarToolText: "saveToolbarToolText", addToolbarToolText: "addToolbarToolText", cancelToolbarToolText: "cancelToolbarToolText", removeToolbarToolText: "removeToolbarToolText", excelExportToolbarToolText: "excelExportToolbarToolText", pdfExportToolbarToolText: "pdfExportToolbarToolText", groupPanelLabel: "groupPanelLabel", dragRowHandleLabel: "dragRowHandleLabel", columnMenuFilterTabTitle: "columnMenuFilterTabTitle", columnMenuGeneralTabTitle: "columnMenuGeneralTabTitle", columnMenuColumnsTabTitle: "columnMenuColumnsTabTitle", groupChipMenuPrevious: "groupChipMenuPrevious", groupChipMenuNext: "groupChipMenuNext", groupToolbarToolText: "groupToolbarToolText", formValidationErrorText: "formValidationErrorText", removeConfirmationDialogTitle: "removeConfirmationDialogTitle", removeConfirmationDialogContent: "removeConfirmationDialogContent", removeConfirmationDialogConfirmText: "removeConfirmationDialogConfirmText", removeConfirmationDialogRejectText: "removeConfirmationDialogRejectText", externalEditingTitle: "externalEditingTitle", externalEditingAddTitle: "externalEditingAddTitle", externalEditingSaveText: "externalEditingSaveText", externalEditingCancelText: "externalEditingCancelText", multiCheckboxFilterSearchPlaceholder: "multiCheckboxFilterSearchPlaceholder", multiCheckboxFilterSelectAllLabel: "multiCheckboxFilterSelectAllLabel", multiCheckboxFilterSelectedItemsCount: "multiCheckboxFilterSelectedItemsCount" }, usesInheritance: true, ngImport: i0 });
619
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: GridMessages, selector: "kendo-grid-messages-base", inputs: { groupPanelEmpty: "groupPanelEmpty", noRecords: "noRecords", pagerLabel: "pagerLabel", pagerFirstPage: "pagerFirstPage", pagerLastPage: "pagerLastPage", pagerPreviousPage: "pagerPreviousPage", pagerNextPage: "pagerNextPage", pagerPage: "pagerPage", pagerItemsPerPage: "pagerItemsPerPage", pagerOf: "pagerOf", pagerItems: "pagerItems", pagerPageNumberInputTitle: "pagerPageNumberInputTitle", pagerInputLabel: "pagerInputLabel", pagerSelectPage: "pagerSelectPage", filter: "filter", filterInputLabel: "filterInputLabel", filterMenuTitle: "filterMenuTitle", filterMenuOperatorsDropDownLabel: "filterMenuOperatorsDropDownLabel", filterMenuLogicDropDownLabel: "filterMenuLogicDropDownLabel", filterCellOperatorLabel: "filterCellOperatorLabel", booleanFilterCellLabel: "booleanFilterCellLabel", aiAssistantApplyButtonText: "aiAssistantApplyButtonText", aiAssistantToolbarToolText: "aiAssistantToolbarToolText", aiAssistantWindowTitle: "aiAssistantWindowTitle", aiAssistantWindowCloseTitle: "aiAssistantWindowCloseTitle", aiAssistantOutputCardTitle: "aiAssistantOutputCardTitle", aiAssistantOutputCardBodyContent: "aiAssistantOutputCardBodyContent", aiAssistantSelectionNotEnabled: "aiAssistantSelectionNotEnabled", aiAssistantSelectionRowModeRequired: "aiAssistantSelectionRowModeRequired", aiAssistantSelectionCellModeRequired: "aiAssistantSelectionCellModeRequired", aiAssistantWindowMaximizeTitle: "aiAssistantWindowMaximizeTitle", aiAssistantWindowMinimizeTitle: "aiAssistantWindowMinimizeTitle", aiAssistantWindowRestoreTitle: "aiAssistantWindowRestoreTitle", filterEqOperator: "filterEqOperator", filterNotEqOperator: "filterNotEqOperator", filterIsNullOperator: "filterIsNullOperator", filterIsNotNullOperator: "filterIsNotNullOperator", filterIsEmptyOperator: "filterIsEmptyOperator", filterIsNotEmptyOperator: "filterIsNotEmptyOperator", filterStartsWithOperator: "filterStartsWithOperator", filterContainsOperator: "filterContainsOperator", filterNotContainsOperator: "filterNotContainsOperator", filterEndsWithOperator: "filterEndsWithOperator", filterGteOperator: "filterGteOperator", filterGtOperator: "filterGtOperator", filterLteOperator: "filterLteOperator", filterLtOperator: "filterLtOperator", filterIsTrue: "filterIsTrue", filterIsFalse: "filterIsFalse", filterBooleanAll: "filterBooleanAll", adaptiveFilterOperatorsTitle: "adaptiveFilterOperatorsTitle", filterAfterOrEqualOperator: "filterAfterOrEqualOperator", filterAfterOperator: "filterAfterOperator", filterBeforeOperator: "filterBeforeOperator", filterBeforeOrEqualOperator: "filterBeforeOrEqualOperator", filterFilterButton: "filterFilterButton", filterClearButton: "filterClearButton", adaptiveCloseButtonTitle: "adaptiveCloseButtonTitle", adaptiveBackButtonTitle: "adaptiveBackButtonTitle", filterAndLogic: "filterAndLogic", filterOrLogic: "filterOrLogic", filterToolbarToolText: "filterToolbarToolText", loading: "loading", gridLabel: "gridLabel", columnMenu: "columnMenu", setColumnPosition: "setColumnPosition", columns: "columns", columnChooserSelectedColumnsCount: "columnChooserSelectedColumnsCount", columnsSubtitle: "columnsSubtitle", adaptiveFilterTitle: "adaptiveFilterTitle", adaptiveSortTitle: "adaptiveSortTitle", adaptiveGroupTitle: "adaptiveGroupTitle", filterClearAllButton: "filterClearAllButton", groupClearButton: "groupClearButton", sortClearButton: "sortClearButton", sortDoneButton: "sortDoneButton", groupDoneButton: "groupDoneButton", lock: "lock", unlock: "unlock", stick: "stick", unstick: "unstick", sortable: "sortable", sortAscending: "sortAscending", sortDescending: "sortDescending", autosizeThisColumn: "autosizeThisColumn", autosizeAllColumns: "autosizeAllColumns", sortedAscending: "sortedAscending", sortedDescending: "sortedDescending", sortedDefault: "sortedDefault", sortToolbarToolText: "sortToolbarToolText", columnsApply: "columnsApply", columnsReset: "columnsReset", detailExpand: "detailExpand", detailCollapse: "detailCollapse", filterDateToday: "filterDateToday", filterDateToggle: "filterDateToggle", filterNumericDecrement: "filterNumericDecrement", filterNumericIncrement: "filterNumericIncrement", selectionCheckboxLabel: "selectionCheckboxLabel", selectAllCheckboxLabel: "selectAllCheckboxLabel", groupCollapse: "groupCollapse", groupExpand: "groupExpand", topToolbarLabel: "topToolbarLabel", bottomToolbarLabel: "bottomToolbarLabel", editToolbarToolText: "editToolbarToolText", saveToolbarToolText: "saveToolbarToolText", addToolbarToolText: "addToolbarToolText", cancelToolbarToolText: "cancelToolbarToolText", removeToolbarToolText: "removeToolbarToolText", excelExportToolbarToolText: "excelExportToolbarToolText", pdfExportToolbarToolText: "pdfExportToolbarToolText", groupPanelLabel: "groupPanelLabel", dragRowHandleLabel: "dragRowHandleLabel", columnMenuFilterTabTitle: "columnMenuFilterTabTitle", columnMenuGeneralTabTitle: "columnMenuGeneralTabTitle", columnMenuColumnsTabTitle: "columnMenuColumnsTabTitle", groupChipMenuPrevious: "groupChipMenuPrevious", groupChipMenuNext: "groupChipMenuNext", groupToolbarToolText: "groupToolbarToolText", formValidationErrorText: "formValidationErrorText", removeConfirmationDialogTitle: "removeConfirmationDialogTitle", removeConfirmationDialogContent: "removeConfirmationDialogContent", removeConfirmationDialogConfirmText: "removeConfirmationDialogConfirmText", removeConfirmationDialogRejectText: "removeConfirmationDialogRejectText", externalEditingTitle: "externalEditingTitle", externalEditingAddTitle: "externalEditingAddTitle", externalEditingSaveText: "externalEditingSaveText", externalEditingCancelText: "externalEditingCancelText", multiCheckboxFilterSearchPlaceholder: "multiCheckboxFilterSearchPlaceholder", multiCheckboxFilterSelectAllLabel: "multiCheckboxFilterSelectAllLabel", multiCheckboxFilterSelectedItemsCount: "multiCheckboxFilterSelectedItemsCount" }, usesInheritance: true, ngImport: i0 });
608
620
  }
609
621
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GridMessages, decorators: [{
610
622
  type: Directive,
@@ -666,6 +678,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
666
678
  type: Input
667
679
  }], aiAssistantOutputCardBodyContent: [{
668
680
  type: Input
681
+ }], aiAssistantSelectionNotEnabled: [{
682
+ type: Input
683
+ }], aiAssistantSelectionRowModeRequired: [{
684
+ type: Input
685
+ }], aiAssistantSelectionCellModeRequired: [{
686
+ type: Input
669
687
  }], aiAssistantWindowMaximizeTitle: [{
670
688
  type: Input
671
689
  }], aiAssistantWindowMinimizeTitle: [{
@@ -511,6 +511,13 @@ export class NavigationService {
511
511
  const row = this.cursor.row;
512
512
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
513
513
  const code = normalizeNumpadKeys(args);
514
+ // Handle row reordering keyboard shortcuts (Ctrl/Cmd + Shift + Up/Down Arrow)
515
+ if (modifier && args.shiftKey && (code === Keys.ArrowUp || code === Keys.ArrowDown)) {
516
+ if (this.handleRowReorderKeyboard(args, code, row)) {
517
+ args.preventDefault();
518
+ return;
519
+ }
520
+ }
514
521
  const dir = code === Keys.ArrowDown ? 'Down' : 'Up';
515
522
  const right = code === Keys.ArrowRight;
516
523
  const isArrowKey = code === Keys.ArrowDown || code === Keys.ArrowUp || code === Keys.ArrowLeft || code === Keys.ArrowRight;
@@ -518,6 +525,9 @@ export class NavigationService {
518
525
  startNewSelection = true;
519
526
  this.isShiftPressed = true;
520
527
  }
528
+ const cellElement = args.target;
529
+ const isDragCell = cellElement ? closest(cellElement, (el) => hasClasses(el, 'k-drag-cell')) : false;
530
+ const isRowReorderable = this.ctx.grid.rowReorderable;
521
531
  switch (code) {
522
532
  case Keys.ArrowDown:
523
533
  case Keys.ArrowUp:
@@ -525,7 +535,7 @@ export class NavigationService {
525
535
  rowspanOffset = this.calculateRowspanOffset(dir, rowspan);
526
536
  step += rowspanOffset;
527
537
  }
528
- if (args.shiftKey) {
538
+ if (args.shiftKey && !(isDragCell && isRowReorderable)) {
529
539
  if (this.ctx.grid.blockArrowSelection) {
530
540
  return;
531
541
  }
@@ -873,6 +883,42 @@ export class NavigationService {
873
883
  get isStackedMode() {
874
884
  return this.ctx?.grid?.isStacked;
875
885
  }
886
+ handleRowReorderKeyboard(args, code, row) {
887
+ if (!this.ctx.grid.rowReorderable || !this.activeCell) {
888
+ return false;
889
+ }
890
+ const cell = this.activeCell;
891
+ const cellElement = args.target;
892
+ if (!cellElement) {
893
+ return false;
894
+ }
895
+ const dragCell = closest(cellElement, (el) => hasClasses(el, 'k-drag-cell'));
896
+ if (!dragCell || row.dataRowIndex < 0 || !row.dataItem) {
897
+ return false;
898
+ }
899
+ const isUpArrow = code === Keys.ArrowUp;
900
+ const currentRowIndex = row.dataRowIndex;
901
+ const data = this.ctx.grid.flatData;
902
+ if (!data || data.length === 0) {
903
+ return false;
904
+ }
905
+ const targetRowIndex = currentRowIndex + (isUpArrow ? -1 : 1);
906
+ if (targetRowIndex < 0 || targetRowIndex >= data.length) {
907
+ return false;
908
+ }
909
+ const dropPosition = isUpArrow ? 'before' : 'after';
910
+ this.zone.run(() => {
911
+ const skip = this.ctx.grid.skip || 0;
912
+ this.ctx.grid.rowReorderService.reorderViaKeyboard(currentRowIndex + skip, targetRowIndex + skip, dropPosition, data);
913
+ // Move focus to follow the reordered row
914
+ // After reordering, the row will be at the target position
915
+ this.zone.onStable.pipe(take(1)).subscribe(() => {
916
+ const newRowIndex = this.meta.headerRows + targetRowIndex;
917
+ this.cursor.reset(newRowIndex, cell.colIndex);
918
+ });
919
+ });
920
+ return true;
921
+ }
876
922
  handleStackedKeydown(args) {
877
923
  const target = args.target;
878
924
  const stackedCell = closest(target, (el) => hasClasses(el, 'k-grid-stack-cell'));
@@ -10,7 +10,7 @@ export const packageMetadata = {
10
10
  productName: 'Kendo UI for Angular',
11
11
  productCode: 'KENDOUIANGULAR',
12
12
  productCodes: ['KENDOUIANGULAR'],
13
- publishDate: 1761910431,
14
- version: '21.0.0-develop.9',
13
+ publishDate: 1762953482,
14
+ version: '21.0.1-develop.1',
15
15
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
16
16
  };
@@ -90,11 +90,17 @@ export class PDFComponent extends PDFExportComponent {
90
90
  this.drawSubscription = pdfService.drawPDF.subscribe(this.drawPDF.bind(this));
91
91
  this.reset = this.reset.bind(this);
92
92
  this.draw = this.draw.bind(this);
93
+ if (this.ctx) {
94
+ this.ctx.pdfComponent = this;
95
+ }
93
96
  }
94
97
  ngOnDestroy() {
95
98
  this.saveSubscription.unsubscribe();
96
99
  this.drawSubscription.unsubscribe();
97
100
  this.reset();
101
+ if (this.ctx?.pdfComponent === this) {
102
+ this.ctx.pdfComponent = undefined;
103
+ }
98
104
  }
99
105
  /**
100
106
  * @hidden
@@ -304,17 +304,28 @@ export class ListComponent {
304
304
  const shouldCalculatePageSize = isDocumentAvailable() && this.isVirtual && !isPresent(this.virtualPageSize) && (!isPresent(this.ctx.grid?.pageSize) || this.ctx.grid?.pageable);
305
305
  const previousTotal = this.allItems.length;
306
306
  this.allItems = this.dataMappingService.dataMapper(this.data, this.nonLockedColumnsToRender, this.lockedLeafColumns, this.detailTemplate, this.showFooter);
307
- if (!this.isVirtual || (this.isVirtual && !this.ctx.grid?.pageable && !this.ctx.grid?.group?.length)) {
308
- this.itemsToRender = this.allItems;
309
- }
310
307
  const totalChanged = previousTotal !== this.allItems.length;
308
+ const totalIncreased = this.allItems.length > previousTotal;
311
309
  if (this.totalIsAllItems && totalChanged) {
312
310
  this.scroller.reset(this.skipScroll);
313
311
  this.scroller.total = this.allItems.length;
312
+ this.itemsToRender = this.allItems.slice(this.scroller.virtualSkip, this.scroller.virtualSkip + this.virtualPageSize);
314
313
  }
315
314
  else if (totalChanged && !this.ctx.grid?.group?.length) {
316
- this.scroller.reset(this.skipScroll);
317
- this.scroller.total = this.total;
315
+ // Preserve scroll position for non-virtual endless scrolling (scrollBottom event)
316
+ if (!this.isVirtual && totalIncreased) {
317
+ this.scroller.total = this.total;
318
+ }
319
+ else {
320
+ this.scroller.reset(this.skipScroll);
321
+ this.scroller.total = this.total;
322
+ // Clear flags to allow viewport update on next change detection (virtual scrolling fix)
323
+ this.skipScroll = false;
324
+ this.scroller.scrollSyncing = false;
325
+ }
326
+ }
327
+ if (!this.isVirtual || (this.isVirtual && !this.ctx.grid?.pageable && !this.ctx.grid?.group?.length)) {
328
+ this.itemsToRender = this.allItems;
318
329
  }
319
330
  const rebindGroupedData = this.isVirtual && !totalChanged && this.ctx.grid?.group?.length && !this.rebindGroupedDataFlag;
320
331
  if (rebindGroupedData) {