@progress/kendo-angular-grid 5.5.1 → 6.0.0-dev.202201191529

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 (94) 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/filter-menu-input-wrapper.component.js +2 -2
  15. package/dist/es/filtering/menu/string-filter-menu-input.component.js +1 -1
  16. package/dist/es/grid.component.js +4 -5
  17. package/dist/es/grouping/group-indicator.component.js +1 -1
  18. package/dist/es/navigation/focusable.directive.js +5 -5
  19. package/dist/es/package-metadata.js +1 -1
  20. package/dist/es/pager/pager-numeric-buttons.component.js +1 -1
  21. package/dist/es/pager/pager.component.js +0 -5
  22. package/dist/es/pdf/export-element.js +1 -1
  23. package/dist/es/rendering/cell.component.js +1 -1
  24. package/dist/es/rendering/constants.js +1 -1
  25. package/dist/es/rendering/details-expand.directive.js +20 -6
  26. package/dist/es/rendering/header/header.component.js +1 -1
  27. package/dist/es/rendering/toolbar/toolbar-template.directive.js +4 -4
  28. package/dist/es/selection/pair-set.js +91 -0
  29. package/dist/es/selection/selection-default.js +48 -30
  30. package/dist/es/utils.js +1 -3
  31. package/dist/es2015/column-menu/column-chooser.component.js +2 -2
  32. package/dist/es2015/column-menu/column-list.component.js +3 -3
  33. package/dist/es2015/dragdrop/draggable-column.directive.js +3 -3
  34. package/dist/es2015/filtering/cell/filter-cell-operators.component.js +3 -3
  35. package/dist/es2015/filtering/cell/string-filter-cell.component.js +1 -1
  36. package/dist/es2015/filtering/filter-input.directive.js +2 -1
  37. package/dist/es2015/filtering/menu/boolean-filter-menu.component.js +1 -1
  38. package/dist/es2015/filtering/menu/filter-menu-container.component.js +2 -2
  39. package/dist/es2015/filtering/menu/filter-menu-input-wrapper.component.d.ts +2 -2
  40. package/dist/es2015/filtering/menu/filter-menu-input-wrapper.component.js +2 -2
  41. package/dist/es2015/filtering/menu/string-filter-menu-input.component.js +1 -1
  42. package/dist/es2015/grid.component.d.ts +4 -4
  43. package/dist/es2015/grid.component.js +4 -5
  44. package/dist/es2015/grouping/group-indicator.component.js +2 -2
  45. package/dist/es2015/index.metadata.json +1 -1
  46. package/dist/es2015/navigation/focusable.directive.d.ts +5 -5
  47. package/dist/es2015/navigation/focusable.directive.js +5 -5
  48. package/dist/es2015/package-metadata.js +1 -1
  49. package/dist/es2015/pager/pager-numeric-buttons.component.js +1 -1
  50. package/dist/es2015/pager/pager.component.d.ts +0 -1
  51. package/dist/es2015/pager/pager.component.js +0 -5
  52. package/dist/es2015/pdf/export-element.js +1 -1
  53. package/dist/es2015/rendering/cell.component.js +3 -3
  54. package/dist/es2015/rendering/constants.d.ts +1 -1
  55. package/dist/es2015/rendering/constants.js +1 -1
  56. package/dist/es2015/rendering/details-expand.directive.d.ts +8 -2
  57. package/dist/es2015/rendering/details-expand.directive.js +20 -6
  58. package/dist/es2015/rendering/header/header.component.js +1 -1
  59. package/dist/es2015/rendering/toolbar/toolbar-template.directive.d.ts +4 -4
  60. package/dist/es2015/rendering/toolbar/toolbar-template.directive.js +4 -4
  61. package/dist/es2015/selection/pair-set.d.ts +50 -0
  62. package/dist/es2015/selection/pair-set.js +81 -0
  63. package/dist/es2015/selection/selection-default.d.ts +10 -2
  64. package/dist/es2015/selection/selection-default.js +42 -28
  65. package/dist/es2015/utils.d.ts +2 -2
  66. package/dist/fesm2015/index.js +179 -78
  67. package/dist/fesm5/index.js +186 -74
  68. package/dist/npm/column-menu/column-chooser.component.js +1 -1
  69. package/dist/npm/column-menu/column-list.component.js +1 -1
  70. package/dist/npm/dragdrop/draggable-column.directive.js +3 -3
  71. package/dist/npm/filtering/cell/filter-cell-operators.component.js +1 -1
  72. package/dist/npm/filtering/cell/string-filter-cell.component.js +1 -1
  73. package/dist/npm/filtering/filter-input.directive.js +2 -1
  74. package/dist/npm/filtering/menu/boolean-filter-menu.component.js +1 -1
  75. package/dist/npm/filtering/menu/filter-menu-container.component.js +1 -1
  76. package/dist/npm/filtering/menu/filter-menu-input-wrapper.component.js +2 -2
  77. package/dist/npm/filtering/menu/string-filter-menu-input.component.js +1 -1
  78. package/dist/npm/grid.component.js +4 -5
  79. package/dist/npm/grouping/group-indicator.component.js +1 -1
  80. package/dist/npm/navigation/focusable.directive.js +5 -5
  81. package/dist/npm/package-metadata.js +1 -1
  82. package/dist/npm/pager/pager-numeric-buttons.component.js +1 -1
  83. package/dist/npm/pager/pager.component.js +0 -5
  84. package/dist/npm/pdf/export-element.js +1 -1
  85. package/dist/npm/rendering/cell.component.js +1 -1
  86. package/dist/npm/rendering/constants.js +1 -1
  87. package/dist/npm/rendering/details-expand.directive.js +19 -5
  88. package/dist/npm/rendering/header/header.component.js +1 -1
  89. package/dist/npm/rendering/toolbar/toolbar-template.directive.js +4 -4
  90. package/dist/npm/selection/pair-set.js +93 -0
  91. package/dist/npm/selection/selection-default.js +48 -30
  92. package/dist/npm/utils.js +1 -3
  93. package/dist/systemjs/kendo-angular-grid.js +1 -1
  94. package/package.json +16 -16
