@progress/kendo-angular-grid 19.0.0-develop.2 → 19.0.0-develop.20

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 (129) hide show
  1. package/adaptiveness/adaptive-mode.d.ts +12 -0
  2. package/adaptiveness/adaptive-renderer.component.d.ts +84 -0
  3. package/column-menu/column-chooser.component.d.ts +4 -0
  4. package/column-menu/column-list.component.d.ts +9 -3
  5. package/column-menu/column-menu-item.component.d.ts +38 -2
  6. package/column-menu/column-menu-item.directive.d.ts +5 -2
  7. package/column-menu/column-menu.component.d.ts +4 -2
  8. package/columns/column-base.d.ts +5 -0
  9. package/columns/span-column.component.d.ts +2 -2
  10. package/common/adaptiveness.service.d.ts +50 -0
  11. package/common/single-popup.service.d.ts +3 -1
  12. package/common/toolbar-tool-base.directive.d.ts +26 -0
  13. package/directives.d.ts +12 -5
  14. package/dragdrop/drag-hint.service.d.ts +3 -2
  15. package/editing/add-command-tool.directive.d.ts +7 -6
  16. package/editing/cancel-command-tool.directive.d.ts +38 -0
  17. package/editing/edit-command-tool.directive.d.ts +38 -0
  18. package/editing/edit.service.d.ts +1 -1
  19. package/editing/remove-command-tool.directive.d.ts +39 -0
  20. package/editing/save-command-tool.directive.d.ts +38 -0
  21. package/editing/toolbar-editing-tool-base.directive.d.ts +29 -0
  22. package/editing-directives/external-editing.directive.d.ts +3 -1
  23. package/esm2022/adaptiveness/adaptive-mode.mjs +5 -0
  24. package/esm2022/adaptiveness/adaptive-renderer.component.mjs +1106 -0
  25. package/esm2022/column-menu/column-chooser.component.mjs +13 -11
  26. package/esm2022/column-menu/column-list.component.mjs +43 -8
  27. package/esm2022/column-menu/column-menu-autosize-all.component.mjs +1 -1
  28. package/esm2022/column-menu/column-menu-autosize.component.mjs +1 -1
  29. package/esm2022/column-menu/column-menu-chooser.component.mjs +1 -1
  30. package/esm2022/column-menu/column-menu-container.component.mjs +1 -1
  31. package/esm2022/column-menu/column-menu-filter.component.mjs +1 -1
  32. package/esm2022/column-menu/column-menu-item.component.mjs +106 -11
  33. package/esm2022/column-menu/column-menu-item.directive.mjs +14 -5
  34. package/esm2022/column-menu/column-menu-lock.component.mjs +1 -1
  35. package/esm2022/column-menu/column-menu-position.component.mjs +1 -1
  36. package/esm2022/column-menu/column-menu-sort.component.mjs +1 -1
  37. package/esm2022/column-menu/column-menu-stick.component.mjs +1 -1
  38. package/esm2022/column-menu/column-menu.component.mjs +68 -44
  39. package/esm2022/column-resizing/column-handle.directive.mjs +2 -2
  40. package/esm2022/columns/column-base.mjs +9 -0
  41. package/esm2022/columns/columns-container.mjs +1 -1
  42. package/esm2022/columns/span-column.component.mjs +9 -9
  43. package/esm2022/common/adaptiveness.service.mjs +72 -0
  44. package/esm2022/common/single-popup.service.mjs +9 -3
  45. package/esm2022/common/toolbar-tool-base.directive.mjs +81 -0
  46. package/esm2022/directives.mjs +18 -3
  47. package/esm2022/dragdrop/drag-hint.service.mjs +7 -4
  48. package/esm2022/editing/add-command-tool.directive.mjs +12 -15
  49. package/esm2022/editing/cancel-command-tool.directive.mjs +64 -0
  50. package/esm2022/editing/edit-command-tool.directive.mjs +59 -0
  51. package/esm2022/editing/form/form-formfield.component.mjs +1 -1
  52. package/esm2022/editing/remove-command-tool.directive.mjs +60 -0
  53. package/esm2022/editing/remove-command.directive.mjs +1 -0
  54. package/esm2022/editing/save-command-tool.directive.mjs +64 -0
  55. package/esm2022/editing/toolbar-editing-tool-base.directive.mjs +89 -0
  56. package/esm2022/editing-directives/external-editing.directive.mjs +28 -14
  57. package/esm2022/excel/excel-command-tool.directive.mjs +12 -17
  58. package/esm2022/filtering/cell/autocomplete-filter-cell.component.mjs +1 -1
  59. package/esm2022/filtering/cell/boolean-filter-cell.component.mjs +1 -1
  60. package/esm2022/filtering/cell/date-filter-cell.component.mjs +1 -1
  61. package/esm2022/filtering/cell/filter-cell-operators.component.mjs +1 -1
  62. package/esm2022/filtering/filter-input.directive.mjs +14 -2
  63. package/esm2022/filtering/menu/boolean-filter-menu.component.mjs +2 -2
  64. package/esm2022/filtering/menu/date-filter-menu-input.component.mjs +3 -1
  65. package/esm2022/filtering/menu/date-filter-menu.component.mjs +5 -1
  66. package/esm2022/filtering/menu/filter-menu-container.component.mjs +21 -10
  67. package/esm2022/filtering/menu/filter-menu-input-wrapper.component.mjs +25 -5
  68. package/esm2022/filtering/menu/filter-menu.component.mjs +44 -29
  69. package/esm2022/filtering/menu/numeric-filter-menu.component.mjs +5 -1
  70. package/esm2022/filtering/menu/string-filter-menu.component.mjs +5 -1
  71. package/esm2022/grid.component.mjs +291 -55
  72. package/esm2022/grid.module.mjs +114 -101
  73. package/esm2022/index.mjs +10 -1
  74. package/esm2022/localization/messages.mjs +104 -2
  75. package/esm2022/navigation/navigation.service.mjs +1 -1
  76. package/esm2022/navigation/toolbar-tool-name.mjs +17 -0
  77. package/esm2022/package-metadata.mjs +2 -2
  78. package/esm2022/pdf/pdf-command-tool.directive.mjs +12 -15
  79. package/esm2022/rendering/cell.component.mjs +4 -4
  80. package/esm2022/rendering/header/header.component.mjs +1 -1
  81. package/esm2022/rendering/list.component.mjs +1 -1
  82. package/esm2022/rendering/table-body.component.mjs +11 -3
  83. package/esm2022/rendering/toolbar/tools/column-chooser-tool.directive.mjs +201 -0
  84. package/esm2022/rendering/toolbar/tools/filter-command-tool.directive.mjs +49 -33
  85. package/esm2022/rendering/toolbar/tools/filter-tool-wrapper.component.mjs +28 -8
  86. package/esm2022/rendering/toolbar/tools/filter-toolbar-tool.component.mjs +26 -4
  87. package/esm2022/rendering/toolbar/tools/sort-command-tool.directive.mjs +33 -17
  88. package/esm2022/rendering/toolbar/tools/sort-toolbar-tool.component.mjs +24 -8
  89. package/esm2022/row-reordering/row-reorder.service.mjs +15 -0
  90. package/esm2022/selection/selection.service.mjs +11 -0
  91. package/esm2022/state-management/grid-state.models.mjs +26 -0
  92. package/esm2022/state-management/redo-command-tool.mjs +66 -0
  93. package/esm2022/state-management/undo-command-tool.mjs +66 -0
  94. package/esm2022/state-management/undo-redo.directive.mjs +178 -0
  95. package/esm2022/state-management/undo-redo.service.mjs +22 -0
  96. package/esm2022/state-management/undo-redo.stack.mjs +232 -0
  97. package/esm2022/utils.mjs +13 -13
  98. package/excel/excel-command-tool.directive.d.ts +5 -5
  99. package/fesm2022/progress-kendo-angular-grid.mjs +4066 -1351
  100. package/filtering/filter-input.directive.d.ts +1 -0
  101. package/filtering/menu/date-filter-menu-input.component.d.ts +1 -1
  102. package/filtering/menu/filter-menu-container.component.d.ts +14 -4
  103. package/filtering/menu/filter-menu-input-wrapper.component.d.ts +8 -3
  104. package/filtering/menu/filter-menu.component.d.ts +6 -3
  105. package/grid.component.d.ts +71 -21
  106. package/grid.module.d.ts +107 -100
  107. package/index.d.ts +9 -1
  108. package/localization/messages.d.ts +70 -2
  109. package/navigation/toolbar-tool-name.d.ts +17 -0
  110. package/package.json +21 -20
  111. package/pdf/pdf-command-tool.directive.d.ts +6 -5
  112. package/rendering/cell.component.d.ts +1 -1
  113. package/{column-menu → rendering/toolbar/tools}/column-chooser-tool.directive.d.ts +17 -6
  114. package/rendering/toolbar/tools/filter-command-tool.directive.d.ts +4 -1
  115. package/rendering/toolbar/tools/filter-tool-wrapper.component.d.ts +6 -5
  116. package/rendering/toolbar/tools/filter-toolbar-tool.component.d.ts +4 -1
  117. package/rendering/toolbar/tools/sort-command-tool.directive.d.ts +4 -1
  118. package/rendering/toolbar/tools/sort-toolbar-tool.component.d.ts +5 -1
  119. package/row-reordering/row-reorder.service.d.ts +2 -0
  120. package/schematics/ngAdd/index.js +4 -4
  121. package/selection/selection.service.d.ts +1 -0
  122. package/state-management/grid-state.models.d.ts +58 -0
  123. package/state-management/redo-command-tool.d.ts +38 -0
  124. package/state-management/undo-command-tool.d.ts +38 -0
  125. package/state-management/undo-redo.directive.d.ts +51 -0
  126. package/state-management/undo-redo.service.d.ts +19 -0
  127. package/state-management/undo-redo.stack.d.ts +104 -0
  128. package/utils.d.ts +11 -5
  129. package/esm2022/column-menu/column-chooser-tool.directive.mjs +0 -172
