@progress/kendo-angular-dropdowns 5.4.0-dev.202107151438 → 5.5.0-dev.202110290903

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 (43) hide show
  1. package/dist/cdn/js/kendo-angular-dropdowns.js +2 -2
  2. package/dist/cdn/main.js +1 -1
  3. package/dist/es/common/localization/messages.js +4 -0
  4. package/dist/es/common/shared.module.js +3 -1
  5. package/dist/es/dropdowntrees/checked-state/base-check.directive.js +54 -0
  6. package/dist/es/dropdowntrees/checked-state/check-all.directive.js +181 -0
  7. package/dist/es/dropdowntrees/checked-state/check.directive.js +15 -36
  8. package/dist/es/dropdowntrees/dropdowntree.component.js +1 -2
  9. package/dist/es/dropdowntrees/multiselecttree.component.js +62 -17
  10. package/dist/es/index.js +2 -0
  11. package/dist/es/multiselect/multiselect.component.js +8 -1
  12. package/dist/es/package-metadata.js +1 -1
  13. package/dist/es2015/common/localization/messages.d.ts +4 -0
  14. package/dist/es2015/common/localization/messages.js +4 -0
  15. package/dist/es2015/common/shared.module.js +3 -1
  16. package/dist/es2015/dropdowntrees/checked-state/base-check.directive.d.ts +32 -0
  17. package/dist/es2015/dropdowntrees/checked-state/base-check.directive.js +48 -0
  18. package/dist/es2015/dropdowntrees/checked-state/check-all.directive.d.ts +53 -0
  19. package/dist/es2015/dropdowntrees/checked-state/check-all.directive.js +161 -0
  20. package/dist/es2015/dropdowntrees/checked-state/check.directive.d.ts +3 -5
  21. package/dist/es2015/dropdowntrees/checked-state/check.directive.js +5 -26
  22. package/dist/es2015/dropdowntrees/dropdowntree.component.js +1 -2
  23. package/dist/es2015/dropdowntrees/multiselecttree.component.d.ts +14 -0
  24. package/dist/es2015/dropdowntrees/multiselecttree.component.js +87 -20
  25. package/dist/es2015/index.d.ts +2 -0
  26. package/dist/es2015/index.js +2 -0
  27. package/dist/es2015/index.metadata.json +1 -1
  28. package/dist/es2015/multiselect/multiselect.component.js +8 -1
  29. package/dist/es2015/package-metadata.js +1 -1
  30. package/dist/fesm2015/index.js +301 -51
  31. package/dist/fesm5/index.js +311 -58
  32. package/dist/npm/common/localization/messages.js +4 -0
  33. package/dist/npm/common/shared.module.js +3 -1
  34. package/dist/npm/dropdowntrees/checked-state/base-check.directive.js +56 -0
  35. package/dist/npm/dropdowntrees/checked-state/check-all.directive.js +183 -0
  36. package/dist/npm/dropdowntrees/checked-state/check.directive.js +14 -35
  37. package/dist/npm/dropdowntrees/dropdowntree.component.js +1 -2
  38. package/dist/npm/dropdowntrees/multiselecttree.component.js +62 -17
  39. package/dist/npm/index.js +4 -0
  40. package/dist/npm/multiselect/multiselect.component.js +8 -1
  41. package/dist/npm/package-metadata.js +1 -1
  42. package/dist/systemjs/kendo-angular-dropdowns.js +1 -1
  43. package/package.json +1 -1
@@ -23,7 +23,7 @@ var packageMetadata = {
23
23
  name: '@progress/kendo-angular-dropdowns',
24
24
  productName: 'Kendo UI for Angular',
25
25
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
26
- publishDate: 1626359778,
26
+ publishDate: 1635498056,
27
27
  version: '',
28
28
  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'
29
29
  };
@@ -6886,7 +6886,11 @@ var MultiSelectComponent = /** @class */ (function () {
6886
6886
  data = data.filter(function (item) { return !item.header; }).map(function (item) { return item.value; });
6887
6887
  }
6888
6888
  var dataItemValues = new Set(dataItems.map(function (item) { return getter$1(item, _this.valueField); }));
6889
- this.value = this.value.filter(function (value) { return !dataItemValues.has(getter$1(value, _this.valueField)); });
6889
+ this.value = this.value.filter(function (value) {
6890
+ var index = selectedIndices([value], data, _this.valueField)[0];
6891
+ var isDataItemDisabled = _this.disabledItemsService.isIndexDisabled(index);
6892
+ return !dataItemValues.has(getter$1(value, _this.valueField)) || isDataItemDisabled;
6893
+ });
6890
6894
  this.emitValueChange();
6891
6895
  };
