@progress/kendo-angular-grid 5.5.2 → 6.0.1-dev.202201201304

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 (91) hide show
  1. package/LICENSE.md +1 -1
  2. package/NOTICE.txt +119 -79
  3. package/README.md +1 -1
  4. package/dist/cdn/js/kendo-angular-grid.js +2 -2
  5. package/dist/cdn/main.js +1 -1
  6. package/dist/es/column-menu/column-chooser.component.js +1 -1
  7. package/dist/es/column-menu/column-list.component.js +1 -1
  8. package/dist/es/dragdrop/draggable-column.directive.js +3 -3
  9. package/dist/es/filtering/cell/filter-cell-operators.component.js +1 -1
  10. package/dist/es/filtering/cell/string-filter-cell.component.js +1 -1
  11. package/dist/es/filtering/filter-input.directive.js +2 -1
  12. package/dist/es/filtering/menu/boolean-filter-menu.component.js +1 -1
  13. package/dist/es/filtering/menu/filter-menu-container.component.js +1 -1
  14. package/dist/es/filtering/menu/string-filter-menu-input.component.js +1 -1
  15. package/dist/es/grid.component.js +4 -5
  16. package/dist/es/grouping/group-indicator.component.js +1 -1
  17. package/dist/es/navigation/focusable.directive.js +5 -5
  18. package/dist/es/package-metadata.js +1 -1
  19. package/dist/es/pager/pager-numeric-buttons.component.js +1 -1
  20. package/dist/es/pager/pager.component.js +0 -5
  21. package/dist/es/pdf/export-element.js +1 -1
  22. package/dist/es/rendering/cell.component.js +1 -1
  23. package/dist/es/rendering/constants.js +1 -1
  24. package/dist/es/rendering/details-expand.directive.js +20 -6
  25. package/dist/es/rendering/header/header.component.js +1 -1
  26. package/dist/es/rendering/toolbar/toolbar-template.directive.js +4 -4
  27. package/dist/es/selection/pair-set.js +91 -0
  28. package/dist/es/selection/selection-default.js +48 -30
  29. package/dist/es/utils.js +1 -3
  30. package/dist/es2015/column-menu/column-chooser.component.js +2 -2
  31. package/dist/es2015/column-menu/column-list.component.js +3 -3
  32. package/dist/es2015/dragdrop/draggable-column.directive.js +3 -3
  33. package/dist/es2015/filtering/cell/filter-cell-operators.component.js +3 -3
  34. package/dist/es2015/filtering/cell/string-filter-cell.component.js +1 -1
  35. package/dist/es2015/filtering/filter-input.directive.js +2 -1
  36. package/dist/es2015/filtering/menu/boolean-filter-menu.component.js +1 -1
  37. package/dist/es2015/filtering/menu/filter-menu-container.component.js +2 -2
  38. package/dist/es2015/filtering/menu/string-filter-menu-input.component.js +1 -1
  39. package/dist/es2015/grid.component.d.ts +4 -4
  40. package/dist/es2015/grid.component.js +4 -5
  41. package/dist/es2015/grouping/group-indicator.component.js +2 -2
  42. package/dist/es2015/index.metadata.json +1 -1
  43. package/dist/es2015/navigation/focusable.directive.d.ts +5 -5
  44. package/dist/es2015/navigation/focusable.directive.js +5 -5
  45. package/dist/es2015/package-metadata.js +1 -1
  46. package/dist/es2015/pager/pager-numeric-buttons.component.js +1 -1
  47. package/dist/es2015/pager/pager.component.d.ts +0 -1
  48. package/dist/es2015/pager/pager.component.js +0 -5
  49. package/dist/es2015/pdf/export-element.js +1 -1
  50. package/dist/es2015/rendering/cell.component.js +3 -3
  51. package/dist/es2015/rendering/constants.d.ts +1 -1
  52. package/dist/es2015/rendering/constants.js +1 -1
  53. package/dist/es2015/rendering/details-expand.directive.d.ts +8 -2
  54. package/dist/es2015/rendering/details-expand.directive.js +20 -6
  55. package/dist/es2015/rendering/header/header.component.js +1 -1
  56. package/dist/es2015/rendering/toolbar/toolbar-template.directive.d.ts +4 -4
  57. package/dist/es2015/rendering/toolbar/toolbar-template.directive.js +4 -4
  58. package/dist/es2015/selection/pair-set.d.ts +50 -0
  59. package/dist/es2015/selection/pair-set.js +81 -0
  60. package/dist/es2015/selection/selection-default.d.ts +10 -2
  61. package/dist/es2015/selection/selection-default.js +42 -28
  62. package/dist/es2015/utils.d.ts +2 -2
  63. package/dist/fesm2015/index.js +179 -78
  64. package/dist/fesm5/index.js +186 -74
  65. package/dist/npm/column-menu/column-chooser.component.js +1 -1
  66. package/dist/npm/column-menu/column-list.component.js +1 -1
  67. package/dist/npm/dragdrop/draggable-column.directive.js +3 -3
  68. package/dist/npm/filtering/cell/filter-cell-operators.component.js +1 -1
  69. package/dist/npm/filtering/cell/string-filter-cell.component.js +1 -1
  70. package/dist/npm/filtering/filter-input.directive.js +2 -1
  71. package/dist/npm/filtering/menu/boolean-filter-menu.component.js +1 -1
  72. package/dist/npm/filtering/menu/filter-menu-container.component.js +1 -1
  73. package/dist/npm/filtering/menu/string-filter-menu-input.component.js +1 -1
  74. package/dist/npm/grid.component.js +4 -5
  75. package/dist/npm/grouping/group-indicator.component.js +1 -1
  76. package/dist/npm/navigation/focusable.directive.js +5 -5
  77. package/dist/npm/package-metadata.js +1 -1
  78. package/dist/npm/pager/pager-numeric-buttons.component.js +1 -1
  79. package/dist/npm/pager/pager.component.js +0 -5
  80. package/dist/npm/pdf/export-element.js +1 -1
  81. package/dist/npm/rendering/cell.component.js +1 -1
  82. package/dist/npm/rendering/constants.js +1 -1
  83. package/dist/npm/rendering/details-expand.directive.js +19 -5
  84. package/dist/npm/rendering/header/header.component.js +1 -1
  85. package/dist/npm/rendering/toolbar/toolbar-template.directive.js +4 -4
  86. package/dist/npm/selection/pair-set.js +93 -0
  87. package/dist/npm/selection/selection-default.js +48 -30
  88. package/dist/npm/utils.js +1 -3
  89. package/dist/systemjs/kendo-angular-grid.js +1 -1
  90. package/package.json +14 -14
  91. package/schematics/ngAdd/index.js +1 -1