@@ -12,10 +12,12 @@ import { ColumnMenuItemComponent } from '../../../column-menu/column-menu-item.c
12
12
  import { ColumnMenuItemContentTemplateDirective } from '../../../column-menu/column-menu-item-content-template.directive';
13
13
  import { ColumnInfoService } from '../../../common/column-info.service';
14
14
  import { cloneFilters } from '../../../common/filter-descriptor-differ';
15
+ import { AdaptiveGridService } from '../../../common/adaptiveness.service';
15
16
  import * as i0 from "@angular/core";
16
17
  import * as i1 from "../../../filtering/filter.service";
17
18
  import * as i2 from "../../../common/provider.service";
18
19
  import * as i3 from "../../../common/column-info.service";
20
+ import * as i4 from "../../../common/adaptiveness.service";
19
21
  /**
20
22
  * @hidden
21
23
  */
@@ -24,6 +26,7 @@ export class FilterToolbarToolComponent {
24
26
  filterService;
25
27
  ctx;
26
28
  columnInfoService;
29
+ adaptiveGridService;
27
30
  filterItems;
28
31
  menuItems;
29
32
  filterContainers;
@@ -39,11 +42,12 @@ export class FilterToolbarToolComponent {
39
42
  columns;
40
43
  filter;
41
44
  subscriptions;
42
- constructor(element, filterService, ctx, columnInfoService) {
45
+ constructor(element, filterService, ctx, columnInfoService, adaptiveGridService) {
43
46
  this.element = element;
44
47
  this.filterService = filterService;
45
48
  this.ctx = ctx;
46
49
  this.columnInfoService = columnInfoService;
50
+ this.adaptiveGridService = adaptiveGridService;
47
51
  }
48
52
  ngOnInit() {
49
53
  this.columns = this.columnInfoService.leafNamedColumns.filter(column => column?.filterable);
@@ -60,6 +64,20 @@ export class FilterToolbarToolComponent {
60
64
  this.subscriptions.unsubscribe();
61
65
  }
62
66
  }
67
+ navigateView(column) {
68
+ if (this.ctx.grid.isActionSheetExpanded && this.adaptiveGridService.viewType === 'filterToolbarTool') {
69
+ const componentRef = this.ctx.grid.adaptiveRenderer.filterToolbarToolTemplate.createComponent(FilterMenuContainerComponent);
70
+ componentRef.instance.column = this.getColumnComponent(column);
71
+ componentRef.instance.filter = this.filter;
72
+ this.subscriptions.add(componentRef.instance.close.subscribe(() => {
73
+ this.adaptiveGridService.reset();
74
+ }));
75
+ this.adaptiveGridService.filterMenuContainerComponentRef = componentRef;
76
+ this.adaptiveGridService.secondaryView = 'columnFilter';
77
+ this.adaptiveGridService.column = this.getColumnComponent(column);
78
+ this.ctx.grid.adaptiveRenderer.actionSheet.nextView();
79
+ }
80
+ }
63
81
  getColumnComponent(column) {
64
82
  return column;
65
83
  }
@@ -83,15 +101,17 @@ export class FilterToolbarToolComponent {
83
101
  menuItem.contentState = 'expanded';
84
102
  }
85
103
  }
86
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterToolbarToolComponent, deps: [{ token: i0.ElementRef }, { token: i1.FilterService }, { token: i2.ContextService }, { token: i3.ColumnInfoService }], target: i0.ɵɵFactoryTarget.Component });
104
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterToolbarToolComponent, deps: [{ token: i0.ElementRef }, { token: i1.FilterService }, { token: i2.ContextService }, { token: i3.ColumnInfoService }, { token: i4.AdaptiveGridService }], target: i0.ɵɵFactoryTarget.Component });
87
105
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FilterToolbarToolComponent, isStandalone: true, selector: "kendo-filter-toolbar-tool", outputs: { close: "close" }, viewQueries: [{ propertyName: "filterItems", predicate: ["filterItem"], descendants: true, read: ElementRef }, { propertyName: "menuItems", predicate: ["filterItem"], descendants: true }, { propertyName: "filterContainers", predicate: ["filterContainer"], descendants: true }], ngImport: i0, template: `
88
106
  <div [style]="hostStyles">
89
107
  <kendo-grid-columnmenu-item *ngFor="let column of columns; let i = index"
90
108
  class="k-columnmenu-item-wrapper" #filterItem
91
109
  role="button"
92
110
  tabindex="0"
111
+ [column]="getColumnComponent(column)"
93
112
  [text]="column.title || getColumnComponent(column).field"
94
113
  (keydown.enter)="toggleItem($event, i)"
114
+ (itemClick)="navigateView(getColumnComponent(column))"
95
115
  [expanded]="false">
96
116
  <ng-template kendoGridColumnMenuItemContentTemplate>
97
117
  <kendo-grid-filter-menu-container
@@ -105,7 +125,7 @@ export class FilterToolbarToolComponent {
105
125
  </ng-template>
106
126
  </kendo-grid-columnmenu-item>
107
127
  </div>
108
- `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: FilterMenuContainerComponent, selector: "kendo-grid-filter-menu-container", inputs: ["column", "isLast", "isExpanded", "menuTabbingService", "filter", "actionsClass"], outputs: ["close"] }, { kind: "component", type: ColumnMenuItemComponent, selector: "kendo-grid-columnmenu-item", inputs: ["icon", "svgIcon", "text", "selected", "disabled", "expanded", "service"], outputs: ["itemClick", "expand", "collapse"] }, { kind: "directive", type: ColumnMenuItemContentTemplateDirective, selector: "[kendoGridColumnMenuItemContentTemplate]" }] });
128
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: FilterMenuContainerComponent, selector: "kendo-grid-filter-menu-container", inputs: ["column", "isLast", "isExpanded", "menuTabbingService", "filter", "actionsClass"], outputs: ["close"] }, { kind: "component", type: ColumnMenuItemComponent, selector: "kendo-grid-columnmenu-item", inputs: ["icon", "svgIcon", "text", "selected", "disabled", "expanded", "service", "column"], outputs: ["itemClick", "expand", "collapse"] }, { kind: "directive", type: ColumnMenuItemContentTemplateDirective, selector: "[kendoGridColumnMenuItemContentTemplate]" }] });
109
129
  }
