@progress/kendo-angular-dropdowns 11.6.0 → 12.0.0-develop.10

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 (33) hide show
  1. package/autocomplete/autocomplete.component.d.ts +82 -20
  2. package/comboboxes/combobox.component.d.ts +76 -8
  3. package/comboboxes/multicolumncombobox.component.d.ts +4 -0
  4. package/common/action-sheet.component.d.ts +43 -0
  5. package/common/list.component.d.ts +2 -1
  6. package/common/localization/messages.d.ts +9 -1
  7. package/common/selection/selectable.directive.d.ts +2 -1
  8. package/common/shared.module.d.ts +11 -7
  9. package/common/util.d.ts +39 -2
  10. package/dropdownlist/dropdownlist.component.d.ts +78 -9
  11. package/dropdowntrees/dropdowntree.component.d.ts +80 -8
  12. package/dropdowntrees/multiselecttree.component.d.ts +90 -6
  13. package/esm2020/autocomplete/autocomplete.component.mjs +294 -116
  14. package/esm2020/comboboxes/combobox.component.mjs +251 -60
  15. package/esm2020/comboboxes/multicolumncombobox.component.mjs +110 -119
  16. package/esm2020/common/action-sheet.component.mjs +243 -0
  17. package/esm2020/common/list.component.mjs +11 -2
  18. package/esm2020/common/localization/messages.mjs +5 -1
  19. package/esm2020/common/selection/selectable.directive.mjs +3 -3
  20. package/esm2020/common/shared.module.mjs +13 -6
  21. package/esm2020/common/util.mjs +68 -2
  22. package/esm2020/dropdownlist/dropdownlist.component.mjs +245 -64
  23. package/esm2020/dropdowntrees/dropdowntree.component.mjs +254 -56
  24. package/esm2020/dropdowntrees/multiselecttree.component.mjs +291 -55
  25. package/esm2020/index.mjs +1 -0
  26. package/esm2020/multiselect/multiselect.component.mjs +320 -88
  27. package/esm2020/package-metadata.mjs +2 -2
  28. package/fesm2015/progress-kendo-angular-dropdowns.mjs +2085 -552
  29. package/fesm2020/progress-kendo-angular-dropdowns.mjs +2054 -545
  30. package/index.d.ts +2 -0
  31. package/multiselect/multiselect.component.d.ts +87 -10
  32. package/package.json +9 -8
  33. package/schematics/ngAdd/index.js +2 -2
@@ -16,7 +16,7 @@ import { PreventableEvent } from '../common/models/preventable-event';
16
16
  import { NavigationAction } from '../common/navigation/navigation-action';
17
17
  import { RemoveTagEvent } from '../common/models/remove-tag-event';
18
18
  import { MultiSelectTreeMessages } from '../common/constants/error-messages';
19
- import { fetchDescendentNodes, getFillModeClass, getRoundedClass, getSearchableItems, getSizeClass, hasProps, isArray, isLetter, isObject, isObjectArray, isPresent, isUntouched, noop, parseNumber, valueFrom } from '../common/util';
19
+ import { animationDuration, fetchDescendentNodes, getFillModeClass, getRoundedClass, getSearchableItems, getSizeClass, hasProps, isArray, isLetter, isObject, isObjectArray, isPresent, isTruthy, isUntouched, noop, parseNumber, setActionSheetTitle, updateActionSheetAdaptiveAppearance, valueFrom, windowSize } from '../common/util';
20
20
  import { HeaderTemplateDirective } from '../common/templates/header-template.directive';
21
21
  import { FooterTemplateDirective } from '../common/templates/footer-template.directive';
22
22
  import { NodeTemplateDirective } from './templates/node-template.directive';
@@ -28,6 +28,7 @@ import { merge, of, Subject, Subscription } from 'rxjs';
28
28
  import { debounceTime, filter, tap } from 'rxjs/operators';
29
29
  import { buildTreeItem, MultiSelectTreeLookupService, nodeIndex } from './lookup/lookup.service';
30
30
  import { searchIcon, xIcon } from '@progress/kendo-svg-icons';
31
+ import { ResponsiveRendererComponent } from '../common/action-sheet.component';
31
32
  import * as i0 from "@angular/core";
32
33
  import * as i1 from "@progress/kendo-angular-popup";
33
34
  import * as i2 from "../common/navigation/navigation.service";
@@ -35,15 +36,16 @@ import * as i3 from "@progress/kendo-angular-l10n";
35
36
  import * as i4 from "./lookup/lookup.service";
36
37
  import * as i5 from "../common/taglist.component";
37
38
  import * as i6 from "@progress/kendo-angular-icons";
38
- import * as i7 from "@progress/kendo-angular-treeview";
39
- import * as i8 from "../common/localization/localized-messages.directive";
40
- import * as i9 from "@angular/common";
41
- import * as i10 from "@angular/forms";
42
- import * as i11 from "../common/filter-input.directive";
43
- import * as i12 from "@progress/kendo-angular-common";
44
- import * as i13 from "../common/templates/template-context.directive";
45
- import * as i14 from "./checked-state/check-all.directive";
46
- import * as i15 from "./checked-state/check.directive";
39
+ import * as i7 from "../common/action-sheet.component";
40
+ import * as i8 from "@progress/kendo-angular-treeview";
41
+ import * as i9 from "@progress/kendo-angular-common";
42
+ import * as i10 from "../common/localization/localized-messages.directive";
43
+ import * as i11 from "@angular/common";
44
+ import * as i12 from "@angular/forms";
45
+ import * as i13 from "../common/filter-input.directive";
46
+ import * as i14 from "../common/templates/template-context.directive";
47
+ import * as i15 from "./checked-state/check-all.directive";
48
+ import * as i16 from "./checked-state/check.directive";
47
49
  const DEFAULT_POPUP_SETTINGS = { animate: true };