@@ -132,7 +132,7 @@ var ColumnChooserComponent = /** @class */ (function () {
132
132
  ColumnChooserComponent = tslib_1.__decorate([
133
133
  Component({
134
134
  selector: 'kendo-grid-column-chooser',
135
- 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 "
135
+ 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 "
136
136
  }),
137
137
  tslib_1.__metadata("design:paramtypes", [LocalizationService,
138
138
  ColumnInfoService,
@@ -221,7 +221,7 @@ var ColumnListComponent = /** @class */ (function () {
221
221
  ColumnListComponent = tslib_1.__decorate([
222
222
  Component({
223
223
  selector: 'kendo-grid-columnlist',
224
- 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 "
224
+ 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 "
225
225
  }),
226
226
  tslib_1.__metadata("design:paramtypes", [ElementRef,
227
227
  NgZone,
@@ -24,9 +24,9 @@ var preventOnDblClick = function (release) { return function (mouseDown) {
24
24
  var ɵ0 = preventOnDblClick;
25
25
  var hasClass = function (className) { return function (el) { return new RegExp("(^| )" + className + "( |$)").test(el.className); }; };
26
26
  var ɵ1 = hasClass;
27
- var isDeleteButton = or(hasClass("k-i-group-delete"), hasClass("k-button-icon"));
28
- var isSortIcon = or(hasClass("k-i-sort-asc-sm"), hasClass("k-i-sort-desc-sm"));
29
- var skipButtons = and(not(isDeleteButton), not(isSortIcon), not(isFocusableWithTabKey), not(matchesNodeName("label")));
27
+ var isDeleteButton = or(hasClass('k-i-group-delete'), hasClass('k-icon-button'));
28
+ var isSortIcon = or(hasClass('k-i-sort-asc-sm'), hasClass('k-i-sort-desc-sm'));
29
+ var skipButtons = and(not(isDeleteButton), not(isSortIcon), not(isFocusableWithTabKey), not(matchesNodeName('label')));
30
30
  var elementUnderCursor = function (_a) {
31
31
  var clientX = _a.clientX, clientY = _a.clientY;
32
32
  return document.elementFromPoint(clientX, clientY);
@@ -117,7 +117,7 @@ var FilterCellOperatorsComponent = /** @class */ (function () {
117
117
  FilterCellOperatorsComponent = tslib_1.__decorate([
118
118
  Component({
119
119
  selector: 'kendo-grid-filter-cell-operators',
120
- 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 "
120
+ 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 "
121
121
  }),
122
122
  tslib_1.__metadata("design:paramtypes", [LocalizationService])
123
123
  ], FilterCellOperatorsComponent);
@@ -67,7 +67,7 @@ var StringFilterCellComponent = /** @class */ (function (_super) {
67
67
  StringFilterCellComponent = tslib_1.__decorate([
68
68
  Component({
69
69
  selector: 'kendo-grid-string-filter-cell',
70
- 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 "
70
+ 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 "
71
71
  }),
72
72
  tslib_1.__metadata("design:paramtypes", [FilterService,
73
73
  LocalizationService])
@@ -79,7 +79,8 @@ var FilterInputDirective = /** @class */ (function () {
79
79
  FilterInputDirective.prototype.addAriaAttributes = function () {
80
80
  var ariaValue = this.columnLabel;
81
81
  if (this.kendoInput && this.kendoInput.focusableId && isDocumentAvailable()) {
82
- var focusableElement = this.element.nativeElement.querySelector("#" + this.kendoInput.focusableId);
82
+ var focusableElement = this.element.nativeElement.querySelector("#" + this.kendoInput.focusableId) ||
83
+ this.element.nativeElement;
83
84
  this.renderer.setAttribute(focusableElement, 'aria-label', ariaValue);
84
85
  }
85
86
  else {
@@ -125,7 +125,7 @@ var BooleanFilterMenuComponent = /** @class */ (function (_super) {
125
125
  BooleanFilterMenuComponent = tslib_1.__decorate([
126
126
  Component({
127
127
  selector: 'kendo-grid-boolean-filter-menu',
128
- 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 "
128
+ 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 "
129
129
  }),
130
130
  tslib_1.__metadata("design:paramtypes", [LocalizationService])
131
131
  ], BooleanFilterMenuComponent);
@@ -226,7 +226,7 @@ var FilterMenuContainerComponent = /** @class */ (function () {
226
226
  MenuTabbingService
227
227
  ],
228
228
  selector: 'kendo-grid-filter-menu-container',
229
- 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 "
229
+ 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 "
230
230
  }),
231
231
  tslib_1.__param(0, SkipSelf()),
232
232
  tslib_1.__metadata("design:paramtypes", [FilterService,
@@ -3,10 +3,10 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import * as tslib_1 from "tslib";
6
+ import { Component, Input, ViewChild } from '@angular/core';
6
7
  import { LocalizationService } from '@progress/kendo-angular-l10n';
7
- import { MenuTabbingService } from './menu-tabbing.service';
8
8
  import { DropDownListComponent } from '@progress/kendo-angular-dropdowns';
9
- import { Component, Input, ViewChild } from '@angular/core';
9
+ import { MenuTabbingService } from './menu-tabbing.service';
10
10
  import { FilterService } from '../filter.service';
11
11
  import { FilterInputWrapperComponent } from "../filter-input-wrapper.component";
12
12
  import { replaceMessagePlaceholder } from '../../utils';
@@ -61,7 +61,7 @@ var StringFilterMenuInputComponent = /** @class */ (function () {
61
61
  StringFilterMenuInputComponent = tslib_1.__decorate([
62
62
  Component({
63
63
  selector: 'kendo-grid-string-filter-menu-input',
64
- 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 "
64
+ 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 "
65
65
  }),
66
66
  tslib_1.__metadata("design:paramtypes", [LocalizationService])
67
67
  ], StringFilterMenuInputComponent);
@@ -1452,7 +1452,7 @@ var GridComponent = /** @class */ (function () {
1452
1452
  * [resizable]="true"
1453
1453
  * style="height: 300px">
1454
1454
  * <ng-template kendoGridToolbarTemplate>
1455
- * <button class="k-button" (click)="grid.autoFitColumn(groupColumn)">
1455
+ * <button kendoButton (click)="grid.autoFitColumn(groupColumn)">
1456
1456
  * Auto-fit the group column
1457
1457
  * </button>
1458
1458
  * </ng-template>
@@ -1518,10 +1518,10 @@ var GridComponent = /** @class */ (function () {
1518
1518
  * [resizable]="true"
1519
1519
  * style="height: 300px">
1520
1520
  * <ng-template kendoGridToolbarTemplate>
1521
- * <button class="k-button" (click)="grid.autoFitColumns([firstColumn, lastColumn])">
1521
+ * <button kendoButton (click)="grid.autoFitColumns([firstColumn, lastColumn])">
1522
1522
  * Auto-fit the first and last column
1523
1523
  * </button>
1524
- * <button class="k-button" (click)="grid.autoFitColumns()">
1524
+ * <button kendoButton (click)="grid.autoFitColumns()">
1525
1525
  * Auto-fit all columns
1526
1526
  * </button>
1527
1527
  * </ng-template>
@@ -1700,7 +1700,7 @@ var GridComponent = /** @class */ (function () {
1700
1700
  * [reorderable]="true"
1701
1701
  * style="height: 300px">
1702
1702
  * <ng-template kendoGridToolbarTemplate>
1703
- * <button class="k-button"
1703
+ * <button kendoButton
1704
1704
  * (click)="grid.reorderColumn(groupColumn, 2, { before: true })">
1705
1705
  * Move the group column before the last one.
1706
1706
  * </button>
@@ -2561,7 +2561,6 @@ var GridComponent = /** @class */ (function () {
2561
2561
  tslib_1.__metadata("design:paramtypes", [])
2562
2562
  ], GridComponent.prototype, "dir", null);
2563
2563
  tslib_1.__decorate([
2564
- HostBinding('class.k-widget'),
2565
2564
  HostBinding('class.k-grid'),
2566
2565
  tslib_1.__metadata("design:type", Boolean),
2567
2566
  tslib_1.__metadata("design:paramtypes", [])
@@ -65,7 +65,7 @@ var GroupIndicatorComponent = /** @class */ (function () {
65
65
  Component({
66
66
  changeDetection: ChangeDetectionStrategy.OnPush,
67
67
  selector: '[kendoGroupIndicator]',
68
- 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 "
68
+ 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 "
69
69
  })
70
70
  ], GroupIndicatorComponent);
71
71
  return GroupIndicatorComponent;
@@ -15,7 +15,7 @@ import { CELL_CONTEXT } from '../rendering/common/cell-context';
15
15
  * _@Component({
16
16
  * selector: 'my-app',
17
17
  * template: `
18
- * <input type="text" class="k-textbox" placeholder="Tab stop #0" style="margin-bottom: 8px;" />
18
+ * <input type="text" placeholder="Tab stop #0" style="margin-bottom: 8px;" />
19
19
  * <kendo-grid [data]="data" [navigable]="true">
20
20
  * <kendo-grid-column field="ProductID" title="Product ID" width="100">
21
21
  * </kendo-grid-column>
@@ -24,18 +24,18 @@ import { CELL_CONTEXT } from '../rendering/common/cell-context';
24
24
  * <kendo-grid-column>
25
25
  * <ng-template kendoGridCellTemplate let-dataItem>
26
26
  * <!-- The first focusable element will be focused when pressing Enter on the cell -->
27
- * <input type="text" class="k-textbox" kendoGridFocusable [value]="dataItem.ProductName" style="margin-right: 8px;" />
28
- * <button class="k-button" kendoGridFocusable>Update</button>
27
+ * <input type="text" kendoGridFocusable [value]="dataItem.ProductName" style="margin-right: 8px;" />
28
+ * <button kendoGridFocusable>Update</button>
29
29
  * </ng-template>
30
30
  * </kendo-grid-column>
31
31
  * <kendo-grid-column width="100">
32
32
  * <ng-template kendoGridCellTemplate>
33
33
  * <!-- A single focusable element will be focused during navigation -->
34
- * <button class="k-button" kendoGridFocusable>Delete</button>
34
+ * <button kendoGridFocusable>Delete</button>
35
35
  * </ng-template>
36
36
  * </kendo-grid-column>
37
37
  * </kendo-grid>
38
- * <input type="text" class="k-textbox" placeholder="Tab stop #2" style="margin-top: 8px;" />
38
+ * <input type="text" placeholder="Tab stop #2" style="margin-top: 8px;" />
39
39
  * `
40
40
  * })
41
41
  *
@@ -9,7 +9,7 @@ export var packageMetadata = {
9
9
  name: '@progress/kendo-angular-grid',
10
10
  productName: 'Kendo UI for Angular',
11
11
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
12
- publishDate: 1639039762,
12
+ publishDate: 1642605543,
13
13
  version: '',
14
14
  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'
15
15
  };
@@ -109,7 +109,7 @@ var PagerNumericButtonsComponent = /** @class */ (function (_super) {
109
109
  Component({
110
110
  changeDetection: ChangeDetectionStrategy.OnPush,
111
111
  selector: 'kendo-pager-numeric-buttons',
112
- 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 "
112
+ 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 "
113
113
  }),
114
114
  tslib_1.__metadata("design:paramtypes", [LocalizationService,
115
115
  ChangeDetectorRef,
@@ -37,7 +37,6 @@ var PagerComponent = /** @class */ (function () {
37
37
  this.pageChange = new EventEmitter();
38
38
  this.pagerWrapClass = true;
39
39
  this.gridPagerClass = true;
40
- this.widgetClass = true;
41
40
  this.settings = normalize({});
42
41
  this.subscriptions = new Subscription();
43
42
  this._templateContext = {};
@@ -284,10 +283,6 @@ var PagerComponent = /** @class */ (function () {
284
283
  HostBinding('class.k-grid-pager'),
285
284
  tslib_1.__metadata("design:type", Boolean)
286
285
  ], PagerComponent.prototype, "gridPagerClass", void 0);
287
- tslib_1.__decorate([
288
- HostBinding('class.k-widget'),
289
- tslib_1.__metadata("design:type", Boolean)
290
- ], PagerComponent.prototype, "widgetClass", void 0);
291
286
  tslib_1.__decorate([
292
287
  HostBinding('class.k-state-focused'),
293
288
  tslib_1.__metadata("design:type", Boolean),
@@ -34,7 +34,7 @@ var appendNodes = function (element, nodes) {
34
34
  var ɵ0 = appendNodes;
35
35
  var wrapTable = function (table) {
36
36
  var wrapper = document.createElement('div');
37
- wrapper.className = 'k-widget k-grid';
37
+ wrapper.className = 'k-grid';
38
38
  wrapper.appendChild(table);
39
39
  return wrapper;
40
40
  };
@@ -232,7 +232,7 @@ var CellComponent = /** @class */ (function () {
232
232
  CellComponent = tslib_1.__decorate([
233
233
  Component({
234
234
  selector: '[kendoGridCell]',
235
- 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 "
235
+ 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 "
236
236
  }),
237
237
  tslib_1.__param(3, Optional()), tslib_1.__param(3, Inject(CELL_CONTEXT)),
238
238
  tslib_1.__metadata("design:paramtypes", [EditService,
@@ -17,4 +17,4 @@ export var IGNORE_TARGET_CLASSSES = 'k-icon';
17
17
  /**
18
18
  * @hidden
19
19
  */
20
- export var IGNORE_CONTAINER_CLASSES = 'k-widget k-grid-ignore-click';
20
+ export var IGNORE_CONTAINER_CLASSES = 'k-grid k-grid-ignore-click';
@@ -8,7 +8,7 @@ import { GridComponent } from '../grid.component';
8
8
  import { Subscription, merge } from 'rxjs';
9
9
  import { map } from 'rxjs/operators';
10
10
  import { getter } from '@progress/kendo-common';
11
- import { isString } from '../utils';
11
+ import { isPresent, isString } from '../utils';
12
12
  /**
13
13
  * A directive which controls the expanded state of the master detail rows.
14
14
  */
@@ -25,9 +25,12 @@ var ExpandDetailsDirective = /** @class */ (function () {
25
25
  this.expandedDetailKeys = [];
26
26
  /**
27
27
  * Specifies if the items should be initially expanded.
28
+ * When set to `true` items added to the `expandedDetailKeys` collection will be collapsed, and items that are not present in it will be expanded.
29
+ *
28
30
  * @default false
29
31
  */
30
32
  this.initiallyExpanded = false;
33
+ this.expandedState = new Set();
31
34
  this.subscriptions = new Subscription();
32
35
  this.grid.isDetailExpanded = this.isExpanded.bind(this);
33
36
  this.subscriptions.add(merge(this.grid.detailExpand.pipe(map(function (e) { return (tslib_1.__assign({ expand: true }, e)); })), this.grid.detailCollapse.pipe(map(function (e) { return (tslib_1.__assign({ expand: false }, e)); }))).subscribe(this.toggleState.bind(this)));
@@ -65,6 +68,12 @@ var ExpandDetailsDirective = /** @class */ (function () {
65
68
  enumerable: true,
66
69
  configurable: true
67
70
  });
71
+ ExpandDetailsDirective.prototype.ngOnChanges = function (changes) {
72
+ // skip reinitialization if the user data is the same as the last state change
73
+ if (isPresent(changes.expandedDetailKeys) && this.lastExpandedState !== this.expandedDetailKeys) {
74
+ this.expandedState = new Set(this.expandedDetailKeys);
75
+ }
76
+ };
68
77
  ExpandDetailsDirective.prototype.ngOnDestroy = function () {
69
78
  this.subscriptions.unsubscribe();
70
79
  };
@@ -80,18 +89,23 @@ var ExpandDetailsDirective = /** @class */ (function () {
80
89
  */
81
90
  ExpandDetailsDirective.prototype.isExpanded = function (args) {
82
91
  var key = this.keyGetter(args.dataItem);
83
- return this.expandedDetailKeys.indexOf(key) > -1 ? !this.initiallyExpanded : this.initiallyExpanded;
92
+ var hasKey = this.expandedState.has(key);
93
+ // when [initiallyExpanded]="true" a present key means the corresponding detail row is collapsed
94
+ return this.initiallyExpanded ? !hasKey : hasKey;
84
95
  };
85
96
  ExpandDetailsDirective.prototype.toggleState = function (args) {
86
97
  var key = this.keyGetter(args.dataItem);
87
98
  if (Boolean(this.initiallyExpanded) !== args.expand) {
88
- this.expandedDetailKeys.push(key);
99
+ this.expandedState.add(key);
89
100
  }
90
101
  else {
91
- var index = this.expandedDetailKeys.indexOf(key);
92
- this.expandedDetailKeys.splice(index, 1);
102
+ this.expandedState.delete(key);
93
103
  }
94
- this.expandedDetailKeysChange.emit(this.expandedDetailKeys);
104
+ this.notifyChange();
105
+ };
106
+ ExpandDetailsDirective.prototype.notifyChange = function () {
107
+ this.lastExpandedState = Array.from(this.expandedState);
108
+ this.expandedDetailKeysChange.emit(this.lastExpandedState);
95
109
  };
96
110
  tslib_1.__decorate([
97
111
  Output(),
@@ -552,7 +552,7 @@ var HeaderComponent = /** @class */ (function () {
552
552
  Component({
553
553
  selector: '[kendoGridHeader]',
554
554
  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 "],
555
- 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 "
555
+ 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 "
556
556
  }),
557
557
  tslib_1.__metadata("design:paramtypes", [SinglePopupService,
558
558
  DragHintService,
@@ -17,16 +17,16 @@ import { Directive, TemplateRef, Optional, Input } from '@angular/core';
17
17
  * selector: 'my-app',
18
18
  * template: `
19
19
  * <div class="example-config">
20
- * <input type="radio" id="top" name="position" class="k-radio" value="top" checked (click)="positionChange($event)"/>
20
+ * <input type="radio" id="top" name="position" value="top" checked (click)="positionChange($event)"/>
21
21
  * <label class="k-radio-label" for="top">Top</label><br/>
22
- * <input type="radio" id="bottom" name="position" class="k-radio" value="bottom" (click)="positionChange($event)"/>
22
+ * <input type="radio" id="bottom" name="position" value="bottom" (click)="positionChange($event)"/>
23
23
  * <label class="k-radio-label" for="bottom">Bottom</label><br/>
24
- * <input type="radio" id="both" name="position" value="both" class="k-radio" (click)="positionChange($event)"/>
24
+ * <input type="radio" id="both" name="position" value="both" (click)="positionChange($event)"/>
25
25
  * <label class="k-radio-label" for="both">Both</label><br/>
26
26
  * </div>
27
27
  * <kendo-grid [data]="gridData" style="height: 200px">
28
28
  * <ng-template kendoGridToolbarTemplate [position]="position" let-position="position">
29
- * <button (click)="onClick()" class="k-button">Custom action</button>
29
+ * <button (click)="onClick()">Custom action</button>
30
30
  * </ng-template>
31
31
  * <kendo-grid-column field="ProductName">
32
32
  * </kendo-grid-column>
@@ -0,0 +1,91 @@
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
+ /**
6
+ * @hidden
7
+ *
8
+ * Quick look-up structure for combinations of keys.
9
+ * Similar to the native JS Set, however, working with a couple of keys instead of with a single key.
10
+ * Supports both primitive keys and object keys (compared by reference).
11
+ */
12
+ var PairSet = /** @class */ (function () {
13
+ function PairSet(items, keyXField, keyYField) {
14
+ var _this = this;
15
+ /**
16
+ * Holds a set of Y keys for each defined X key.
17
+ * Each X key creates a map which holds a set of Y keys.
18
+ *
19
+ * Map { 1 => Set { 1, 2, 3 } } // pairs: [1, 1], [1, 2], [1, 3]
20
+ */
21
+ this.keysX = new Map();
22
+ /**
23
+ * Count the each added or deleted key manually to avoid iterating over all items when calling `this.size`.
24
+ */
25
+ this.totalKeysCount = 0;
26
+ if (items && keyXField && keyYField) {
27
+ items.forEach(function (item) { return _this.add(item[keyXField], item[keyYField]); });
28
+ }
29
+ }
30
+ Object.defineProperty(PairSet.prototype, "size", {
31
+ /**
32
+ * Gets the total number of X/Y key pairs.
33
+ */
34
+ get: function () {
35
+ return this.totalKeysCount;
36
+ },
37
+ enumerable: true,
38
+ configurable: true
39
+ });
40
+ /**
41
+ * Adds a couple of items identified as a combination.
42
+ */
43
+ PairSet.prototype.add = function (keyX, keyY) {
44
+ if (!this.keysX.has(keyX)) {
45
+ this.keysX.set(keyX, new Set());
46
+ }
47
+ if (!this.has(keyX, keyY)) {
48
+ this.keysX.get(keyX).add(keyY);
49
+ this.totalKeysCount += 1;
50
+ }
51
+ };
52
+ /**
53
+ * Adds a combination of a couple of items identified together.
54
+ */
55
+ PairSet.prototype.delete = function (keyX, keyY) {
56
+ if (this.has(keyX, keyY)) {
57
+ this.keysX.get(keyX).delete(keyY);
58
+ this.totalKeysCount -= 1;
59
+ }
60
+ };
61
+ /**
62
+ * Checks whether the defined combination is stored.
63
+ */
64
+ PairSet.prototype.has = function (keyX, keyY) {
65
+ return this.keysX.has(keyX) && this.keysX.get(keyX).has(keyY);
66
+ };
67
+ /**
68
+ * Clears all key combinations.
69
+ */
70
+ PairSet.prototype.clear = function () {
71
+ this.keysX.clear();
72
+ this.totalKeysCount = 0;
73
+ };
74
+ /**
75
+ * Converts the persisted data structure to an array of objects,
76
+ * using the provided field names for the object props.
77
+ */
78
+ PairSet.prototype.toArray = function (keyXField, keyYField) {
79
+ return Array.from(this.keysX).reduce(function (pairs, pair) {
80
+ // Array.from(mapInstance) returns an array of arrays [[itemKey1, columnKeysSet1], [itemKey2, columnKeysSet2]]
81
+ var keyX = pair[0], keysY = pair[1];
82
+ Array.from(keysY).forEach(function (keyY) {
83
+ var _a;
84
+ return pairs.push((_a = {}, _a[keyXField] = keyX, _a[keyYField] = keyY, _a));
85
+ });
86
+ return pairs;
87
+ }, []);
88
+ };
89
+ return PairSet;
90
+ }());
91
+ export { PairSet };