@@ -134,7 +134,7 @@ var ColumnChooserComponent = /** @class */ (function () {
134
134
  ColumnChooserComponent = tslib_1.__decorate([
135
135
  core_1.Component({
136
136
  selector: 'kendo-grid-column-chooser',
137
- template: "\n <button #anchor\n type=\"button\"\n (click)=\"toggle(anchor, template)\"\n class=\"k-button k-bare k-button-icon\"\n [attr.title]=\"localization.get('columns')\">\n <span class=\"k-icon k-i-columns\"></span>\n </button>\n <ng-template #template>\n <span class='k-column-chooser-title'>{{ localization.get('columns') }}</span>\n <kendo-grid-columnlist\n [columns]=\"columns\"\n [applyText]=\"localization.get('columnsApply')\"\n [resetText]=\"localization.get('columnsReset')\"\n [autoSync]=\"autoSync\"\n [allowHideAll]=\"allowHideAll\"\n (apply)=\"onApply($event)\"\n (columnChange)=\"onChange($event)\">\n </kendo-grid-columnlist>\n </ng-template>\n "
137
+ template: "\n <button #anchor\n type=\"button\"\n (click)=\"toggle(anchor, template)\"\n class=\"k-button k-button-flat-base k-button-flat k-icon-button k-button-md k-rounded-md k-button-rectangle k-icon-button\"\n [attr.title]=\"localization.get('columns')\">\n <span class=\"k-button-icon k-icon k-i-columns\"></span>\n </button>\n <ng-template #template>\n <span class='k-column-chooser-title'>{{ localization.get('columns') }}</span>\n <kendo-grid-columnlist\n [columns]=\"columns\"\n [applyText]=\"localization.get('columnsApply')\"\n [resetText]=\"localization.get('columnsReset')\"\n [autoSync]=\"autoSync\"\n [allowHideAll]=\"allowHideAll\"\n (apply)=\"onApply($event)\"\n (columnChange)=\"onChange($event)\">\n </kendo-grid-columnlist>\n </ng-template>\n "
138
138
  }),
139
139
  tslib_1.__metadata("design:paramtypes", [kendo_angular_l10n_1.LocalizationService,
140
140
  column_info_service_1.ColumnInfoService,
@@ -223,7 +223,7 @@ var ColumnListComponent = /** @class */ (function () {
223
223
  ColumnListComponent = tslib_1.__decorate([
224
224
  core_1.Component({
225
225
  selector: 'kendo-grid-columnlist',
226
- template: "\n <div class=\"k-column-list\">\n <label *ngFor=\"let column of columns; let index = index;\" class='k-column-list-item'>\n <input class=\"k-checkbox\" type=\"checkbox\" [attr.data-index]=\"index\" [checked]=\"!column.hidden\" [disabled]=\"isDisabled(column)\" /><span class=\"k-checkbox-label\">{{ column.displayTitle }}</span>\n </label>\n </div>\n <div [ngClass]=\"actionsClass\" *ngIf=\"!autoSync\">\n <button type=\"button\" class=\"k-button\" (click)=\"cancelChanges()\">{{ resetText }}</button>\n <button #applyButton type=\"button\" (keydown.tab)=\"onTab($event)\" class=\"k-button k-primary\" (click)=\"applyChanges()\">{{ applyText }}</button>\n </div>\n "
226
+ template: "\n <div class=\"k-column-list\">\n <label *ngFor=\"let column of columns; let index = index;\" class='k-column-list-item'>\n <input class=\"k-checkbox k-checkbox-md k-rounded-md\" type=\"checkbox\" [attr.data-index]=\"index\" [checked]=\"!column.hidden\" [disabled]=\"isDisabled(column)\" /><span class=\"k-checkbox-label\">{{ column.displayTitle }}</span>\n </label>\n </div>\n <div [ngClass]=\"actionsClass\" *ngIf=\"!autoSync\">\n <button type=\"button\" class=\"k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle\" (click)=\"cancelChanges()\">{{ resetText }}</button>\n <button #applyButton type=\"button\" (keydown.tab)=\"onTab($event)\" class=\"k-button k-button-solid-primary k-button-solid k-button-md k-rounded-md k-button-rectangle\" (click)=\"applyChanges()\">{{ applyText }}</button>\n </div>\n "
227
227
  }),
228
228
  tslib_1.__metadata("design:paramtypes", [core_1.ElementRef,
229
229
  core_1.NgZone,
@@ -28,9 +28,9 @@ exports.ɵ0 = ɵ0;
28
28
  var hasClass = function (className) { return function (el) { return new RegExp("(^| )" + className + "( |$)").test(el.className); }; };
29
29
  var ɵ1 = hasClass;
30
30
  exports.ɵ1 = ɵ1;
31
- var isDeleteButton = utils_1.or(hasClass("k-i-group-delete"), hasClass("k-button-icon"));
32
- var isSortIcon = utils_1.or(hasClass("k-i-sort-asc-sm"), hasClass("k-i-sort-desc-sm"));
33
- var skipButtons = utils_1.and(utils_1.not(isDeleteButton), utils_1.not(isSortIcon), utils_1.not(dom_queries_1.isFocusableWithTabKey), utils_1.not(dom_queries_1.matchesNodeName("label")));
31
+ var isDeleteButton = utils_1.or(hasClass('k-i-group-delete'), hasClass('k-icon-button'));
32
+ var isSortIcon = utils_1.or(hasClass('k-i-sort-asc-sm'), hasClass('k-i-sort-desc-sm'));
33
+ var skipButtons = utils_1.and(utils_1.not(isDeleteButton), utils_1.not(isSortIcon), utils_1.not(dom_queries_1.isFocusableWithTabKey), utils_1.not(dom_queries_1.matchesNodeName('label')));
34
34
  var elementUnderCursor = function (_a) {
35
35
  var clientX = _a.clientX, clientY = _a.clientY;
36
36
  return document.elementFromPoint(clientX, clientY);
@@ -119,7 +119,7 @@ var FilterCellOperatorsComponent = /** @class */ (function () {
119
119
  FilterCellOperatorsComponent = tslib_1.__decorate([
120
120
  core_1.Component({
121
121
  selector: 'kendo-grid-filter-cell-operators',
122
- template: "\n <kendo-dropdownlist\n #dropdown\n *ngIf=\"showOperators\"\n kendoGridFocusable\n [data]=\"operators\"\n class=\"k-dropdown-operator\"\n (valueChange)=\"onChange($event)\"\n [value]=\"value\"\n iconClass=\"k-i-filter\"\n [valuePrimitive]=\"true\"\n textField=\"text\"\n [popupSettings]=\"{ width: 'auto' }\"\n valueField=\"value\"\n (keydown)=\"dropdownKeydown($event)\">\n </kendo-dropdownlist>\n <button type=\"button\"\n kendoGridFocusable\n [ngClass]=\"{'k-clear-button-visible': showButton}\"\n class=\"k-button k-button-icon\"\n [title]=\"clearText\"\n (click)=\"clearClick()\"\n (keydown)=\"clearKeydown($event)\">\n <span class=\"k-icon k-i-filter-clear\"></span>\n </button>\n "
122
+ template: "\n <kendo-dropdownlist\n #dropdown\n *ngIf=\"showOperators\"\n kendoGridFocusable\n [data]=\"operators\"\n class=\"k-dropdown-operator\"\n (valueChange)=\"onChange($event)\"\n [value]=\"value\"\n iconClass=\"k-i-filter\"\n [valuePrimitive]=\"true\"\n textField=\"text\"\n [popupSettings]=\"{ width: 'auto' }\"\n valueField=\"value\"\n (keydown)=\"dropdownKeydown($event)\">\n </kendo-dropdownlist>\n <button type=\"button\"\n kendoGridFocusable\n *ngIf=\"showButton\"\n class=\"k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle k-icon-button\"\n [title]=\"clearText\"\n (click)=\"clearClick()\"\n (keydown)=\"clearKeydown($event)\">\n <span class=\"k-icon k-button-icon k-i-filter-clear\"></span>\n </button>\n "
123
123
  }),
124
124
  tslib_1.__metadata("design:paramtypes", [kendo_angular_l10n_1.LocalizationService])
125
125
  ], FilterCellOperatorsComponent);
@@ -69,7 +69,7 @@ var StringFilterCellComponent = /** @class */ (function (_super) {
69
69
  StringFilterCellComponent = tslib_1.__decorate([
70
70
  core_1.Component({
71
71
  selector: 'kendo-grid-string-filter-cell',
72
- template: "\n <kendo-grid-filter-wrapper-cell\n [column]=\"column\"\n [filter]=\"filter\"\n [operators]=\"operators\"\n [defaultOperator]=\"operator\"\n [showOperators]=\"showOperators\">\n <input\n class=\"k-textbox\"\n kendoGridFocusable\n kendoFilterInput\n [columnLabel]=\"columnLabel\"\n [filterDelay]=\"filterDelay\"\n [ngModel]=\"currentFilter?.value\" />\n </kendo-grid-filter-wrapper-cell>\n "
72
+ template: "\n <kendo-grid-filter-wrapper-cell\n [column]=\"column\"\n [filter]=\"filter\"\n [operators]=\"operators\"\n [defaultOperator]=\"operator\"\n [showOperators]=\"showOperators\">\n <input\n kendoTextBox\n kendoGridFocusable\n kendoFilterInput\n [columnLabel]=\"columnLabel\"\n [filterDelay]=\"filterDelay\"\n [ngModel]=\"currentFilter?.value\" />\n </kendo-grid-filter-wrapper-cell>\n "
73
73
  }),
74
74
  tslib_1.__metadata("design:paramtypes", [filter_service_1.FilterService,
75
75
  kendo_angular_l10n_1.LocalizationService])
@@ -81,7 +81,8 @@ var FilterInputDirective = /** @class */ (function () {
81
81
  FilterInputDirective.prototype.addAriaAttributes = function () {
82
82
  var ariaValue = this.columnLabel;
83
83
  if (this.kendoInput && this.kendoInput.focusableId && kendo_angular_common_1.isDocumentAvailable()) {
84
- var focusableElement = this.element.nativeElement.querySelector("#" + this.kendoInput.focusableId);
84
+ var focusableElement = this.element.nativeElement.querySelector("#" + this.kendoInput.focusableId) ||
85
+ this.element.nativeElement;
85
86
  this.renderer.setAttribute(focusableElement, 'aria-label', ariaValue);
86
87
  }
87
88
  else {
@@ -127,7 +127,7 @@ var BooleanFilterMenuComponent = /** @class */ (function (_super) {
127
127
  BooleanFilterMenuComponent = tslib_1.__decorate([
128
128
  core_1.Component({
129
129
  selector: 'kendo-grid-boolean-filter-menu',
130
- template: "\n <ul class=\"k-radio-list k-reset\">\n <li *ngFor=\"let item of items\">\n <input type=\"radio\"\n kendoFilterMenuRadioButton\n [columnLabel]=\"columnLabel\"\n #input\n [name]=\"idPrefix\"\n class=\"k-radio\"\n [checked]=\"isSelected(item.value)\"\n [attr.id]=\"radioId(item.value)\"\n (change)=\"onChange(item.value, input)\"\n (keydown.shift.tab)=\"onShiftTab($event)\"\n />\n <label class=\"k-radio-label\" [attr.for]=\"radioId(item.value)\">{{item.text}}</label>\n </li>\n </ul>\n "
130
+ template: "\n <ul class=\"k-radio-list k-reset\">\n <li *ngFor=\"let item of items\">\n <input type=\"radio\"\n kendoFilterMenuRadioButton\n [columnLabel]=\"columnLabel\"\n #input\n [name]=\"idPrefix\"\n kendoRadioButton\n [checked]=\"isSelected(item.value)\"\n [attr.id]=\"radioId(item.value)\"\n (change)=\"onChange(item.value, input)\"\n (keydown.shift.tab)=\"onShiftTab($event)\"\n />\n <label class=\"k-radio-label\" [attr.for]=\"radioId(item.value)\">{{item.text}}</label>\n </li>\n </ul>\n "
131
131
  }),
132
132
  tslib_1.__metadata("design:paramtypes", [kendo_angular_l10n_1.LocalizationService])
133
133
  ], BooleanFilterMenuComponent);
@@ -233,7 +233,7 @@ var FilterMenuContainerComponent = /** @class */ (function () {
233
233
  menu_tabbing_service_1.MenuTabbingService
234
234
  ],
235
235
  selector: 'kendo-grid-filter-menu-container',
236
- template: "\n <form (submit)=\"submit()\" (reset)=\"reset()\"\n class=\"k-filter-menu k-group k-reset k-state-border-up\">\n <div class=\"k-filter-menu-container\">\n <ng-container [ngSwitch]=\"hasTemplate\">\n <ng-container *ngSwitchCase=\"false\">\n <ng-container\n kendoFilterMenuHost\n [filterService]=\"childService\"\n [column]=\"column\"\n [filter]=\"childFilter\"\n [menuTabbingService]=\"menuTabbingService\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"true\">\n <ng-template\n *ngIf=\"column.filterMenuTemplateRef\"\n [ngTemplateOutlet]=\"column.filterMenuTemplateRef\"\n [ngTemplateOutletContext]=\"templateContext\"\n >\n </ng-template>\n </ng-container>\n </ng-container>\n <div [ngClass]=\"actionsClass\">\n <button\n #resetButton\n type=\"reset\"\n class=\"k-button\"\n (keydown.tab)=\"onTab($event, 'reset')\">{{clearText}}</button>\n <button #filterButton\n type=\"submit\"\n class=\"k-button k-primary\"\n [disabled]=\"disabled\"\n (keydown.tab)=\"onTab($event, 'filter')\">{{filterText}}</button>\n </div>\n </div>\n </form>\n "
236
+ template: "\n <form (submit)=\"submit()\" (reset)=\"reset()\"\n class=\"k-filter-menu k-group k-reset k-state-border-up\">\n <div class=\"k-filter-menu-container\">\n <ng-container [ngSwitch]=\"hasTemplate\">\n <ng-container *ngSwitchCase=\"false\">\n <ng-container\n kendoFilterMenuHost\n [filterService]=\"childService\"\n [column]=\"column\"\n [filter]=\"childFilter\"\n [menuTabbingService]=\"menuTabbingService\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"true\">\n <ng-template\n *ngIf=\"column.filterMenuTemplateRef\"\n [ngTemplateOutlet]=\"column.filterMenuTemplateRef\"\n [ngTemplateOutletContext]=\"templateContext\"\n >\n </ng-template>\n </ng-container>\n </ng-container>\n <div [ngClass]=\"actionsClass\">\n <button\n #resetButton\n type=\"reset\"\n class=\"k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle\"\n (keydown.tab)=\"onTab($event, 'reset')\">{{clearText}}</button>\n <button #filterButton\n type=\"submit\"\n class=\"k-button k-button-solid-primary k-button-solid k-button-md k-rounded-md k-button-rectangle\"\n [disabled]=\"disabled\"\n (keydown.tab)=\"onTab($event, 'filter')\">{{filterText}}</button>\n </div>\n </div>\n </form>\n "
237
237
  }),
238
238
  tslib_1.__param(0, core_1.SkipSelf()),
239
239
  tslib_1.__metadata("design:paramtypes", [filter_service_1.FilterService,
@@ -63,7 +63,7 @@ var StringFilterMenuInputComponent = /** @class */ (function () {
63
63
  StringFilterMenuInputComponent = tslib_1.__decorate([
64
64
  core_1.Component({
65
65
  selector: 'kendo-grid-string-filter-menu-input',
66
- template: "\n <kendo-grid-filter-menu-input-wrapper\n [column]=\"column\"\n [filter]=\"filter\"\n [operators]=\"operators\"\n [defaultOperator]=\"operator\"\n [currentFilter]=\"currentFilter\"\n [filterService]=\"filterService\"\n [isFirstDropDown]=\"isFirstDropDown\"\n [menuTabbingService]=\"menuTabbingService\"\n >\n <input\n class=\"k-textbox\"\n kendoFilterInput\n [columnLabel]=\"columnLabel\"\n [filterDelay]=\"0\"\n [ngModel]=\"currentFilter?.value\" />\n </kendo-grid-filter-menu-input-wrapper>\n "
66
+ template: "\n <kendo-grid-filter-menu-input-wrapper\n [column]=\"column\"\n [filter]=\"filter\"\n [operators]=\"operators\"\n [defaultOperator]=\"operator\"\n [currentFilter]=\"currentFilter\"\n [filterService]=\"filterService\"\n [isFirstDropDown]=\"isFirstDropDown\"\n [menuTabbingService]=\"menuTabbingService\"\n >\n <input\n kendoTextBox\n kendoFilterInput\n [columnLabel]=\"columnLabel\"\n [filterDelay]=\"0\"\n [ngModel]=\"currentFilter?.value\" />\n </kendo-grid-filter-menu-input-wrapper>\n "
67
67
  }),
68
68
  tslib_1.__metadata("design:paramtypes", [kendo_angular_l10n_1.LocalizationService])
69
69
  ], StringFilterMenuInputComponent);
@@ -1460,7 +1460,7 @@ var GridComponent = /** @class */ (function () {
1460
1460
  * [resizable]="true"
1461
1461
  * style="height: 300px">
1462
1462
  * <ng-template kendoGridToolbarTemplate>
1463
- * <button class="k-button" (click)="grid.autoFitColumn(groupColumn)">
1463
+ * <button kendoButton (click)="grid.autoFitColumn(groupColumn)">
1464
1464
  * Auto-fit the group column
1465
1465
  * </button>
1466
1466
  * </ng-template>
@@ -1526,10 +1526,10 @@ var GridComponent = /** @class */ (function () {
1526
1526
  * [resizable]="true"
1527
1527
  * style="height: 300px">
1528
1528
  * <ng-template kendoGridToolbarTemplate>
1529
- * <button class="k-button" (click)="grid.autoFitColumns([firstColumn, lastColumn])">
1529
+ * <button kendoButton (click)="grid.autoFitColumns([firstColumn, lastColumn])">
1530
1530
  * Auto-fit the first and last column
1531
1531
  * </button>
1532
- * <button class="k-button" (click)="grid.autoFitColumns()">
1532
+ * <button kendoButton (click)="grid.autoFitColumns()">
1533
1533
  * Auto-fit all columns
1534
1534
  * </button>
1535
1535
  * </ng-template>
@@ -1708,7 +1708,7 @@ var GridComponent = /** @class */ (function () {
1708
1708
  * [reorderable]="true"
1709
1709
  * style="height: 300px">
1710
1710
  * <ng-template kendoGridToolbarTemplate>
1711
- * <button class="k-button"
1711
+ * <button kendoButton
1712
1712
  * (click)="grid.reorderColumn(groupColumn, 2, { before: true })">
1713
1713
  * Move the group column before the last one.
1714
1714
  * </button>
@@ -2569,7 +2569,6 @@ var GridComponent = /** @class */ (function () {
2569
2569
  tslib_1.__metadata("design:paramtypes", [])
2570
2570
  ], GridComponent.prototype, "dir", null);
2571
2571
  tslib_1.__decorate([
2572
- core_1.HostBinding('class.k-widget'),
2573
2572
  core_1.HostBinding('class.k-grid'),
2574
2573
  tslib_1.__metadata("design:type", Boolean),
2575
2574
  tslib_1.__metadata("design:paramtypes", [])
@@ -67,7 +67,7 @@ var GroupIndicatorComponent = /** @class */ (function () {
67
67
  core_1.Component({
68
68
  changeDetection: core_1.ChangeDetectionStrategy.OnPush,
69
69
  selector: '[kendoGroupIndicator]',
70
- template: "\n <a href=\"#\" class=\"k-link\" tabindex=\"-1\" (click)=\"toggleDirection()\">\n <span class=\"k-icon\"\n [class.k-i-sort-asc-sm]=\"dir === 'asc'\"\n [class.k-i-sort-desc-sm]=\"dir === 'desc'\"></span>\n {{groupTitle}}</a>\n <a class=\"k-button k-button-icon k-bare\" tabindex=\"-1\" (click)=\"removeDescriptor()\">\n <span class=\"k-icon k-i-group-delete\"></span>\n </a>\n "
70
+ template: "\n <a href=\"#\" class=\"k-link\" tabindex=\"-1\" (click)=\"toggleDirection()\">\n <span class=\"k-icon\"\n [class.k-i-sort-asc-sm]=\"dir === 'asc'\"\n [class.k-i-sort-desc-sm]=\"dir === 'desc'\"></span>\n {{groupTitle}}</a>\n <a class=\"k-button k-button-flat-base k-button-flat k-icon-button k-button-md k-rounded-md k-button-rectangle k-icon-button\" tabindex=\"-1\" (click)=\"removeDescriptor()\">\n <span class=\"k-button-icon k-icon k-i-group-delete\"></span>\n </a>\n "
71
71
  })
72
72
  ], GroupIndicatorComponent);
73
73
  return GroupIndicatorComponent;
@@ -17,7 +17,7 @@ var cell_context_1 = require("../rendering/common/cell-context");
17
17
  * _@Component({
18
18
  * selector: 'my-app',
19
19
  * template: `
20
- * <input type="text" class="k-textbox" placeholder="Tab stop #0" style="margin-bottom: 8px;" />
20
+ * <input type="text" placeholder="Tab stop #0" style="margin-bottom: 8px;" />
21
21
  * <kendo-grid [data]="data" [navigable]="true">
22
22
  * <kendo-grid-column field="ProductID" title="Product ID" width="100">
23
23
  * </kendo-grid-column>
@@ -26,18 +26,18 @@ var cell_context_1 = require("../rendering/common/cell-context");
26
26
  * <kendo-grid-column>
27
27
  * <ng-template kendoGridCellTemplate let-dataItem>
28
28
  * <!-- The first focusable element will be focused when pressing Enter on the cell -->
29
- * <input type="text" class="k-textbox" kendoGridFocusable [value]="dataItem.ProductName" style="margin-right: 8px;" />
30
- * <button class="k-button" kendoGridFocusable>Update</button>
29
+ * <input type="text" kendoGridFocusable [value]="dataItem.ProductName" style="margin-right: 8px;" />
30
+ * <button kendoGridFocusable>Update</button>
31
31
  * </ng-template>
32
32
  * </kendo-grid-column>
33
33
  * <kendo-grid-column width="100">
34
34
  * <ng-template kendoGridCellTemplate>
35
35
  * <!-- A single focusable element will be focused during navigation -->
36
- * <button class="k-button" kendoGridFocusable>Delete</button>
36
+ * <button kendoGridFocusable>Delete</button>
37
37
  * </ng-template>
38
38
  * </kendo-grid-column>
39
39
  * </kendo-grid>
40
- * <input type="text" class="k-textbox" placeholder="Tab stop #2" style="margin-top: 8px;" />
40
+ * <input type="text" placeholder="Tab stop #2" style="margin-top: 8px;" />
41
41
  * `
42
42
  * })
43
43
  *
@@ -11,7 +11,7 @@ exports.packageMetadata = {
11
11
  name: '@progress/kendo-angular-grid',
12
12
  productName: 'Kendo UI for Angular',
13
13
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
14
- publishDate: 1641921939,
14
+ publishDate: 1642683266,
15
15
  version: '',
16
16
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'
17
17
  };
@@ -111,7 +111,7 @@ var PagerNumericButtonsComponent = /** @class */ (function (_super) {
111
111
  core_1.Component({
112
112
  changeDetection: core_1.ChangeDetectionStrategy.OnPush,
113
113
  selector: 'kendo-pager-numeric-buttons',
114
- template: "\n <select\n class=\"k-dropdown k-pager-nav\"\n kendoGridFocusable\n tabindex=\"0\"\n [value]=\"(currentPage).toString()\"\n (change)=\"onSelectChange($event)\">\n <option *ngIf=\"start > 1\"\n class=\"k-link\"\n value=\"previousButtons\"\n [attr.aria-label]=\"pageLabel(start - 1)\">...\n </option>\n <option *ngFor=\"let num of buttons\"\n [value]=\"num.toString()\"\n [attr.aria-label]=\"pageLabel(num)\"\n [attr.aria-current]=\"currentPage == num ? 'page' : undefined\"\n [ngClass]=\"{'k-link': true, 'k-state-selected':currentPage == num}\">\n {{num}}\n </option>\n <option *ngIf=\"end < totalPages\"\n value=\"nextButtons\"\n class=\"k-link\"\n [attr.aria-label]=\"pageLabel(end + 1)\">...\n </option>\n </select>\n <ul [ngClass]=\"{'k-pager-numbers': true, 'k-reset': true}\">\n <li *ngIf=\"start > 1\">\n <span\n kendoGridFocusable\n tabindex=\"0\"\n class=\"k-link k-pager-nav\"\n [attr.aria-label]=\"pageLabel(start - 1)\"\n (click)=\"changePage(start - 2)\"\n (keydown.enter)=\"changePage(start - 2)\">...</span>\n </li>\n <li *ngFor=\"let num of buttons\">\n <span\n kendoGridFocusable\n tabindex=\"0\"\n [attr.aria-label]=\"pageLabel(num)\"\n [ngClass]=\"{'k-link': true, 'k-state-selected':currentPage == num, 'k-pager-nav': true}\"\n (click)=\"changePage(num - 1)\"\n (keydown.enter)=\"changePage(num - 1)\">\n {{num}}\n </span>\n </li>\n <li *ngIf=\"end < totalPages\">\n <span\n kendoGridFocusable\n tabindex=\"0\"\n class=\"k-link k-pager-nav\"\n [attr.aria-label]=\"pageLabel(end + 1)\"\n (click)=\"changePage(end)\"\n (keydown.enter)=\"changePage(end)\">...</span>\n </li>\n </ul>\n "
114
+ template: "\n <select\n class=\"k-dropdownlist k-pager-nav\"\n kendoGridFocusable\n tabindex=\"0\"\n [value]=\"(currentPage).toString()\"\n (change)=\"onSelectChange($event)\">\n <option *ngIf=\"start > 1\"\n class=\"k-link\"\n value=\"previousButtons\"\n [attr.aria-label]=\"pageLabel(start - 1)\">...\n </option>\n <option *ngFor=\"let num of buttons\"\n [value]=\"num.toString()\"\n [attr.aria-label]=\"pageLabel(num)\"\n [attr.aria-current]=\"currentPage == num ? 'page' : undefined\"\n [ngClass]=\"{'k-link': true, 'k-state-selected':currentPage == num}\">\n {{num}}\n </option>\n <option *ngIf=\"end < totalPages\"\n value=\"nextButtons\"\n class=\"k-link\"\n [attr.aria-label]=\"pageLabel(end + 1)\">...\n </option>\n </select>\n <ul [ngClass]=\"{'k-pager-numbers': true, 'k-reset': true}\">\n <li *ngIf=\"start > 1\">\n <span\n kendoGridFocusable\n tabindex=\"0\"\n class=\"k-link k-pager-nav\"\n [attr.aria-label]=\"pageLabel(start - 1)\"\n (click)=\"changePage(start - 2)\"\n (keydown.enter)=\"changePage(start - 2)\">...</span>\n </li>\n <li *ngFor=\"let num of buttons\">\n <span\n kendoGridFocusable\n tabindex=\"0\"\n [attr.aria-label]=\"pageLabel(num)\"\n [ngClass]=\"{'k-link': true, 'k-state-selected':currentPage == num, 'k-pager-nav': true}\"\n (click)=\"changePage(num - 1)\"\n (keydown.enter)=\"changePage(num - 1)\">\n {{num}}\n </span>\n </li>\n <li *ngIf=\"end < totalPages\">\n <span\n kendoGridFocusable\n tabindex=\"0\"\n class=\"k-link k-pager-nav\"\n [attr.aria-label]=\"pageLabel(end + 1)\"\n (click)=\"changePage(end)\"\n (keydown.enter)=\"changePage(end)\">...</span>\n </li>\n </ul>\n "
115
115
  }),
116
116
  tslib_1.__metadata("design:paramtypes", [kendo_angular_l10n_1.LocalizationService,
117
117
  core_1.ChangeDetectorRef,
@@ -39,7 +39,6 @@ var PagerComponent = /** @class */ (function () {
39
39
  this.pageChange = new core_1.EventEmitter();
40
40
  this.pagerWrapClass = true;
41
41
  this.gridPagerClass = true;
42
- this.widgetClass = true;
43
42
  this.settings = pager_settings_1.normalize({});
44
43
  this.subscriptions = new rxjs_1.Subscription();
45
44
  this._templateContext = {};
@@ -286,10 +285,6 @@ var PagerComponent = /** @class */ (function () {
286
285
  core_1.HostBinding('class.k-grid-pager'),
287
286
  tslib_1.__metadata("design:type", Boolean)
288
287
  ], PagerComponent.prototype, "gridPagerClass", void 0);
289
- tslib_1.__decorate([
290
- core_1.HostBinding('class.k-widget'),
291
- tslib_1.__metadata("design:type", Boolean)
292
- ], PagerComponent.prototype, "widgetClass", void 0);
293
288
  tslib_1.__decorate([
294
289
  core_1.HostBinding('class.k-state-focused'),
295
290
  tslib_1.__metadata("design:type", Boolean),
@@ -37,7 +37,7 @@ var ɵ0 = appendNodes;
37
37
  exports.ɵ0 = ɵ0;
38
38
  var wrapTable = function (table) {
39
39
  var wrapper = document.createElement('div');
40
- wrapper.className = 'k-widget k-grid';
40
+ wrapper.className = 'k-grid';
41
41
  wrapper.appendChild(table);
42
42
  return wrapper;
43
43
  };
@@ -234,7 +234,7 @@ var CellComponent = /** @class */ (function () {
234
234
  CellComponent = tslib_1.__decorate([
235
235
  core_1.Component({
236
236
  selector: '[kendoGridCell]',
237
- template: "\n <ng-container [ngSwitch]=\"isEdited\">\n <ng-container *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"!showLoading; else loading\">\n <ng-template [ngIf]=\"column.templateRef\"\n [ngTemplateOutlet]=\"column.templateRef\"\n [ngTemplateOutletContext]=\"templateContext\">\n </ng-template>\n <ng-template [ngIf]=\"isSpanColumn\">\n <ng-template ngFor let-childColumn [ngForOf]=\"childColumns\">\n {{ dataItem | valueOf: childColumn.field: childColumn.format}}\n </ng-template>\n </ng-template>\n <ng-template [ngIf]=\"isBoundColumn\">{{ dataItem | valueOf: column.field: column.format}}</ng-template>\n <ng-template [ngIf]=\"isCheckboxColumn && !isNew\">\n <input\n class=\"k-checkbox\"\n [kendoGridSelectionCheckbox]=\"rowIndex\"\n [attr.id]=\"selectionCheckboxId\"\n [attr.aria-label]=\"selectionCheckboxLabel\" />\n </ng-template>\n </ng-container>\n <ng-template #loading>\n <ng-template\n *ngIf=\"loadingTemplate\"\n [ngTemplateOutlet]=\"loadingTemplate\"\n [ngTemplateOutletContext]=\"{$implicit: column}\">\n </ng-template>\n <div *ngIf=\"!loadingTemplate\" class=\"k-skeleton-text k-skeleton\"></div>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"true\">\n <ng-template\n *ngIf=\"column.editTemplateRef\"\n [ngTemplateOutlet]=\"column.editTemplateRef\"\n [ngTemplateOutletContext]=\"editTemplateContext\">\n </ng-template>\n <ng-container [ngSwitch]=\"column.editor\" *ngIf=\"!column.editTemplateRef\">\n <kendo-numerictextbox\n *ngSwitchCase=\"'numeric'\"\n [format]=\"format\"\n [formControl]=\"formGroup.get(column.field)\"\n kendoGridFocusable\n ></kendo-numerictextbox>\n\n <kendo-datepicker\n *ngSwitchCase=\"'date'\"\n [format]=\"format\"\n [formControl]=\"formGroup.get(column.field)\"\n kendoGridFocusable\n ></kendo-datepicker>\n\n <input\n *ngSwitchCase=\"'boolean'\"\n type=\"checkbox\"\n class=\"k-checkbox\"\n [formControl]=\"formGroup.get(column.field)\"\n kendoGridFocusable\n />\n\n <input\n *ngSwitchDefault\n type=\"text\"\n class=\"k-textbox\"\n [formControl]=\"formGroup.get(column.field)\"\n kendoGridFocusable\n />\n </ng-container>\n </ng-container>\n </ng-container>\n "
237
+ template: "\n <ng-container [ngSwitch]=\"isEdited\">\n <ng-container *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"!showLoading; else loading\">\n <ng-template [ngIf]=\"column.templateRef\"\n [ngTemplateOutlet]=\"column.templateRef\"\n [ngTemplateOutletContext]=\"templateContext\">\n </ng-template>\n <ng-template [ngIf]=\"isSpanColumn\">\n <ng-template ngFor let-childColumn [ngForOf]=\"childColumns\">\n {{ dataItem | valueOf: childColumn.field: childColumn.format}}\n </ng-template>\n </ng-template>\n <ng-template [ngIf]=\"isBoundColumn\">{{ dataItem | valueOf: column.field: column.format}}</ng-template>\n <ng-template [ngIf]=\"isCheckboxColumn && !isNew\">\n <input\n class=\"k-checkbox k-checkbox-md k-rounded-md\"\n [kendoGridSelectionCheckbox]=\"rowIndex\"\n [attr.id]=\"selectionCheckboxId\"\n [attr.aria-label]=\"selectionCheckboxLabel\" />\n </ng-template>\n </ng-container>\n <ng-template #loading>\n <ng-template\n *ngIf=\"loadingTemplate\"\n [ngTemplateOutlet]=\"loadingTemplate\"\n [ngTemplateOutletContext]=\"{$implicit: column}\">\n </ng-template>\n <div *ngIf=\"!loadingTemplate\" class=\"k-skeleton-text k-skeleton\"></div>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"true\">\n <ng-template\n *ngIf=\"column.editTemplateRef\"\n [ngTemplateOutlet]=\"column.editTemplateRef\"\n [ngTemplateOutletContext]=\"editTemplateContext\">\n </ng-template>\n <ng-container [ngSwitch]=\"column.editor\" *ngIf=\"!column.editTemplateRef\">\n <kendo-numerictextbox\n *ngSwitchCase=\"'numeric'\"\n [format]=\"format\"\n [formControl]=\"formGroup.get(column.field)\"\n kendoGridFocusable\n ></kendo-numerictextbox>\n\n <kendo-datepicker\n *ngSwitchCase=\"'date'\"\n [format]=\"format\"\n [formControl]=\"formGroup.get(column.field)\"\n kendoGridFocusable\n ></kendo-datepicker>\n\n <input\n *ngSwitchCase=\"'boolean'\"\n type=\"checkbox\"\n class=\"k-checkbox k-checkbox-md k-rounded-md\"\n [formControl]=\"formGroup.get(column.field)\"\n kendoGridFocusable\n />\n\n <input\n *ngSwitchDefault\n type=\"text\"\n class=\"k-textbox k-input k-rounded-md\"\n [formControl]=\"formGroup.get(column.field)\"\n kendoGridFocusable\n />\n </ng-container>\n </ng-container>\n </ng-container>\n "
238
238
  }),
239
239
  tslib_1.__param(3, core_1.Optional()), tslib_1.__param(3, core_1.Inject(cell_context_1.CELL_CONTEXT)),
240
240
  tslib_1.__metadata("design:paramtypes", [edit_service_1.EditService,
@@ -19,4 +19,4 @@ exports.IGNORE_TARGET_CLASSSES = 'k-icon';
19
19
  /**
20
20
  * @hidden
21
21
  */
22
- exports.IGNORE_CONTAINER_CLASSES = 'k-widget k-grid-ignore-click';
22
+ exports.IGNORE_CONTAINER_CLASSES = 'k-grid k-grid-ignore-click';
@@ -27,9 +27,12 @@ var ExpandDetailsDirective = /** @class */ (function () {
27
27
  this.expandedDetailKeys = [];
28
28
  /**
29
29
  * Specifies if the items should be initially expanded.
30
+ * When set to `true` items added to the `expandedDetailKeys` collection will be collapsed, and items that are not present in it will be expanded.
31
+ *
30
32
  * @default false
31
33
  */
32
34
  this.initiallyExpanded = false;
35
+ this.expandedState = new Set();
33
36
  this.subscriptions = new rxjs_1.Subscription();
34
37
  this.grid.isDetailExpanded = this.isExpanded.bind(this);
35
38
  this.subscriptions.add(rxjs_1.merge(this.grid.detailExpand.pipe(operators_1.map(function (e) { return (tslib_1.__assign({ expand: true }, e)); })), this.grid.detailCollapse.pipe(operators_1.map(function (e) { return (tslib_1.__assign({ expand: false }, e)); }))).subscribe(this.toggleState.bind(this)));
@@ -67,6 +70,12 @@ var ExpandDetailsDirective = /** @class */ (function () {
67
70
  enumerable: true,
68
71
  configurable: true
69
72
  });
73
+ ExpandDetailsDirective.prototype.ngOnChanges = function (changes) {
74
+ // skip reinitialization if the user data is the same as the last state change
75
+ if (utils_1.isPresent(changes.expandedDetailKeys) && this.lastExpandedState !== this.expandedDetailKeys) {
76
+ this.expandedState = new Set(this.expandedDetailKeys);
77
+ }
78
+ };
70
79
  ExpandDetailsDirective.prototype.ngOnDestroy = function () {
71
80
  this.subscriptions.unsubscribe();
72
81
  };
@@ -82,18 +91,23 @@ var ExpandDetailsDirective = /** @class */ (function () {
82
91
  */
83
92
  ExpandDetailsDirective.prototype.isExpanded = function (args) {
84
93
  var key = this.keyGetter(args.dataItem);
85
- return this.expandedDetailKeys.indexOf(key) > -1 ? !this.initiallyExpanded : this.initiallyExpanded;
94
+ var hasKey = this.expandedState.has(key);
95
+ // when [initiallyExpanded]="true" a present key means the corresponding detail row is collapsed
96
+ return this.initiallyExpanded ? !hasKey : hasKey;
86
97
  };
87
98
  ExpandDetailsDirective.prototype.toggleState = function (args) {
88
99
  var key = this.keyGetter(args.dataItem);
89
100
  if (Boolean(this.initiallyExpanded) !== args.expand) {
90
- this.expandedDetailKeys.push(key);
101
+ this.expandedState.add(key);
91
102
  }
92
103
  else {
93
- var index = this.expandedDetailKeys.indexOf(key);
94
- this.expandedDetailKeys.splice(index, 1);
104
+ this.expandedState.delete(key);
95
105
  }
96
- this.expandedDetailKeysChange.emit(this.expandedDetailKeys);
106
+ this.notifyChange();
107
+ };
108
+ ExpandDetailsDirective.prototype.notifyChange = function () {
109
+ this.lastExpandedState = Array.from(this.expandedState);
110
+ this.expandedDetailKeysChange.emit(this.lastExpandedState);
97
111
  };
98
112
  tslib_1.__decorate([
99
113
  core_1.Output(),
@@ -565,7 +565,7 @@ var HeaderComponent = /** @class */ (function () {
565
565
  core_1.Component({
566
566
  selector: '[kendoGridHeader]',
567
567
  styles: ["\n .k-column-resizer {\n cursor: col-resize;\n display: block;\n height: 1000%;\n position: absolute;\n top: 0;\n width: .5em;\n }\n "],
568
- template: "\n <ng-template [ngIf]=\"true\">\n <tr *ngFor=\"let i of columnLevels; let levelIndex = index\"\n kendoGridLogicalRow\n [logicalRowIndex]=\"levelIndex\"\n [logicalSlaveRow]=\"lockedColumnsCount > 0\"\n [logicalCellsCount]=\"columns.length\"\n [logicalSlaveCellsCount]=\"unlockedColumnsCount\">\n <th\n class=\"k-group-cell k-header\"\n role=\"presentation\"\n *ngFor=\"let g of groups\">\n </th>\n <th class=\"k-hierarchy-cell k-header\"\n role=\"presentation\"\n *ngIf=\"detailTemplate?.templateRef\"\n kendoGridLogicalCell\n [logicalRowIndex]=\"levelIndex\"\n [logicalColIndex]=\"0\"\n aria-selected=\"false\"\n >\n </th>\n <ng-template ngFor let-column [ngForOf]=\"columnsForLevel(levelIndex)\" [ngForTrackBy]=\"trackByIndex\" let-columnIndex=\"index\" let-last=\"last\">\n <th *ngIf=\"!isColumnGroupComponent(column)\"\n kendoGridLogicalCell\n [logicalRowIndex]=\"levelIndex\"\n [logicalColIndex]=\"logicalColumnIndex(column)\"\n [headerLabelText]=\"column.title || column.field\"\n [colSpan]=\"column.colspan\"\n [rowSpan]=\"column.rowspan(totalColumnLevels)\"\n role=\"columnheader\"\n aria-selected=\"false\"\n [attr.aria-sort]=\"sortState(column)\"\n (keydown)=\"onHeaderKeydown(column, $event)\"\n kendoDropTarget\n kendoDraggable\n kendoDraggableColumn\n [enableDrag]=\"shouldActivate(column)\"\n [context]=\"{\n field: column.field,\n type: 'column',\n column: column,\n hint: column.title || column.field,\n lastColumn: last && columnIndex === 0\n }\"\n class=\"k-header\"\n [class.k-filterable]=\"(showFilterMenu && isFilterable(column)) || showColumnMenu(column)\"\n [class.k-first]=\"isFirstOnRow(column, columnIndex)\"\n [class.k-grid-header-sticky]=\"column.sticky\"\n [ngClass]=\"column.headerClass\"\n [ngStyle]=\"column.sticky ? addStickyStyles(column) : column.headerStyle\"\n [attr.rowspan]=\"column.rowspan(totalColumnLevels)\"\n [attr.colspan]=\"column.colspan\">\n\n <ng-template [ngIf]=\"!isSortable(column)\">\n <kendo-grid-filter-menu\n *ngIf=\"showFilterMenu && isFilterable(column)\"\n [column]=\"column\"\n [filter]=\"filter\"\n [tabIndex]=\"tabIndex\">\n </kendo-grid-filter-menu>\n <kendo-grid-column-menu *ngIf=\"showColumnMenu(column)\"\n [standalone]=\"false\"\n [settings]=\"columnMenu\"\n [column]=\"column\"\n [columnMenuTemplate]=\"columnMenuTemplate\"\n [sort]=\"sort\"\n [filter]=\"filter\"\n [sortable]=\"sortable\"\n [tabIndex]=\"tabIndex\">\n </kendo-grid-column-menu>\n <ng-template\n [templateContext]=\"{\n templateRef: column.headerTemplateRef,\n columnIndex: column.leafIndex,\n column: column,\n $implicit: column\n }\">\n </ng-template>\n <ng-template [ngIf]=\"!column.headerTemplateRef\">{{column.displayTitle}}</ng-template>\n </ng-template>\n\n <ng-template [ngIf]=\"isSortable(column)\">\n <span class=\"k-cell-inner\">\n <span #link class=\"k-link\" (click)=\"onSortClick(column, $event, link)\">\n <ng-template\n [templateContext]=\"{\n templateRef: column.headerTemplateRef,\n columnIndex: column.leafIndex,\n column: column,\n $implicit: column\n }\">\n </ng-template>\n <ng-template [ngIf]=\"!column.headerTemplateRef\">\n <span class=\"k-column-title\">{{column.displayTitle}}</span>\n </ng-template>\n <span [attr.aria-label]=\"sortableLabel\" [ngClass]=\"sortIcon(column.field)\"></span>\n <span *ngIf=\"showSortNumbering(column)\" class=\"k-sort-order\">{{sortOrder(column.field)}}</span>\n </span>\n <span role=\"status\"\n class=\"k-sort-status\"\n style=\"position: absolute; left: -10000px;\"\n [innerHtml]=\"sortStatus(column)\">\n </span>\n <kendo-grid-filter-menu\n *ngIf=\"showFilterMenu && isFilterable(column)\"\n [column]=\"column\"\n [filter]=\"filter\"\n [tabIndex]=\"tabIndex\">\n </kendo-grid-filter-menu>\n <kendo-grid-column-menu *ngIf=\"showColumnMenu(column)\"\n [standalone]=\"false\"\n [settings]=\"columnMenu\"\n [column]=\"column\"\n [columnMenuTemplate]=\"columnMenuTemplate\"\n [sort]=\"sort\"\n [filter]=\"filter\"\n [sortable]=\"sortable\"\n [tabIndex]=\"tabIndex\">\n </kendo-grid-column-menu>\n </span>\n </ng-template>\n\n <ng-template [ngIf]=\"isCheckboxColumn(column) && !column.headerTemplateRef && column.showSelectAll\">\n <input\n class=\"k-checkbox\"\n [attr.id]=\"selectAllCheckboxId()\"\n [attr.aria-label]=\"selectAllCheckboxLabel\"\n kendoGridSelectAllCheckbox\n kendoGridFocusable>\n </ng-template>\n <span kendoGridColumnHandle\n kendoDraggable\n class=\"k-column-resizer\"\n *ngIf=\"resizable\"\n [column]=\"column\"\n [columns]=\"columns\">\n </span>\n </th>\n <th *ngIf=\"isColumnGroupComponent(column)\"\n kendoGridLogicalCell\n [logicalRowIndex]=\"levelIndex\"\n [logicalColIndex]=\"logicalColumnIndex(column)\"\n [rowSpan]=\"column.rowspan(totalColumnLevels)\"\n [colSpan]=\"column.colspan\"\n [headerLabelText]=\"column.title || column.field\"\n kendoDropTarget\n kendoDraggable\n kendoDraggableColumn\n [enableDrag]=\"shouldActivate(column)\"\n [context]=\"{\n type: 'columnGroup',\n column: column,\n hint: column.title,\n lastColumn: last && columnIndex === 0\n }\"\n class=\"k-header\"\n [class.k-first]=\"isFirstOnRow(column, columnIndex)\"\n [class.k-filterable]=\"showColumnMenu(column)\"\n [class.k-grid-content-sticky]=\"column.sticky\"\n [ngClass]=\"column.headerClass\"\n [ngStyle]=\"column.headerStyle\"\n [attr.rowspan]=\"column.rowspan(totalColumnLevels)\"\n [attr.colspan]=\"column.colspan\">\n <kendo-grid-column-menu *ngIf=\"showColumnMenu(column)\"\n [standalone]=\"false\"\n [settings]=\"columnMenu\"\n [column]=\"column\"\n [columnMenuTemplate]=\"columnMenuTemplate\">\n </kendo-grid-column-menu>\n <ng-template\n [templateContext]=\"{\n templateRef: column.headerTemplateRef,\n columnIndex: lockedColumnsCount + columnIndex,\n column: column,\n $implicit: column\n }\">\n </ng-template>\n <ng-template [ngIf]=\"!column.headerTemplateRef\">{{column.displayTitle}}</ng-template>\n <span kendoGridColumnHandle\n kendoDraggable\n class=\"k-column-resizer\"\n *ngIf=\"resizable\"\n [column]=\"column\"\n [columns]=\"columns\">\n </span>\n </th>\n </ng-template>\n </tr>\n <tr *ngIf=\"showFilterRow\"\n kendoGridFilterRow\n [columns]=\"leafColumns\"\n [filter]=\"filter\"\n [groups]=\"groups\"\n [detailTemplate]=\"detailTemplate\"\n [lockedColumnsCount]=\"lockedColumnsCount\"\n kendoGridLogicalRow\n [logicalRowIndex]=\"totalColumnLevels + 1\"\n [logicalSlaveRow]=\"lockedColumnsCount > 0\"\n [logicalCellsCount]=\"columns.length\"\n [logicalSlaveCellsCount]=\"unlockedColumnsCount\"\n ></tr>\n </ng-template>\n "
568
+ template: "\n <ng-template [ngIf]=\"true\">\n <tr *ngFor=\"let i of columnLevels; let levelIndex = index\"\n kendoGridLogicalRow\n [logicalRowIndex]=\"levelIndex\"\n [logicalSlaveRow]=\"lockedColumnsCount > 0\"\n [logicalCellsCount]=\"columns.length\"\n [logicalSlaveCellsCount]=\"unlockedColumnsCount\">\n <th\n class=\"k-group-cell k-header\"\n role=\"presentation\"\n *ngFor=\"let g of groups\">\n </th>\n <th class=\"k-hierarchy-cell k-header\"\n role=\"presentation\"\n *ngIf=\"detailTemplate?.templateRef\"\n kendoGridLogicalCell\n [logicalRowIndex]=\"levelIndex\"\n [logicalColIndex]=\"0\"\n aria-selected=\"false\"\n >\n </th>\n <ng-template ngFor let-column [ngForOf]=\"columnsForLevel(levelIndex)\" [ngForTrackBy]=\"trackByIndex\" let-columnIndex=\"index\" let-last=\"last\">\n <th *ngIf=\"!isColumnGroupComponent(column)\"\n kendoGridLogicalCell\n [logicalRowIndex]=\"levelIndex\"\n [logicalColIndex]=\"logicalColumnIndex(column)\"\n [headerLabelText]=\"column.title || column.field\"\n [colSpan]=\"column.colspan\"\n [rowSpan]=\"column.rowspan(totalColumnLevels)\"\n role=\"columnheader\"\n aria-selected=\"false\"\n [attr.aria-sort]=\"sortState(column)\"\n (keydown)=\"onHeaderKeydown(column, $event)\"\n kendoDropTarget\n kendoDraggable\n kendoDraggableColumn\n [enableDrag]=\"shouldActivate(column)\"\n [context]=\"{\n field: column.field,\n type: 'column',\n column: column,\n hint: column.title || column.field,\n lastColumn: last && columnIndex === 0\n }\"\n class=\"k-header\"\n [class.k-filterable]=\"(showFilterMenu && isFilterable(column)) || showColumnMenu(column)\"\n [class.k-first]=\"isFirstOnRow(column, columnIndex)\"\n [class.k-grid-header-sticky]=\"column.sticky\"\n [ngClass]=\"column.headerClass\"\n [ngStyle]=\"column.sticky ? addStickyStyles(column) : column.headerStyle\"\n [attr.rowspan]=\"column.rowspan(totalColumnLevels)\"\n [attr.colspan]=\"column.colspan\">\n\n <ng-template [ngIf]=\"!isSortable(column)\">\n <kendo-grid-filter-menu\n *ngIf=\"showFilterMenu && isFilterable(column)\"\n [column]=\"column\"\n [filter]=\"filter\"\n [tabIndex]=\"tabIndex\">\n </kendo-grid-filter-menu>\n <kendo-grid-column-menu *ngIf=\"showColumnMenu(column)\"\n [standalone]=\"false\"\n [settings]=\"columnMenu\"\n [column]=\"column\"\n [columnMenuTemplate]=\"columnMenuTemplate\"\n [sort]=\"sort\"\n [filter]=\"filter\"\n [sortable]=\"sortable\"\n [tabIndex]=\"tabIndex\">\n </kendo-grid-column-menu>\n <ng-template\n [templateContext]=\"{\n templateRef: column.headerTemplateRef,\n columnIndex: column.leafIndex,\n column: column,\n $implicit: column\n }\">\n </ng-template>\n <ng-template [ngIf]=\"!column.headerTemplateRef\">{{column.displayTitle}}</ng-template>\n </ng-template>\n\n <ng-template [ngIf]=\"isSortable(column)\">\n <span class=\"k-cell-inner\">\n <span #link class=\"k-link\" (click)=\"onSortClick(column, $event, link)\">\n <ng-template\n [templateContext]=\"{\n templateRef: column.headerTemplateRef,\n columnIndex: column.leafIndex,\n column: column,\n $implicit: column\n }\">\n </ng-template>\n <ng-template [ngIf]=\"!column.headerTemplateRef\">\n <span class=\"k-column-title\">{{column.displayTitle}}</span>\n </ng-template>\n <span [attr.aria-label]=\"sortableLabel\" [ngClass]=\"sortIcon(column.field)\"></span>\n <span *ngIf=\"showSortNumbering(column)\" class=\"k-sort-order\">{{sortOrder(column.field)}}</span>\n </span>\n <span role=\"status\"\n class=\"k-sort-status\"\n style=\"position: absolute; left: -10000px;\"\n [innerHtml]=\"sortStatus(column)\">\n </span>\n <kendo-grid-filter-menu\n *ngIf=\"showFilterMenu && isFilterable(column)\"\n [column]=\"column\"\n [filter]=\"filter\"\n [tabIndex]=\"tabIndex\">\n </kendo-grid-filter-menu>\n <kendo-grid-column-menu *ngIf=\"showColumnMenu(column)\"\n [standalone]=\"false\"\n [settings]=\"columnMenu\"\n [column]=\"column\"\n [columnMenuTemplate]=\"columnMenuTemplate\"\n [sort]=\"sort\"\n [filter]=\"filter\"\n [sortable]=\"sortable\"\n [tabIndex]=\"tabIndex\">\n </kendo-grid-column-menu>\n </span>\n </ng-template>\n\n <ng-template [ngIf]=\"isCheckboxColumn(column) && !column.headerTemplateRef && column.showSelectAll\">\n <input\n class=\"k-checkbox k-checkbox-md k-rounded-md\"\n [attr.id]=\"selectAllCheckboxId()\"\n [attr.aria-label]=\"selectAllCheckboxLabel\"\n kendoGridSelectAllCheckbox\n kendoGridFocusable>\n </ng-template>\n <span kendoGridColumnHandle\n kendoDraggable\n class=\"k-column-resizer\"\n *ngIf=\"resizable\"\n [column]=\"column\"\n [columns]=\"columns\">\n </span>\n </th>\n <th *ngIf=\"isColumnGroupComponent(column)\"\n kendoGridLogicalCell\n [logicalRowIndex]=\"levelIndex\"\n [logicalColIndex]=\"logicalColumnIndex(column)\"\n [rowSpan]=\"column.rowspan(totalColumnLevels)\"\n [colSpan]=\"column.colspan\"\n [headerLabelText]=\"column.title || column.field\"\n kendoDropTarget\n kendoDraggable\n kendoDraggableColumn\n [enableDrag]=\"shouldActivate(column)\"\n [context]=\"{\n type: 'columnGroup',\n column: column,\n hint: column.title,\n lastColumn: last && columnIndex === 0\n }\"\n class=\"k-header\"\n [class.k-first]=\"isFirstOnRow(column, columnIndex)\"\n [class.k-filterable]=\"showColumnMenu(column)\"\n [class.k-grid-content-sticky]=\"column.sticky\"\n [ngClass]=\"column.headerClass\"\n [ngStyle]=\"column.headerStyle\"\n [attr.rowspan]=\"column.rowspan(totalColumnLevels)\"\n [attr.colspan]=\"column.colspan\">\n <kendo-grid-column-menu *ngIf=\"showColumnMenu(column)\"\n [standalone]=\"false\"\n [settings]=\"columnMenu\"\n [column]=\"column\"\n [columnMenuTemplate]=\"columnMenuTemplate\">\n </kendo-grid-column-menu>\n <ng-template\n [templateContext]=\"{\n templateRef: column.headerTemplateRef,\n columnIndex: lockedColumnsCount + columnIndex,\n column: column,\n $implicit: column\n }\">\n </ng-template>\n <ng-template [ngIf]=\"!column.headerTemplateRef\">{{column.displayTitle}}</ng-template>\n <span kendoGridColumnHandle\n kendoDraggable\n class=\"k-column-resizer\"\n *ngIf=\"resizable\"\n [column]=\"column\"\n [columns]=\"columns\">\n </span>\n </th>\n </ng-template>\n </tr>\n <tr *ngIf=\"showFilterRow\"\n kendoGridFilterRow\n [columns]=\"leafColumns\"\n [filter]=\"filter\"\n [groups]=\"groups\"\n [detailTemplate]=\"detailTemplate\"\n [lockedColumnsCount]=\"lockedColumnsCount\"\n kendoGridLogicalRow\n [logicalRowIndex]=\"totalColumnLevels + 1\"\n [logicalSlaveRow]=\"lockedColumnsCount > 0\"\n [logicalCellsCount]=\"columns.length\"\n [logicalSlaveCellsCount]=\"unlockedColumnsCount\"\n ></tr>\n </ng-template>\n "
569
569
  }),
570
570
  tslib_1.__metadata("design:paramtypes", [single_popup_service_1.SinglePopupService,
571
571
  drag_hint_service_1.DragHintService,
@@ -19,16 +19,16 @@ var core_1 = require("@angular/core");
19
19
  * selector: 'my-app',
20
20
  * template: `
21
21
  * <div class="example-config">
22
- * <input type="radio" id="top" name="position" class="k-radio" value="top" checked (click)="positionChange($event)"/>
22
+ * <input type="radio" id="top" name="position" value="top" checked (click)="positionChange($event)"/>
23
23
  * <label class="k-radio-label" for="top">Top</label><br/>
24
- * <input type="radio" id="bottom" name="position" class="k-radio" value="bottom" (click)="positionChange($event)"/>
24
+ * <input type="radio" id="bottom" name="position" value="bottom" (click)="positionChange($event)"/>
25
25
  * <label class="k-radio-label" for="bottom">Bottom</label><br/>
26
- * <input type="radio" id="both" name="position" value="both" class="k-radio" (click)="positionChange($event)"/>
26
+ * <input type="radio" id="both" name="position" value="both" (click)="positionChange($event)"/>
27
27
  * <label class="k-radio-label" for="both">Both</label><br/>
28
28
  * </div>
29
29
  * <kendo-grid [data]="gridData" style="height: 200px">
30
30
  * <ng-template kendoGridToolbarTemplate [position]="position" let-position="position">
31
- * <button (click)="onClick()" class="k-button">Custom action</button>
31
+ * <button (click)="onClick()">Custom action</button>
32
32
  * </ng-template>
33
33
  * <kendo-grid-column field="ProductName">
34
34
  * </kendo-grid-column>
@@ -0,0 +1,93 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2021 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
+ /**
8
+ * @hidden
9
+ *
10
+ * Quick look-up structure for combinations of keys.
11
+ * Similar to the native JS Set, however, working with a couple of keys instead of with a single key.
12
+ * Supports both primitive keys and object keys (compared by reference).
13
+ */
14
+ var PairSet = /** @class */ (function () {
15
+ function PairSet(items, keyXField, keyYField) {
16
+ var _this = this;
17
+ /**
18
+ * Holds a set of Y keys for each defined X key.
19
+ * Each X key creates a map which holds a set of Y keys.
20
+ *
21
+ * Map { 1 => Set { 1, 2, 3 } } // pairs: [1, 1], [1, 2], [1, 3]
22
+ */
23
+ this.keysX = new Map();
24
+ /**
25
+ * Count the each added or deleted key manually to avoid iterating over all items when calling `this.size`.
26
+ */
27
+ this.totalKeysCount = 0;
28
+ if (items && keyXField && keyYField) {
29
+ items.forEach(function (item) { return _this.add(item[keyXField], item[keyYField]); });
30
+ }
31
+ }
32
+ Object.defineProperty(PairSet.prototype, "size", {
33
+ /**
34
+ * Gets the total number of X/Y key pairs.
35
+ */
36
+ get: function () {
37
+ return this.totalKeysCount;
38
+ },
39
+ enumerable: true,
40
+ configurable: true
41
+ });
42
+ /**
43
+ * Adds a couple of items identified as a combination.
44
+ */
45
+ PairSet.prototype.add = function (keyX, keyY) {
46
+ if (!this.keysX.has(keyX)) {
47
+ this.keysX.set(keyX, new Set());
48
+ }
49
+ if (!this.has(keyX, keyY)) {
50
+ this.keysX.get(keyX).add(keyY);
51
+ this.totalKeysCount += 1;
52
+ }
53
+ };
54
+ /**
55
+ * Adds a combination of a couple of items identified together.
56
+ */
57
+ PairSet.prototype.delete = function (keyX, keyY) {
58
+ if (this.has(keyX, keyY)) {
59
+ this.keysX.get(keyX).delete(keyY);
60
+ this.totalKeysCount -= 1;
61
+ }
62
+ };
63
+ /**
64
+ * Checks whether the defined combination is stored.
65
+ */
66
+ PairSet.prototype.has = function (keyX, keyY) {
67
+ return this.keysX.has(keyX) && this.keysX.get(keyX).has(keyY);
68
+ };
69
+ /**
70
+ * Clears all key combinations.
71
+ */
72
+ PairSet.prototype.clear = function () {
73
+ this.keysX.clear();
74
+ this.totalKeysCount = 0;
75
+ };
76
+ /**
77
+ * Converts the persisted data structure to an array of objects,
78
+ * using the provided field names for the object props.
79
+ */
80
+ PairSet.prototype.toArray = function (keyXField, keyYField) {
81
+ return Array.from(this.keysX).reduce(function (pairs, pair) {
82
+ // Array.from(mapInstance) returns an array of arrays [[itemKey1, columnKeysSet1], [itemKey2, columnKeysSet2]]
83
+ var keyX = pair[0], keysY = pair[1];
84
+ Array.from(keysY).forEach(function (keyY) {
85
+ var _a;
86
+ return pairs.push((_a = {}, _a[keyXField] = keyX, _a[keyYField] = keyY, _a));
87
+ });
88
+ return pairs;
89
+ }, []);
90
+ };
91
+ return PairSet;
92
+ }());
93
+ exports.PairSet = PairSet;