@progress/kendo-angular-dropdowns 11.2.0 → 11.3.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.
@@ -5,11 +5,11 @@
5
5
  import * as i0 from '@angular/core';
6
6
  import { EventEmitter, Component, Input, Output, ViewChild, HostBinding, Directive, Injectable, HostListener, ViewChildren, InjectionToken, forwardRef, isDevMode, ViewContainerRef, Optional, Inject, ContentChild, ContentChildren, ChangeDetectionStrategy, NgModule } from '@angular/core';
7
7
  import * as i10 from '@progress/kendo-angular-common';
8
- import { isDocumentAvailable, Keys, isChanged, hasObservers, KendoInput, anyChanged, guid as guid$1, ResizeSensorModule, EventsModule } from '@progress/kendo-angular-common';
8
+ import { isDocumentAvailable, isSafari, Keys, isChanged, hasObservers, KendoInput, anyChanged, guid as guid$1, ResizeSensorModule, EventsModule } from '@progress/kendo-angular-common';
9
9
  import * as i13 from '@angular/forms';
10
10
  import { NgControl, NG_VALUE_ACCESSOR, FormsModule, ReactiveFormsModule } from '@angular/forms';
11
11
  import { validatePackage } from '@progress/kendo-licensing';
12
- import { getter as getter$1, detectDesktopBrowser, detectMobileOS, pointers, touchEnabled } from '@progress/kendo-common';
12
+ import { getter as getter$1, pointers, touchEnabled } from '@progress/kendo-common';
13
13
  import * as i1 from '@progress/kendo-angular-l10n';
14
14
  import { ComponentMessages, LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
15
15
  import { Subscription, merge, fromEvent, Subject, of, interval } from 'rxjs';
@@ -32,8 +32,8 @@ const packageMetadata = {
32
32
  name: '@progress/kendo-angular-dropdowns',
33
33
  productName: 'Kendo UI for Angular',
34
34
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
35
- publishDate: 1676453697,
36
- version: '11.2.0',
35
+ publishDate: 1677586118,
36
+ version: '11.3.0-develop.10',
37
37
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
38
38
  };
39
39
 
@@ -361,15 +361,6 @@ const getFillModeClass = (component, fillMode) => {
361
361
  * @hidden
362
362
  */
363
363
  const filterAndMap = (arr, predicate, mapper) => arr.reduce((acc, curr) => predicate(curr) ? [...acc, mapper(curr)] : acc, []);
364
- /**
365
- * @hidden
366
- *
367
- * Returns true if the used browser is Safari.
368
- */
369
- const isSafari = (userAgent) => {
370
- return detectDesktopBrowser(userAgent).safari ||
371
- (detectMobileOS(userAgent) && detectMobileOS(userAgent).browser === 'mobilesafari');
372
- };
373
364
  /**
374
365
  * @hidden
375
366
  *
@@ -398,8 +389,8 @@ const getTextField = (field, level) => {
398
389
  /**
399
390
  * @hidden
400
391
  */
401
- const getSearchableItems = (popupId, popupElement) => {
402
- const nodeSeletor = `kendo-popup[id='${popupId}'] li.k-treeview-item`;
392
+ const getSearchableItems = (treeViewId, popupElement) => {
393
+ const nodeSeletor = `kendo-treeview[id='${treeViewId}'] li.k-treeview-item`;
403
394
  const liElements = Array.from(popupElement.querySelectorAll(nodeSeletor));
404
395
  return liElements.map((liElement) => {
405
396
  return { text: liElement.innerText, index: liElement.getAttribute('data-treeindex') };
@@ -413,6 +404,7 @@ class SearchBarComponent {
413
404
  constructor(localization, renderer, injector) {
414
405
  this.localization = localization;
415
406
  this.injector = injector;
407
+ this.ariaExpanded = null;
416
408
  this.valueChange = new EventEmitter();
417
409
  this.onBlur = new EventEmitter();
418
410
  this.onFocus = new EventEmitter();
@@ -469,9 +461,6 @@ class SearchBarComponent {
469
461
  get placeholder() {
470
462
  return this._placeholder;
471
463
  }
472
- get ariaExpanded() {
473
- return this.role === 'combobox' ? this.popupOpen : null;
474
- }
475
464
  ngOnInit() {
476
465
  this.subs.add(this.localization
477
466
  .changes.subscribe(({ rtl }) => this.direction = rtl ? 'rtl' : 'ltr'));
@@ -586,14 +575,14 @@ class SearchBarComponent {
586
575
  }
587
576
  }
588
577
  SearchBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SearchBarComponent, deps: [{ token: i1.LocalizationService }, { token: i0.Renderer2 }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
589
- SearchBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: SearchBarComponent, selector: "kendo-searchbar", inputs: { id: "id", listId: "listId", tagListId: "tagListId", activeDescendant: "activeDescendant", disabled: "disabled", readonly: "readonly", tabIndex: "tabIndex", popupOpen: "popupOpen", role: "role", isLoading: "isLoading", isSuggestable: "isSuggestable", isFilterable: "isFilterable", userInput: "userInput", suggestedText: "suggestedText", placeholder: "placeholder" }, outputs: { valueChange: "valueChange", onBlur: "onBlur", onFocus: "onFocus", onClick: "onClick", onNavigate: "onNavigate" }, host: { properties: { "class.k-searchbar": "this.searchBarClass" } }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
578
+ SearchBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: SearchBarComponent, selector: "kendo-searchbar", inputs: { id: "id", tagListId: "tagListId", activeDescendant: "activeDescendant", disabled: "disabled", readonly: "readonly", tabIndex: "tabIndex", role: "role", isLoading: "isLoading", ariaControls: "ariaControls", ariaExpanded: "ariaExpanded", isSuggestable: "isSuggestable", isFilterable: "isFilterable", userInput: "userInput", suggestedText: "suggestedText", placeholder: "placeholder" }, outputs: { valueChange: "valueChange", onBlur: "onBlur", onFocus: "onFocus", onClick: "onClick", onNavigate: "onNavigate" }, host: { properties: { "class.k-searchbar": "this.searchBarClass" } }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
590
579
  <input #input
591
580
  autocomplete="off"
592
581
  [id]="id"
593
582
  [disabled]="disabled"
594
583
  [readonly]="readonly"
595
584
  [placeholder]="placeholder"
596
- [class]="'k-input-inner'"
585
+ class="k-input-inner"
597
586
  (input)="handleInput($event)"
598
587
  (keydown)="handleKeydown($event)"
599
588
  [kendoEventsOutsideAngular]="{
@@ -606,7 +595,7 @@ SearchBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
606
595
  [attr.role]="role"
607
596
  aria-haspopup="listbox"
608
597
  [attr.aria-expanded]="ariaExpanded"
609
- [attr.aria-controls]="listId"
598
+ [attr.aria-controls]="ariaControls"
610
599
  [attr.aria-describedby]="tagListId"
611
600
  [attr.aria-activedescendant]="activeDescendant"
612
601
  [attr.aria-busy]="isLoading"
@@ -624,7 +613,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
624
613
  [disabled]="disabled"
625
614
  [readonly]="readonly"
626
615
  [placeholder]="placeholder"
627
- [class]="'k-input-inner'"
616
+ class="k-input-inner"
628
617
  (input)="handleInput($event)"
629
618
  (keydown)="handleKeydown($event)"
630
619
  [kendoEventsOutsideAngular]="{
@@ -637,7 +626,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
637
626
  [attr.role]="role"
638
627
  aria-haspopup="listbox"
639
628
  [attr.aria-expanded]="ariaExpanded"
640
- [attr.aria-controls]="listId"
629
+ [attr.aria-controls]="ariaControls"
641
630
  [attr.aria-describedby]="tagListId"
642
631
  [attr.aria-activedescendant]="activeDescendant"
643
632
  [attr.aria-busy]="isLoading"
@@ -647,8 +636,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
647
636
  }]
648
637
  }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i0.Renderer2 }, { type: i0.Injector }]; }, propDecorators: { id: [{
649
638
  type: Input
650
- }], listId: [{
651
- type: Input
652
639
  }], tagListId: [{
653
640
  type: Input
654
641
  }], activeDescendant: [{
@@ -659,12 +646,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
659
646
  type: Input
660
647
  }], tabIndex: [{
661
648
  type: Input
662
- }], popupOpen: [{
663
- type: Input
664
649
  }], role: [{
665
650
  type: Input
666
651
  }], isLoading: [{
667
652
  type: Input
653
+ }], ariaControls: [{
654
+ type: Input
655
+ }], ariaExpanded: [{
656
+ type: Input
668
657
  }], isSuggestable: [{
669
658
  type: Input
670
659
  }], isFilterable: [{
@@ -2139,6 +2128,9 @@ ListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
2139
2128
  *ngIf="checkboxes.enabled"
2140
2129
  type="checkbox"
2141
2130
  class="k-checkbox"
2131
+ role="presentation"
2132
+ tabindex="-1"
2133
+ aria-hidden="true"
2142
2134
  [ngClass]="checkboxClasses"
2143
2135
  (change)="onCheckedChange($event, itemIndex)"
2144
2136
  [checked]="isChecked(itemIndex)"
@@ -2267,6 +2259,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
2267
2259
  *ngIf="checkboxes.enabled"
2268
2260
  type="checkbox"
2269
2261
  class="k-checkbox"
2262
+ role="presentation"
2263
+ tabindex="-1"
2264
+ aria-hidden="true"
2270
2265
  [ngClass]="checkboxClasses"
2271
2266
  (change)="onCheckedChange($event, itemIndex)"
2272
2267
  [checked]="isChecked(itemIndex)"
@@ -2435,7 +2430,7 @@ const TOUCH_ENABLED = new InjectionToken('dropdowns-touch-enabled');
2435
2430
  class Messages extends ComponentMessages {
2436
2431
  }
2437
2432
  Messages.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: Messages, deps: null, target: i0.ɵɵFactoryTarget.Directive });
2438
- Messages.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: Messages, inputs: { noDataText: "noDataText", clearTitle: "clearTitle", checkAllText: "checkAllText", selectButtonText: "selectButtonText" }, usesInheritance: true, ngImport: i0 });
2433
+ Messages.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: Messages, inputs: { noDataText: "noDataText", clearTitle: "clearTitle", checkAllText: "checkAllText", selectButtonText: "selectButtonText", filterInputLabel: "filterInputLabel", popupLabel: "popupLabel" }, usesInheritance: true, ngImport: i0 });
2439
2434
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: Messages, decorators: [{
2440
2435
  type: Directive
2441
2436
  }], propDecorators: { noDataText: [{
@@ -2446,6 +2441,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
2446
2441
  type: Input
2447
2442
  }], selectButtonText: [{
2448
2443
  type: Input
2444
+ }], filterInputLabel: [{
2445
+ type: Input
2446
+ }], popupLabel: [{
2447
+ type: Input
2449
2448
  }] } });
