@progress/kendo-angular-dropdowns 7.2.2 → 7.2.3

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.
@@ -2,14 +2,15 @@
2
2
  * Copyright © 2021 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { Renderer2, EventEmitter, ElementRef, OnChanges, OnInit, OnDestroy, Injector, AfterContentChecked } from '@angular/core';
5
+ import { Renderer2, EventEmitter, ElementRef, OnChanges, OnInit, OnDestroy, Injector } from '@angular/core';
6
6
  import { Direction } from './models/direction';
7
7
  import { LocalizationService } from '@progress/kendo-angular-l10n';
8
+ import { FormControl } from '@angular/forms';
8
9
  import * as i0 from "@angular/core";
9
10
  /**
10
11
  * @hidden
11
12
  */
12
- export declare class SearchBarComponent implements OnChanges, OnInit, OnDestroy, AfterContentChecked {
13
+ export declare class SearchBarComponent implements OnChanges, OnInit, OnDestroy {
13
14
  private localization;
14
15
  private injector;
15
16
  direction: Direction;
@@ -29,6 +30,10 @@ export declare class SearchBarComponent implements OnChanges, OnInit, OnDestroy,
29
30
  get isFilterable(): boolean;
30
31
  get userInput(): string;
31
32
  set userInput(userInput: string);
33
+ /**
34
+ * @hidden
35
+ */
36
+ get formControl(): FormControl;
32
37
  suggestedText: string;
33
38
  valueChange: EventEmitter<any>;
34
39
  onBlur: EventEmitter<any>;
@@ -46,17 +51,14 @@ export declare class SearchBarComponent implements OnChanges, OnInit, OnDestroy,
46
51
  private _placeholder;
47
52
  private _isSuggestable;
48
53
  private _isFilterable;
49
- private control;
50
54
  private renderer;
51
55
  private subs;
52
56
  constructor(localization: LocalizationService, renderer: Renderer2, injector: Injector);
53
57
  ngOnInit(): void;
54
- ngAfterContentChecked(): void;
55
58
  ngOnChanges(changes: any): void;
56
59
  ngOnDestroy(): void;
57
60
  private writeInputValue;
58
61
  private setInputSelection;
59
- private setAriaInvalid;
60
62
  private setAriaAutocomplete;
61
63
  handleInput(event: any): void;
62
64
  handleFocus(event: any): void;
@@ -9,7 +9,7 @@ import * as i3 from "./dropdownlist/dropdownlist.module";
9
9
  import * as i4 from "./multiselect/multiselect.module";
10
10
  import * as i5 from "./dropdowntrees/dropdowntrees.module";
11
11
  /**
12
- * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})
12
+ * Represents the [NgModule](link:site.data.urls.angular['ngmoduleapi'])
13
13
  * definition for the Dropdowns components.
14
14
  *
15
15
  * @example
@@ -2,10 +2,10 @@
2
2
  * Copyright © 2021 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { OnInit, OnDestroy, ElementRef, EventEmitter, NgZone, Renderer2, TemplateRef, ChangeDetectorRef, SimpleChanges, OnChanges, ViewContainerRef, AfterContentChecked } from '@angular/core';
5
+ import { OnInit, OnDestroy, ElementRef, EventEmitter, NgZone, Renderer2, TemplateRef, ChangeDetectorRef, SimpleChanges, OnChanges, ViewContainerRef, AfterContentChecked, Injector } from '@angular/core';
6
6
  import { PopupRef, PopupService } from '@progress/kendo-angular-popup';
7
7
  import { TreeItem, TreeViewComponent, DataBoundComponent, ExpandableComponent } from '@progress/kendo-angular-treeview';
8
- import { ControlValueAccessor } from '@angular/forms';
8
+ import { ControlValueAccessor, FormControl } from '@angular/forms';
9
9
  import { NavigationService } from '../common/navigation/navigation.service';
10
10
  import { LocalizationService } from '@progress/kendo-angular-l10n';
11
11
  import { PreventableEvent } from '../common/models/preventable-event';
@@ -25,6 +25,7 @@ import * as i0 from "@angular/core";
25
25
  * Represents the [Kendo UI DropDownTree component for Angular]({% slug overview_ddt %}).
26
26
  */
27
27
  export declare class DropDownTreeComponent implements OnInit, OnDestroy, OnChanges, AfterContentChecked, ControlValueAccessor, DataBoundComponent, ExpandableComponent {
28
+ private injector;
28
29
  wrapper: ElementRef<HTMLElement>;
29
30
  private popupService;
30
31
  private navigationService;
@@ -34,15 +35,20 @@ export declare class DropDownTreeComponent implements OnInit, OnDestroy, OnChang
34
35
  private localization;
35
36
  touchEnabled: boolean;
36
37
  hostClasses: boolean;
38
+ get hostAriaInvalid(): string;
37
39
  get isDisabled(): boolean;
40
+ get isDisabledAttribute(): string;
38
41
  get isLoading(): boolean;
42
+ get isBusy(): string;
43
+ get hostAriaControls(): string;
39
44
  get id(): string;
40
45
  direction: Direction;
41
46
  get hostTabIndex(): number;
42
47
  role: string;
43
48
  ariaHasPopup: string;
44
49
  get isAriaExpanded(): boolean;
45
- get isReadonly(): boolean;
50
+ get hostAriaAutocomplete(): string;
51
+ get isReadonly(): string;
46
52
  /**
47
53
  * @hidden
48
54
  */
@@ -365,6 +371,10 @@ export declare class DropDownTreeComponent implements OnInit, OnDestroy, OnChang
365
371
  * Used to associate the value label with the wrapper via aria-describedby.
366
372
  */
367
373
  valueLabelId: string;
374
+ /**
375
+ * @hidden
376
+ */
377
+ get formControl(): FormControl;
368
378
  private _nodes;
369
379
  private _value;
370
380
  private _popupSettings;
@@ -372,12 +382,13 @@ export declare class DropDownTreeComponent implements OnInit, OnDestroy, OnChang
372
382
  private _isFocused;
373
383
  private _dataItem;
374
384
  private _treeview;
385
+ private _popupId;
375
386
  private _size;
376
387
  private _rounded;
377
388
  private _fillMode;
378
389
  private subscriptions;
379
390
  private touchstartDisposeHandler;
380
- constructor(wrapper: ElementRef<HTMLElement>, popupService: PopupService, navigationService: NavigationService, renderer: Renderer2, _zone: NgZone, cdr: ChangeDetectorRef, localization: LocalizationService, touchEnabled: boolean);
391
+ constructor(injector: Injector, wrapper: ElementRef<HTMLElement>, popupService: PopupService, navigationService: NavigationService, renderer: Renderer2, _zone: NgZone, cdr: ChangeDetectorRef, localization: LocalizationService, touchEnabled: boolean);
381
392
  ngOnInit(): void;
382
393
  /**
383
394
  * @hidden
@@ -518,6 +529,6 @@ export declare class DropDownTreeComponent implements OnInit, OnDestroy, OnChang
518
529
  private handleDocumentBlur;
519
530
  private assignAriaDescribedBy;
520
531
  private setComponentClasses;
521
- static ɵfac: i0.ɵɵFactoryDeclaration<DropDownTreeComponent, [null, null, null, null, null, null, null, { optional: true; }]>;
532
+ static ɵfac: i0.ɵɵFactoryDeclaration<DropDownTreeComponent, [null, null, null, null, null, null, null, null, { optional: true; }]>;
522
533
  static ɵcmp: i0.ɵɵComponentDeclaration<DropDownTreeComponent, "kendo-dropdowntree", ["kendoDropDownTree"], { "loading": "loading"; "clearButton": "clearButton"; "data": "data"; "value": "value"; "textField": "textField"; "valueField": "valueField"; "valueDepth": "valueDepth"; "hasChildren": "hasChildren"; "fetchChildren": "fetchChildren"; "placeholder": "placeholder"; "popupSettings": "popupSettings"; "dataItem": "dataItem"; "listHeight": "listHeight"; "disabled": "disabled"; "readonly": "readonly"; "valuePrimitive": "valuePrimitive"; "tabindex": "tabindex"; "size": "size"; "rounded": "rounded"; "fillMode": "fillMode"; "itemDisabled": "itemDisabled"; "isNodeExpanded": "isNodeExpanded"; "isNodeVisible": "isNodeVisible"; "loadOnDemand": "loadOnDemand"; "filterable": "filterable"; "filter": "filter"; "focusableId": "focusableId"; }, { "open": "open"; "opened": "opened"; "close": "close"; "closed": "closed"; "nodeExpand": "nodeExpand"; "nodeCollapse": "nodeCollapse"; "onFocus": "focus"; "onBlur": "blur"; "valueChange": "valueChange"; "filterChange": "filterChange"; }, ["noDataTemplate", "headerTemplate", "footerTemplate", "nodeTemplate", "valueTemplate"], never>;
523
534
  }
@@ -2,8 +2,8 @@
2
2
  * Copyright © 2021 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { AfterContentChecked, ChangeDetectorRef, ElementRef, EventEmitter, NgZone, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core';
6
- import { ControlValueAccessor } from '@angular/forms';
5
+ import { AfterContentChecked, ChangeDetectorRef, ElementRef, EventEmitter, Injector, NgZone, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core';
6
+ import { ControlValueAccessor, FormControl } from '@angular/forms';
7
7
  import { LocalizationService } from '@progress/kendo-angular-l10n';
8
8
  import { NavigationService } from '../common/navigation/navigation.service';
9
9
  import { PopupRef, PopupService } from '@progress/kendo-angular-popup';
@@ -30,6 +30,7 @@ import * as i0 from "@angular/core";
30
30
  * Represents the [Kendo UI MultiSelectTree component for Angular]({% slug overview_multiselecttree %}).
31
31
  */
32
32
  export declare class MultiSelectTreeComponent implements OnInit, OnDestroy, OnChanges, AfterContentChecked, DataBoundComponent, ExpandableComponent, ControlValueAccessor {
33
+ private injector;
33
34
  wrapper: ElementRef;
34
35
  private popupService;
35
36
  private renderer;
@@ -41,16 +42,24 @@ export declare class MultiSelectTreeComponent implements OnInit, OnDestroy, OnCh
41
42
  touchEnabled: boolean;
42
43
  hostClasses: boolean;
43
44
  get isDisabled(): boolean;
45
+ get hostAriaControls(): string;
46
+ get hostAriaAutocomplete(): string;
44
47
  get isLoading(): boolean;
48
+ get hostAriaInvalid(): string;
49
+ get isBusy(): string;
45
50
  get id(): string;
46
51
  direction: Direction;
47
52
  get hostTabIndex(): number;
48
53
  role: string;
49
54
  get isAriaExpanded(): boolean;
50
55
  ariaHasPopup: string;
51
- get isReadonly(): boolean;
56
+ get isReadonly(): string;
52
57
  get ariaDescribedBy(): string;
53
58
  get ariaActiveDescendant(): string;
59
+ /**
60
+ * @hidden
61
+ */
62
+ get formControl(): FormControl;
54
63
  /**
55
64
  * @hidden
56
65
  */
@@ -424,13 +433,14 @@ export declare class MultiSelectTreeComponent implements OnInit, OnDestroy, OnCh
424
433
  private _isFocused;
425
434
  private _treeview;
426
435
  private _dataItems;
436
+ private _popupId;
427
437
  private _size;
428
438
  private _rounded;
429
439
  private _fillMode;
430
440
  private subscriptions;
431
441
  private lastNodeOnFocus;
432
442
  private isContentInit;
433
- constructor(wrapper: ElementRef, popupService: PopupService, renderer: Renderer2, navigationService: NavigationService, _zone: NgZone, localization: LocalizationService, cdr: ChangeDetectorRef, lookup: MultiSelectTreeLookupService, touchEnabled: boolean);
443
+ constructor(injector: Injector, wrapper: ElementRef, popupService: PopupService, renderer: Renderer2, navigationService: NavigationService, _zone: NgZone, localization: LocalizationService, cdr: ChangeDetectorRef, lookup: MultiSelectTreeLookupService, touchEnabled: boolean);
434
444
  ngOnInit(): void;
435
445
  /**
436
446
  * @hidden
@@ -595,6 +605,6 @@ export declare class MultiSelectTreeComponent implements OnInit, OnDestroy, OnCh
595
605
  */
596
606
  private registerLookupItems;
597
607
  private registerChildLookupItems;
598
- static ɵfac: i0.ɵɵFactoryDeclaration<MultiSelectTreeComponent, [null, null, null, null, null, null, null, null, { optional: true; }]>;
608
+ static ɵfac: i0.ɵɵFactoryDeclaration<MultiSelectTreeComponent, [null, null, null, null, null, null, null, null, null, { optional: true; }]>;
599
609
  static ɵcmp: i0.ɵɵComponentDeclaration<MultiSelectTreeComponent, "kendo-multiselecttree", ["kendoMultiSelectTree"], { "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"; }, { "onFocus": "focus"; "onBlur": "blur"; "open": "open"; "opened": "opened"; "close": "close"; "closed": "closed"; "nodeExpand": "nodeExpand"; "nodeCollapse": "nodeCollapse"; "valueChange": "valueChange"; "removeTag": "removeTag"; "filterChange": "filterChange"; }, ["headerTemplate", "footerTemplate", "nodeTemplate", "noDataTemplate", "tagTemplate", "groupTagTemplate"], never>;
600
610
  }
@@ -57,6 +57,13 @@ export class SearchBarComponent {
57
57
  set userInput(userInput) {
58
58
  this._userInput = userInput || "";
59
59
  }
60
+ /**
61
+ * @hidden
62
+ */
63
+ get formControl() {
64
+ const ngControl = this.injector.get(NgControl, null);
65
+ return (ngControl === null || ngControl === void 0 ? void 0 : ngControl.control) || null;
66
+ }
60
67
  get value() {
61
68
  return this.input.nativeElement.value;
62
69
  }
@@ -74,17 +81,6 @@ export class SearchBarComponent {
74
81
  this.subs.add(this.localization
75
82
  .changes.subscribe(({ rtl }) => this.direction = rtl ? 'rtl' : 'ltr'));
76
83
  }
77
- ngAfterContentChecked() {
78
- var _a;
79
- const formControl = (_a = this.injector.get(NgControl, null)) === null || _a === void 0 ? void 0 : _a.control;
80
- this.control = formControl;
81
- if (formControl) {
82
- this.subs.add(formControl.valueChanges.subscribe(() => {
83
- this.control = formControl;
84
- }));
85
- }
86
- this.setAriaInvalid();
87
- }
88
84
  ngOnChanges(changes) {
89
85
  let previousUserInput;
90
86
  if (this.input && (changes.userInput || changes.suggestedText)) {
@@ -135,19 +131,6 @@ export class SearchBarComponent {
135
131
  }
136
132
  }
137
133
  }
138
- setAriaInvalid() {
139
- if (this.control) {
140
- if (this.control.invalid) {
141
- this.renderer.setAttribute(this.input.nativeElement, 'aria-invalid', 'true');
142
- }
143
- else {
144
- this.renderer.setAttribute(this.input.nativeElement, 'aria-invalid', 'false');
145
- }
146
- }
147
- else {
148
- this.renderer.removeAttribute(this.input.nativeElement, 'aria-invalid');
149
- }
150
- }
151
134
  setAriaAutocomplete() {
152
135
  if (this.isFilterable) {
153
136
  this.renderer.setAttribute(this.input.nativeElement, 'aria-autocomplete', 'list');
@@ -229,6 +212,7 @@ SearchBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
229
212
  [attr.aria-describedby]="tagListId"
230
213
  [attr.aria-activedescendant]="activeDescendant"
231
214
  [attr.aria-busy]="isLoading"
215
+ [attr.aria-invalid]="formControl?.invalid"
232
216
  />
233
217
  `, isInline: true, directives: [{ type: i2.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }] });
234
218
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SearchBarComponent, decorators: [{
@@ -259,6 +243,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
259
243
  [attr.aria-describedby]="tagListId"
260
244
  [attr.aria-activedescendant]="activeDescendant"
261
245
  [attr.aria-busy]="isLoading"
246
+ [attr.aria-invalid]="formControl?.invalid"
262
247
  />
263
248
  `
264
249
  }]
@@ -524,6 +524,7 @@ export class DropDownListComponent {
524
524
  action !== NavigationAction.Delete &&
525
525
  action !== NavigationAction.PageDown &&
526
526
  action !== NavigationAction.PageUp &&
527
+ action !== NavigationAction.SelectAll &&
527
528
  !(leftRightKeys && this.filterable) &&
528
529
  action !== NavigationAction.Enter //enter when popup is opened is handled before `handleEnter`
529
530
  ) {
@@ -10,7 +10,7 @@ import { MultiSelectModule } from './multiselect/multiselect.module';
10
10
  import { DropDownTreesModule } from './dropdowntrees/dropdowntrees.module';
11
11
  import * as i0 from "@angular/core";
12
12
  /**
13
- * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})
13
+ * Represents the [NgModule](link:site.data.urls.angular['ngmoduleapi'])
14
14
  * definition for the Dropdowns components.
15
15
  *
16
16
  * @example
@@ -6,7 +6,7 @@ import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, O
6
6
  import { anyChanged, guid, hasObservers, isDocumentAvailable, KendoInput } from '@progress/kendo-angular-common';
7
7
  import { DataBoundComponent, ExpandableComponent } from '@progress/kendo-angular-treeview';
8
8
  import { getter } from '@progress/kendo-common';
9
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
9
+ import { NgControl, NG_VALUE_ACCESSOR } from '@angular/forms';
10
10
  import { DataService } from '../common/data.service';
11
11
  import { DisabledItemsService } from '../common/disabled-items/disabled-items.service';
12
12
  import { NavigationService } from '../common/navigation/navigation.service';
@@ -46,7 +46,8 @@ const DEFAULT_FILL_MODE = 'solid';
46
46
  * Represents the [Kendo UI DropDownTree component for Angular]({% slug overview_ddt %}).
47
47
  */
48
48
  export class DropDownTreeComponent {
49
- constructor(wrapper, popupService, navigationService, renderer, _zone, cdr, localization, touchEnabled) {
49
+ constructor(injector, wrapper, popupService, navigationService, renderer, _zone, cdr, localization, touchEnabled) {
50
+ this.injector = injector;
50
51
  this.wrapper = wrapper;
51
52
  this.popupService = popupService;
52
53
  this.navigationService = navigationService;
@@ -56,7 +57,7 @@ export class DropDownTreeComponent {
56
57
  this.localization = localization;
57
58
  this.touchEnabled = touchEnabled;
58
59
  this.hostClasses = true;
59
- this.role = 'listbox';
60
+ this.role = 'combobox';
60
61
  this.ariaHasPopup = 'tree';
61
62
  /**
62
63
  * Fires each time the popup is about to open
@@ -192,6 +193,7 @@ export class DropDownTreeComponent {
192
193
  this._popupSettings = DEFAULT_POPUP_SETTINGS;
193
194
  this._tabindex = 0;
194
195
  this._isFocused = false;
196
+ this._popupId = guid();
195
197
  this._size = 'medium';
196
198
  this._rounded = 'medium';
197
199
  this._fillMode = 'solid';
@@ -203,12 +205,24 @@ export class DropDownTreeComponent {
203
205
  this.subscribeTouchEvents();
204
206
  this.subscribeFocusEvents();
205
207
  }
208
+ get hostAriaInvalid() {
209
+ return this.formControl ? this.formControl.invalid.toString() : null;
210
+ }
206
211
  get isDisabled() {
207
212
  return this.disabled;
208
213
  }
214
+ get isDisabledAttribute() {
215
+ return this.disabled ? '' : null;
216
+ }
209
217
  get isLoading() {
210
218
  return this.loading;
211
219
  }
220
+ get isBusy() {
221
+ return this.loading ? 'true' : null;
222
+ }
223
+ get hostAriaControls() {
224
+ return this.isOpen ? this._popupId : null;
225
+ }
212
226
  get id() {
213
227
  return this.focusableId;
214
228
  }
@@ -218,8 +232,11 @@ export class DropDownTreeComponent {
218
232
  get isAriaExpanded() {
219
233
  return this.isOpen;
220
234
  }
235
+ get hostAriaAutocomplete() {
236
+ return this.filterable ? 'list' : null;
237
+ }
221
238
  get isReadonly() {
222
- return this.readonly;
239
+ return this.readonly ? '' : null;
223
240
  }
224
241
  /**
225
242
  * @hidden
@@ -475,6 +492,13 @@ export class DropDownTreeComponent {
475
492
  get isVisible() {
476
493
  return this.isNodeVisible;
477
494
  }
495
+ /**
496
+ * @hidden
497
+ */
498
+ get formControl() {
499
+ const ngControl = this.injector.get(NgControl, null);
500
+ return (ngControl === null || ngControl === void 0 ? void 0 : ngControl.control) || null;
501
+ }
478
502
  ngOnInit() {
479
503
  this.renderer.removeAttribute(this.wrapper.nativeElement, 'tabindex');
480
504
  this.assignAriaDescribedBy();
@@ -825,10 +849,11 @@ export class DropDownTreeComponent {
825
849
  });
826
850
  const popupWrapper = this.popupRef.popupElement;
827
851
  const { min, max } = this.width;
828
- popupWrapper.style.minWidth = min;
829
- popupWrapper.style.width = max;
830
- popupWrapper.style.height = this.height;
831
- popupWrapper.setAttribute("dir", this.direction);
852
+ this.renderer.setStyle(popupWrapper, 'minWidth', min);
853
+ this.renderer.setStyle(popupWrapper, 'width', max);
854
+ this.renderer.setStyle(popupWrapper, 'height', this.height);
855
+ this.renderer.setAttribute(popupWrapper, 'dir', this.direction);
856
+ this.renderer.setAttribute(popupWrapper, 'id', this._popupId);
832
857
  this.popupRef.popupOpen.subscribe(() => {
833
858
  this.cdr.detectChanges();
834
859
  this.opened.emit();
@@ -873,7 +898,11 @@ export class DropDownTreeComponent {
873
898
  this.selectedKeys = [];
874
899
  }
875
900
  subscribeEvents() {
876
- this.subscriptions.push(this.navigationService.open.subscribe(() => this.togglePopup(true)), this.navigationService.close.subscribe(() => {
901
+ this.subscriptions.push(this.navigationService.open.subscribe((event) => {
902
+ event.originalEvent.preventDefault();
903
+ this.togglePopup(true);
904
+ }), this.navigationService.close.subscribe((event) => {
905
+ event.originalEvent.preventDefault();
877
906
  this.togglePopup(false);
878
907
  this.focus();
879
908
  }), this.navigationService.enter
@@ -965,8 +994,8 @@ export class DropDownTreeComponent {
965
994
  }
966
995
  }
967
996
  }
968
- DropDownTreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: DropDownTreeComponent, deps: [{ token: i0.ElementRef }, { token: i1.PopupService }, { token: i2.NavigationService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i3.LocalizationService }, { token: TOUCH_ENABLED, optional: true }], target: i0.ɵɵFactoryTarget.Component });
969
- DropDownTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: DropDownTreeComponent, selector: "kendo-dropdowntree", inputs: { loading: "loading", clearButton: "clearButton", data: "data", value: "value", textField: "textField", valueField: "valueField", valueDepth: "valueDepth", hasChildren: "hasChildren", fetchChildren: "fetchChildren", placeholder: "placeholder", popupSettings: "popupSettings", dataItem: "dataItem", listHeight: "listHeight", disabled: "disabled", readonly: "readonly", valuePrimitive: "valuePrimitive", tabindex: "tabindex", size: "size", rounded: "rounded", fillMode: "fillMode", itemDisabled: "itemDisabled", isNodeExpanded: "isNodeExpanded", isNodeVisible: "isNodeVisible", loadOnDemand: "loadOnDemand", filterable: "filterable", filter: "filter", focusableId: "focusableId" }, outputs: { open: "open", opened: "opened", close: "close", closed: "closed", nodeExpand: "nodeExpand", nodeCollapse: "nodeCollapse", onFocus: "focus", onBlur: "blur", valueChange: "valueChange", filterChange: "filterChange" }, host: { listeners: { "click": "handleClick()", "keydown": "handleKeydown($event)" }, properties: { "class.k-dropdowntree": "this.hostClasses", "class.k-picker": "this.hostClasses", "class.k-disabled": "this.isDisabled", "attr.aria-disabled": "this.isDisabled", "class.k-loading": "this.isLoading", "attr.id": "this.id", "attr.dir": "this.direction", "attr.tabindex": "this.hostTabIndex", "attr.role": "this.role", "attr.aria-haspopup": "this.ariaHasPopup", "attr.aria-expanded": "this.isAriaExpanded", "attr.readonly": "this.isReadonly", "attr.aria-readonly": "this.isReadonly" } }, providers: [
997
+ DropDownTreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: DropDownTreeComponent, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: i1.PopupService }, { token: i2.NavigationService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i3.LocalizationService }, { token: TOUCH_ENABLED, optional: true }], target: i0.ɵɵFactoryTarget.Component });
998
+ DropDownTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: DropDownTreeComponent, selector: "kendo-dropdowntree", inputs: { loading: "loading", clearButton: "clearButton", data: "data", value: "value", textField: "textField", valueField: "valueField", valueDepth: "valueDepth", hasChildren: "hasChildren", fetchChildren: "fetchChildren", placeholder: "placeholder", popupSettings: "popupSettings", dataItem: "dataItem", listHeight: "listHeight", disabled: "disabled", readonly: "readonly", valuePrimitive: "valuePrimitive", tabindex: "tabindex", size: "size", rounded: "rounded", fillMode: "fillMode", itemDisabled: "itemDisabled", isNodeExpanded: "isNodeExpanded", isNodeVisible: "isNodeVisible", loadOnDemand: "loadOnDemand", filterable: "filterable", filter: "filter", focusableId: "focusableId" }, outputs: { open: "open", opened: "opened", close: "close", closed: "closed", nodeExpand: "nodeExpand", nodeCollapse: "nodeCollapse", onFocus: "focus", onBlur: "blur", valueChange: "valueChange", filterChange: "filterChange" }, host: { listeners: { "click": "handleClick()", "keydown": "handleKeydown($event)" }, properties: { "class.k-dropdowntree": "this.hostClasses", "class.k-picker": "this.hostClasses", "attr.aria-invalid": "this.hostAriaInvalid", "class.k-disabled": "this.isDisabled", "attr.disabled": "this.isDisabledAttribute", "class.k-loading": "this.isLoading", "attr.aria-busy": "this.isBusy", "attr.aria-controls": "this.hostAriaControls", "attr.id": "this.id", "attr.dir": "this.direction", "attr.tabindex": "this.hostTabIndex", "attr.role": "this.role", "attr.aria-haspopup": "this.ariaHasPopup", "attr.aria-expanded": "this.isAriaExpanded", "attr.aria-autocomplete": "this.hostAriaAutocomplete", "attr.readonly": "this.isReadonly" } }, providers: [
970
999
  DataService,
971
1000
  SelectionService,
972
1001
  NavigationService,
@@ -1008,7 +1037,6 @@ DropDownTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
1008
1037
  <span
1009
1038
  [attr.id]="valueLabelId"
1010
1039
  class="k-input-inner"
1011
- role="option"
1012
1040
  >
1013
1041
  <span class="k-input-value-text">
1014
1042
  <ng-template *ngIf="valueTemplate"
@@ -1178,7 +1206,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
1178
1206
  <span
1179
1207
  [attr.id]="valueLabelId"
1180
1208
  class="k-input-inner"
1181
- role="option"
1182
1209
  >
1183
1210
  <span class="k-input-value-text">
1184
1211
  <ng-template *ngIf="valueTemplate"
@@ -1302,7 +1329,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
1302
1329
  `,
1303
1330
  changeDetection: ChangeDetectionStrategy.OnPush
1304
1331
  }]
1305
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.PopupService }, { type: i2.NavigationService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i3.LocalizationService }, { type: undefined, decorators: [{
1332
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i1.PopupService }, { type: i2.NavigationService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i3.LocalizationService }, { type: undefined, decorators: [{
1306
1333
  type: Optional
1307
1334
  }, {
1308
1335
  type: Inject,
@@ -1313,15 +1340,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
1313
1340
  }, {
1314
1341
  type: HostBinding,
1315
1342
  args: ['class.k-picker']
1343
+ }], hostAriaInvalid: [{
1344
+ type: HostBinding,
1345
+ args: ['attr.aria-invalid']
1316
1346
  }], isDisabled: [{
1317
1347
  type: HostBinding,
1318
1348
  args: ['class.k-disabled']
1319
- }, {
1349
+ }], isDisabledAttribute: [{
1320
1350
  type: HostBinding,
1321
- args: ['attr.aria-disabled']
1351
+ args: ['attr.disabled']
1322
1352
  }], isLoading: [{
1323
1353
  type: HostBinding,
1324
1354
  args: ['class.k-loading']
1355
+ }], isBusy: [{
1356
+ type: HostBinding,
1357
+ args: ['attr.aria-busy']
1358
+ }], hostAriaControls: [{
1359
+ type: HostBinding,
1360
+ args: ['attr.aria-controls']
1325
1361
  }], id: [{
1326
1362
  type: HostBinding,
1327
1363
  args: ['attr.id']
@@ -1340,12 +1376,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
1340
1376
  }], isAriaExpanded: [{
1341
1377
  type: HostBinding,
1342
1378
  args: ['attr.aria-expanded']
1379
+ }], hostAriaAutocomplete: [{
1380
+ type: HostBinding,
1381
+ args: ['attr.aria-autocomplete']
1343
1382
  }], isReadonly: [{
1344
1383
  type: HostBinding,
1345
1384
  args: ['attr.readonly']
1346
- }, {
1347
- type: HostBinding,
1348
- args: ['attr.aria-readonly']
1349
1385
  }], handleClick: [{
1350
1386
  type: HostListener,
1351
1387
  args: ['click']
@@ -3,7 +3,7 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { Component, ContentChild, EventEmitter, forwardRef, HostBinding, HostListener, Inject, Input, isDevMode, Optional, Output, ViewChild, ViewContainerRef } from '@angular/core';
6
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
6
+ import { NgControl, NG_VALUE_ACCESSOR } from '@angular/forms';
7
7
  import { anyChanged, guid, hasObservers, Keys, KendoInput, isDocumentAvailable } from '@progress/kendo-angular-common';
8
8
  import { L10N_PREFIX, LocalizationService } from '@progress/kendo-angular-l10n';
9
9
  import { NavigationService } from '../common/navigation/navigation.service';
@@ -54,7 +54,8 @@ const DEFAULT_FILL_MODE = 'solid';
54
54
  * Represents the [Kendo UI MultiSelectTree component for Angular]({% slug overview_multiselecttree %}).
55
55
  */
56
56
  export class MultiSelectTreeComponent {
57
- constructor(wrapper, popupService, renderer, navigationService, _zone, localization, cdr, lookup, touchEnabled) {
57
+ constructor(injector, wrapper, popupService, renderer, navigationService, _zone, localization, cdr, lookup, touchEnabled) {
58
+ this.injector = injector;
58
59
  this.wrapper = wrapper;
59
60
  this.popupService = popupService;
60
61
  this.renderer = renderer;
@@ -225,6 +226,7 @@ export class MultiSelectTreeComponent {
225
226
  this._popupSettings = DEFAULT_POPUP_SETTINGS;
226
227
  this._checkableSettings = DEFAULT_CHECKABLE_SETTINGS;
227
228
  this._isFocused = false;
229
+ this._popupId = guid();
228
230
  this._size = 'medium';
229
231
  this._rounded = 'medium';
230
232
  this._fillMode = 'solid';
@@ -239,9 +241,21 @@ export class MultiSelectTreeComponent {
239
241
  get isDisabled() {
240
242
  return this.disabled;
241
243
  }
244
+ get hostAriaControls() {
245
+ return this.isOpen ? this._popupId : null;
246
+ }
247
+ get hostAriaAutocomplete() {
248
+ return this.filterable ? 'list' : null;
249
+ }
242
250
  get isLoading() {
243
251
  return this.loading;
244
252
  }
253
+ get hostAriaInvalid() {
254
+ return this.formControl ? this.formControl.invalid.toString() : null;
255
+ }
256
+ get isBusy() {
257
+ return this.loading ? 'true' : null;
258
+ }
245
259
  get id() {
246
260
  return this.focusableId;
247
261
  }
@@ -252,7 +266,7 @@ export class MultiSelectTreeComponent {
252
266
  return this.isOpen;
253
267
  }
254
268
  get isReadonly() {
255
- return this.readonly;
269
+ return this.readonly ? '' : null;
256
270
  }
257
271
  get ariaDescribedBy() {
258
272
  return this.tagListId;
@@ -260,6 +274,13 @@ export class MultiSelectTreeComponent {
260
274
  get ariaActiveDescendant() {
261
275
  return this.focusedTagId;
262
276
  }
277
+ /**
278
+ * @hidden
279
+ */
280
+ get formControl() {
281
+ const ngControl = this.injector.get(NgControl, null);
282
+ return (ngControl === null || ngControl === void 0 ? void 0 : ngControl.control) || null;
283
+ }
263
284
  /**
264
285
  * @hidden
265
286
  */
@@ -1034,9 +1055,13 @@ export class MultiSelectTreeComponent {
1034
1055
  }
1035
1056
  }
1036
1057
  subscribeEvents() {
1037
- this.subscriptions.push(this.navigationService.open.subscribe(() => this.togglePopup(true)), this.navigationService.enter
1058
+ this.subscriptions.push(this.navigationService.open.subscribe((event) => {
1059
+ event.originalEvent.preventDefault();
1060
+ this.togglePopup(true);
1061
+ }), this.navigationService.enter
1038
1062
  .pipe(tap((event) => event.originalEvent.preventDefault()))
1039
- .subscribe(() => this.togglePopup(true)), merge(this.navigationService.close, this.navigationService.esc).subscribe(() => {
1063
+ .subscribe(() => this.togglePopup(true)), merge(this.navigationService.close, this.navigationService.esc).subscribe((event) => {
1064
+ event.originalEvent.preventDefault();
1040
1065
  this.focus();
1041
1066
  this.togglePopup(false);
1042
1067
  }), this.navigationService.tab.subscribe(this.handleTabKey.bind(this)), this.navigationService.up.subscribe(this.handleUpKey.bind(this)), this.navigationService.down.subscribe(this.handleDownKey.bind(this)), this.navigationService.left
@@ -1272,8 +1297,8 @@ export class MultiSelectTreeComponent {
1272
1297
  }
1273
1298
  }
1274
1299
  }
1275
- MultiSelectTreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: MultiSelectTreeComponent, deps: [{ 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 });
1276
- MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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: { listeners: { "click": "handleClick()", "keydown": "handleKeydown($event)" }, properties: { "class.k-dropdowntree": "this.hostClasses", "class.k-input": "this.hostClasses", "class.k-disabled": "this.isDisabled", "attr.aria-disabled": "this.isDisabled", "class.k-loading": "this.isLoading", "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-readonly": "this.isReadonly", "attr.aria-describedby": "this.ariaDescribedBy", "attr.aria-activedescendant": "this.ariaActiveDescendant" } }, providers: [
1300
+ MultiSelectTreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", 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 });
1301
+ MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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: { listeners: { "click": "handleClick()", "keydown": "handleKeydown($event)" }, 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: [
1277
1302
  LocalizationService,
1278
1303
  NavigationService,
1279
1304
  DataService,
@@ -1678,14 +1703,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
1678
1703
  <ng-container #container></ng-container>
1679
1704
  `
1680
1705
  }]
1681
- }], ctorParameters: function () { return [{ 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: [{
1706
+ }], 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: [{
1682
1707
  type: Optional
1683
1708
  }, {
1684
1709
  type: Inject,
1685
1710
  args: [TOUCH_ENABLED]
1686
1711
  }] }]; }, propDecorators: { hostClasses: [{
1687
1712
  type: HostBinding,
1688
- args: ['class.k-dropdowntree']
1713
+ args: ['class.k-multiselect-tree']
1689
1714
  }, {
1690
1715
  type: HostBinding,
1691
1716
  args: ['class.k-input']
@@ -1695,9 +1720,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
1695
1720
  }, {
1696
1721
  type: HostBinding,
1697
1722
  args: ['attr.aria-disabled']
1723
+ }], hostAriaControls: [{
1724
+ type: HostBinding,
1725
+ args: ['attr.aria-controls']
1726
+ }], hostAriaAutocomplete: [{
1727
+ type: HostBinding,
1728
+ args: ['attr.aria-autocomplete']
1698
1729
  }], isLoading: [{
1699
1730
  type: HostBinding,
1700
1731
  args: ['class.k-loading']
1732
+ }], hostAriaInvalid: [{
1733
+ type: HostBinding,
1734
+ args: ['attr.aria-invalid']
1735
+ }], isBusy: [{
1736
+ type: HostBinding,
1737
+ args: ['attr.aria-busy']
1701
1738
  }], id: [{
1702
1739
  type: HostBinding,
1703
1740
  args: ['attr.id']
@@ -1719,9 +1756,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
1719
1756
  }], isReadonly: [{
1720
1757
  type: HostBinding,
1721
1758
  args: ['attr.readonly']
1722
- }, {
1723
- type: HostBinding,
1724
- args: ['attr.aria-readonly']
1725
1759
  }], ariaDescribedBy: [{
1726
1760
  type: HostBinding,
1727
1761
  args: ['attr.aria-describedby']