6892
6896
  MultiSelectComponent.prototype.removeSingleTag = function (dataItem) {
@@ -6896,6 +6900,9 @@ var MultiSelectComponent = /** @class */ (function () {
6896
6900
  data = data.filter(function (item) { return !item.header; }).map(function (item) { return item.value; });
6897
6901
  }
6898
6902
  var index = selectedIndices([dataItem], data, this.valueField)[0];
6903
+ if (this.disabledItemsService.isIndexDisabled(index)) {
6904
+ return;
6905
+ }
6899
6906
  if (isNumber(index)) {
6900
6907
  this.selectionService.unselect(index);
6901
6908
  this.selectionService.focused = index;
@@ -8453,8 +8460,8 @@ var DropDownTreeComponent = /** @class */ (function () {
8453
8460
  dataItem;
8454
8461
  var shouldUpdateValue = newValue !== this.value;
8455
8462
  if (shouldUpdateValue) {
8456
- this.dataItem = dataItem;
8457
8463
  this.value = newValue;
8464
+ this.dataItem = dataItem;
8458
8465
  this.emitValueChange(this.value);
8459
8466
  }
8460
8467
  this.togglePopup(false);
@@ -8661,7 +8668,6 @@ var DropDownTreeComponent = /** @class */ (function () {
8661
8668
  };
8662
8669
  DropDownTreeComponent.prototype.clearState = function () {
8663
8670
  this.text = undefined;
8664
- this.valueDepth = undefined;
8665
8671
  this.selectedKeys = [];
8666
8672
  };
8667
8673
  DropDownTreeComponent.prototype.subscribeEvents = function () {
@@ -9042,6 +9048,12 @@ var MultiSelectTreeComponent = /** @class */ (function () {
9042
9048
  * @default false
9043
9049
  */
9044
9050
  this.filterable = false;
9051
+ /**
9052
+ * If `checkАll` is set to `true` and the checkboxes are enabled, a tri-state checkbox appears above the embedded treeview.
9053
+ * Clicking the checkbox checks or unchecks all enabled items of the treeview that are loaded.
9054
+ * @default false
9055
+ */
9056
+ this.checkAll = false;
9045
9057
  /**
9046
9058
  * A function which determines if a specific node has child nodes.
9047
9059
  */
@@ -9145,6 +9157,7 @@ var MultiSelectTreeComponent = /** @class */ (function () {
9145
9157
  this._checkableSettings = DEFAULT_CHECKABLE_SETTINGS;
9146
9158
  this._isFocused = false;
9147
9159
  this.subscriptions = [];
9160
+ this.lastAction = 'check';
9148
9161
  this.onTouchedCallback = noop;
9149
9162
  this.onChangeCallback = noop;
9150
9163
  this.direction = localization.rtl ? 'rtl' : 'ltr';
@@ -9160,7 +9173,7 @@ var MultiSelectTreeComponent = /** @class */ (function () {
9160
9173
  this._treeview = treeview;
9161
9174
  if (treeview) {
9162
9175
  // If filtering is enabled, focus the TreeView on mobile devices instead of the filter input
9163
- if (this.isFocused && !this.filterable || this.touchEnabled) {
9176
+ if (this.isFocused && !this.filterable && !this.checkAll || this.touchEnabled) {
9164
9177
  treeview.focus();
9165
9178
  }
9166
9179
  /**
@@ -9481,6 +9494,20 @@ var MultiSelectTreeComponent = /** @class */ (function () {
9481
9494
  enumerable: true,
9482
9495
  configurable: true
9483
9496
  });
9497
+ Object.defineProperty(MultiSelectTreeComponent.prototype, "isFilterActive", {
9498
+ get: function () {
9499
+ return this.filterInput && document.activeElement === this.filterInput.nativeElement;
9500
+ },
9501
+ enumerable: true,
9502
+ configurable: true
9503
+ });
9504
+ Object.defineProperty(MultiSelectTreeComponent.prototype, "isCheckAllActive", {
9505
+ get: function () {
9506
+ return this.checkAllInput && document.activeElement === this.checkAllInput.nativeElement;
9507
+ },
9508
+ enumerable: true,
9509
+ configurable: true
9510
+ });
9484
9511
  MultiSelectTreeComponent.prototype.ngOnInit = function () {
9485
9512
  var _this = this;
9486
9513
  this.renderer.removeAttribute(this.hostElement.nativeElement, 'tabindex');
@@ -9704,6 +9731,7 @@ var MultiSelectTreeComponent = /** @class */ (function () {
9704
9731
  */
9705
9732
  MultiSelectTreeComponent.prototype.handleCheckedItemsChange = function (items) {
9706
9733
  this.valueDepth = items.map(function (item) { return item.level; });
9734
+ this.lastAction = items.length > this.dataItems.length ? 'check' : 'uncheck';
9707
9735
  this.dataItems = items.slice();
9708
9736
  this.updateValue(this.dataItems);
9709
9737
  };
@@ -9725,12 +9753,12 @@ var MultiSelectTreeComponent = /** @class */ (function () {
9725
9753
  if (tag instanceof Array) {
9726
9754
  // Remove group tag
9727
9755
  this.dataItems = this.dataItems.filter(function (_item, i) { return i < _this.showAfter || _this.disabledIndices.has(i); });
9728
- this.valueDepth = this.valueDepth.filter(function (_item, i) { return i < _this.showAfter; });
9756
+ this.valueDepth = this.valueDepth.filter(function (_item, i) { return i < _this.showAfter || _this.disabledIndices.has(i); });
9729
9757
  }
9730
9758
  else {
9731
9759
  // Remove single tag
9732
- this.dataItems = this.dataItems.filter(function (_item, i) { return i !== index; });
9733
- this.valueDepth = this.valueDepth.filter(function (_item, i) { return i !== index; });
9760
+ this.dataItems = this.dataItems.filter(function (_item, i) { return i !== index || _this.disabledIndices.has(i); });
9761
+ this.valueDepth = this.valueDepth.filter(function (_item, i) { return i !== index || _this.disabledIndices.has(i); });
9734
9762
  }
9735
9763
  this.updateValue(this.dataItems);
9736
9764
  // focus the wrapper if the component is not focused - the floating label reacts to focus/blur
@@ -9756,7 +9784,7 @@ var MultiSelectTreeComponent = /** @class */ (function () {
9756
9784
  this.value = this.value.filter(function (_item, index) { return _this.disabledIndices.has(index); });
9757
9785
  this.dataItems = this.dataItems.filter(function (_item, index) { return _this.disabledIndices.has(index); });
9758
9786
  this.valueDepth = this.valueDepth.filter(function (_depth, index) { return _this.disabledIndices.has(index); });
9759
- this.emitValueChange();
9787
+ this.emitValueChange(this.value);
9760
9788
  };
9761
9789
  /**
9762
9790
  * @hidden
@@ -9796,6 +9824,13 @@ var MultiSelectTreeComponent = /** @class */ (function () {
9796
9824
  this.filterChange.next(term);
9797
9825
  this.allNodesHidden = this.nodes.every(function (node, index) { return !_this.isVisible(node, String(index)); });
9798
9826
  };
9827
+ /**
9828
+ * @hidden
9829
+ */
9830
+ MultiSelectTreeComponent.prototype.toggleCheckAll = function () {
9831
+ this.checkAllInput.nativeElement.focus();
9832
+ this.checkAllInput.nativeElement.click();
9833
+ };
9799
9834
  MultiSelectTreeComponent.prototype.verifySettings = function () {
9800
9835
  if (!isDevMode()) {
9801
9836
  return;
@@ -9921,17 +9956,20 @@ var MultiSelectTreeComponent = /** @class */ (function () {
9921
9956
  return;
9922
9957
  }
9923
9958
  var isFirstNodeActive = this.treeview['navigationService']['activeIndex'] === '0';
9924
- if (this.filterable) {
9925
- var isFilterActive = this.filterInput.nativeElement === document.activeElement;
9926
- if (isFilterActive) {
9927
- this.focus();
9928
- }
9929
- else if (!isFilterActive && isFirstNodeActive) {
9930
- this.filterInput.nativeElement.focus();
9931
- }
9932
- }
9933
- if (!this.filterable && isFirstNodeActive) {
9959
+ // Current focus is on the filter input => should focus the wrapper
9960
+ if (this.filterable && this.isFilterActive) {
9934
9961
  this.focus();
9962
+ // Current focus is on the treeview first node => should focus the check all checkbox if enabled
9963
+ }
9964
+ else if (this.checkAll && !this.isCheckAllActive && isFirstNodeActive) {
9965
+ this.checkAllInput.nativeElement.focus();
9966
+ // Current focus is either on the check all checkbox or the treeview's first node
9967
+ // => should focus either the filter input (if enabled) or the wrapper
9968
+ }
9969
+ else if (this.isCheckAllActive || isFirstNodeActive) {
9970
+ this.filterable ?
9971
+ this.filterInput.nativeElement.focus() :
9972
+ this.focus();
9935
9973
  }
9936
9974
  };
9937
9975
  MultiSelectTreeComponent.prototype.handleDownKey = function (event) {
@@ -9939,9 +9977,14 @@ var MultiSelectTreeComponent = /** @class */ (function () {
9939
9977
  return;
9940
9978
  }
9941
9979
  event.originalEvent.preventDefault();
9942
- // Put the focus back on the filter input if the wrapper is focused
9980
+ // Current focus is on the wrapper => should focus the filter input
9943
9981
  if (this.filterable && this.isWrapperActive) {
9944
9982
  this.filterInput.nativeElement.focus();
9983
+ // Current focus is on the wrapper/filter input => should focus check all checkbox if enabled
9984
+ }
9985
+ else if (this.checkAll && (this.isWrapperActive || this.isFilterActive)) {
9986
+ this.checkAllInput.nativeElement.focus();
9987
+ // Should focus the treeview if filterable and check all are disabled
9945
9988
  }
9946
9989
  else if (!this.treeview.isActive) {
9947
9990
  this.treeview.focus();
@@ -10102,6 +10145,10 @@ var MultiSelectTreeComponent = /** @class */ (function () {
10102
10145
  ViewChild('filterInput', { static: false }),
10103
10146
  __metadata("design:type", ElementRef)
10104
10147
  ], MultiSelectTreeComponent.prototype, "filterInput", void 0);
10148
+ __decorate([
10149
+ ViewChild('checkAllInput', { static: false }),
10150
+ __metadata("design:type", ElementRef)
10151
+ ], MultiSelectTreeComponent.prototype, "checkAllInput", void 0);
10105
10152
  __decorate([
10106
10153
  Input(),
10107
10154
  __metadata("design:type", Number),
@@ -10184,6 +10231,10 @@ var MultiSelectTreeComponent = /** @class */ (function () {
10184
10231
  Input(),
10185
10232
  __metadata("design:type", Boolean)
10186
10233
  ], MultiSelectTreeComponent.prototype, "filterable", void 0);
10234
+ __decorate([
10235
+ Input(),
10236
+ __metadata("design:type", Boolean)
10237
+ ], MultiSelectTreeComponent.prototype, "checkAll", void 0);
10187
10238
  __decorate([
10188
10239
  Input(),
10189
10240
  __metadata("design:type", Function)
@@ -10284,7 +10335,7 @@ var MultiSelectTreeComponent = /** @class */ (function () {
10284
10335
  }
10285
10336
  ],
10286
10337
  selector: 'kendo-multiselecttree',
10287
- template: "\n <ng-container kendoMultiSelectTreeLocalizedMessages\n i18n-noDataText=\"kendo.multiselecttree.noDataText|The text displayed in the popup when there are no items\"\n noDataText=\"NO DATA FOUND\"\n\n i18n-clearTitle=\"kendo.multiselecttree.clearTitle|The title of the clear button\"\n clearTitle=\"clear\"\n >\n </ng-container>\n <div #wrapper\n [ngClass]=\"{\n 'k-multiselect-wrap': true,\n 'k-floatwrap': true,\n 'k-state-disabled': this.disabled\n }\"\n role=\"listbox\"\n aria-haspopup=\"tree\"\n [attr.aria-describedby]=\"tagListId\"\n [attr.aria-readonly]=\"readonly\"\n [attr.aria-activedescendant]=\"focusedTagId\"\n [attr.tabindex]=\"tabindex\"\n [attr.id]=\"focusableId\"\n [attr.dir]=\"direction\"\n (click)=\"handleClick()\"\n (keydown)=\"handleKeydown($event)\"\n [kendoEventsOutsideAngular]=\"{\n focus: handleFocus,\n blur: handleBlur\n }\"\n [scope]=\"this\"\n >\n <kendo-taglist\n [id]=\"tagListId\"\n [tags]=\"tags\"\n [focused]=\"focusedTagIndex\"\n [textField]=\"textField\"\n [valueField]=\"valueField\"\n [valueDepth]=\"valueDepth\"\n [disabled]=\"disabled\"\n [tagPrefix]=\"tagPrefix\"\n [template]=\"tagTemplate\"\n [groupTemplate]=\"groupTagTemplate\"\n [disabledIndices]=\"disabledIndices\"\n (removeTag)=\"handleRemoveTag($event)\"\n >\n </kendo-taglist>\n <span *ngIf=\"!tags || !tags.length\"\n class=\"k-input k-readonly\"\n >\n {{ placeholder }}\n </span>\n <span\n *ngIf=\"!disabled && !loading && !readonly && clearButton && tags?.length\"\n class=\"k-icon k-clear-value k-i-close\"\n [attr.title]=\"messageFor('clearTitle')\"\n role=\"button\"\n tabindex=\"-1\"\n (mousedown)=\"clearAll($event)\"\n >\n </span>\n <span\n *ngIf=\"loading\"\n class=\"k-icon k-i-loading\"\n >\n </span>\n </div>\n <ng-template #popupTemplate>\n <span\n *ngIf=\"filterable\"\n class=\"k-list-filter\"\n >\n <input\n #filterInput\n (input)=\"handleFilterInputChange($event.target.value)\"\n [filterInput]=\"filterable && !touchEnabled\"\n (keydown.arrowdown)=\"handleKeydown($event)\"\n (keydown.arrowup)=\"handleKeydown($event)\"\n (keydown.alt.arrowup)=\"handleKeydown($event)\"\n [(ngModel)]=\"filter\"\n class=\"k-textbox\"\n role=\"textbox\"\n aria-haspopup=\"true\"\n aria-expanded=\"false\"\n tabindex=\"0\"\n aria-disabled=\"false\"\n aria-readonly=\"false\"\n [kendoEventsOutsideAngular]=\"{\n blur: handleBlur\n }\"\n [scope]=\"this\"\n >\n <span class=\"k-icon k-i-zoom\"></span>\n </span>\n <!--header template-->\n <ng-template\n *ngIf=\"headerTemplate\"\n [templateContext]=\"{\n templateRef: headerTemplate?.templateRef\n }\">\n </ng-template>\n <kendo-treeview\n #treeview\n [nodes]=\"data\"\n [style.maxHeight.px]=\"listHeight\"\n [animate]=\"false\"\n kendoMultiSelectTreeCheckable\n [checkable]=\"checkableSettings\"\n [checkedItems]=\"checkedItems\"\n [valueField]=\"valueField\"\n [textField]=\"textField\"\n [children]=\"children\"\n [hasChildren]=\"hasChildren\"\n [isExpanded]=\"isNodeExpanded\"\n [isDisabled]=\"itemDisabled\"\n [nodeTemplate]=\"nodeTemplate\"\n [loadOnDemand]=\"loadOnDemand\"\n [filter]=\"filter\"\n [isVisible]=\"isNodeVisible\"\n (keydown)=\"handleKeydown($event)\"\n (nodeClick)=\"handleNodeClick($event)\"\n (expand)=\"nodeExpand.emit($event)\"\n (collapse)=\"nodeCollapse.emit($event)\"\n (checkedItemsChange)=\"handleCheckedItemsChange($event)\"\n [kendoEventsOutsideAngular]=\"{\n focusout: handleBlur\n }\"\n [scope]=\"this\"\n >\n </kendo-treeview>\n <!--footer template-->\n <ng-template\n *ngIf=\"footerTemplate\"\n [templateContext]=\"{\n templateRef: footerTemplate?.templateRef\n }\">\n </ng-template>\n <!--no-data template-->\n <div class=\"k-nodata\" *ngIf=\"data?.length === 0 || allNodesHidden\">\n <ng-template [ngIf]=\"noDataTemplate\"\n [templateContext]=\"{\n templateRef: noDataTemplate?.templateRef\n }\">\n </ng-template>\n <ng-template [ngIf]=\"!noDataTemplate\">\n <div>{{ messageFor('noDataText') }}</div>\n </ng-template>\n </div>\n </ng-template>\n <ng-container #container></ng-container>\n "
10338
+ template: "\n <ng-container kendoMultiSelectTreeLocalizedMessages\n i18n-noDataText=\"kendo.multiselecttree.noDataText|The text displayed in the popup when there are no items\"\n noDataText=\"NO DATA FOUND\"\n\n i18n-clearTitle=\"kendo.multiselecttree.clearTitle|The title of the clear button\"\n clearTitle=\"clear\"\n\n i18n-checkAllText=\"kendo.multiselecttree.checkAllText|The text displayed for the check-all checkbox\"\n checkAllText=\"Check all\"\n >\n </ng-container>\n <div #wrapper\n [ngClass]=\"{\n 'k-multiselect-wrap': true,\n 'k-floatwrap': true,\n 'k-state-disabled': this.disabled\n }\"\n role=\"listbox\"\n aria-haspopup=\"tree\"\n [attr.aria-describedby]=\"tagListId\"\n [attr.aria-readonly]=\"readonly\"\n [attr.aria-activedescendant]=\"focusedTagId\"\n [attr.tabindex]=\"tabindex\"\n [attr.id]=\"focusableId\"\n [attr.dir]=\"direction\"\n (click)=\"handleClick()\"\n (keydown)=\"handleKeydown($event)\"\n [kendoEventsOutsideAngular]=\"{\n focus: handleFocus,\n blur: handleBlur\n }\"\n [scope]=\"this\"\n >\n <kendo-taglist\n [id]=\"tagListId\"\n [tags]=\"tags\"\n [focused]=\"focusedTagIndex\"\n [textField]=\"textField\"\n [valueField]=\"valueField\"\n [valueDepth]=\"valueDepth\"\n [disabled]=\"disabled\"\n [tagPrefix]=\"tagPrefix\"\n [template]=\"tagTemplate\"\n [groupTemplate]=\"groupTagTemplate\"\n [disabledIndices]=\"disabledIndices\"\n (removeTag)=\"handleRemoveTag($event)\"\n >\n </kendo-taglist>\n <span *ngIf=\"!tags || !tags.length\"\n class=\"k-input k-readonly\"\n >\n {{ placeholder }}\n </span>\n <span\n *ngIf=\"!disabled && !loading && !readonly && clearButton && tags?.length\"\n class=\"k-icon k-clear-value k-i-close\"\n [attr.title]=\"messageFor('clearTitle')\"\n role=\"button\"\n tabindex=\"-1\"\n (click)=\"clearAll($event)\"\n >\n </span>\n <span\n *ngIf=\"loading\"\n class=\"k-icon k-i-loading\"\n >\n </span>\n </div>\n <ng-template #popupTemplate>\n <span\n *ngIf=\"filterable\"\n class=\"k-list-filter\"\n >\n <input\n #filterInput\n (input)=\"handleFilterInputChange($event.target.value)\"\n [filterInput]=\"filterable && !touchEnabled\"\n (keydown)=\"handleKeydown($event)\"\n [(ngModel)]=\"filter\"\n class=\"k-textbox\"\n role=\"textbox\"\n aria-haspopup=\"true\"\n aria-expanded=\"false\"\n tabindex=\"0\"\n aria-disabled=\"false\"\n aria-readonly=\"false\"\n [kendoEventsOutsideAngular]=\"{\n blur: handleBlur\n }\"\n [scope]=\"this\"\n >\n <span class=\"k-icon k-i-zoom\"></span>\n </span>\n <!--header template-->\n <ng-template\n *ngIf=\"headerTemplate\"\n [templateContext]=\"{\n templateRef: headerTemplate?.templateRef\n }\">\n </ng-template>\n <div *ngIf=\"checkAll\" class=\"k-check-all\">\n <input\n #checkAllInput\n [checkAll]=\"!filterable && !touchEnabled\"\n type=\"checkbox\"\n class=\"k-checkbox\"\n role=\"checkbox\"\n tabindex=\"0\"\n aria-disabled=\"false\"\n aria-readonly=\"false\"\n [treeview]=\"treeview\"\n [checkedItems]=\"checkedItems\"\n [valueField]=\"valueField\"\n [lastAction]=\"lastAction\"\n (checkedItemsChange)=\"handleCheckedItemsChange($event)\"\n (keydown)=\"handleKeydown($event)\"\n [kendoEventsOutsideAngular]=\"{\n blur: handleBlur\n }\"\n [scope]=\"this\"\n >\n <span\n class=\"k-checkbox-label\"\n (click)=\"toggleCheckAll()\"\n (mousedown)=\"$event.preventDefault()\"\n >\n {{ messageFor('checkAllText') }}\n </span>\n </div>\n <kendo-treeview\n #treeview\n [nodes]=\"data\"\n [style.maxHeight.px]=\"listHeight\"\n [animate]=\"false\"\n kendoMultiSelectTreeCheckable\n [checkable]=\"checkableSettings\"\n [checkedItems]=\"checkedItems\"\n [valueField]=\"valueField\"\n [textField]=\"textField\"\n [children]=\"children\"\n [hasChildren]=\"hasChildren\"\n [isExpanded]=\"isNodeExpanded\"\n [isDisabled]=\"itemDisabled\"\n [nodeTemplate]=\"nodeTemplate\"\n [loadOnDemand]=\"loadOnDemand\"\n [filter]=\"filter\"\n [isVisible]=\"isNodeVisible\"\n (keydown)=\"handleKeydown($event)\"\n (nodeClick)=\"handleNodeClick($event)\"\n (expand)=\"nodeExpand.emit($event)\"\n (collapse)=\"nodeCollapse.emit($event)\"\n (checkedItemsChange)=\"handleCheckedItemsChange($event)\"\n [kendoEventsOutsideAngular]=\"{\n focusout: handleBlur\n }\"\n [scope]=\"this\"\n >\n </kendo-treeview>\n <!--footer template-->\n <ng-template\n *ngIf=\"footerTemplate\"\n [templateContext]=\"{\n templateRef: footerTemplate?.templateRef\n }\">\n </ng-template>\n <!--no-data template-->\n <div class=\"k-nodata\" *ngIf=\"data?.length === 0 || allNodesHidden\">\n <ng-template [ngIf]=\"noDataTemplate\"\n [templateContext]=\"{\n templateRef: noDataTemplate?.templateRef\n }\">\n </ng-template>\n <ng-template [ngIf]=\"!noDataTemplate\">\n <div>{{ messageFor('noDataText') }}</div>\n </ng-template>\n </div>\n </ng-template>\n <ng-container #container></ng-container>\n "
10288
10339
  }),
10289
10340
  __param(7, Optional()), __param(7, Inject(TOUCH_ENABLED)),
10290
10341
  __metadata("design:paramtypes", [PopupService,
@@ -10572,6 +10623,10 @@ var Messages = /** @class */ (function (_super) {
10572
10623
  Input(),
10573
10624
  __metadata("design:type", String)
10574
10625
  ], Messages.prototype, "clearTitle", void 0);
10626
+ __decorate([
10627
+ Input(),
10628
+ __metadata("design:type", String)
10629
+ ], Messages.prototype, "checkAllText", void 0);
10575
10630
  return Messages;
10576
10631
  }(ComponentMessages));
10577
10632
 
@@ -10967,33 +11022,81 @@ var TemplateContextDirective = /** @class */ (function () {
10967
11022
  *
10968
11023
  * A directive which manages the in-memory checked state of the MultiSelectTree nodes.
10969
11024
  */
10970
- var CheckDirective = /** @class */ (function () {
11025
+ var BaseCheckDirective = /** @class */ (function () {
11026
+ function BaseCheckDirective() {
11027
+ }
11028
+ BaseCheckDirective.prototype.addItem = function (item) {
11029
+ if (this.isItemChecked(item)) {
11030
+ return;
11031
+ }
11032
+ var level = getHierarchicalItemLevel(item.index);
11033
+ var candidate = __assign({}, item, { level: level });
11034
+ this.checkedItems.push(candidate);
11035
+ this.checkedKeys.add(valueFrom(candidate, this.valueField));
11036
+ };
11037
+ BaseCheckDirective.prototype.removeItem = function (item) {
11038
+ var _this = this;
11039
+ if (!this.isItemChecked(item)) {
11040
+ return;
11041
+ }
11042
+ var level = getHierarchicalItemLevel(item.index);
11043
+ var candidate = __assign({}, item, { level: level });
11044
+ this.checkedItems = this.checkedItems
11045
+ .filter(function (item) { return valueFrom(item, _this.valueField) !== valueFrom(candidate, _this.valueField); });
11046
+ this.checkedKeys.delete(valueFrom(candidate, this.valueField));
11047
+ };
11048
+ BaseCheckDirective.prototype.isItemChecked = function (item) {
11049
+ return this.checkedKeys.has(valueFrom(item, this.valueField));
11050
+ };
11051
+ BaseCheckDirective.prototype.updateItems = function () {
11052
+ var _this = this;
11053
+ this.checkedItems = this.checkedItems || [];
11054
+ this.checkedKeys = new Set(this.checkedItems.map(function (item) { return valueFrom(item, _this.valueField); }));
11055
+ };
11056
+ __decorate([
11057
+ Input(),
11058
+ __metadata("design:type", Object)
11059
+ ], BaseCheckDirective.prototype, "valueField", void 0);
11060
+ __decorate([
11061
+ Input(),
11062
+ __metadata("design:type", Array)
11063
+ ], BaseCheckDirective.prototype, "checkedItems", void 0);
11064
+ return BaseCheckDirective;
11065
+ }());
11066
+
11067
+ /**
11068
+ * @hidden
11069
+ *
11070
+ * A directive which manages the in-memory checked state of the MultiSelectTree nodes.
11071
+ */
11072
+ var CheckDirective = /** @class */ (function (_super) {
11073
+ __extends(CheckDirective, _super);
10971
11074
  function CheckDirective(treeView) {
10972
- this.treeView = treeView;
11075
+ var _this = _super.call(this) || this;
11076
+ _this.treeView = treeView;
10973
11077
  /**
10974
11078
  * Fires when the `checkedItems` collection was updated.
10975
11079
  */
10976
- this.checkedItemsChange = new EventEmitter();
11080
+ _this.checkedItemsChange = new EventEmitter();
10977
11081
  /**
10978
11082
  * Holds a Set with just the checked item keys.
10979
11083
  *
10980
11084
  * Should be updated each time the `checkedItems` value or content is changed.
10981
11085
  * Can be used for efficient look-up of whether an item is checked or not (O(1) access time).
10982
11086
  */
10983
- this.checkedKeys = new Set();
10984
- this.subscriptions = new Subscription();
10985
- this.subscriptions.add(this.treeView.checkedChange
10986
- .subscribe(this.handleCheckedChange.bind(this)));
10987
- this.treeView.isChecked = this.getCheckedState.bind(this);
11087
+ _this.checkedKeys = new Set();
11088
+ _this.subscriptions = new Subscription();
11089
+ _this.subscriptions.add(_this.treeView.checkedChange
11090
+ .subscribe(_this.handleCheckedChange.bind(_this)));
11091
+ _this.treeView.isChecked = _this.getCheckedState.bind(_this);
11092
+ return _this;
10988
11093
  }
10989
11094
  CheckDirective.prototype.ngOnChanges = function (changes) {
10990
- var _this = this;
10991
11095
  if (isPresent(changes.checkable)) {
10992
11096
  this.toggleCheckOnClick();
10993
11097
  }
10994
11098
  if (isPresent(changes.checkedItems)) {
10995
- this.checkedItems = this.checkedItems || [];
10996
- this.checkedKeys = new Set(this.checkedItems.map(function (item) { return valueFrom(item, _this.valueField); }));
11099
+ this.updateItems();
10997
11100
  }
10998
11101
  };
10999
11102
  CheckDirective.prototype.ngOnDestroy = function () {
@@ -11078,29 +11181,6 @@ var CheckDirective = /** @class */ (function () {
11078
11181
  currentParent = currentParent.parent;
11079
11182
  }
11080
11183
  };
11081
- CheckDirective.prototype.addItem = function (item) {
11082
- if (this.isItemChecked(item)) {
11083
- return;
11084
- }
11085
- var level = getHierarchicalItemLevel(item.index);
11086
- var candidate = __assign({}, item, { level: level });
11087
- this.checkedItems.push(candidate);
11088
- this.checkedKeys.add(valueFrom(candidate, this.valueField));
11089
- };
11090
- CheckDirective.prototype.removeItem = function (item) {
11091
- var _this = this;
11092
- if (!this.isItemChecked(item)) {
11093
- return;
11094
- }
11095
- var level = getHierarchicalItemLevel(item.index);
11096
- var candidate = __assign({}, item, { level: level });
11097
- this.checkedItems = this.checkedItems
11098
- .filter(function (item) { return valueFrom(item, _this.valueField) !== valueFrom(candidate, _this.valueField); });
11099
- this.checkedKeys.delete(valueFrom(candidate, this.valueField));
11100
- };
11101
- CheckDirective.prototype.isItemChecked = function (item) {
11102
- return this.checkedKeys.has(valueFrom(item, this.valueField));
11103
- };
11104
11184
  CheckDirective.prototype.isItemIndeterminate = function (lookup) {
11105
11185
  var children = lookup.children;
11106
11186
  if (!Array.isArray(children) || children.length === 0) {
@@ -11140,7 +11220,179 @@ var CheckDirective = /** @class */ (function () {
11140
11220
  __metadata("design:paramtypes", [TreeViewComponent])
11141
11221
  ], CheckDirective);
11142
11222
  return CheckDirective;
11143
- }());
11223
+ }(BaseCheckDirective));
11224
+
11225
+ /**
11226
+ * @hidden
11227
+ *
11228
+ * A directive which manages the in-memory checked state of the MultiSelectTree nodes.
11229
+ */
11230
+ var CheckAllDirective = /** @class */ (function (_super) {
11231
+ __extends(CheckAllDirective, _super);
11232
+ function CheckAllDirective(element, zone, cdr, renderer) {
11233
+ var _this = _super.call(this) || this;
11234
+ _this.element = element;
11235
+ _this.zone = zone;
11236
+ _this.cdr = cdr;
11237
+ _this.renderer = renderer;
11238
+ /**
11239
+ * Fires when the `checkedItems` collection was updated.
11240
+ */
11241
+ _this.checkedItemsChange = new EventEmitter();
11242
+ /**
11243
+ * Holds a Set with just the checked item keys.
11244
+ *
11245
+ * Should be updated each time the `checkedItems` value or content is changed.
11246
+ * Can be used for efficient look-up of whether an item is checked or not (O(1) access time).
11247
+ */
11248
+ _this.checkedKeys = new Set();
11249
+ return _this;
11250
+ }
11251
+ CheckAllDirective.prototype.handleChange = function (event) {
11252
+ var _this = this;
11253
+ // Need to store the current checkbox state at the moment of click
11254
+ this.currentCheckedState = event.checked;
11255
+ this.currentIndeterminateState = this.isIndeterminate;
11256
+ this.treeview.nodes.map(function (_value, index) {
11257
+ var itemIndex = String(index);
11258
+ var itemLookup = _this.treeview.itemLookup(itemIndex);
11259
+ _this.checkNode(itemLookup);
11260
+ });
11261
+ this.checkedItemsChange.emit(this.checkedItems.slice());
11262
+ };
11263
+ Object.defineProperty(CheckAllDirective.prototype, "isIndeterminate", {
11264
+ get: function () {
11265
+ var _this = this;
11266
+ var isIndeterminate = this.treeview.nodes.some(function (_node, index) {
11267
+ var itemIndex = String(index);
11268
+ var itemLookup = _this.treeview.itemLookup(itemIndex);
11269
+ return _this.someChecked(itemLookup);
11270
+ });
11271
+ return this.isChecked ? false : isIndeterminate;
11272
+ },
11273
+ enumerable: true,
11274
+ configurable: true
11275
+ });
11276
+ Object.defineProperty(CheckAllDirective.prototype, "isChecked", {
11277
+ get: function () {
11278
+ var _this = this;
11279
+ var isChecked = this.treeview.nodes.every(function (_node, index) {
11280
+ var itemIndex = String(index);
11281
+ var itemLookup = _this.treeview.itemLookup(itemIndex);
11282
+ return _this.allChecked(itemLookup);
11283
+ });
11284
+ return isChecked;
11285
+ },
11286
+ enumerable: true,
11287
+ configurable: true
11288
+ });
11289
+ CheckAllDirective.prototype.ngOnChanges = function (changes) {
11290
+ if (isPresent(changes.checkedItems)) {
11291
+ this.updateItems();
11292
+ this.renderer.setProperty(this.element.nativeElement, 'checked', this.isChecked);
11293
+ this.renderer.setProperty(this.element.nativeElement, 'indeterminate', this.isIndeterminate);
11294
+ }
11295
+ };
11296
+ CheckAllDirective.prototype.ngOnInit = function () {
11297
+ var _this = this;
11298
+ if (this.focused) {
11299
+ this.nextTick(function () { return _this.element.nativeElement.focus(); });
11300
+ }
11301
+ };
11302
+ CheckAllDirective.prototype.nextTick = function (fn) {
11303
+ this.zone.runOutsideAngular(function () { return setTimeout(fn); });
11304
+ };
11305
+ CheckAllDirective.prototype.checkNode = function (itemLookup) {
11306
+ var _this = this;
11307
+ if (this.treeview.isDisabled(itemLookup.item.dataItem, itemLookup.item.index)) {
11308
+ return;
11309
+ }
11310
+ var pendingCheck = [];
11311
+ var filter$$1 = function (item) {
11312
+ return _this.treeview.isVisible(item.dataItem, item.index) &&
11313
+ !_this.treeview.isDisabled(item.dataItem, item.index);
11314
+ };
11315
+ pendingCheck.push(itemLookup.item);
11316
+ fetchDescendentNodes(itemLookup, filter$$1)
11317
+ .forEach(function (lookup) { return pendingCheck.push(lookup.item); });
11318
+ pendingCheck.forEach(function (item) {
11319
+ if (_this.currentIndeterminateState) {
11320
+ _this.lastAction === 'check' ?
11321
+ _this.addItem(item) :
11322
+ _this.removeItem(item);
11323
+ return;
11324
+ }
11325
+ _this.currentCheckedState ?
11326
+ _this.addItem(item) :
11327
+ _this.removeItem(item);
11328
+ });
11329
+ };
11330
+ CheckAllDirective.prototype.allChecked = function (lookup) {
11331
+ var _this = this;
11332
+ var children = lookup && lookup.children;
11333
+ if (!Array.isArray(children)) {
11334
+ return;
11335
+ }
11336
+ var childrenChecked = children.every(function (child) {
11337
+ if (child.children.length) {
11338
+ return _this.isItemChecked(child.item) && _this.allChecked(child);
11339
+ }
11340
+ return _this.isItemChecked(child.item);
11341
+ });
11342
+ return childrenChecked && this.isItemChecked(lookup.item);
11343
+ };
11344
+ CheckAllDirective.prototype.someChecked = function (lookup) {
11345
+ var _this = this;
11346
+ var children = lookup && lookup.children;
11347
+ if (!Array.isArray(children)) {
11348
+ return;
11349
+ }
11350
+ var childrenChecked = children.some(function (child) {
11351
+ if (child.children.length) {
11352
+ return _this.isItemChecked(child.item) || _this.someChecked(child);
11353
+ }
11354
+ return _this.isItemChecked(child.item);
11355
+ });
11356
+ return childrenChecked || this.isItemChecked(lookup.item);
11357
+ };
11358
+ __decorate([
11359
+ Input(),
11360
+ __metadata("design:type", String)
11361
+ ], CheckAllDirective.prototype, "lastAction", void 0);
11362
+ __decorate([
11363
+ Input(),
11364
+ __metadata("design:type", TreeViewComponent)
11365
+ ], CheckAllDirective.prototype, "treeview", void 0);
11366
+ __decorate([
11367
+ Input(),
11368
+ __metadata("design:type", Array)
11369
+ ], CheckAllDirective.prototype, "checkedItems", void 0);
11370
+ __decorate([
11371
+ Input(),
11372
+ __metadata("design:type", Object)
11373
+ ], CheckAllDirective.prototype, "valueField", void 0);
11374
+ __decorate([
11375
+ Input('checkAll'),
11376
+ __metadata("design:type", Boolean)
11377
+ ], CheckAllDirective.prototype, "focused", void 0);
11378
+ __decorate([
11379
+ Output(),
11380
+ __metadata("design:type", EventEmitter)
11381
+ ], CheckAllDirective.prototype, "checkedItemsChange", void 0);
11382
+ __decorate([
11383
+ HostListener('change', ['$event.target']),
11384
+ __metadata("design:type", Function),
11385
+ __metadata("design:paramtypes", [Object]),
11386
+ __metadata("design:returntype", void 0)
11387
+ ], CheckAllDirective.prototype, "handleChange", null);
11388
+ CheckAllDirective = __decorate([
11389
+ Directive({
11390
+ selector: '[checkAll]' // tslint:disable-line
11391
+ }),
11392
+ __metadata("design:paramtypes", [ElementRef, NgZone, ChangeDetectorRef, Renderer2])
11393
+ ], CheckAllDirective);
11394
+ return CheckAllDirective;
11395
+ }(BaseCheckDirective));
11144
11396
 
11145
11397
  var INTERNAL_DIRECTIVES = [
11146
11398
  ListComponent,
@@ -11149,7 +11401,8 @@ var INTERNAL_DIRECTIVES = [
11149
11401
  SearchBarComponent,
11150
11402
  TemplateContextDirective,
11151
11403
  TagListComponent,
11152
- CheckDirective
11404
+ CheckDirective,
11405
+ CheckAllDirective
11153
11406
  ];
11154
11407
  /**
11155
11408
  * @hidden
@@ -11479,4 +11732,4 @@ var DropDownsModule = /** @class */ (function () {
11479
11732
  * Generated bundle index. Do not edit.
11480
11733
  */
11481
11734
 
11482
- export { AUTOCOMPLETE_VALUE_ACCESSOR, COMBOBOX_VALUE_ACCESSOR, TOUCH_ENABLED, DataService, DisabledItemsService, FilterInputDirective, FilterableComponent, ListItemDirective, CustomMessagesComponent, LocalizedMessagesDirective, Messages, NavigationService, SearchBarComponent, SelectionService, TagListComponent, NoDataTemplateDirective, TagTemplateDirective, DROPDOWNLIST_VALUE_ACCESSOR, CheckDirective, MultiSelectTreeSummaryTagDirective, AutoCompleteComponent, ComboBoxComponent, DropDownListComponent, MultiSelectComponent, MultiColumnComboBoxComponent, ComboBoxColumnComponent, ColumnCellTemplateDirective, ColumnHeaderTemplateDirective, DropDownTreeComponent, MultiSelectTreeComponent, DropDownTreeFlatBindingDirective, DropDownTreeHierarchyBindingDirective, MultiSelectTreeFlatBindingDirective, MultiSelectTreeHierarchyBindingDirective, DropDownTreesExpandDirective, DropDownTreesModule, NodeTemplateDirective, ItemTemplateDirective, GroupTemplateDirective, FixedGroupTemplateDirective, CustomItemTemplateDirective, HeaderTemplateDirective, FooterTemplateDirective, ValueTemplateDirective, TemplateContextDirective, GroupTagTemplateDirective, SelectableDirective, SummaryTagDirective, FilterDirective, DropDownsModule, MultiSelectModule, SharedModule, AutoCompleteModule, ComboBoxModule, DropDownListModule, SharedDirectivesModule, ListComponent, PreventableEvent, RemoveTagEvent };
11735
+ export { AUTOCOMPLETE_VALUE_ACCESSOR, COMBOBOX_VALUE_ACCESSOR, TOUCH_ENABLED, DataService, DisabledItemsService, FilterInputDirective, FilterableComponent, ListItemDirective, CustomMessagesComponent, LocalizedMessagesDirective, Messages, NavigationService, SearchBarComponent, SelectionService, TagListComponent, NoDataTemplateDirective, TagTemplateDirective, DROPDOWNLIST_VALUE_ACCESSOR, BaseCheckDirective, CheckAllDirective, CheckDirective, MultiSelectTreeSummaryTagDirective, AutoCompleteComponent, ComboBoxComponent, DropDownListComponent, MultiSelectComponent, MultiColumnComboBoxComponent, ComboBoxColumnComponent, ColumnCellTemplateDirective, ColumnHeaderTemplateDirective, DropDownTreeComponent, MultiSelectTreeComponent, DropDownTreeFlatBindingDirective, DropDownTreeHierarchyBindingDirective, MultiSelectTreeFlatBindingDirective, MultiSelectTreeHierarchyBindingDirective, DropDownTreesExpandDirective, DropDownTreesModule, NodeTemplateDirective, ItemTemplateDirective, GroupTemplateDirective, FixedGroupTemplateDirective, CustomItemTemplateDirective, HeaderTemplateDirective, FooterTemplateDirective, ValueTemplateDirective, TemplateContextDirective, GroupTagTemplateDirective, SelectableDirective, SummaryTagDirective, FilterDirective, DropDownsModule, MultiSelectModule, SharedModule, AutoCompleteModule, ComboBoxModule, DropDownListModule, SharedDirectivesModule, ListComponent, PreventableEvent, RemoveTagEvent };
@@ -23,6 +23,10 @@ var Messages = /** @class */ (function (_super) {
23
23
  core_1.Input(),
24
24
  tslib_1.__metadata("design:type", String)
25
25
  ], Messages.prototype, "clearTitle", void 0);
26
+ tslib_1.__decorate([
27
+ core_1.Input(),
28
+ tslib_1.__metadata("design:type", String)
29
+ ], Messages.prototype, "checkAllText", void 0);
26
30
  return Messages;
27
31
  }(kendo_angular_l10n_1.ComponentMessages));
28
32
  exports.Messages = Messages;
@@ -18,6 +18,7 @@ var list_item_directive_1 = require("./list-item.directive");
18
18
  var selectable_directive_1 = require("./selection/selectable.directive");
19
19
  var template_context_directive_1 = require("./templates/template-context.directive");
20
20
  var check_directive_1 = require("../dropdowntrees/checked-state/check.directive");
21
+ var check_all_directive_1 = require("../dropdowntrees/checked-state/check-all.directive");
21
22
  var INTERNAL_DIRECTIVES = [
22
23
  list_component_1.ListComponent,
23
24
  list_item_directive_1.ListItemDirective,
@@ -25,7 +26,8 @@ var INTERNAL_DIRECTIVES = [
25
26
  searchbar_component_1.SearchBarComponent,
26
27
  template_context_directive_1.TemplateContextDirective,
27
28
  taglist_component_1.TagListComponent,
28
- check_directive_1.CheckDirective
29
+ check_directive_1.CheckDirective,
30
+ check_all_directive_1.CheckAllDirective
29
31
  ];
30
32
  /**
31
33
  * @hidden