2450
2449
 
2451
2450
  /**
@@ -2620,8 +2619,8 @@ class AutoCompleteComponent {
2620
2619
  */
2621
2620
  this.onBlur = new EventEmitter();
2622
2621
  this.widgetClasses = true;
2623
- this.listBoxId = guid();
2624
- this.optionPrefix = guid();
2622
+ this.listBoxId = `k-${guid()}`;
2623
+ this.optionPrefix = `k-${guid()}`;
2625
2624
  this.onChangeCallback = noop;
2626
2625
  this.onTouchedCallback = noop;
2627
2626
  this.popupMouseDownHandler = (event) => event.preventDefault();
@@ -2685,6 +2684,9 @@ class AutoCompleteComponent {
2685
2684
  return 'visible';
2686
2685
  }
2687
2686
  }
2687
+ get ariaControls() {
2688
+ return this.isOpen ? this.listBoxId : undefined;
2689
+ }
2688
2690
  /**
2689
2691
  * Toggles the visibility of the popup.
2690
2692
  * If you use the `toggle` method to open or close the popup, the `open` and `close` events will not be fired.
@@ -3257,9 +3259,9 @@ class AutoCompleteComponent {
3257
3259
  if (this.virtual) {
3258
3260
  this.virtual.skip = 0;
3259
3261
  }
3260
- const horizontalAlign = this.direction === "rtl" ? "right" : "left";
3261
- const anchorPosition = { horizontal: horizontalAlign, vertical: "bottom" };
3262
- const popupPosition = { horizontal: horizontalAlign, vertical: "top" };
3262
+ const horizontalAlign = this.direction === 'rtl' ? 'right' : 'left';
3263
+ const anchorPosition = { horizontal: horizontalAlign, vertical: 'bottom' };
3264
+ const popupPosition = { horizontal: horizontalAlign, vertical: 'top' };
3263
3265
  this.popupRef = this.popupService.open({
3264
3266
  anchor: this.wrapper,
3265
3267
  animate: this.popupSettings.animate,
@@ -3276,7 +3278,11 @@ class AutoCompleteComponent {
3276
3278
  popupWrapper.style.minWidth = min;
3277
3279
  popupWrapper.style.width = max;
3278
3280
  popupWrapper.style.height = this.height;
3279
- popupWrapper.setAttribute("dir", this.direction);
3281
+ popupWrapper.setAttribute('dir', this.direction);
3282
+ if (!this.appendTo) {
3283
+ this.renderer.setAttribute(popupWrapper, 'role', 'region');
3284
+ this.renderer.setAttribute(popupWrapper, 'aria-label', this.messageFor('popupLabel'));
3285
+ }
3280
3286
  const listBox = popupWrapper.querySelector('ul.k-list-ul');
3281
3287
  const ariaLabel = this.searchbar.input.nativeElement.getAttribute('aria-labelledby');
3282
3288
  if (ariaLabel) {
@@ -3381,22 +3387,26 @@ AutoCompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
3381
3387
 
3382
3388
  i18n-clearTitle="kendo.autocomplete.clearTitle|The title of the clear button"
3383
3389
  clearTitle="clear"
3390
+
3391
+ i18n-popupLabel="kendo.autocomplete.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
3392
+ popupLabel="Options list"
3384
3393
  >
3385
3394
  </ng-container>
3386
3395
  <kendo-searchbar #searchbar
3387
3396
  [role]="'combobox'"
3397
+ [ariaExpanded]="isOpen"
3398
+ [ariaControls]="ariaControls"
3388
3399
  [isSuggestable]="suggest"
3389
3400
  [isFilterable]="filterable"
3390
3401
  [isLoading]="isLoading"
3402
+ [ariaControls]="ariaControls"
3391
3403
  [id]="focusableId"
3392
- [listId]="listBoxId"
3393
3404
  [activeDescendant]="activeDescendant"
3394
3405
  [userInput]="text"
3395
3406
  [suggestedText]="suggestion"
3396
3407
  [disabled]="disabled"
3397
3408
  [readonly]="readonly"
3398
3409
  [tabIndex]="tabIndex"
3399
- [popupOpen]="isOpen"
3400
3410
  [placeholder]="placeholder"
3401
3411
  (onNavigate)="handleNavigate($event)"
3402
3412
  (valueChange)="searchBarChange($event)"
@@ -3468,7 +3478,7 @@ AutoCompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
3468
3478
  <kendo-resize-sensor (resize)="onResize()"></kendo-resize-sensor>
3469
3479
  </ng-template>
3470
3480
  <ng-container #container></ng-container>
3471
- `, isInline: true, components: [{ type: SearchBarComponent, selector: "kendo-searchbar", inputs: ["id", "listId", "tagListId", "activeDescendant", "disabled", "readonly", "tabIndex", "popupOpen", "role", "isLoading", "isSuggestable", "isFilterable", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: i8.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "ariaLive", "isMultiselect", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i10.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: LocalizedMessagesDirective, selector: "\n [kendoDropDownListLocalizedMessages],\n [kendoDropDownTreeLocalizedMessages],\n [kendoComboBoxLocalizedMessages],\n [kendoMultiColumnComboBoxLocalizedMessages],\n [kendoAutoCompleteLocalizedMessages],\n [kendoMultiSelectLocalizedMessages],\n [kendoMultiSelectTreeLocalizedMessages]\n " }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
3481
+ `, isInline: true, components: [{ type: SearchBarComponent, selector: "kendo-searchbar", inputs: ["id", "tagListId", "activeDescendant", "disabled", "readonly", "tabIndex", "role", "isLoading", "ariaControls", "ariaExpanded", "isSuggestable", "isFilterable", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: i8.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "ariaLive", "isMultiselect", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i10.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: LocalizedMessagesDirective, selector: "\n [kendoDropDownListLocalizedMessages],\n [kendoDropDownTreeLocalizedMessages],\n [kendoComboBoxLocalizedMessages],\n [kendoMultiColumnComboBoxLocalizedMessages],\n [kendoAutoCompleteLocalizedMessages],\n [kendoMultiSelectLocalizedMessages],\n [kendoMultiSelectTreeLocalizedMessages]\n " }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
3472
3482
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AutoCompleteComponent, decorators: [{
3473
3483
  type: Component,
3474
3484
  args: [{
@@ -3501,22 +3511,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
3501
3511
 
3502
3512
  i18n-clearTitle="kendo.autocomplete.clearTitle|The title of the clear button"
3503
3513
  clearTitle="clear"
3514
+
3515
+ i18n-popupLabel="kendo.autocomplete.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
3516
+ popupLabel="Options list"
3504
3517
  >
3505
3518
  </ng-container>
3506
3519
  <kendo-searchbar #searchbar
3507
3520
  [role]="'combobox'"
3521
+ [ariaExpanded]="isOpen"
3522
+ [ariaControls]="ariaControls"
3508
3523
  [isSuggestable]="suggest"
3509
3524
  [isFilterable]="filterable"
3510
3525
  [isLoading]="isLoading"
3526
+ [ariaControls]="ariaControls"
3511
3527
  [id]="focusableId"
3512
- [listId]="listBoxId"
3513
3528
  [activeDescendant]="activeDescendant"
3514
3529
  [userInput]="text"
3515
3530
  [suggestedText]="suggestion"
3516
3531
  [disabled]="disabled"
3517
3532
  [readonly]="readonly"
3518
3533
  [tabIndex]="tabIndex"
3519
- [popupOpen]="isOpen"
3520
3534
  [placeholder]="placeholder"
3521
3535
  (onNavigate)="handleNavigate($event)"
3522
3536
  (valueChange)="searchBarChange($event)"
@@ -3951,8 +3965,8 @@ class ComboBoxComponent {
3951
3965
  this.onBlur = new EventEmitter();
3952
3966
  this.widgetClasses = true;
3953
3967
  this._isFocused = false;
3954
- this.listBoxId = guid();
3955
- this.optionPrefix = guid();
3968
+ this.listBoxId = `k-${guid()}`;
3969
+ this.optionPrefix = `k-${guid()}`;
3956
3970
  this.onChangeCallback = (_) => { };
3957
3971
  this.onTouchedCallback = (_) => { };
3958
3972
  /**
@@ -3986,6 +4000,12 @@ class ComboBoxComponent {
3986
4000
  get text() {
3987
4001
  return this._text;
3988
4002
  }
4003
+ /**
4004
+ * @hidden
4005
+ */
4006
+ get ariaControls() {
4007
+ return this.isOpen ? this.listBoxId : undefined;
4008
+ }
3989
4009
  /**
3990
4010
  * @hidden
3991
4011
  */