48
50
  const DEFAULT_CHECKABLE_SETTINGS = { checkChildren: true, checkOnClick: true };
49
51
  const hasChildren = () => false;
@@ -68,6 +70,10 @@ export class MultiSelectTreeComponent {
68
70
  this.cdr = cdr;
69
71
  this.lookup = lookup;
70
72
  this.touchEnabled = touchEnabled;
73
+ /**
74
+ * @hidden
75
+ */
76
+ this.animationDuration = animationDuration;
71
77
  /**
72
78
  * @hidden
73
79
  */
@@ -80,6 +86,23 @@ export class MultiSelectTreeComponent {
80
86
  this.treeViewId = `k-${guid()}`;
81
87
  this.role = 'combobox';
82
88
  this.ariaHasPopup = 'tree';
89
+ /**
90
+ * Enables or disables the adaptive mode. By default the adaptive rendering is disabled.
91
+ */
92
+ this.adaptiveMode = 'none';
93
+ /**
94
+ * Sets the title of the ActionSheet that is rendered instead of the Popup when using small screen devices.
95
+ * By default the ActionSheet title uses the text provided for the label of the AutoComplete.
96
+ */
97
+ this.title = '';
98
+ /**
99
+ * @hidden
100
+ */
101
+ this.windowSize = 'large';
102
+ /**
103
+ * @hidden
104
+ */
105
+ this.isActionSheetExpanded = false;
83
106
  /**
84
107
  * Sets the levels in the data set where the values can be found when `valueField` is an Array.
85
108
  * The field serves to correctly allocate a data item used when the MultiSelectTree is initialized with a value.
@@ -88,14 +111,8 @@ export class MultiSelectTreeComponent {
88
111
  /**
89
112
  * The hint which is displayed when the component is empty.
90
113
  */
91
- this.placeholder = "";
92
- /**
93
- * Sets the height of the options list. By default, `listHeight` is 200px.
94
- *
95
- * > The `listHeight` property affects only the list of options and not the whole popup container.
96
- * > To set the height of the popup container, use `popupSettings.height`.
97
- */
98
- this.listHeight = 200;
114
+ this.placeholder = '';
115
+ this._listHeight = 200;
99
116
  /**
100
117
  * Sets the disabled state of the component.
101
118
  */
@@ -238,6 +255,7 @@ export class MultiSelectTreeComponent {
238
255
  this._popupSettings = DEFAULT_POPUP_SETTINGS;
239
256
  this._checkableSettings = DEFAULT_CHECKABLE_SETTINGS;
240
257
  this._isFocused = false;
258
+ this._initiallyCheckedItems = [];
241
259
  this._size = 'medium';
242
260
  this._rounded = 'medium';
243
261
  this._fillMode = 'solid';
@@ -298,7 +316,47 @@ export class MultiSelectTreeComponent {
298
316
  /**
299
317
  * @hidden
300
318
  */
301
- handleKeydown(event) {
319
+ onFilterChange(text) {
320
+ if (this.filterable) {
321
+ this.filterChange.emit(text);
322
+ }
323
+ }
324
+ /**
325
+ * @hidden
326
+ */
327
+ onExpand() {
328
+ this._searchableNodes = getSearchableItems(this.treeViewId, this.actionSheet.element.nativeElement);
329
+ this.isActionSheetExpanded = true;
330
+ }
331
+ /**
332
+ * @hidden
333
+ */
334
+ onCollapse() {
335
+ this.isActionSheetExpanded = false;
336
+ }
337
+ /**
338
+ * Sets the subtitle of the ActionSheet that is rendered instead of the Popup when using small screen devices.
339
+ * By default the ActionSheet subtitle uses the text provided for the `placeholder` of the AutoComplete.
340
+ */
341
+ set subtitle(_subtitle) {
342
+ this._subtitle = _subtitle;
343
+ }
344
+ get subtitle() {
345
+ return this._subtitle || this.placeholder;
346
+ }
347
+ /**
348
+ * @hidden
349
+ */
350
+ get isAdaptiveModeEnabled() {
351
+ return this.adaptiveMode === 'auto';
352
+ }
353
+ /**
354
+ * @hidden
355
+ */
356
+ handleKeydown(event, input) {
357
+ if (input) {
358
+ event.stopImmediatePropagation();
359
+ }
302
360
  const deleteTag = this.isWrapperActive && event.keyCode === Keys.Backspace && this.tags.length > 0;
303
361
  if (deleteTag) {
304
362
  this.handleBackspace();
@@ -307,7 +365,7 @@ export class MultiSelectTreeComponent {
307
365
  if (this.disabled || this.readonly) {
308
366
  return;
309
367
  }
310
- if (!this.isFilterActive && isLetter(event.key)) {
368
+ if (!this.isFilterActive && isLetter(event.key) && !this.actionSheetSearchBar?.onFocus) {
311
369
  this.printableCharacters.next(event.key);
312
370
  }
313
371
  const eventData = event;
@@ -322,6 +380,24 @@ export class MultiSelectTreeComponent {
322
380
  this.treeview?.element.nativeElement.dispatchEvent(spaceKeyDownEvent);
323
381
  }
324
382
  }
383
+ /**
384
+ * @hidden
385
+ */
386
+ get actionSheet() {
387
+ return this.responsiveRendererComponent?.actionSheet;
388
+ }
389
+ /**
390
+ * @hidden
391
+ */
392
+ get actionSheetSearchBar() {
393
+ return this.responsiveRendererComponent?.actionSheetSearchBar;
394
+ }
395
+ /**
396
+ * @hidden
397
+ */
398
+ get isAdaptive() {
399
+ return this.isAdaptiveModeEnabled && this.windowSize !== 'large';
400
+ }
325
401
  set treeview(treeview) {
326
402
  this._treeview = treeview;
327
403
  if (treeview) {
@@ -507,6 +583,24 @@ export class MultiSelectTreeComponent {
507
583
  };
508
584
  });
509
585
  }
586
+ /**
587
+ * Sets the height of the options list in the popup. By default, `listHeight` is 200px.
588
+ *
589
+ * > The `listHeight` property affects only the list of options and not the whole popup container.
590
+ * > To set the height of the popup container, use `popupSettings.height`.
591
+ *
592
+ * > When using `adaptiveMode` and the screen size is `small` or `medium` the `listHeight` property is set to null.
593
+ */
594
+ set listHeight(_listHeight) {
595
+ this._listHeight = _listHeight;
596
+ }
597
+ ;
598
+ get listHeight() {
599
+ if (this.isAdaptive) {
600
+ return;
601
+ }
602
+ return this._listHeight;
603
+ }
510
604
  /**
511
605
  * @hidden
512
606
  */
@@ -525,10 +619,10 @@ export class MultiSelectTreeComponent {
525
619
  return this._isFocused;
526
620
  }
527
621
  /**
528
- * Returns the current open state of the popup.
622
+ * Returns the current open state. Returns `true` if the popup or actionSheet is open.
529
623
  */
530
624
  get isOpen() {
531
- return isPresent(this.popupRef);
625
+ return isTruthy(isPresent(this.popupRef) || this.isActionSheetExpanded);
532
626
  }
533
627
  get width() {
534
628
  const wrapperWidth = this.wrapper.nativeElement.offsetWidth;
@@ -639,6 +733,23 @@ export class MultiSelectTreeComponent {
639
733
  get isCheckAllActive() {
640
734
  return this.checkAllInput && document.activeElement === this.checkAllInput.nativeElement;
641
735
  }
736
+ /**
737
+ * @hidden
738
+ */
739
+ onResize() {
740
+ if (this.isAdaptiveModeEnabled && this.windowSize !== windowSize()) {
741
+ if (this.isOpen) {
742
+ this.togglePopup(false);
743
+ }
744
+ this.windowSize = windowSize();
745
+ }
746
+ if (this.isOpen && !this.isActionSheetExpanded) {
747
+ const popupWrapper = this.popupRef.popupElement;
748
+ const { min, max } = this.width;
749
+ popupWrapper.style.minWidth = min;
750
+ popupWrapper.style.width = max;
751
+ }
752
+ }
642
753
  ngOnInit() {
643
754
  this.subs.add(this.printableCharacters.pipe(tap((char) => {
644
755
  this._typedValue += char;
@@ -657,10 +768,13 @@ export class MultiSelectTreeComponent {
657
768
  this.cdr.markForCheck();
658
769
  }));
659
770
  this.setComponentClasses();
771
+ this._initiallyCheckedItems = [...this.checkedItems];
660
772
  }
661
773
  ngAfterViewInit() {
774
+ this.windowSize = windowSize();
662
775
  this.subs.add(this.renderer.listen(this.wrapper.nativeElement, 'click', this.handleClick.bind(this)));
663
776
  this.subs.add(this.renderer.listen(this.wrapper.nativeElement, 'keydown', this.handleKeydown.bind(this)));
777
+ this.renderer.setAttribute(this.actionSheet?.element.nativeElement, 'style', '--kendo-actionsheet-height: 60vh; --kendo-actionsheet-max-height: none');
664
778
  }
665
779
  /**
666
780
  * @hidden
@@ -703,6 +817,23 @@ export class MultiSelectTreeComponent {
703
817
  ngAfterContentChecked() {
704
818
  this.verifySettings();
705
819
  }
820
+ /**
821
+ * @hidden
822
+ */
823
+ applyValue() {
824
+ this.value = this._tempValue;
825
+ this._initiallyCheckedItems = [...this.checkedItems];
826
+ this.emitValueChange(this.value);
827
+ this.setTags();
828
+ this.toggle(false);
829
+ }
830
+ /**
831
+ * @hidden
832
+ */
833
+ cancelValue() {
834
+ this.checkedItems = [...this._initiallyCheckedItems];
835
+ this.togglePopup(false);
836
+ }
706
837
  ngAfterContentInit() {
707
838
  this.isContentInit = true;
708
839
  // Still need to keep the call of 'registerLookupItems()' from ngAfterContentInit in the cases when the data is passed initially
@@ -759,7 +890,7 @@ export class MultiSelectTreeComponent {
759
890
  this.valueDepth = [];
760
891
  }
761
892
  /**
762
- * Toggles the visibility of the popup
893
+ * Toggles the visibility of the popup or actionSheet
763
894
  * ([see example]({% slug openstate_multiselecttree %})).
764
895
  * If you use the `toggle` method to open or close the popup, the `open` and `close` events will not be fired.
765
896
  *
@@ -804,19 +935,21 @@ export class MultiSelectTreeComponent {
804
935
  * @hidden
805
936
  */
806
937
  handleBlur(e) {
807
- const relatedTarget = e && e.relatedTarget;
808
- if (this.wrapper.nativeElement.contains(relatedTarget) ||
809
- (this.isOpen && this.popupRef.popupElement.contains(relatedTarget))) {
810
- return;
811
- }
812
- this.isFocused = false;
813
- this.togglePopup(false);
814
- if (hasObservers(this.onBlur) ||
815
- isUntouched(this.wrapper.nativeElement)) {
816
- this._zone.run(() => {
817
- this.onBlur.emit();
818
- this.onTouchedCallback();
819
- });
938
+ if (!this.isActionSheetExpanded) {
939
+ const relatedTarget = e && e.relatedTarget;
940
+ if (this.wrapper.nativeElement.contains(relatedTarget) ||
941
+ (this.isOpen && this.popupRef.popupElement.contains(relatedTarget))) {
942
+ return;
943
+ }
944
+ this.isFocused = false;
945
+ this.togglePopup(false);
946
+ if (hasObservers(this.onBlur) ||
947
+ isUntouched(this.wrapper.nativeElement)) {
948
+ this._zone.run(() => {
949
+ this.onBlur.emit();
950
+ this.onTouchedCallback();
951
+ });
952
+ }
820
953
  }
821
954
  }
822
955
  /**
@@ -1043,6 +1176,12 @@ export class MultiSelectTreeComponent {
1043
1176
  return eventArgs.isDefaultPrevented();
1044
1177
  }
1045
1178
  createPopup() {
1179
+ this.windowSize = windowSize();
1180
+ if (this.isAdaptive) {
1181
+ this.openActionSheet();
1182
+ this.cdr.detectChanges();
1183
+ return;
1184
+ }
1046
1185
  const horizontalAlign = this.direction === "rtl" ? "right" : "left";
1047
1186
  const anchorPosition = { horizontal: horizontalAlign, vertical: 'bottom' };
1048
1187
  const popupPosition = { horizontal: horizontalAlign, vertical: 'top' };
@@ -1076,6 +1215,9 @@ export class MultiSelectTreeComponent {
1076
1215
  });
1077
1216
  }
1078
1217
  destroyPopup() {
1218
+ if (this.isActionSheetExpanded) {
1219
+ this.closeActionSheet();
1220
+ }
1079
1221
  if (this.popupRef) {
1080
1222
  this.popupRef.close();
1081
1223
  this.popupRef = null;
@@ -1094,7 +1236,7 @@ export class MultiSelectTreeComponent {
1094
1236
  handleClick(e) {
1095
1237
  // The check is needed otherwise when appended to the component, the popup reopens on click
1096
1238
  // https://github.com/telerik/kendo-angular/issues/3738
1097
- if ((this.popupRef && this.popupRef.popupElement.contains(e.target))) {
1239
+ if ((this.popupRef && this.popupRef.popupElement.contains(e.target)) || this.isActionSheetExpanded) {
1098
1240
  return;
1099
1241
  }
1100
1242
  this.togglePopup(!this.isOpen);
@@ -1154,7 +1296,9 @@ export class MultiSelectTreeComponent {
1154
1296
  this.handleBlur(event);
1155
1297
  }
1156
1298
  handleTabKey() {
1157
- this.focus();
1299
+ if (!this.isActionSheetExpanded) {
1300
+ this.focus();
1301
+ }
1158
1302
  if (this.isOpen) {
1159
1303
  this.treeview.blur();
1160
1304
  this.removeTreeViewFromTabOrder();
@@ -1182,7 +1326,7 @@ export class MultiSelectTreeComponent {
1182
1326
  }
1183
1327
  else if (this.isCheckAllActive || isFirstNodeActive) {
1184
1328
  if (this.filterable) {
1185
- this.filterInput.nativeElement.focus();
1329
+ this.isActionSheetExpanded ? this.actionSheetSearchBar.focus() : this.filterInput.nativeElement.focus();
1186
1330
  }
1187
1331
  else {
1188
1332
  this.focus();
@@ -1275,7 +1419,9 @@ export class MultiSelectTreeComponent {
1275
1419
  }
1276
1420
  setState() {
1277
1421
  if (isPresent(this.dataItems) && isPresent(this.valueField)) {
1278
- this.setTags();
1422
+ if (!this.isActionSheetExpanded) {
1423
+ this.setTags();
1424
+ }
1279
1425
  this.checkedItems = this.dataItems.slice();
1280
1426
  }
1281
1427
  this.cdr.markForCheck();
@@ -1289,8 +1435,13 @@ export class MultiSelectTreeComponent {
1289
1435
  const newValue = this.valuePrimitive ?
1290
1436
  value.map(item => valueFrom(item, this.valueField)) :
1291
1437
  value.map(item => item.dataItem);
1292
- this.value = newValue;
1293
- this.emitValueChange(this.value);
1438
+ if (this.isActionSheetExpanded) {
1439
+ this._tempValue = newValue.slice();
1440
+ }
1441
+ else {
1442
+ this.value = newValue;
1443
+ this.emitValueChange(this.value);
1444
+ }
1294
1445
  }
1295
1446
  /**
1296
1447
  * @hidden
@@ -1300,6 +1451,9 @@ export class MultiSelectTreeComponent {
1300
1451
  if (this.popupRef) {
1301
1452
  this._searchableNodes = getSearchableItems(this.treeViewId, this.popupRef.popupElement);
1302
1453
  }
1454
+ if (this.isActionSheetExpanded) {
1455
+ this._searchableNodes = getSearchableItems(this.treeViewId, this.actionSheet.element.nativeElement);
1456
+ }
1303
1457
  });
1304
1458
  }
1305
1459
  /**
@@ -1364,9 +1518,28 @@ export class MultiSelectTreeComponent {
1364
1518
  });
1365
1519
  }
1366
1520
  }
1521
+ closeActionSheet() {
1522
+ this.wrapper.nativeElement.focus();
1523
+ this.actionSheet.toggle(false);
1524
+ if (this.filterable) {
1525
+ this.actionSheetSearchBar.value = '';
1526
+ this.filterChange.emit('');
1527
+ }
1528
+ this.closed.emit();
1529
+ }
1530
+ openActionSheet() {
1531
+ this.windowSize = windowSize();
1532
+ this.actionSheet.toggle(true);
1533
+ this.title = setActionSheetTitle(this.wrapper, this.title);
1534
+ this.cdr.detectChanges();
1535
+ updateActionSheetAdaptiveAppearance(this.actionSheet, this.windowSize, this.renderer);
1536
+ this.cdr.detectChanges();
1537
+ this.opened.emit();
1538
+ this.filterable && this.actionSheetSearchBar.focus();
1539
+ }
1367
1540
  }
1368
1541
  MultiSelectTreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: MultiSelectTreeComponent, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: i1.PopupService }, { token: i0.Renderer2 }, { token: i2.NavigationService }, { token: i0.NgZone }, { token: i3.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i4.MultiSelectTreeLookupService }, { token: TOUCH_ENABLED, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1369
- MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: MultiSelectTreeComponent, selector: "kendo-multiselecttree", inputs: { tabindex: "tabindex", size: "size", rounded: "rounded", fillMode: "fillMode", popupSettings: "popupSettings", checkableSettings: "checkableSettings", data: "data", value: "value", dataItems: "dataItems", textField: "textField", valueField: "valueField", valueDepth: "valueDepth", loading: "loading", placeholder: "placeholder", listHeight: "listHeight", disabled: "disabled", readonly: "readonly", valuePrimitive: "valuePrimitive", loadOnDemand: "loadOnDemand", focusableId: "focusableId", clearButton: "clearButton", filterable: "filterable", checkAll: "checkAll", hasChildren: "hasChildren", fetchChildren: "fetchChildren", isNodeExpanded: "isNodeExpanded", isNodeVisible: "isNodeVisible", itemDisabled: "itemDisabled", tagMapper: "tagMapper" }, outputs: { onFocus: "focus", onBlur: "blur", open: "open", opened: "opened", close: "close", closed: "closed", nodeExpand: "nodeExpand", nodeCollapse: "nodeCollapse", valueChange: "valueChange", removeTag: "removeTag", filterChange: "filterChange" }, host: { properties: { "class.k-multiselect-tree": "this.hostClasses", "class.k-input": "this.hostClasses", "class.k-disabled": "this.isDisabled", "attr.aria-disabled": "this.isDisabled", "attr.aria-controls": "this.hostAriaControls", "attr.aria-autocomplete": "this.hostAriaAutocomplete", "class.k-loading": "this.isLoading", "attr.aria-invalid": "this.hostAriaInvalid", "attr.aria-busy": "this.isBusy", "attr.id": "this.id", "attr.dir": "this.direction", "attr.tabindex": "this.hostTabIndex", "attr.role": "this.role", "attr.aria-expanded": "this.isAriaExpanded", "attr.aria-haspopup": "this.ariaHasPopup", "attr.readonly": "this.isReadonly", "attr.aria-describedby": "this.ariaDescribedBy", "attr.aria-activedescendant": "this.ariaActiveDescendant" } }, providers: [
1542
+ MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: MultiSelectTreeComponent, selector: "kendo-multiselecttree", inputs: { adaptiveMode: "adaptiveMode", title: "title", subtitle: "subtitle", tabindex: "tabindex", size: "size", rounded: "rounded", fillMode: "fillMode", popupSettings: "popupSettings", checkableSettings: "checkableSettings", data: "data", value: "value", dataItems: "dataItems", textField: "textField", valueField: "valueField", valueDepth: "valueDepth", loading: "loading", placeholder: "placeholder", listHeight: "listHeight", disabled: "disabled", readonly: "readonly", valuePrimitive: "valuePrimitive", loadOnDemand: "loadOnDemand", focusableId: "focusableId", clearButton: "clearButton", filterable: "filterable", checkAll: "checkAll", hasChildren: "hasChildren", fetchChildren: "fetchChildren", isNodeExpanded: "isNodeExpanded", isNodeVisible: "isNodeVisible", itemDisabled: "itemDisabled", tagMapper: "tagMapper" }, outputs: { onFocus: "focus", onBlur: "blur", open: "open", opened: "opened", close: "close", closed: "closed", nodeExpand: "nodeExpand", nodeCollapse: "nodeCollapse", valueChange: "valueChange", removeTag: "removeTag", filterChange: "filterChange" }, host: { properties: { "class.k-multiselect-tree": "this.hostClasses", "class.k-input": "this.hostClasses", "class.k-disabled": "this.isDisabled", "attr.aria-disabled": "this.isDisabled", "attr.aria-controls": "this.hostAriaControls", "attr.aria-autocomplete": "this.hostAriaAutocomplete", "class.k-loading": "this.isLoading", "attr.aria-invalid": "this.hostAriaInvalid", "attr.aria-busy": "this.isBusy", "attr.id": "this.id", "attr.dir": "this.direction", "attr.tabindex": "this.hostTabIndex", "attr.role": "this.role", "attr.aria-expanded": "this.isAriaExpanded", "attr.aria-haspopup": "this.ariaHasPopup", "attr.readonly": "this.isReadonly", "attr.aria-describedby": "this.ariaDescribedBy", "attr.aria-activedescendant": "this.ariaActiveDescendant" } }, providers: [
1370
1543
  LocalizationService,
1371
1544
  NavigationService,
1372
1545
  DataService,
@@ -1394,7 +1567,7 @@ MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
1394
1567
  provide: KendoInput,
1395
1568
  useExisting: forwardRef(() => MultiSelectTreeComponent)
1396
1569
  }
1397
- ], queries: [{ propertyName: "headerTemplate", first: true, predicate: HeaderTemplateDirective, descendants: true }, { propertyName: "footerTemplate", first: true, predicate: FooterTemplateDirective, descendants: true }, { propertyName: "nodeTemplate", first: true, predicate: NodeTemplateDirective, descendants: true }, { propertyName: "noDataTemplate", first: true, predicate: NoDataTemplateDirective, descendants: true }, { propertyName: "tagTemplate", first: true, predicate: TagTemplateDirective, descendants: true }, { propertyName: "groupTagTemplate", first: true, predicate: GroupTagTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "treeview", first: true, predicate: ["treeview"], descendants: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }, { propertyName: "checkAllInput", first: true, predicate: ["checkAllInput"], descendants: true }], exportAs: ["kendoMultiSelectTree"], usesOnChanges: true, ngImport: i0, template: `
1570
+ ], queries: [{ propertyName: "headerTemplate", first: true, predicate: HeaderTemplateDirective, descendants: true }, { propertyName: "footerTemplate", first: true, predicate: FooterTemplateDirective, descendants: true }, { propertyName: "nodeTemplate", first: true, predicate: NodeTemplateDirective, descendants: true }, { propertyName: "noDataTemplate", first: true, predicate: NoDataTemplateDirective, descendants: true }, { propertyName: "tagTemplate", first: true, predicate: TagTemplateDirective, descendants: true }, { propertyName: "groupTagTemplate", first: true, predicate: GroupTagTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "responsiveRendererComponent", first: true, predicate: ResponsiveRendererComponent, descendants: true }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "treeview", first: true, predicate: ["treeview"], descendants: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }, { propertyName: "checkAllInput", first: true, predicate: ["checkAllInput"], descendants: true }], exportAs: ["kendoMultiSelectTree"], usesOnChanges: true, ngImport: i0, template: `
1398
1571
  <ng-container kendoMultiSelectTreeLocalizedMessages
1399
1572
  i18n-noDataText="kendo.multiselecttree.noDataText|The text displayed in the popup when there are no items"
1400
1573
  noDataText="NO DATA FOUND"
@@ -1410,6 +1583,12 @@ MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
1410
1583
 
1411
1584
  i18n-popupLabel="kendo.multiselecttree.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
1412
1585
  popupLabel="Options list"
1586
+
1587
+ i18n-applyButton="kendo.multiselecttree.applyButton|The text of the Apply button in the action sheet"
1588
+ applyButton="Apply"
1589
+
1590
+ i18n-cancelButton="kendo.multiselecttree.cancelButton|The text of the Cancel button in the action sheet"
1591
+ cancelButton="Cancel"
1413
1592
  >
1414
1593
  </ng-container>
1415
1594
  <kendo-taglist
@@ -1456,10 +1635,30 @@ MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
1456
1635
  >
1457
1636
  </span>
1458
1637
  <ng-template #popupTemplate>
1638
+ <ng-container *ngTemplateOutlet="sharedPopupActionSheetTemplate"></ng-container>
1639
+ </ng-template>
1640
+ <ng-container #container></ng-container>
1641
+ <!--adaptive rendering-->
1642
+ <responsive-renderer
1643
+ [sharedPopupActionSheetTemplate]="sharedPopupActionSheetTemplate"
1644
+ [isActionSheetExpanded]="isActionSheetExpanded"
1645
+ [title]="title"
1646
+ [showTextInput]="filterable"
1647
+ [showActionButtons]="true"
1648
+ [subtitle]="subtitle"
1649
+ (closePopup)="togglePopup(false)"
1650
+ (onExpand)="onExpand()"
1651
+ (onCollapse)="onCollapse()"
1652
+ (textInputChange)="onFilterChange($event)"
1653
+ (onApply)="applyValue()"
1654
+ (onCancel)="cancelValue()"
1655
+ >
1656
+ </responsive-renderer>
1657
+ <ng-template #sharedPopupActionSheetTemplate>
1459
1658
  <span
1460
- *ngIf="filterable"
1659
+ *ngIf="filterable && !isActionSheetExpanded"
1461
1660
  class="k-list-filter"
1462
- >
1661
+ >
1463
1662
  <span
1464
1663
  class="k-textbox k-input"
1465
1664
  [ngClass]="filterInputClasses"
@@ -1477,7 +1676,7 @@ MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
1477
1676
  (input)="handleFilterInputChange($event.target)"
1478
1677
  [filterInput]="filterable && !touchEnabled"
1479
1678
  [attr.aria-label]="messageFor('filterInputLabel')"
1480
- (keydown)="handleKeydown($event)"
1679
+ (keydown)="handleKeydown($event, filterInput)"
1481
1680
  [(ngModel)]="filter"
1482
1681
  class="k-input-inner"
1483
1682
  role="textbox"
@@ -1499,7 +1698,7 @@ MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
1499
1698
  [templateContext]="{
1500
1699
  templateRef: headerTemplate?.templateRef
1501
1700
  }">
1502
- </ng-template>
1701
+ </ng-template>
1503
1702
  <div *ngIf="checkAll" class="k-check-all">
1504
1703
  <input
1505
1704
  #checkAllInput
@@ -1582,8 +1781,9 @@ MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
1582
1781
  </ng-template>
1583
1782
  </div>
1584
1783
  </ng-template>
1585
- <ng-container #container></ng-container>
1586
- `, isInline: true, components: [{ type: i5.TagListComponent, selector: "kendo-taglist", inputs: ["tags", "textField", "valueField", "valueDepth", "focused", "template", "groupTemplate", "disabled", "tagPrefix", "id", "size", "rounded", "fillMode", "disabledIndices"], outputs: ["removeTag"] }, { type: i6.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: i7.TreeViewComponent, selector: "kendo-treeview", inputs: ["filterInputPlaceholder", "expandDisabledNodes", "animate", "nodeTemplate", "loadMoreButtonTemplate", "trackBy", "nodes", "textField", "hasChildren", "isChecked", "isDisabled", "isExpanded", "isSelected", "isVisible", "navigable", "children", "loadOnDemand", "filterable", "filter", "size", "disableParentNodesOnly"], outputs: ["childrenLoaded", "blur", "focus", "expand", "collapse", "nodeDragStart", "nodeDrag", "filterStateChange", "nodeDrop", "nodeDragEnd", "addItem", "removeItem", "checkedChange", "selectionChange", "filterChange", "nodeClick", "nodeDblClick"], exportAs: ["kendoTreeView"] }], directives: [{ type: i8.LocalizedMessagesDirective, selector: "\n [kendoDropDownListLocalizedMessages],\n [kendoDropDownTreeLocalizedMessages],\n [kendoComboBoxLocalizedMessages],\n [kendoMultiColumnComboBoxLocalizedMessages],\n [kendoAutoCompleteLocalizedMessages],\n [kendoMultiSelectLocalizedMessages],\n [kendoMultiSelectTreeLocalizedMessages]\n " }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i11.FilterInputDirective, selector: "[filterInput]", inputs: ["filterInput"] }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i12.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i13.TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i14.CheckAllDirective, selector: "[checkAll]", inputs: ["lastAction", "treeview", "checkedItems", "valueField", "checkAll"], outputs: ["checkedItemsChange"] }, { type: i15.CheckDirective, selector: "[kendoMultiSelectTreeCheckable]", inputs: ["checkable", "valueField", "checkedItems"], outputs: ["checkedItemsChange"] }] });
1784
+
1785
+ <kendo-resize-sensor *ngIf="isOpen || isAdaptiveModeEnabled" (resize)="onResize()"></kendo-resize-sensor>
1786
+ `, isInline: true, components: [{ type: i5.TagListComponent, selector: "kendo-taglist", inputs: ["tags", "textField", "valueField", "valueDepth", "focused", "template", "groupTemplate", "disabled", "tagPrefix", "id", "size", "rounded", "fillMode", "disabledIndices"], outputs: ["removeTag"] }, { type: i6.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: i7.ResponsiveRendererComponent, selector: "responsive-renderer", inputs: ["title", "showActionButtons", "subtitle", "size", "showTextInput", "sharedPopupActionSheetTemplate", "isActionSheetExpanded", "text", "placeholder"], outputs: ["closePopup", "textInputChange", "navigate", "onExpand", "onCollapse", "onApply", "onCancel"] }, { type: i8.TreeViewComponent, selector: "kendo-treeview", inputs: ["filterInputPlaceholder", "expandDisabledNodes", "animate", "nodeTemplate", "loadMoreButtonTemplate", "trackBy", "nodes", "textField", "hasChildren", "isChecked", "isDisabled", "isExpanded", "isSelected", "isVisible", "navigable", "children", "loadOnDemand", "filterable", "filter", "size", "disableParentNodesOnly"], outputs: ["childrenLoaded", "blur", "focus", "expand", "collapse", "nodeDragStart", "nodeDrag", "filterStateChange", "nodeDrop", "nodeDragEnd", "addItem", "removeItem", "checkedChange", "selectionChange", "filterChange", "nodeClick", "nodeDblClick"], exportAs: ["kendoTreeView"] }, { type: i9.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: i10.LocalizedMessagesDirective, selector: "\n [kendoDropDownListLocalizedMessages],\n [kendoDropDownTreeLocalizedMessages],\n [kendoComboBoxLocalizedMessages],\n [kendoMultiColumnComboBoxLocalizedMessages],\n [kendoAutoCompleteLocalizedMessages],\n [kendoMultiSelectLocalizedMessages],\n [kendoMultiSelectTreeLocalizedMessages]\n " }, { type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i13.FilterInputDirective, selector: "[filterInput]", inputs: ["filterInput"] }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i9.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i14.TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i15.CheckAllDirective, selector: "[checkAll]", inputs: ["lastAction", "treeview", "checkedItems", "valueField", "checkAll"], outputs: ["checkedItemsChange"] }, { type: i16.CheckDirective, selector: "[kendoMultiSelectTreeCheckable]", inputs: ["checkable", "valueField", "checkedItems"], outputs: ["checkedItemsChange"] }] });
1587
1787
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: MultiSelectTreeComponent, decorators: [{
1588
1788
  type: Component,
1589
1789
  args: [{
@@ -1634,6 +1834,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
1634
1834
 
1635
1835
  i18n-popupLabel="kendo.multiselecttree.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
1636
1836
  popupLabel="Options list"
1837
+
1838
+ i18n-applyButton="kendo.multiselecttree.applyButton|The text of the Apply button in the action sheet"
1839
+ applyButton="Apply"
1840
+
1841
+ i18n-cancelButton="kendo.multiselecttree.cancelButton|The text of the Cancel button in the action sheet"
1842
+ cancelButton="Cancel"
1637
1843
  >
1638
1844
  </ng-container>
1639
1845
  <kendo-taglist
@@ -1680,10 +1886,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
1680
1886
  >
1681
1887
  </span>
1682
1888
  <ng-template #popupTemplate>
1889
+ <ng-container *ngTemplateOutlet="sharedPopupActionSheetTemplate"></ng-container>
1890
+ </ng-template>
1891
+ <ng-container #container></ng-container>
1892
+ <!--adaptive rendering-->
1893
+ <responsive-renderer
1894
+ [sharedPopupActionSheetTemplate]="sharedPopupActionSheetTemplate"
1895
+ [isActionSheetExpanded]="isActionSheetExpanded"
1896
+ [title]="title"
1897
+ [showTextInput]="filterable"
1898
+ [showActionButtons]="true"
1899
+ [subtitle]="subtitle"
1900
+ (closePopup)="togglePopup(false)"
1901
+ (onExpand)="onExpand()"
1902
+ (onCollapse)="onCollapse()"
1903
+ (textInputChange)="onFilterChange($event)"
1904
+ (onApply)="applyValue()"
1905
+ (onCancel)="cancelValue()"
1906
+ >
1907
+ </responsive-renderer>
1908
+ <ng-template #sharedPopupActionSheetTemplate>
1683
1909
  <span
1684
- *ngIf="filterable"
1910
+ *ngIf="filterable && !isActionSheetExpanded"
1685
1911
  class="k-list-filter"
1686
- >
1912
+ >
1687
1913
  <span
1688
1914
  class="k-textbox k-input"
1689
1915
  [ngClass]="filterInputClasses"
@@ -1701,7 +1927,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
1701
1927
  (input)="handleFilterInputChange($event.target)"
1702
1928
  [filterInput]="filterable && !touchEnabled"
1703
1929
  [attr.aria-label]="messageFor('filterInputLabel')"
1704
- (keydown)="handleKeydown($event)"
1930
+ (keydown)="handleKeydown($event, filterInput)"
1705
1931
  [(ngModel)]="filter"
1706
1932
  class="k-input-inner"
1707
1933
  role="textbox"
@@ -1723,7 +1949,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
1723
1949
  [templateContext]="{
1724
1950
  templateRef: headerTemplate?.templateRef
1725
1951
  }">
1726
- </ng-template>
1952
+ </ng-template>
1727
1953
  <div *ngIf="checkAll" class="k-check-all">
1728
1954
  <input
1729
1955
  #checkAllInput
@@ -1806,7 +2032,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
1806
2032
  </ng-template>
1807
2033
  </div>
1808
2034
  </ng-template>
1809
- <ng-container #container></ng-container>
2035
+
2036
+ <kendo-resize-sensor *ngIf="isOpen || isAdaptiveModeEnabled" (resize)="onResize()"></kendo-resize-sensor>
1810
2037
  `
1811
2038
  }]
1812
2039
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i1.PopupService }, { type: i0.Renderer2 }, { type: i2.NavigationService }, { type: i0.NgZone }, { type: i3.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i4.MultiSelectTreeLookupService }, { type: undefined, decorators: [{
@@ -1868,6 +2095,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
1868
2095
  }], ariaActiveDescendant: [{
1869
2096
  type: HostBinding,
1870
2097
  args: ['attr.aria-activedescendant']
2098
+ }], adaptiveMode: [{
2099
+ type: Input
2100
+ }], title: [{
2101
+ type: Input
2102
+ }], subtitle: [{
2103
+ type: Input
2104
+ }], responsiveRendererComponent: [{
2105
+ type: ViewChild,
2106
+ args: [ResponsiveRendererComponent]
1871
2107
  }], headerTemplate: [{
1872
2108
  type: ContentChild,
1873
2109
  args: [HeaderTemplateDirective, { static: false }]
package/esm2020/index.mjs CHANGED
@@ -51,6 +51,7 @@ export { ComboBoxModule } from './comboboxes/combobox.module';
51
51
  export { DropDownListModule } from './dropdownlist/dropdownlist.module';
52
52
  export { SharedDirectivesModule } from './common/shared-directives.module';
53
53
  export { ListComponent } from './common/list.component';
54
+ export { ResponsiveRendererComponent } from './common/action-sheet.component';
54
55
  /**
55
56
  * @hidden
56
57
  * TODO: See if the export could be removed (AOT should pass)