110
130
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterToolbarToolComponent, decorators: [{
111
131
  type: Component,
@@ -117,8 +137,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
117
137
  class="k-columnmenu-item-wrapper" #filterItem
118
138
  role="button"
119
139
  tabindex="0"
140
+ [column]="getColumnComponent(column)"
120
141
  [text]="column.title || getColumnComponent(column).field"
121
142
  (keydown.enter)="toggleItem($event, i)"
143
+ (itemClick)="navigateView(getColumnComponent(column))"
122
144
  [expanded]="false">
123
145
  <ng-template kendoGridColumnMenuItemContentTemplate>
124
146
  <kendo-grid-filter-menu-container
@@ -136,7 +158,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
136
158
  standalone: true,
137
159
  imports: [NgFor, KENDO_BUTTON, FilterMenuContainerComponent, ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective]
138
160
  }]
139
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.FilterService }, { type: i2.ContextService }, { type: i3.ColumnInfoService }]; }, propDecorators: { filterItems: [{
161
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.FilterService }, { type: i2.ContextService }, { type: i3.ColumnInfoService }, { type: i4.AdaptiveGridService }]; }, propDecorators: { filterItems: [{
140
162
  type: ViewChildren,
141
163
  args: ['filterItem', { read: ElementRef }]
142
164
  }], menuItems: [{
@@ -13,12 +13,14 @@ import { SortService } from '../../../common/sort.service';
13
13
  import { closest, isDocumentAvailable, isPresent } from '@progress/kendo-angular-common';
14
14
  import { ColumnInfoService } from '../../../common/column-info.service';
15
15
  import { take } from 'rxjs/operators';
16
+ import { AdaptiveGridService } from '../../../common/adaptiveness.service';
16
17
  import * as i0 from "@angular/core";
17
18
  import * as i1 from "@progress/kendo-angular-toolbar";
18
19
  import * as i2 from "@progress/kendo-angular-popup";
19
20
  import * as i3 from "../../../common/provider.service";
20
21
  import * as i4 from "../../../common/sort.service";
21
22
  import * as i5 from "../../../common/column-info.service";
23
+ import * as i6 from "../../../common/adaptiveness.service";
22
24
  let incrementingId = 0;
23
25
  /**
24
26
  * Represents the toolbar tool for sorting columns of the Grid.
@@ -45,12 +47,13 @@ export class SortCommandToolbarDirective {
45
47
  columnInfoService;
46
48
  ngZone;
47
49
  renderer;
50
+ adaptiveGridService;
48
51
  popupRef;
49
52
  nextId = incrementingId++;
50
53
  toolSubs = new Subscription();
51
54
  popupSubs;
52
55
  removeClickListener;
53
- constructor(host, popupService, ctx, sortService, columnInfoService, ngZone, renderer) {
56
+ constructor(host, popupService, ctx, sortService, columnInfoService, ngZone, renderer, adaptiveGridService) {
54
57
  this.host = host;
55
58
  this.popupService = popupService;
56
59
  this.ctx = ctx;
@@ -58,6 +61,7 @@ export class SortCommandToolbarDirective {
58
61
  this.columnInfoService = columnInfoService;
59
62
  this.ngZone = ngZone;
60
63
  this.renderer = renderer;
64
+ this.adaptiveGridService = adaptiveGridService;
61
65
  }
62
66
  ngOnInit() {
63
67
  this.toolSubs = this.host.click.subscribe(e => this.onClick(e));
@@ -70,7 +74,7 @@ export class SortCommandToolbarDirective {
70
74
  const hasIcon = hasToolbarIcon && hasOverflowIcon;
71
75
  const hasSvgIcon = isPresent(this.host.toolbarOptions.svgIcon) && isPresent(this.host.overflowOptions.svgIcon);
72
76
  if (!hasIcon) {
73
- this.host.icon = 'k-i-arrows-swap';
77
+ this.host.icon = 'arrows-swap';
74
78
  }
75
79
  if (!hasSvgIcon) {
76
80
  this.host.svgIcon = arrowsSwapIcon;
@@ -82,9 +86,9 @@ export class SortCommandToolbarDirective {
82
86
  this.host.text = this.ctx.localization.get(`sortToolbarToolText`);
83
87
  });
84
88
  }
85
- this.host.toolbarButtonElement.nativeElement.setAttribute('aria-haspopup', 'dialog');
86
- this.host.toolbarButtonElement.nativeElement.setAttribute('aria-expanded', 'false');
87
- this.host.toolbarButtonElement.nativeElement.setAttribute('title', this.ctx.localization.get('sortable'));
89
+ this.buttonElement?.setAttribute('aria-haspopup', 'dialog');
90
+ this.buttonElement?.setAttribute('aria-expanded', 'false');
91
+ this.buttonElement?.setAttribute('title', this.ctx.localization.get('sortable'));
88
92
  }
89
93
  ngOnDestroy() {
90
94
  if (this.toolSubs) {
@@ -104,29 +108,38 @@ export class SortCommandToolbarDirective {
104
108
  }
105
109
  onClick(e) {
106
110
  e.preventDefault();
107
- if (this.popupRef) {
108
- this.closePopup();
109
- return;
111
+ if (this.ctx.grid.adaptiveMode === 'auto' && this.adaptiveGridService.windowSize !== 'large') {
112
+ if (!this.ctx.grid.isActionSheetExpanded) {
113
+ this.adaptiveGridService.viewType = 'sortToolbarTool';
114
+ this.ctx.grid.adaptiveRenderer.actionSheet.toggle(true);
115
+ }
116
+ }
117
+ else {
118
+ if (this.popupRef) {
119
+ this.closePopup();
120
+ return;
121
+ }
122
+ this.openPopup();
110
123
  }
111
- this.openPopup();
112
124
  }
113
125
  openPopup() {
114
126
  const direction = this.ctx.localization.rtl ? 'right' : 'left';
115
127
  this.popupRef = this.popupService.open({
116
- anchor: this.host.toolbarButtonElement.nativeElement,
128
+ anchor: this.buttonElement,
117
129
  content: SortToolbarToolComponent,
118
130
  popupClass: 'k-grid-columnmenu-popup',
119
131
  positionMode: 'absolute',
120
132
  anchorAlign: { vertical: 'bottom', horizontal: direction },
121
133
  popupAlign: { vertical: 'top', horizontal: direction }
122
134
  });
135
+ this.adaptiveGridService.popupRef = this.popupRef;
123
136
  this.setPopupAttributes();
124
137
  this.ngZone.runOutsideAngular(() => {
125
138
  if (!isDocumentAvailable()) {
126
139
  return;
127
140
  }
128
141
  this.removeClickListener = this.renderer.listen('document', 'click', (e) => {
129
- if (this.popupRef && !closest(e.target, node => node === this.popupRef.popupElement || node === this.host.toolbarButtonElement.nativeElement)) {
142
+ if (this.popupRef && !closest(e.target, node => node === this.popupRef.popupElement || node === this.buttonElement)) {
130
143
  this.closePopup();
131
144
  }
132
145
  });
@@ -145,8 +158,8 @@ export class SortCommandToolbarDirective {
145
158
  this.renderer.setAttribute(popupElement, 'dir', this.ctx.localization.rtl ? 'rtl' : 'ltr');
146
159
  this.renderer.setAttribute(popupAriaElement, 'id', popupId);
147
160
  this.renderer.setAttribute(popupAriaElement, 'role', 'dialog');
148
- this.host.toolbarButtonElement.nativeElement.setAttribute('aria-expanded', 'true');
149
- this.host.toolbarButtonElement.nativeElement.setAttribute('aria-controls', popupId);
161
+ this.buttonElement?.setAttribute('aria-expanded', 'true');
162
+ this.buttonElement?.setAttribute('aria-controls', popupId);
150
163
  }
151
164
  initPopupProperties() {
152
165
  this.popupRef.content.instance.columnInfoService = this.columnInfoService;
@@ -161,8 +174,8 @@ export class SortCommandToolbarDirective {
161
174
  }));
162
175
  }
163
176
  closePopup() {
164
- this.host.toolbarButtonElement.nativeElement.setAttribute('aria-expanded', 'false');
165
- this.host.toolbarButtonElement.nativeElement.removeAttribute('aria-controls');
177
+ this.buttonElement?.setAttribute('aria-expanded', 'false');
178
+ this.buttonElement?.removeAttribute('aria-controls');
166
179
  if (this.popupRef) {
167
180
  this.popupRef.close();
168
181
  this.popupRef = null;
@@ -176,7 +189,10 @@ export class SortCommandToolbarDirective {
176
189
  this.removeClickListener = null;
177
190
  }
178
191
  }
179
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SortCommandToolbarDirective, deps: [{ token: i1.ToolBarButtonComponent }, { token: i2.PopupService }, { token: i3.ContextService }, { token: i4.SortService }, { token: i5.ColumnInfoService }, { token: i0.NgZone }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
192
+ get buttonElement() {
193
+ return this.host.getButton();
194
+ }
195
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SortCommandToolbarDirective, deps: [{ token: i1.ToolBarButtonComponent }, { token: i2.PopupService }, { token: i3.ContextService }, { token: i4.SortService }, { token: i5.ColumnInfoService }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i6.AdaptiveGridService }], target: i0.ɵɵFactoryTarget.Directive });
180
196
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: SortCommandToolbarDirective, isStandalone: true, selector: "[kendoGridSortTool]", ngImport: i0 });
181
197
  }
182
198
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SortCommandToolbarDirective, decorators: [{
@@ -185,4 +201,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
185
201
  selector: '[kendoGridSortTool]',
186
202
  standalone: true
187
203
  }]
188
- }], ctorParameters: function () { return [{ type: i1.ToolBarButtonComponent }, { type: i2.PopupService }, { type: i3.ContextService }, { type: i4.SortService }, { type: i5.ColumnInfoService }, { type: i0.NgZone }, { type: i0.Renderer2 }]; } });
204
+ }], ctorParameters: function () { return [{ type: i1.ToolBarButtonComponent }, { type: i2.PopupService }, { type: i3.ContextService }, { type: i4.SortService }, { type: i5.ColumnInfoService }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i6.AdaptiveGridService }]; } });
@@ -12,7 +12,10 @@ import { normalize } from '../../../columns/sort-settings';
12
12
  import { take } from 'rxjs/operators';
13
13
  import * as i0 from "@angular/core";
14
14
  import * as i1 from "@progress/kendo-angular-buttons";
15
- const directions = initialDirection => initialDirection === "asc" ? ["asc", "desc"] : ["desc", "asc"];
15
+ /**
16
+ * @hidden
17
+ */
18
+ export const directions = initialDirection => initialDirection === "asc" ? ["asc", "desc"] : ["desc", "asc"];
16
19
  /**
17
20
  * @hidden
18
21
  */
@@ -75,7 +78,10 @@ export class SortToolbarToolComponent {
75
78
  this.subscription.unsubscribe();
76
79
  }
77
80
  }
78
- toggleSort(column) {
81
+ toggleSort(column, ev) {
82
+ if (this.hostButton.location !== 'toolbar') {
83
+ ev.stopImmediatePropagation();
84
+ }
79
85
  const field = column?.field;
80
86
  if (!field) {
81
87
  return;
@@ -142,8 +148,8 @@ export class SortToolbarToolComponent {
142
148
  #sortItem
143
149
  role="button"
144
150
  class="k-columnmenu-item"
145
- (click)="toggleSort(column)"
146
- (keydown.enter)="toggleSort(column)"
151
+ (click)="toggleSort(column, $event)"
152
+ (keydown.enter)="toggleSort(column, $event)"
147
153
  [tabindex]="'0'"
148
154
  >
149
155
  {{column.title || getColumnComponent(column).field}}
@@ -160,7 +166,12 @@ export class SortToolbarToolComponent {
160
166
  </div>
161
167
 
162
168
  <div class="k-actions k-actions-stretched k-actions-horizontal k-column-menu-footer">
163
- <button kendoButton [svgIcon]="clearIcon" (click)="clearSorting()" >Clear sorting</button>
169
+ <button kendoButton
170
+ [svgIcon]="clearIcon"
171
+ icon="x"
172
+ (click)="clearSorting()">
173
+ {{ctx?.localization.get('sortClearButton')}}
174
+ </button>
164
175
  </div>
165
176
  `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "component", type: i1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }] });
166
177
  }
@@ -179,8 +190,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
179
190
  #sortItem
180
191
  role="button"
181
192
  class="k-columnmenu-item"
182
- (click)="toggleSort(column)"
183
- (keydown.enter)="toggleSort(column)"
193
+ (click)="toggleSort(column, $event)"
194
+ (keydown.enter)="toggleSort(column, $event)"
184
195
  [tabindex]="'0'"
185
196
  >
186
197
  {{column.title || getColumnComponent(column).field}}
@@ -197,7 +208,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
197
208
  </div>
198
209
 
199
210
  <div class="k-actions k-actions-stretched k-actions-horizontal k-column-menu-footer">
200
- <button kendoButton [svgIcon]="clearIcon" (click)="clearSorting()" >Clear sorting</button>
211
+ <button kendoButton
212
+ [svgIcon]="clearIcon"
213
+ icon="x"
214
+ (click)="clearSorting()">
215
+ {{ctx?.localization.get('sortClearButton')}}
216
+ </button>
201
217
  </div>
202
218
  `,
203
219
  standalone: true,
@@ -24,6 +24,10 @@ export class RowReorderService {
24
24
  constructor(renderer) {
25
25
  this.renderer = renderer;
26
26
  }
27
+ ngOnDestroy() {
28
+ this.destroyDropIndicator();
29
+ this.destroyHintElement();
30
+ }
27
31
  press(ev) {
28
32
  this.dragTarget = ev.dragTarget;
29
33
  this.offsetY = ev.dragEvent.offsetY;
@@ -55,12 +59,14 @@ export class RowReorderService {
55
59
  }
56
60
  dragEnd() {
57
61
  this.destroyDropIndicator();
62
+ this.destroyHintElement();
58
63
  this.dragTarget = null;
59
64
  this.dropTarget = null;
60
65
  this.hintElement = null;
61
66
  }
62
67
  drop(ev) {
63
68
  this.destroyDropIndicator();
69
+ this.destroyHintElement();
64
70
  const rowReorderArgs = this.rowReorderArgs(this.dragTarget, this.dropTarget, ev.dragData);
65
71
  this.rowReorder.emit(rowReorderArgs);
66
72
  }
@@ -142,6 +148,15 @@ export class RowReorderService {
142
148
  this.dropIndicator = null;
143
149
  }
144
150
  }
151
+ destroyHintElement() {
152
+ if (!isDocumentAvailable()) {
153
+ return;
154
+ }
155
+ if (this.hintElement?.parentElement) {
156
+ this.hintElement.parentElement.removeChild(this.hintElement);
157
+ this.hintElement = null;
158
+ }
159
+ }
145
160
  decorateHint() {
146
161
  hintClasses.forEach(className => this.renderer.addClass(this.hintElement, className));
147
162
  Object.keys(hintStyles)
@@ -144,6 +144,7 @@ export class SelectionService {
144
144
  ev.rangeStartRow = { dataItem: this.lastSelectionData, index: this.lastSelectionStartIndex };
145
145
  ev.rangeEndRow = { dataItem: item.data, index: item.index };
146
146
  }
147
+ this.syncCurrentSelection(ev);
147
148
  this.changes.emit(ev);
148
149
  }
149
150
  toggle(item) {
@@ -223,6 +224,7 @@ export class SelectionService {
223
224
  deselectedRows: [rowArgs],
224
225
  selectedRows: []
225
226
  };
227
+ this.syncCurrentSelection(ev);
226
228
  this.changes.emit(ev);
227
229
  }
228
230
  }
@@ -295,6 +297,7 @@ export class SelectionService {
295
297
  if (this.options.cellAggregates) {
296
298
  ev.cellAggregates = this.aggregateService.onSelectionChange(ev);
297
299
  }
300
+ this.syncCurrentSelection(ev);
298
301
  this.changes.emit(ev);
299
302
  }
300
303
  selectRange(startIndex, endIndex, preserveSelection, existingSelections = []) {
@@ -428,6 +431,14 @@ export class SelectionService {
428
431
  this.dataChangedSubscription = null;
429
432
  }
430
433
  }
434
+ syncCurrentSelection(ev) {
435
+ for (const row of ev.deselectedRows) {
436
+ this.currentSelection.splice(row.index, 1);
437
+ }
438
+ for (const row of ev.selectedRows) {
439
+ this.currentSelection[row.index] = row;
440
+ }
441
+ }
431
442
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SelectionService, deps: [{ token: i1.DomEventsService }, { token: i2.CellSelectionAggregateService }, { token: i3.LocalDataChangesService }, { token: i4.NavigationService }, { token: i5.ContextService }], target: i0.ɵɵFactoryTarget.Injectable });
432
443
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SelectionService });
433
444
  }
@@ -0,0 +1,26 @@
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
+ import { PreventableEvent } from "@progress/kendo-angular-common";
6
+ /**
7
+ * Arguments for the `undo` and `redo` events.
8
+ */
9
+ export class UndoRedoEvent extends PreventableEvent {
10
+ /**
11
+ * The event data of the original action that triggered the state change.
12
+ */
13
+ originalEvent;
14
+ /**
15
+ * The grid state and rendered data at the time of the action.
16
+ */
17
+ gridState;
18
+ /**
19
+ * @hidden
20
+ */
21
+ constructor({ originalEvent, gridState }) {
22
+ super();
23
+ this.originalEvent = originalEvent;
24
+ this.gridState = gridState;
25
+ }
26
+ }
@@ -0,0 +1,66 @@
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
+ import { Directive } from '@angular/core';
6
+ import { ToolBarButtonComponent } from '@progress/kendo-angular-toolbar';
7
+ import { Subscription } from 'rxjs';
8
+ import { redoIcon } from '@progress/kendo-svg-icons';
9
+ import { UndoRedoService } from './undo-redo.service';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./undo-redo.service";
12
+ import * as i2 from "@progress/kendo-angular-toolbar";
13
+ /**
14
+ * Represents the command for triggering the redo action in the Grid.
15
+ * You can apply this directive to any `kendo-toolbar-button` element inside a
16
+ * ToolbarComponent used in the Grid.
17
+ *
18
+ * When the user clicks the toolbar button that is associated with the directive, the
19
+ * [redo]({% slug api_grid_undoredodirective %}#toc-redo) event is triggered.
20
+ *
21
+ * @example
22
+ * ```html-no-run
23
+ * <kendo-grid>
24
+ * <kendo-toolbar>
25
+ * <kendo-toolbar-button kendoGridRedoTool></kendo-toolbar-button>
26
+ * </kendo-toolbar>
27
+ * </kendo-grid>
28
+ * ```
29
+ */
30
+ export class RedoCommandToolbarDirective {
31
+ undoRedoService;
32
+ host;
33
+ subs = new Subscription();
34
+ constructor(undoRedoService, host) {
35
+ this.undoRedoService = undoRedoService;
36
+ this.host = host;
37
+ }
38
+ ngOnInit() {
39
+ this.subs = this.host.click.subscribe(e => this.onClick(e));
40
+ this.host.className = 'k-grid-redo-command';
41
+ this.host.svgIcon = redoIcon;
42
+ this.host.icon = 'redo';
43
+ this.host.text = 'Redo';
44
+ this.host.disabled = true;
45
+ this.subs.add(this.undoRedoService.stackEndReached.subscribe((stackEnd) => this.host.disabled = stackEnd === 'end'));
46
+ }
47
+ ngOnDestroy() {
48
+ this.subs.unsubscribe();
49
+ }
50
+ /**
51
+ * @hidden
52
+ */
53
+ onClick(e) {
54
+ e.preventDefault();
55
+ this.undoRedoService.onRedo.next();
56
+ }
57
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RedoCommandToolbarDirective, deps: [{ token: i1.UndoRedoService }, { token: i2.ToolBarButtonComponent }], target: i0.ɵɵFactoryTarget.Directive });
58
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: RedoCommandToolbarDirective, isStandalone: true, selector: "[kendoGridRedoTool]", ngImport: i0 });
59
+ }
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RedoCommandToolbarDirective, decorators: [{
61
+ type: Directive,
62
+ args: [{
63
+ selector: '[kendoGridRedoTool]',
64
+ standalone: true
65
+ }]
66
+ }], ctorParameters: function () { return [{ type: i1.UndoRedoService }, { type: i2.ToolBarButtonComponent }]; } });
@@ -0,0 +1,66 @@
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
+ import { Directive } from '@angular/core';
6
+ import { ToolBarButtonComponent } from '@progress/kendo-angular-toolbar';
7
+ import { Subscription } from 'rxjs';
8
+ import { undoIcon } from '@progress/kendo-svg-icons';
9
+ import { UndoRedoService } from './undo-redo.service';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./undo-redo.service";
12
+ import * as i2 from "@progress/kendo-angular-toolbar";
13
+ /**
14
+ * Represents the command for triggering the undo action in the Grid.
15
+ * You can apply this directive to any `kendo-toolbar-button` element inside a
16
+ * ToolbarComponent used in the Grid.
17
+ *
18
+ * When the user clicks the toolbar button that is associated with the directive, the
19
+ * [undo]({% slug api_grid_undoredodirective %}#toc-undo) event is triggered.
20
+ *
21
+ * @example
22
+ * ```html-no-run
23
+ * <kendo-grid>
24
+ * <kendo-toolbar>
25
+ * <kendo-toolbar-button kendoGridUndoTool></kendo-toolbar-button>
26
+ * </kendo-toolbar>
27
+ * </kendo-grid>
28
+ * ```
29
+ */
30
+ export class UndoCommandToolbarDirective {
31
+ undoRedoService;
32
+ host;
33
+ subs = new Subscription();
34
+ constructor(undoRedoService, host) {
35
+ this.undoRedoService = undoRedoService;
36
+ this.host = host;
37
+ }
38
+ ngOnInit() {
39
+ this.subs = this.host.click.subscribe(e => this.onClick(e));
40
+ this.host.className = 'k-grid-undo-command';
41
+ this.host.svgIcon = undoIcon;
42
+ this.host.icon = 'undo';
43
+ this.host.text = 'Undo';
44
+ this.host.disabled = true;
45
+ this.subs.add(this.undoRedoService.stackEndReached.subscribe((stackEnd) => this.host.disabled = stackEnd === 'start'));
46
+ }
47
+ ngOnDestroy() {
48
+ this.subs.unsubscribe();
49
+ }
50
+ /**
51
+ * @hidden
52
+ */
53
+ onClick(e) {
54
+ e.preventDefault();
55
+ this.undoRedoService.onUndo.next();
56
+ }
57
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UndoCommandToolbarDirective, deps: [{ token: i1.UndoRedoService }, { token: i2.ToolBarButtonComponent }], target: i0.ɵɵFactoryTarget.Directive });
58
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: UndoCommandToolbarDirective, isStandalone: true, selector: "[kendoGridUndoTool]", ngImport: i0 });
59
+ }
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UndoCommandToolbarDirective, decorators: [{
61
+ type: Directive,
62
+ args: [{
63
+ selector: '[kendoGridUndoTool]',
64
+ standalone: true
65
+ }]
66
+ }], ctorParameters: function () { return [{ type: i1.UndoRedoService }, { type: i2.ToolBarButtonComponent }]; } });