@@ -4924,7 +4944,11 @@ class ComboBoxComponent {
4924
4944
  popupWrapper.style.minWidth = min;
4925
4945
  popupWrapper.style.width = max;
4926
4946
  popupWrapper.style.height = this.popupHeight;
4927
- popupWrapper.setAttribute("dir", this.direction);
4947
+ popupWrapper.setAttribute('dir', this.direction);
4948
+ if (!this.appendTo) {
4949
+ this.renderer.setAttribute(popupWrapper, 'role', 'region');
4950
+ this.renderer.setAttribute(popupWrapper, 'aria-label', this.messageFor('popupLabel'));
4951
+ }
4928
4952
  const listBox = this.popupRef.popupElement.querySelector('ul');
4929
4953
  const ariaLabel = this.searchbar.input.nativeElement.getAttribute('aria-labelledby');
4930
4954
  if (ariaLabel) {
@@ -5028,12 +5052,16 @@ ComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
5028
5052
 
5029
5053
  i18n-selectButtonText="kendo.combobox.selectButtonText|The text set as aria-label on the select button"
5030
5054
  selectButtonText="Select"
5055
+
5056
+ i18n-popupLabel="kendo.combobox.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
5057
+ popupLabel="Options list"
5031
5058
  >
5032
5059
  </ng-container>
5033
5060
  <kendo-searchbar #searchbar
5034
5061
  [role]="'combobox'"
5062
+ [ariaExpanded]="isOpen"
5063
+ [ariaControls]="ariaControls"
5035
5064
  [id]="focusableId"
5036
- [listId]="listBoxId"
5037
5065
  [isLoading]="loading"
5038
5066
  [isSuggestable]="suggest"
5039
5067
  [isFilterable]="filterable"
@@ -5043,7 +5071,6 @@ ComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
5043
5071
  [disabled]="disabled"
5044
5072
  [readonly]="readonly"
5045
5073
  [tabIndex]="tabIndex"
5046
- [popupOpen]="isOpen"
5047
5074
  [placeholder]="placeholder"
5048
5075
  (onNavigate)="handleNavigate($event)"
5049
5076
  (valueChange)="searchBarChange($event)"
@@ -5135,7 +5162,7 @@ ComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
5135
5162
  <kendo-resize-sensor (resize)="onResize()"></kendo-resize-sensor>
5136
5163
  </ng-template>
5137
5164
  <ng-container #container></ng-container>
5138
- `, isInline: true, components: [{ type: SearchBarComponent, selector: "kendo-searchbar", inputs: ["id", "listId", "tagListId", "activeDescendant", "disabled", "readonly", "tabIndex", "popupOpen", "role", "isLoading", "isSuggestable", "isFilterable", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: i8.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "ariaLive", "isMultiselect", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i10.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: LocalizedMessagesDirective, selector: "\n [kendoDropDownListLocalizedMessages],\n [kendoDropDownTreeLocalizedMessages],\n [kendoComboBoxLocalizedMessages],\n [kendoMultiColumnComboBoxLocalizedMessages],\n [kendoAutoCompleteLocalizedMessages],\n [kendoMultiSelectLocalizedMessages],\n [kendoMultiSelectTreeLocalizedMessages]\n " }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
5165
+ `, isInline: true, components: [{ type: SearchBarComponent, selector: "kendo-searchbar", inputs: ["id", "tagListId", "activeDescendant", "disabled", "readonly", "tabIndex", "role", "isLoading", "ariaControls", "ariaExpanded", "isSuggestable", "isFilterable", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: i8.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "ariaLive", "isMultiselect", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i10.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: LocalizedMessagesDirective, selector: "\n [kendoDropDownListLocalizedMessages],\n [kendoDropDownTreeLocalizedMessages],\n [kendoComboBoxLocalizedMessages],\n [kendoMultiColumnComboBoxLocalizedMessages],\n [kendoAutoCompleteLocalizedMessages],\n [kendoMultiSelectLocalizedMessages],\n [kendoMultiSelectTreeLocalizedMessages]\n " }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
5139
5166
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ComboBoxComponent, decorators: [{
5140
5167
  type: Component,
5141
5168
  args: [{
@@ -5169,12 +5196,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
5169
5196
 
5170
5197
  i18n-selectButtonText="kendo.combobox.selectButtonText|The text set as aria-label on the select button"
5171
5198
  selectButtonText="Select"
5199
+
5200
+ i18n-popupLabel="kendo.combobox.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
5201
+ popupLabel="Options list"
5172
5202
  >
5173
5203
  </ng-container>
5174
5204
  <kendo-searchbar #searchbar
5175
5205
  [role]="'combobox'"
5206
+ [ariaExpanded]="isOpen"
5207
+ [ariaControls]="ariaControls"
5176
5208
  [id]="focusableId"
5177
- [listId]="listBoxId"
5178
5209
  [isLoading]="loading"
5179
5210
  [isSuggestable]="suggest"
5180
5211
  [isFilterable]="filterable"
@@ -5184,7 +5215,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
5184
5215
  [disabled]="disabled"
5185
5216
  [readonly]="readonly"
5186
5217
  [tabIndex]="tabIndex"
5187
- [popupOpen]="isOpen"
5188
5218
  [placeholder]="placeholder"
5189
5219
  (onNavigate)="handleNavigate($event)"
5190
5220
  (valueChange)="searchBarChange($event)"
@@ -5526,6 +5556,7 @@ class DropDownListComponent {
5526
5556
  * @hidden
5527
5557
  */
5528
5558
  this.caretAltDownIcon = caretAltDownIcon;
5559
+ this.listBoxId = `k-${guid()}`;
5529
5560
  /**
5530
5561
  * Sets the height of the options list. By default, `listHeight` is 200px.
5531
5562
  *
@@ -5607,9 +5638,8 @@ class DropDownListComponent {
5607
5638
  this.role = 'combobox';
5608
5639
  this.haspopup = 'listbox';
5609
5640
  this.groupIndices = [];
5610
- this.listBoxId = guid();
5611
- this.optionPrefix = guid();
5612
- this.filterText = "";
5641
+ this.optionPrefix = `k-${guid()}`;
5642
+ this.filterText = '';
5613
5643
  this.subs = new Subscription();
5614
5644
  this._isFocused = false;
5615
5645
  this.onTouchedCallback = (_) => { };
@@ -5915,9 +5945,6 @@ class DropDownListComponent {
5915
5945
  get isAriaExpanded() {
5916
5946
  return this.ariaExpanded;
5917
5947
  }
5918
- get hostAriaControls() {
5919
- return this.ariaControls;
5920
- }
5921
5948
  get hostAriaInvalid() {
5922
5949
  return this.formControl ? this.formControl?.invalid.toString() : null;
5923
5950
  }
@@ -6258,7 +6285,11 @@ class DropDownListComponent {
6258
6285
  popupWrapper.style.minWidth = min;
6259
6286
  popupWrapper.style.width = max;
6260
6287
  popupWrapper.style.height = this.height;
6261
- popupWrapper.setAttribute("dir", this.direction);
6288
+ popupWrapper.setAttribute('dir', this.direction);
6289
+ if (!this.appendTo) {
6290
+ this.renderer.setAttribute(popupWrapper, 'role', 'region');
6291
+ this.renderer.setAttribute(popupWrapper, 'aria-label', this.messageFor('popupLabel'));
6292
+ }
6262
6293
  const listBox = popupWrapper.querySelector('ul.k-list-ul');
6263
6294
  const ariaLabel = this.wrapper.nativeElement.getAttribute('aria-labelledby');
6264
6295
  if (ariaLabel) {
@@ -6650,7 +6681,7 @@ class DropDownListComponent {
6650
6681
  const currentValue = this.wrapper.nativeElement.getAttribute('aria-describedby') || '';
6651
6682
  const trimmed = currentValue.replace(this.valueLabelId, '').trim();
6652
6683
  // reset the value label ID to force readers to read the new value
6653
- this.valueLabelId = guid();
6684
+ this.valueLabelId = `k-${guid()}`;
6654
6685
  // add to the current value - don't replace it
6655
6686
  const newValue = `${this.valueLabelId} ${trimmed}`.trim();
6656
6687
  this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-describedby', newValue);
@@ -6668,7 +6699,7 @@ class DropDownListComponent {
6668
6699
  }
6669
6700
  }
6670
6701
  DropDownListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: DropDownListComponent, deps: [{ token: i0.ElementRef }, { token: i1.LocalizationService }, { token: i2.PopupService }, { token: SelectionService }, { token: NavigationService }, { token: DisabledItemsService }, { token: DataService }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: TOUCH_ENABLED, optional: true }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
6671
- DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: { iconClass: "iconClass", loading: "loading", data: "data", value: "value", textField: "textField", valueField: "valueField", popupSettings: "popupSettings", listHeight: "listHeight", defaultItem: "defaultItem", disabled: "disabled", itemDisabled: "itemDisabled", readonly: "readonly", filterable: "filterable", virtual: "virtual", ignoreCase: "ignoreCase", delay: "delay", valuePrimitive: "valuePrimitive", tabindex: "tabindex", tabIndex: "tabIndex", size: "size", rounded: "rounded", fillMode: "fillMode", focusableId: ["id", "focusableId"] }, outputs: { valueChange: "valueChange", filterChange: "filterChange", selectionChange: "selectionChange", open: "open", opened: "opened", close: "close", closed: "closed", onFocus: "focus", onBlur: "blur" }, host: { listeners: { "keydown": "keydown($event)", "keypress": "keypress($event)", "click": "click($event)" }, properties: { "class.k-dropdownlist": "this.hostClasses", "class.k-picker": "this.hostClasses", "class.k-disabled": "this.isDisabledClass", "attr.disabled": "this.isDisabledAttribute", "class.k-loading": "this.isLoading", "attr.id": "this.focusableId", "attr.dir": "this.dir", "attr.tabindex": "this.hostTabIndex", "attr.readonly": "this.readonlyAttr", "attr.aria-busy": "this.isBusy", "attr.role": "this.role", "attr.aria-haspopup": "this.haspopup", "attr.aria-expanded": "this.isAriaExpanded", "attr.aria-controls": "this.hostAriaControls", "attr.aria-invalid": "this.hostAriaInvalid", "attr.aria-activedescendant": "this.hostAriaActivedescendant" } }, providers: [
6702
+ DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: { iconClass: "iconClass", loading: "loading", data: "data", value: "value", textField: "textField", valueField: "valueField", popupSettings: "popupSettings", listHeight: "listHeight", defaultItem: "defaultItem", disabled: "disabled", itemDisabled: "itemDisabled", readonly: "readonly", filterable: "filterable", virtual: "virtual", ignoreCase: "ignoreCase", delay: "delay", valuePrimitive: "valuePrimitive", tabindex: "tabindex", tabIndex: "tabIndex", size: "size", rounded: "rounded", fillMode: "fillMode", focusableId: ["id", "focusableId"] }, outputs: { valueChange: "valueChange", filterChange: "filterChange", selectionChange: "selectionChange", open: "open", opened: "opened", close: "close", closed: "closed", onFocus: "focus", onBlur: "blur" }, host: { listeners: { "keydown": "keydown($event)", "keypress": "keypress($event)", "click": "click($event)" }, properties: { "attr.aria-controls": "this.ariaControls", "class.k-dropdownlist": "this.hostClasses", "class.k-picker": "this.hostClasses", "class.k-disabled": "this.isDisabledClass", "attr.disabled": "this.isDisabledAttribute", "class.k-loading": "this.isLoading", "attr.id": "this.focusableId", "attr.dir": "this.dir", "attr.tabindex": "this.hostTabIndex", "attr.readonly": "this.readonlyAttr", "attr.aria-busy": "this.isBusy", "attr.role": "this.role", "attr.aria-haspopup": "this.haspopup", "attr.aria-expanded": "this.isAriaExpanded", "attr.aria-invalid": "this.hostAriaInvalid", "attr.aria-activedescendant": "this.hostAriaActivedescendant" } }, providers: [
6672
6703
  DROPDOWNLIST_VALUE_ACCESSOR,
6673
6704
  DataService,
6674
6705
  SelectionService,
@@ -6692,6 +6723,12 @@ DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
6692
6723
 
6693
6724
  i18n-selectButtonText="kendo.dropdownlist.selectButtonText|The text set as aria-label on the select button"
6694
6725
  selectButtonText="Select"
6726
+
6727
+ i18n-filterInputLabel="kendo.dropdownlist.filterInputLabel|The text set as aria-label on the filter input"
6728
+ filterInputLabel="Filter"
6729
+
6730
+ i18n-popupLabel="kendo.dropdownlist.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
6731
+ popupLabel="Options list"
6695
6732
  >
6696
6733
  </ng-container>
6697
6734
  <span class="k-input-inner" unselectable="on" [id]="valueLabelId">
@@ -6727,27 +6764,26 @@ DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
6727
6764
  </button>
6728
6765
  <ng-template #popupTemplate>
6729
6766
  <!--filterable-->
6730
-
6731
6767
  <ng-template [ngIf]="filterable">
6732
6768
  <div class="k-list-filter" (click)="$event.stopImmediatePropagation()">
6733
6769
  <span
6734
6770
  class="k-searchbox k-input"
6735
- [ngClass]="filterInputClasses"
6736
- >
6771
+ [ngClass]="filterInputClasses">
6737
6772
  <kendo-icon-wrapper
6738
6773
  class="k-icon"
6774
+ innerCssClass="k-input-icon"
6739
6775
  name="search"
6740
- [svgIcon]="searchIcon"
6741
- >
6776
+ [svgIcon]="searchIcon">
6742
6777
  </kendo-icon-wrapper>
6743
6778
  <input
6744
6779
  role="searchbox"
6745
6780
  aria-autocomplete="list"
6746
6781
  aria-haspopup="listbox"
6747
- [attr.aria-controls]="ariaControls"
6782
+ [attr.aria-controls]="isOpen ? ariaControls : undefined"
6748
6783
  [attr.aria-activedescendant]="ariaActivedescendant"
6749
6784
  tabindex="-1"
6750
6785
  [filterInput]="isFocused && !touchEnabled"
6786
+ [attr.aria-label]="messageFor('filterInputLabel')"
6751
6787
  [dir]="direction"
6752
6788
  [(ngModel)]="filterText"
6753
6789
  class="k-input-inner"
@@ -6793,9 +6829,9 @@ DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
6793
6829
  <!--list-->
6794
6830
  <kendo-list
6795
6831
  #optionsList
6832
+ [id]="listBoxId"
6796
6833
  [size]="size"
6797
6834
  [rounded]="rounded"
6798
- [id]="listBoxId"
6799
6835
  [optionPrefix]="optionPrefix"
6800
6836
  [data]="data"
6801
6837
  [textField]="textField"
@@ -6807,8 +6843,7 @@ DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
6807
6843
  [show]="isOpen"
6808
6844
  [virtual]="virtual"
6809
6845
  [ariaLive]="ariaLive"
6810
- (pageChange)="pageChange($event)"
6811
- >
6846
+ (pageChange)="pageChange($event)">
6812
6847
  </kendo-list>
6813
6848
  <!--no-data template-->
6814
6849
  <div class="k-no-data" *ngIf="data.length === 0">
@@ -6863,6 +6898,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
6863
6898
 
6864
6899
  i18n-selectButtonText="kendo.dropdownlist.selectButtonText|The text set as aria-label on the select button"
6865
6900
  selectButtonText="Select"
6901
+
6902
+ i18n-filterInputLabel="kendo.dropdownlist.filterInputLabel|The text set as aria-label on the filter input"
6903
+ filterInputLabel="Filter"
6904
+
6905
+ i18n-popupLabel="kendo.dropdownlist.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
6906
+ popupLabel="Options list"
6866
6907
  >
6867
6908
  </ng-container>
6868
6909
  <span class="k-input-inner" unselectable="on" [id]="valueLabelId">
@@ -6898,27 +6939,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
6898
6939
  </button>
6899
6940
  <ng-template #popupTemplate>
6900
6941
  <!--filterable-->
6901
-
6902
6942
  <ng-template [ngIf]="filterable">
6903
6943
  <div class="k-list-filter" (click)="$event.stopImmediatePropagation()">
6904
6944
  <span
6905
6945
  class="k-searchbox k-input"
6906
- [ngClass]="filterInputClasses"
6907
- >
6946
+ [ngClass]="filterInputClasses">
6908
6947
  <kendo-icon-wrapper
6909
6948
  class="k-icon"
6949
+ innerCssClass="k-input-icon"
6910
6950
  name="search"
6911
- [svgIcon]="searchIcon"
6912
- >
6951
+ [svgIcon]="searchIcon">
6913
6952
  </kendo-icon-wrapper>
6914
6953
  <input
6915
6954
  role="searchbox"
6916
6955
  aria-autocomplete="list"
6917
6956
  aria-haspopup="listbox"
6918
- [attr.aria-controls]="ariaControls"
6957
+ [attr.aria-controls]="isOpen ? ariaControls : undefined"
6919
6958
  [attr.aria-activedescendant]="ariaActivedescendant"
6920
6959
  tabindex="-1"
6921
6960
  [filterInput]="isFocused && !touchEnabled"
6961
+ [attr.aria-label]="messageFor('filterInputLabel')"
6922
6962
  [dir]="direction"
6923
6963
  [(ngModel)]="filterText"
6924
6964
  class="k-input-inner"
@@ -6964,9 +7004,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
6964
7004
  <!--list-->
6965
7005
  <kendo-list
6966
7006
  #optionsList
7007
+ [id]="listBoxId"
6967
7008
  [size]="size"
6968
7009
  [rounded]="rounded"
6969
- [id]="listBoxId"
6970
7010
  [optionPrefix]="optionPrefix"
6971
7011
  [data]="data"
6972
7012
  [textField]="textField"
@@ -6978,8 +7018,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
6978
7018
  [show]="isOpen"
6979
7019
  [virtual]="virtual"
6980
7020
  [ariaLive]="ariaLive"
6981
- (pageChange)="pageChange($event)"
6982
- >
7021
+ (pageChange)="pageChange($event)">
6983
7022
  </kendo-list>
6984
7023
  <!--no-data template-->
6985
7024
  <div class="k-no-data" *ngIf="data.length === 0">
@@ -7010,7 +7049,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
7010
7049
  }, {
7011
7050
  type: Inject,
7012
7051
  args: [TOUCH_ENABLED]
7013
- }] }, { type: i0.Injector }]; }, propDecorators: { iconClass: [{
7052
+ }] }, { type: i0.Injector }]; }, propDecorators: { ariaControls: [{
7053
+ type: HostBinding,
7054
+ args: ['attr.aria-controls']
7055
+ }], iconClass: [{
7014
7056
  type: Input
7015
7057
  }], loading: [{
7016
7058
  type: Input
@@ -7150,9 +7192,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
7150
7192
  }], isAriaExpanded: [{
7151
7193
  type: HostBinding,
7152
7194
  args: ['attr.aria-expanded']
7153
- }], hostAriaControls: [{
7154
- type: HostBinding,
7155
- args: ['attr.aria-controls']
7156
7195
  }], hostAriaInvalid: [{
7157
7196
  type: HostBinding,
7158
7197
  args: ['attr.aria-invalid']
@@ -7614,8 +7653,8 @@ class MultiSelectComponent {
7614
7653
  * @hidden
7615
7654
  */
7616
7655
  this.plusIcon = plusIcon;
7617
- this.listBoxId = guid();
7618
- this.tagListId = guid();
7656
+ this.listBoxId = `k-${guid()}`;
7657
+ this.tagListId = `k-${guid()}`;
7619
7658
  this.tagPrefix = "tag-" + guid();
7620
7659
  this.optionPrefix = "option-" + guid();
7621
7660
  this.focusedTagIndex = undefined;
@@ -7796,6 +7835,12 @@ class MultiSelectComponent {
7796
7835
  this.subscribeEvents();
7797
7836
  this.subscribeTouchEvents();
7798
7837
  }
7838
+ /**
7839
+ * @hidden
7840
+ */
7841
+ get ariaControls() {
7842
+ return this.isOpen ? this.listBoxId : undefined;
7843
+ }
7799
7844
  /**
7800
7845
  * Focuses a specific item of the MultiSelect based on a provided index.
7801
7846
  * If there is a custom item it is positioned at index -1.
@@ -8920,6 +8965,10 @@ class MultiSelectComponent {
8920
8965
  });
8921
8966
  const popupWrapper = this.popupRef.popupElement;
8922
8967
  const { min, max } = this.width;
8968
+ if (!this.appendTo) {
8969
+ this.renderer.setAttribute(popupWrapper, 'role', 'region');
8970
+ this.renderer.setAttribute(popupWrapper, 'aria-label', this.messageFor('popupLabel'));
8971
+ }
8923
8972
  popupWrapper.addEventListener('mousedown', this.popupMouseDownHandler);
8924
8973
  popupWrapper.style.minWidth = min;
8925
8974
  popupWrapper.style.width = max;
@@ -9012,6 +9061,9 @@ MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
9012
9061
 
9013
9062
  i18n-clearTitle="kendo.multiselect.clearTitle|The title of the clear button"
9014
9063
  clearTitle="clear"
9064
+
9065
+ i18n-popupLabel="kendo.multiselect.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
9066
+ popupLabel="Options list"
9015
9067
  >
9016
9068
  </ng-container>
9017
9069
  <kendo-taglist
@@ -9032,10 +9084,11 @@ MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
9032
9084
  >
9033
9085
  <kendo-searchbar
9034
9086
  #searchbar
9087
+ [ariaExpanded]="isOpen"
9088
+ [ariaControls]="ariaControls"
9035
9089
  [id]="focusableId"
9036
9090
  [role]="'combobox'"
9037
9091
  [tagListId]="tagListId"
9038
- [listId]="listBoxId"
9039
9092
  [isLoading]="loading"
9040
9093
  [isFilterable]="filterable"
9041
9094
  [activeDescendant]="activeDescendant"
@@ -9043,7 +9096,6 @@ MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
9043
9096
  [disabled]="disabled"
9044
9097
  [readonly]="readonly"
9045
9098
  [tabIndex]="tabIndex"
9046
- [popupOpen]="isOpen"
9047
9099
  [placeholder]="placeholder"
9048
9100
  (onNavigate)="handleNavigate($event)"
9049
9101
  (valueChange)="handleFilter($event)"
@@ -9147,7 +9199,7 @@ MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
9147
9199
  <kendo-resize-sensor (resize)="onResize()"></kendo-resize-sensor>
9148
9200
  </ng-template>
9149
9201
  <ng-container #container></ng-container>
9150
- `, isInline: true, components: [{ type: TagListComponent, selector: "kendo-taglist", inputs: ["tags", "textField", "valueField", "valueDepth", "focused", "template", "groupTemplate", "disabled", "tagPrefix", "id", "size", "rounded", "fillMode", "disabledIndices"], outputs: ["removeTag"] }, { type: SearchBarComponent, selector: "kendo-searchbar", inputs: ["id", "listId", "tagListId", "activeDescendant", "disabled", "readonly", "tabIndex", "popupOpen", "role", "isLoading", "isSuggestable", "isFilterable", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: i8.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "ariaLive", "isMultiselect", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i10.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: LocalizedMessagesDirective, selector: "\n [kendoDropDownListLocalizedMessages],\n [kendoDropDownTreeLocalizedMessages],\n [kendoComboBoxLocalizedMessages],\n [kendoMultiColumnComboBoxLocalizedMessages],\n [kendoAutoCompleteLocalizedMessages],\n [kendoMultiSelectLocalizedMessages],\n [kendoMultiSelectTreeLocalizedMessages]\n " }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: SelectableDirective, selector: "[kendoDropDownsSelectable]", inputs: ["index", "checkboxes", "height", "multipleSelection"] }] });
9202
+ `, isInline: true, components: [{ type: TagListComponent, selector: "kendo-taglist", inputs: ["tags", "textField", "valueField", "valueDepth", "focused", "template", "groupTemplate", "disabled", "tagPrefix", "id", "size", "rounded", "fillMode", "disabledIndices"], outputs: ["removeTag"] }, { type: SearchBarComponent, selector: "kendo-searchbar", inputs: ["id", "tagListId", "activeDescendant", "disabled", "readonly", "tabIndex", "role", "isLoading", "ariaControls", "ariaExpanded", "isSuggestable", "isFilterable", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: i8.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "ariaLive", "isMultiselect", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i10.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: LocalizedMessagesDirective, selector: "\n [kendoDropDownListLocalizedMessages],\n [kendoDropDownTreeLocalizedMessages],\n [kendoComboBoxLocalizedMessages],\n [kendoMultiColumnComboBoxLocalizedMessages],\n [kendoAutoCompleteLocalizedMessages],\n [kendoMultiSelectLocalizedMessages],\n [kendoMultiSelectTreeLocalizedMessages]\n " }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: SelectableDirective, selector: "[kendoDropDownsSelectable]", inputs: ["index", "checkboxes", "height", "multipleSelection"] }] });
9151
9203
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: MultiSelectComponent, decorators: [{
9152
9204
  type: Component,
9153
9205
  args: [{
@@ -9178,6 +9230,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
9178
9230
 
9179
9231
  i18n-clearTitle="kendo.multiselect.clearTitle|The title of the clear button"
9180
9232
  clearTitle="clear"
9233
+
9234
+ i18n-popupLabel="kendo.multiselect.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
9235
+ popupLabel="Options list"
9181
9236
  >
9182
9237
  </ng-container>
9183
9238
  <kendo-taglist
@@ -9198,10 +9253,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
9198
9253
  >
9199
9254
  <kendo-searchbar
9200
9255
  #searchbar
9256
+ [ariaExpanded]="isOpen"
9257
+ [ariaControls]="ariaControls"
9201
9258
  [id]="focusableId"
9202
9259
  [role]="'combobox'"
9203
9260
  [tagListId]="tagListId"
9204
- [listId]="listBoxId"
9205
9261
  [isLoading]="loading"
9206
9262
  [isFilterable]="filterable"
9207
9263
  [activeDescendant]="activeDescendant"
@@ -9209,7 +9265,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
9209
9265
  [disabled]="disabled"
9210
9266
  [readonly]="readonly"
9211
9267
  [tabIndex]="tabIndex"
9212
- [popupOpen]="isOpen"
9213
9268
  [placeholder]="placeholder"
9214
9269
  (onNavigate)="handleNavigate($event)"
9215
9270
  (valueChange)="handleFilter($event)"
@@ -9753,13 +9808,16 @@ MultiColumnComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
9753
9808
 
9754
9809
  i18n-selectButtonText="kendo.multicolumncombobox.selectButtonText|The title of the select button"
9755
9810
  selectButtonText="Select"
9756
- >
9757
- </ng-container>
9811
+
9812
+ i18n-popupLabel="kendo.multicolumncombobox.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
9813
+ popupLabel="Options list"
9814
+ ></ng-container>
9758
9815
  <kendo-searchbar
9759
9816
  #searchbar
9760
9817
  [role]="'combobox'"
9818
+ [ariaExpanded]="isOpen"
9819
+ [ariaControls]="ariaControls"
9761
9820
  [id]="focusableId"
9762
- [listId]="listBoxId"
9763
9821
  [isLoading]="loading"
9764
9822
  [isSuggestable]="suggest"
9765
9823
  [isFilterable]="filterable"
@@ -9769,7 +9827,6 @@ MultiColumnComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
9769
9827
  [disabled]="disabled"
9770
9828
  [readonly]="readonly"
9771
9829
  [tabIndex]="tabIndex"
9772
- [popupOpen]="isOpen"
9773
9830
  [placeholder]="placeholder"
9774
9831
  (onNavigate)="handleNavigate($event)"
9775
9832
  (valueChange)="searchBarChange($event)"
@@ -9905,7 +9962,6 @@ MultiColumnComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
9905
9962
  <!--list-->
9906
9963
  <kendo-list
9907
9964
  #optionsList
9908
- [id]="listBoxId"
9909
9965
  [optionPrefix]="optionPrefix"
9910
9966
  [data]="data"
9911
9967
  [textField]="textField"
@@ -9971,7 +10027,7 @@ MultiColumnComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
9971
10027
 
9972
10028
  <!-- when the popupSettings.appendTo value is set to 'component', this container is used -->
9973
10029
  <ng-container #container></ng-container>
9974
- `, isInline: true, components: [{ type: SearchBarComponent, selector: "kendo-searchbar", inputs: ["id", "listId", "tagListId", "activeDescendant", "disabled", "readonly", "tabIndex", "popupOpen", "role", "isLoading", "isSuggestable", "isFilterable", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: i8.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "ariaLive", "isMultiselect", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i10.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: LocalizedMessagesDirective, selector: "\n [kendoDropDownListLocalizedMessages],\n [kendoDropDownTreeLocalizedMessages],\n [kendoComboBoxLocalizedMessages],\n [kendoMultiColumnComboBoxLocalizedMessages],\n [kendoAutoCompleteLocalizedMessages],\n [kendoMultiSelectLocalizedMessages],\n [kendoMultiSelectTreeLocalizedMessages]\n " }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
10030
+ `, isInline: true, components: [{ type: SearchBarComponent, selector: "kendo-searchbar", inputs: ["id", "tagListId", "activeDescendant", "disabled", "readonly", "tabIndex", "role", "isLoading", "ariaControls", "ariaExpanded", "isSuggestable", "isFilterable", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: i8.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "ariaLive", "isMultiselect", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i10.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: LocalizedMessagesDirective, selector: "\n [kendoDropDownListLocalizedMessages],\n [kendoDropDownTreeLocalizedMessages],\n [kendoComboBoxLocalizedMessages],\n [kendoMultiColumnComboBoxLocalizedMessages],\n [kendoAutoCompleteLocalizedMessages],\n [kendoMultiSelectLocalizedMessages],\n [kendoMultiSelectTreeLocalizedMessages]\n " }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
9975
10031
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: MultiColumnComboBoxComponent, decorators: [{
9976
10032
  type: Component,
9977
10033
  args: [{
@@ -10012,13 +10068,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
10012
10068
 
10013
10069
  i18n-selectButtonText="kendo.multicolumncombobox.selectButtonText|The title of the select button"
10014
10070
  selectButtonText="Select"
10015
- >
10016
- </ng-container>
10071
+
10072
+ i18n-popupLabel="kendo.multicolumncombobox.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
10073
+ popupLabel="Options list"
10074
+ ></ng-container>
10017
10075
  <kendo-searchbar
10018
10076
  #searchbar
10019
10077
  [role]="'combobox'"
10078
+ [ariaExpanded]="isOpen"
10079
+ [ariaControls]="ariaControls"
10020
10080
  [id]="focusableId"
10021
- [listId]="listBoxId"
10022
10081
  [isLoading]="loading"
10023
10082
  [isSuggestable]="suggest"
10024
10083
  [isFilterable]="filterable"
@@ -10028,7 +10087,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
10028
10087
  [disabled]="disabled"
10029
10088
  [readonly]="readonly"
10030
10089
  [tabIndex]="tabIndex"
10031
- [popupOpen]="isOpen"
10032
10090
  [placeholder]="placeholder"
10033
10091
  (onNavigate)="handleNavigate($event)"
10034
10092
  (valueChange)="searchBarChange($event)"
@@ -10164,7 +10222,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
10164
10222
  <!--list-->
10165
10223
  <kendo-list
10166
10224
  #optionsList
10167
- [id]="listBoxId"
10168
10225
  [optionPrefix]="optionPrefix"
10169
10226
  [data]="data"
10170
10227
  [textField]="textField"
@@ -10440,10 +10497,10 @@ class DropDownTreeComponent {
10440
10497
  * Used to associate the value label with the wrapper via aria-describedby.
10441
10498
  */
10442
10499
  this.valueLabelId = `k-${guid$1()}`;
10500
+ this.treeViewId = `k-${guid$1()}`;
10443
10501
  this._popupSettings = DEFAULT_POPUP_SETTINGS$1;
10444
10502
  this._tabindex = 0;
10445
10503
  this._isFocused = false;
10446
- this._popupId = guid$1();
10447
10504
  this._size = 'medium';
10448
10505
  this._rounded = 'medium';
10449
10506
  this._fillMode = 'solid';
@@ -10474,7 +10531,7 @@ class DropDownTreeComponent {
10474
10531
  return this.loading ? 'true' : null;
10475
10532
  }
10476
10533
  get hostAriaControls() {
10477
- return this.isOpen ? this._popupId : null;
10534
+ return this.isOpen ? this.treeViewId : undefined;
10478
10535
  }
10479
10536
  get id() {
10480
10537
  return this.focusableId;
@@ -11070,7 +11127,7 @@ class DropDownTreeComponent {
11070
11127
  onChildrenLoaded() {
11071
11128
  setTimeout(() => {
11072
11129
  if (this.popupRef) {
11073
- this._searchableNodes = getSearchableItems(this._popupId, this.popupRef.popupElement);
11130
+ this._searchableNodes = getSearchableItems(this.treeViewId, this.popupRef.popupElement);
11074
11131
  }
11075
11132
  });
11076
11133
  }
@@ -11126,11 +11183,14 @@ class DropDownTreeComponent {
11126
11183
  this.renderer.setStyle(popupWrapper, 'width', max);
11127
11184
  this.renderer.setStyle(popupWrapper, 'height', this.height);
11128
11185
  this.renderer.setAttribute(popupWrapper, 'dir', this.direction);
11129
- this.renderer.setAttribute(popupWrapper, 'id', this._popupId);
11186
+ if (!this.appendTo) {
11187
+ this.renderer.setAttribute(popupWrapper, 'role', 'region');
11188
+ this.renderer.setAttribute(popupWrapper, 'aria-label', this.messageFor('popupLabel'));
11189
+ }
11130
11190
  this.popupRef.popupOpen.subscribe(() => {
11131
11191
  this.cdr.detectChanges();
11132
11192
  this.opened.emit();
11133
- this._searchableNodes = getSearchableItems(this._popupId, this.popupRef.popupElement);
11193
+ this._searchableNodes = getSearchableItems(this.treeViewId, this.popupRef.popupElement);
11134
11194
  });
11135
11195
  this.popupRef.popupClose.subscribe(() => {
11136
11196
  this.closed.emit();
@@ -11350,6 +11410,12 @@ DropDownTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
11350
11410
 
11351
11411
  i18n-selectButtonText="kendo.dropdowntree.selectButtonText|The text set as aria-label on the select button"
11352
11412
  selectButtonText="Select"
11413
+
11414
+ i18n-filterInputLabel="kendo.dropdowntree.filterInputLabel|The text set as aria-label on the filter input"
11415
+ filterInputLabel="Filter"
11416
+
11417
+ i18n-popupLabel="kendo.dropdowntree.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
11418
+ popupLabel="Options list"
11353
11419
  >
11354
11420
  </ng-container>
11355
11421
  <span
@@ -11420,14 +11486,10 @@ DropDownTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
11420
11486
  [filterInput]="filterable && !touchEnabled"
11421
11487
  (keydown.arrowdown)="handleKeydown($event)"
11422
11488
  (keydown.alt.arrowup)="handleKeydown($event)"
11489
+ [attr.aria-label]="messageFor('filterInputLabel')"
11423
11490
  [(ngModel)]="filter"
11424
11491
  class="k-input-inner"
11425
11492
  role="textbox"
11426
- aria-haspopup="true"
11427
- aria-expanded="false"
11428
- tabindex="0"
11429
- aria-disabled="false"
11430
- aria-readonly="false"
11431
11493
  [kendoEventsOutsideAngular]="{
11432
11494
  blur: handleBlur
11433
11495
  }"
@@ -11444,6 +11506,7 @@ DropDownTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
11444
11506
  </ng-template>
11445
11507
  <kendo-treeview
11446
11508
  #treeview
11509
+ [attr.id]="treeViewId"
11447
11510
  *ngIf="data.length !== 0 && !allNodesHidden"
11448
11511
  [size]="size"
11449
11512
  [nodes]="data"
@@ -11533,6 +11596,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11533
11596
 
11534
11597
  i18n-selectButtonText="kendo.dropdowntree.selectButtonText|The text set as aria-label on the select button"
11535
11598
  selectButtonText="Select"
11599
+
11600
+ i18n-filterInputLabel="kendo.dropdowntree.filterInputLabel|The text set as aria-label on the filter input"
11601
+ filterInputLabel="Filter"
11602
+
11603
+ i18n-popupLabel="kendo.dropdowntree.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
11604
+ popupLabel="Options list"
11536
11605
  >
11537
11606
  </ng-container>
11538
11607
  <span
@@ -11603,14 +11672,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11603
11672
  [filterInput]="filterable && !touchEnabled"
11604
11673
  (keydown.arrowdown)="handleKeydown($event)"
11605
11674
  (keydown.alt.arrowup)="handleKeydown($event)"
11675
+ [attr.aria-label]="messageFor('filterInputLabel')"
11606
11676
  [(ngModel)]="filter"
11607
11677
  class="k-input-inner"
11608
11678
  role="textbox"
11609
- aria-haspopup="true"
11610
- aria-expanded="false"
11611
- tabindex="0"
11612
- aria-disabled="false"
11613
- aria-readonly="false"
11614
11679
  [kendoEventsOutsideAngular]="{
11615
11680
  blur: handleBlur
11616
11681
  }"
@@ -11627,6 +11692,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11627
11692
  </ng-template>
11628
11693
  <kendo-treeview
11629
11694
  #treeview
11695
+ [attr.id]="treeViewId"
11630
11696
  *ngIf="data.length !== 0 && !allNodesHidden"
11631
11697
  [size]="size"
11632
11698
  [nodes]="data"
@@ -12294,6 +12360,7 @@ class MultiSelectTreeComponent {
12294
12360
  */
12295
12361
  this.xIcon = xIcon;
12296
12362
  this.hostClasses = true;
12363
+ this.treeViewId = `k-${guid$1()}`;
12297
12364
  this.role = 'combobox';
12298
12365
  this.ariaHasPopup = 'tree';
12299
12366
  /**
@@ -12446,7 +12513,7 @@ class MultiSelectTreeComponent {
12446
12513
  * @hidden
12447
12514
  */
12448
12515
  this.allNodesHidden = false;
12449
- this.tagListId = guid$1();
12516
+ this.tagListId = `k-${guid$1()}`;
12450
12517
  this.tagPrefix = "tag-" + guid$1();
12451
12518
  this.focusedTagIndex = undefined;
12452
12519
  this._value = [];
@@ -12454,7 +12521,6 @@ class MultiSelectTreeComponent {
12454
12521
  this._popupSettings = DEFAULT_POPUP_SETTINGS;
12455
12522
  this._checkableSettings = DEFAULT_CHECKABLE_SETTINGS;
12456
12523
  this._isFocused = false;
12457
- this._popupId = guid$1();
12458
12524
  this._size = 'medium';
12459
12525
  this._rounded = 'medium';
12460
12526
  this._fillMode = 'solid';
@@ -12473,7 +12539,7 @@ class MultiSelectTreeComponent {
12473
12539
  return this.disabled;
12474
12540
  }
12475
12541
  get hostAriaControls() {
12476
- return this.isOpen ? this._popupId : null;
12542
+ return this.isOpen ? this.treeViewId : null;
12477
12543
  }
12478
12544
  get hostAriaAutocomplete() {
12479
12545
  return this.filterable ? 'list' : null;
@@ -13274,16 +13340,19 @@ class MultiSelectTreeComponent {
13274
13340
  });
13275
13341
  const popupWrapper = this.popupRef.popupElement;
13276
13342
  const { min, max } = this.width;
13343
+ if (!this.appendTo) {
13344
+ this.renderer.setAttribute(popupWrapper, 'role', 'region');
13345
+ this.renderer.setAttribute(popupWrapper, 'aria-label', this.messageFor('popupLabel'));
13346
+ }
13277
13347
  popupWrapper.style.minWidth = min;
13278
13348
  popupWrapper.style.width = max;
13279
13349
  popupWrapper.style.height = this.height;
13280
13350
  this.renderer.setAttribute(popupWrapper, 'dir', this.direction);
13281
13351
  this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-expanded', 'true');
13282
- this.renderer.setAttribute(popupWrapper, 'id', this._popupId);
13283
13352
  this.popupRef.popupOpen.subscribe(() => {
13284
13353
  this.cdr.detectChanges();
13285
13354
  this.opened.emit();
13286
- this._searchableNodes = getSearchableItems(this._popupId, this.popupRef.popupElement);
13355
+ this._searchableNodes = getSearchableItems(this.treeViewId, this.popupRef.popupElement);
13287
13356
  });
13288
13357
  this.popupRef.popupClose.subscribe(() => {
13289
13358
  this.closed.emit();
@@ -13512,7 +13581,7 @@ class MultiSelectTreeComponent {
13512
13581
  onChildrenLoaded() {
13513
13582
  setTimeout(() => {
13514
13583
  if (this.popupRef) {
13515
- this._searchableNodes = getSearchableItems(this._popupId, this.popupRef.popupElement);
13584
+ this._searchableNodes = getSearchableItems(this.treeViewId, this.popupRef.popupElement);
13516
13585
  }
13517
13586
  });
13518
13587
  }
@@ -13618,6 +13687,12 @@ MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
13618
13687
 
13619
13688
  i18n-checkAllText="kendo.multiselecttree.checkAllText|The text displayed for the check-all checkbox"
13620
13689
  checkAllText="Check all"
13690
+
13691
+ i18n-filterInputLabel="kendo.multiselecttree.filterInputLabel|The text set as aria-label on the filter input"
13692
+ filterInputLabel="Filter"
13693
+
13694
+ i18n-popupLabel="kendo.multiselecttree.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
13695
+ popupLabel="Options list"
13621
13696
  >
13622
13697
  </ng-container>
13623
13698
  <kendo-taglist
@@ -13684,6 +13759,7 @@ MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
13684
13759
  #filterInput
13685
13760
  (input)="handleFilterInputChange($event.target)"
13686
13761
  [filterInput]="filterable && !touchEnabled"
13762
+ [attr.aria-label]="messageFor('filterInputLabel')"
13687
13763
  (keydown)="handleKeydown($event)"
13688
13764
  [(ngModel)]="filter"
13689
13765
  class="k-input-inner"
@@ -13740,6 +13816,7 @@ MultiSelectTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
13740
13816
  <kendo-treeview
13741
13817
  #treeview
13742
13818
  [size]="size"
13819
+ [attr.id]="treeViewId"
13743
13820
  [nodes]="data"
13744
13821
  [style.maxHeight.px]="listHeight"
13745
13822
  [animate]="false"
@@ -13834,6 +13911,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
13834
13911
 
13835
13912
  i18n-checkAllText="kendo.multiselecttree.checkAllText|The text displayed for the check-all checkbox"
13836
13913
  checkAllText="Check all"
13914
+
13915
+ i18n-filterInputLabel="kendo.multiselecttree.filterInputLabel|The text set as aria-label on the filter input"
13916
+ filterInputLabel="Filter"
13917
+
13918
+ i18n-popupLabel="kendo.multiselecttree.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
13919
+ popupLabel="Options list"
13837
13920
  >
13838
13921
  </ng-container>
13839
13922
  <kendo-taglist
@@ -13900,6 +13983,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
13900
13983
  #filterInput
13901
13984
  (input)="handleFilterInputChange($event.target)"
13902
13985
  [filterInput]="filterable && !touchEnabled"
13986
+ [attr.aria-label]="messageFor('filterInputLabel')"
13903
13987
  (keydown)="handleKeydown($event)"
13904
13988
  [(ngModel)]="filter"
13905
13989
  class="k-input-inner"
@@ -13956,6 +14040,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
13956
14040
  <kendo-treeview
13957
14041
  #treeview
13958
14042
  [size]="size"
14043
+ [attr.id]="treeViewId"
13959
14044
  [nodes]="data"
13960
14045
  [style.maxHeight.px]="listHeight"
13961
14046
  [animate]="false"