@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.
@@ -75,6 +75,7 @@ export declare class AutoCompleteComponent implements ControlValueAccessor, OnDe
75
75
  get suggestion(): string;
76
76
  get appendTo(): ViewContainerRef;
77
77
  get clearButtonVisiblity(): string;
78
+ get ariaControls(): string;
78
79
  dataItem: any;
79
80
  /**
80
81
  * Toggles the visibility of the popup.
@@ -73,6 +73,10 @@ export declare class ComboBoxComponent implements ControlValueAccessor, OnDestro
73
73
  caretAltDownIcon: SVGIcon;
74
74
  set text(text: any);
75
75
  get text(): any;
76
+ /**
77
+ * @hidden
78
+ */
79
+ get ariaControls(): string;
76
80
  /**
77
81
  * @hidden
78
82
  */
@@ -24,6 +24,14 @@ export declare class Messages extends ComponentMessages {
24
24
  * The text set as aria-label on the select button.
25
25
  */
26
26
  selectButtonText: string;
27
+ /**
28
+ * The text set as aria-label on the list filter input.
29
+ */
30
+ filterInputLabel: string;
31
+ /**
32
+ * The text set as aria-label on the popup containing the list of options when its role is `region`.
33
+ */
34
+ popupLabel: string;
27
35
  static ɵfac: i0.ɵɵFactoryDeclaration<Messages, never>;
28
- static ɵdir: i0.ɵɵDirectiveDeclaration<Messages, never, never, { "noDataText": "noDataText"; "clearTitle": "clearTitle"; "checkAllText": "checkAllText"; "selectButtonText": "selectButtonText"; }, {}, never>;
36
+ static ɵdir: i0.ɵɵDirectiveDeclaration<Messages, never, never, { "noDataText": "noDataText"; "clearTitle": "clearTitle"; "checkAllText": "checkAllText"; "selectButtonText": "selectButtonText"; "filterInputLabel": "filterInputLabel"; "popupLabel": "popupLabel"; }, {}, never>;
29
37
  }
@@ -15,15 +15,15 @@ export declare class SearchBarComponent implements OnChanges, OnInit, OnDestroy
15
15
  private injector;
16
16
  direction: Direction;
17
17
  id: string;
18
- listId: string;
19
18
  tagListId: string;
20
19
  activeDescendant: string;
21
20
  disabled: boolean;
22
21
  readonly: boolean;
23
22
  tabIndex: number;
24
- popupOpen: boolean;
25
23
  role: string;
26
24
  isLoading: boolean;
25
+ ariaControls: string;
26
+ ariaExpanded: boolean | null;
27
27
  set isSuggestable(isSuggestable: boolean);
28
28
  get isSuggestable(): boolean;
29
29
  set isFilterable(isFilterable: boolean);
@@ -45,7 +45,6 @@ export declare class SearchBarComponent implements OnChanges, OnInit, OnDestroy
45
45
  get value(): string;
46
46
  set placeholder(text: string);
47
47
  get placeholder(): string;
48
- get ariaExpanded(): boolean;
49
48
  private _userInput;
50
49
  private _previousValue;
51
50
  private _placeholder;
@@ -68,5 +67,5 @@ export declare class SearchBarComponent implements OnChanges, OnInit, OnDestroy
68
67
  blur(): void;
69
68
  setInputSize(): void;
70
69
  static ɵfac: i0.ɵɵFactoryDeclaration<SearchBarComponent, never>;
71
- static ɵcmp: i0.ɵɵComponentDeclaration<SearchBarComponent, "kendo-searchbar", never, { "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"; }, { "valueChange": "valueChange"; "onBlur": "onBlur"; "onFocus": "onFocus"; "onClick": "onClick"; "onNavigate": "onNavigate"; }, never, never>;
70
+ static ɵcmp: i0.ɵɵComponentDeclaration<SearchBarComponent, "kendo-searchbar", never, { "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"; }, { "valueChange": "valueChange"; "onBlur": "onBlur"; "onFocus": "onFocus"; "onClick": "onClick"; "onNavigate": "onNavigate"; }, never, never>;
72
71
  }
package/common/util.d.ts CHANGED
@@ -161,12 +161,6 @@ export declare const getFillModeClass: (component: string, fillMode: DropDownFil
161
161
  * @hidden
162
162
  */
163
163
  export declare const filterAndMap: (arr: any[], predicate: (item: any) => boolean, mapper: (item: any) => any) => any[];
164
- /**
165
- * @hidden
166
- *
167
- * Returns true if the used browser is Safari.
168
- */
169
- export declare const isSafari: (userAgent: any) => boolean;
170
164
  /**
171
165
  * @hidden
172
166
  *
@@ -184,7 +178,7 @@ export declare const getTextField: (field: string | string[], level: number) =>
184
178
  /**
185
179
  * @hidden
186
180
  */
187
- export declare const getSearchableItems: (popupId: string, popupElement: HTMLElement) => {
181
+ export declare const getSearchableItems: (treeViewId: string, popupElement: HTMLElement) => {
188
182
  text: string;
189
183
  index: string;
190
184
  }[];
@@ -76,6 +76,7 @@ export declare class DropDownListComponent implements ControlValueAccessor, OnDe
76
76
  get height(): any;
77
77
  get widgetTabIndex(): number;
78
78
  get ariaExpanded(): boolean;
79
+ listBoxId: string;
79
80
  get ariaControls(): string;
80
81
  get ariaActivedescendant(): string;
81
82
  get appendTo(): ViewContainerRef;
@@ -315,7 +316,6 @@ export declare class DropDownListComponent implements ControlValueAccessor, OnDe
315
316
  role: string;
316
317
  haspopup: string;
317
318
  get isAriaExpanded(): boolean;
318
- get hostAriaControls(): string;
319
319
  get hostAriaInvalid(): string;
320
320
  get hostAriaActivedescendant(): string;
321
321
  /**
@@ -331,7 +331,6 @@ export declare class DropDownListComponent implements ControlValueAccessor, OnDe
331
331
  */
332
332
  click(event: any): void;
333
333
  groupIndices: any[];
334
- listBoxId: string;
335
334
  optionPrefix: string;
336
335
  valueLabelId: string;
337
336
  filterText: string;
@@ -381,6 +381,7 @@ export declare class DropDownTreeComponent implements OnInit, OnDestroy, OnChang
381
381
  * @hidden
382
382
  */
383
383
  get formControl(): FormControl;
384
+ treeViewId: string;
384
385
  private _nodes;
385
386
  private _value;
386
387
  private _popupSettings;
@@ -388,7 +389,6 @@ export declare class DropDownTreeComponent implements OnInit, OnDestroy, OnChang
388
389
  private _isFocused;
389
390
  private _dataItem;
390
391
  private _treeview;
391
- private _popupId;
392
392
  private _size;
393
393
  private _rounded;
394
394
  private _fillMode;
@@ -51,6 +51,7 @@ export declare class MultiSelectTreeComponent implements OnInit, OnDestroy, OnCh
51
51
  xIcon: SVGIcon;
52
52
  hostClasses: boolean;
53
53
  get isDisabled(): boolean;
54
+ treeViewId: string;
54
55
  get hostAriaControls(): string;
55
56
  get hostAriaAutocomplete(): string;
56
57
  get isLoading(): boolean;
@@ -438,7 +439,6 @@ export declare class MultiSelectTreeComponent implements OnInit, OnDestroy, OnCh
438
439
  private _isFocused;
439
440
  private _treeview;
440
441
  private _dataItems;
441
- private _popupId;
442
442
  private _size;
443
443
  private _rounded;
444
444
  private _fillMode;
@@ -178,8 +178,8 @@ export class AutoCompleteComponent {
178
178
  */
179
179
  this.onBlur = new EventEmitter();
180
180
  this.widgetClasses = true;
181
- this.listBoxId = guid();
182
- this.optionPrefix = guid();
181
+ this.listBoxId = `k-${guid()}`;
182
+ this.optionPrefix = `k-${guid()}`;
183
183
  this.onChangeCallback = noop;
184
184
  this.onTouchedCallback = noop;
185
185
  this.popupMouseDownHandler = (event) => event.preventDefault();
@@ -243,6 +243,9 @@ export class AutoCompleteComponent {
243
243
  return 'visible';
244
244
  }
245
245
  }
246
+ get ariaControls() {
247
+ return this.isOpen ? this.listBoxId : undefined;
248
+ }
246
249
  /**
247
250
  * Toggles the visibility of the popup.
248
251
  * If you use the `toggle` method to open or close the popup, the `open` and `close` events will not be fired.
@@ -815,9 +818,9 @@ export class AutoCompleteComponent {
815
818
  if (this.virtual) {
816
819
  this.virtual.skip = 0;
817
820
  }
818
- const horizontalAlign = this.direction === "rtl" ? "right" : "left";
819
- const anchorPosition = { horizontal: horizontalAlign, vertical: "bottom" };
820
- const popupPosition = { horizontal: horizontalAlign, vertical: "top" };
821
+ const horizontalAlign = this.direction === 'rtl' ? 'right' : 'left';
822
+ const anchorPosition = { horizontal: horizontalAlign, vertical: 'bottom' };
823
+ const popupPosition = { horizontal: horizontalAlign, vertical: 'top' };
821
824
  this.popupRef = this.popupService.open({
822
825
  anchor: this.wrapper,
823
826
  animate: this.popupSettings.animate,
@@ -834,7 +837,11 @@ export class AutoCompleteComponent {
834
837
  popupWrapper.style.minWidth = min;
835
838
  popupWrapper.style.width = max;
836
839
  popupWrapper.style.height = this.height;
837
- popupWrapper.setAttribute("dir", this.direction);
840
+ popupWrapper.setAttribute('dir', this.direction);
841
+ if (!this.appendTo) {
842
+ this.renderer.setAttribute(popupWrapper, 'role', 'region');
843
+ this.renderer.setAttribute(popupWrapper, 'aria-label', this.messageFor('popupLabel'));
844
+ }
838
845
  const listBox = popupWrapper.querySelector('ul.k-list-ul');
839
846
  const ariaLabel = this.searchbar.input.nativeElement.getAttribute('aria-labelledby');
840
847
  if (ariaLabel) {
@@ -939,22 +946,26 @@ AutoCompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
939
946
 
940
947
  i18n-clearTitle="kendo.autocomplete.clearTitle|The title of the clear button"
941
948
  clearTitle="clear"
949
+
950
+ i18n-popupLabel="kendo.autocomplete.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
951
+ popupLabel="Options list"
942
952
  >
943
953
  </ng-container>
944
954
  <kendo-searchbar #searchbar
945
955
  [role]="'combobox'"
956
+ [ariaExpanded]="isOpen"
957
+ [ariaControls]="ariaControls"
946
958
  [isSuggestable]="suggest"
947
959
  [isFilterable]="filterable"
948
960
  [isLoading]="isLoading"
961
+ [ariaControls]="ariaControls"
949
962
  [id]="focusableId"
950
- [listId]="listBoxId"
951
963
  [activeDescendant]="activeDescendant"
952
964
  [userInput]="text"
953
965
  [suggestedText]="suggestion"
954
966
  [disabled]="disabled"
955
967
  [readonly]="readonly"
956
968
  [tabIndex]="tabIndex"
957
- [popupOpen]="isOpen"
958
969
  [placeholder]="placeholder"
959
970
  (onNavigate)="handleNavigate($event)"
960
971
  (valueChange)="searchBarChange($event)"
@@ -1026,7 +1037,7 @@ AutoCompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
1026
1037
  <kendo-resize-sensor (resize)="onResize()"></kendo-resize-sensor>
1027
1038
  </ng-template>
1028
1039
  <ng-container #container></ng-container>
1029
- `, isInline: true, components: [{ type: i7.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: i9.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: i11.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: i13.TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
1040
+ `, isInline: true, components: [{ type: i7.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: i9.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: i11.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: i13.TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
1030
1041
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AutoCompleteComponent, decorators: [{
1031
1042
  type: Component,
1032
1043
  args: [{
@@ -1059,22 +1070,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
1059
1070
 
1060
1071
  i18n-clearTitle="kendo.autocomplete.clearTitle|The title of the clear button"
1061
1072
  clearTitle="clear"
1073
+
1074
+ i18n-popupLabel="kendo.autocomplete.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
1075
+ popupLabel="Options list"
1062
1076
  >
1063
1077
  </ng-container>
1064
1078
  <kendo-searchbar #searchbar
1065
1079
  [role]="'combobox'"
1080
+ [ariaExpanded]="isOpen"
1081
+ [ariaControls]="ariaControls"
1066
1082
  [isSuggestable]="suggest"
1067
1083
  [isFilterable]="filterable"
1068
1084
  [isLoading]="isLoading"
1085
+ [ariaControls]="ariaControls"
1069
1086
  [id]="focusableId"
1070
- [listId]="listBoxId"
1071
1087
  [activeDescendant]="activeDescendant"
1072
1088
  [userInput]="text"
1073
1089
  [suggestedText]="suggestion"
1074
1090
  [disabled]="disabled"
1075
1091
  [readonly]="readonly"
1076
1092
  [tabIndex]="tabIndex"
1077
- [popupOpen]="isOpen"
1078
1093
  [placeholder]="placeholder"
1079
1094
  (onNavigate)="handleNavigate($event)"
1080
1095
  (valueChange)="searchBarChange($event)"
@@ -237,8 +237,8 @@ export class ComboBoxComponent {
237
237
  this.onBlur = new EventEmitter();
238
238
  this.widgetClasses = true;
239
239
  this._isFocused = false;
240
- this.listBoxId = guid();
241
- this.optionPrefix = guid();
240
+ this.listBoxId = `k-${guid()}`;
241
+ this.optionPrefix = `k-${guid()}`;
242
242
  this.onChangeCallback = (_) => { };
243
243
  this.onTouchedCallback = (_) => { };
244
244
  /**
@@ -272,6 +272,12 @@ export class ComboBoxComponent {
272
272
  get text() {
273
273
  return this._text;
274
274
  }
275
+ /**
276
+ * @hidden
277
+ */
278
+ get ariaControls() {
279
+ return this.isOpen ? this.listBoxId : undefined;
280
+ }
275
281
  /**
276
282
  * @hidden
277
283
  */
@@ -1210,7 +1216,11 @@ export class ComboBoxComponent {
1210
1216
  popupWrapper.style.minWidth = min;
1211
1217
  popupWrapper.style.width = max;
1212
1218
  popupWrapper.style.height = this.popupHeight;
1213
- popupWrapper.setAttribute("dir", this.direction);
1219
+ popupWrapper.setAttribute('dir', this.direction);
1220
+ if (!this.appendTo) {
1221
+ this.renderer.setAttribute(popupWrapper, 'role', 'region');
1222
+ this.renderer.setAttribute(popupWrapper, 'aria-label', this.messageFor('popupLabel'));
1223
+ }
1214
1224
  const listBox = this.popupRef.popupElement.querySelector('ul');
1215
1225
  const ariaLabel = this.searchbar.input.nativeElement.getAttribute('aria-labelledby');
1216
1226
  if (ariaLabel) {
@@ -1314,12 +1324,16 @@ ComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
1314
1324
 
1315
1325
  i18n-selectButtonText="kendo.combobox.selectButtonText|The text set as aria-label on the select button"
1316
1326
  selectButtonText="Select"
1327
+
1328
+ i18n-popupLabel="kendo.combobox.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
1329
+ popupLabel="Options list"
1317
1330
  >
1318
1331
  </ng-container>
1319
1332
  <kendo-searchbar #searchbar
1320
1333
  [role]="'combobox'"
1334
+ [ariaExpanded]="isOpen"
1335
+ [ariaControls]="ariaControls"
1321
1336
  [id]="focusableId"
1322
- [listId]="listBoxId"
1323
1337
  [isLoading]="loading"
1324
1338
  [isSuggestable]="suggest"
1325
1339
  [isFilterable]="filterable"
@@ -1329,7 +1343,6 @@ ComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
1329
1343
  [disabled]="disabled"
1330
1344
  [readonly]="readonly"
1331
1345
  [tabIndex]="tabIndex"
1332
- [popupOpen]="isOpen"
1333
1346
  [placeholder]="placeholder"
1334
1347
  (onNavigate)="handleNavigate($event)"
1335
1348
  (valueChange)="searchBarChange($event)"
@@ -1421,7 +1434,7 @@ ComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
1421
1434
  <kendo-resize-sensor (resize)="onResize()"></kendo-resize-sensor>
1422
1435
  </ng-template>
1423
1436
  <ng-container #container></ng-container>
1424
- `, isInline: true, components: [{ type: i7.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: i9.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: i11.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: i13.TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
1437
+ `, isInline: true, components: [{ type: i7.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: i9.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: i11.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: i13.TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
1425
1438
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ComboBoxComponent, decorators: [{
1426
1439
  type: Component,
1427
1440
  args: [{
@@ -1455,12 +1468,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
1455
1468
 
1456
1469
  i18n-selectButtonText="kendo.combobox.selectButtonText|The text set as aria-label on the select button"
1457
1470
  selectButtonText="Select"
1471
+
1472
+ i18n-popupLabel="kendo.combobox.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
1473
+ popupLabel="Options list"
1458
1474
  >
1459
1475
  </ng-container>
1460
1476
  <kendo-searchbar #searchbar
1461
1477
  [role]="'combobox'"
1478
+ [ariaExpanded]="isOpen"
1479
+ [ariaControls]="ariaControls"
1462
1480
  [id]="focusableId"
1463
- [listId]="listBoxId"
1464
1481
  [isLoading]="loading"
1465
1482
  [isSuggestable]="suggest"
1466
1483
  [isFilterable]="filterable"
@@ -1470,7 +1487,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
1470
1487
  [disabled]="disabled"
1471
1488
  [readonly]="readonly"
1472
1489
  [tabIndex]="tabIndex"
1473
- [popupOpen]="isOpen"
1474
1490
  [placeholder]="placeholder"
1475
1491
  (onNavigate)="handleNavigate($event)"
1476
1492
  (valueChange)="searchBarChange($event)"
@@ -188,13 +188,16 @@ MultiColumnComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
188
188
 
189
189
  i18n-selectButtonText="kendo.multicolumncombobox.selectButtonText|The title of the select button"
190
190
  selectButtonText="Select"
191
- >
192
- </ng-container>
191
+
192
+ i18n-popupLabel="kendo.multicolumncombobox.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
193
+ popupLabel="Options list"
194
+ ></ng-container>
193
195
  <kendo-searchbar
194
196
  #searchbar
195
197
  [role]="'combobox'"
198
+ [ariaExpanded]="isOpen"
199
+ [ariaControls]="ariaControls"
196
200
  [id]="focusableId"
197
- [listId]="listBoxId"
198
201
  [isLoading]="loading"
199
202
  [isSuggestable]="suggest"
200
203
  [isFilterable]="filterable"
@@ -204,7 +207,6 @@ MultiColumnComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
204
207
  [disabled]="disabled"
205
208
  [readonly]="readonly"
206
209
  [tabIndex]="tabIndex"
207
- [popupOpen]="isOpen"
208
210
  [placeholder]="placeholder"
209
211
  (onNavigate)="handleNavigate($event)"
210
212
  (valueChange)="searchBarChange($event)"
@@ -340,7 +342,6 @@ MultiColumnComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
340
342
  <!--list-->
341
343
  <kendo-list
342
344
  #optionsList
343
- [id]="listBoxId"
344
345
  [optionPrefix]="optionPrefix"
345
346
  [data]="data"
346
347
  [textField]="textField"
@@ -406,7 +407,7 @@ MultiColumnComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
406
407
 
407
408
  <!-- when the popupSettings.appendTo value is set to 'component', this container is used -->
408
409
  <ng-container #container></ng-container>
409
- `, isInline: true, components: [{ type: i7.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: i9.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: i11.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: i13.TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
410
+ `, isInline: true, components: [{ type: i7.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: i9.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: i11.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: i13.TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
410
411
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: MultiColumnComboBoxComponent, decorators: [{
411
412
  type: Component,
412
413
  args: [{
@@ -447,13 +448,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
447
448
 
448
449
  i18n-selectButtonText="kendo.multicolumncombobox.selectButtonText|The title of the select button"
449
450
  selectButtonText="Select"
450
- >
451
- </ng-container>
451
+
452
+ i18n-popupLabel="kendo.multicolumncombobox.popupLabel|The label of the popup element that contains the list of options when its role is 'region'"
453
+ popupLabel="Options list"
454
+ ></ng-container>
452
455
  <kendo-searchbar
453
456
  #searchbar
454
457
  [role]="'combobox'"
458
+ [ariaExpanded]="isOpen"
459
+ [ariaControls]="ariaControls"
455
460
  [id]="focusableId"
456
- [listId]="listBoxId"
457
461
  [isLoading]="loading"
458
462
  [isSuggestable]="suggest"
459
463
  [isFilterable]="filterable"
@@ -463,7 +467,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
463
467
  [disabled]="disabled"
464
468
  [readonly]="readonly"
465
469
  [tabIndex]="tabIndex"
466
- [popupOpen]="isOpen"
467
470
  [placeholder]="placeholder"
468
471
  (onNavigate)="handleNavigate($event)"
469
472
  (valueChange)="searchBarChange($event)"
@@ -599,7 +602,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
599
602
  <!--list-->
600
603
  <kendo-list
601
604
  #optionsList
602
- [id]="listBoxId"
603
605
  [optionPrefix]="optionPrefix"
604
606
  [data]="data"
605
607
  [textField]="textField"
@@ -432,6 +432,9 @@ ListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
432
432
  *ngIf="checkboxes.enabled"
433
433
  type="checkbox"
434
434
  class="k-checkbox"
435
+ role="presentation"
436
+ tabindex="-1"
437
+ aria-hidden="true"
435
438
  [ngClass]="checkboxClasses"
436
439
  (change)="onCheckedChange($event, itemIndex)"
437
440
  [checked]="isChecked(itemIndex)"
@@ -560,6 +563,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
560
563
  *ngIf="checkboxes.enabled"
561
564
  type="checkbox"
562
565
  class="k-checkbox"
566
+ role="presentation"
567
+ tabindex="-1"
568
+ aria-hidden="true"
563
569
  [ngClass]="checkboxClasses"
564
570
  (change)="onCheckedChange($event, itemIndex)"
565
571
  [checked]="isChecked(itemIndex)"
@@ -11,7 +11,7 @@ import * as i0 from "@angular/core";
11
11
  export class Messages extends ComponentMessages {
12
12
  }
13
13
  Messages.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: Messages, deps: null, target: i0.ɵɵFactoryTarget.Directive });
14
- 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 });
14
+ 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 });
15
15
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: Messages, decorators: [{
16
16
  type: Directive
17
17
  }], propDecorators: { noDataText: [{
@@ -22,4 +22,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
22
22
  type: Input
23
23
  }], selectButtonText: [{
24
24
  type: Input
25
+ }], filterInputLabel: [{
26
+ type: Input
27
+ }], popupLabel: [{
28
+ type: Input
25
29
  }] } });
@@ -3,9 +3,9 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { Component, Renderer2, Input, Output, EventEmitter, ViewChild, ElementRef, HostBinding, Injector } from '@angular/core';
6
- import { isDocumentAvailable } from '@progress/kendo-angular-common';
6
+ import { isDocumentAvailable, isSafari } from '@progress/kendo-angular-common';
7
7
  import { Keys } from '@progress/kendo-angular-common';
8
- import { combineStr, isJapanese, isSafari } from './util';
8
+ import { combineStr, isJapanese } from './util';
9
9
  import { LocalizationService } from '@progress/kendo-angular-l10n';
10
10
  import { Subscription } from 'rxjs';
11
11
  import { NgControl } from '@angular/forms';
@@ -19,6 +19,7 @@ export class SearchBarComponent {
19
19
  constructor(localization, renderer, injector) {
20
20
  this.localization = localization;
21
21
  this.injector = injector;
22
+ this.ariaExpanded = null;
22
23
  this.valueChange = new EventEmitter();
23
24
  this.onBlur = new EventEmitter();
24
25
  this.onFocus = new EventEmitter();
@@ -75,9 +76,6 @@ export class SearchBarComponent {
75
76
  get placeholder() {
76
77
  return this._placeholder;
77
78
  }
78
- get ariaExpanded() {
79
- return this.role === 'combobox' ? this.popupOpen : null;
80
- }
81
79
  ngOnInit() {
82
80
  this.subs.add(this.localization
83
81
  .changes.subscribe(({ rtl }) => this.direction = rtl ? 'rtl' : 'ltr'));
@@ -192,14 +190,14 @@ export class SearchBarComponent {
192
190
  }
193
191
  }
194
192
  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 });
195
- 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: `
193
+ 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: `
196
194
  <input #input
197
195
  autocomplete="off"
198
196
  [id]="id"
199
197
  [disabled]="disabled"
200
198
  [readonly]="readonly"
201
199
  [placeholder]="placeholder"
202
- [class]="'k-input-inner'"
200
+ class="k-input-inner"
203
201
  (input)="handleInput($event)"
204
202
  (keydown)="handleKeydown($event)"
205
203
  [kendoEventsOutsideAngular]="{
@@ -212,7 +210,7 @@ SearchBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
212
210
  [attr.role]="role"
213
211
  aria-haspopup="listbox"
214
212
  [attr.aria-expanded]="ariaExpanded"
215
- [attr.aria-controls]="listId"
213
+ [attr.aria-controls]="ariaControls"
216
214
  [attr.aria-describedby]="tagListId"
217
215
  [attr.aria-activedescendant]="activeDescendant"
218
216
  [attr.aria-busy]="isLoading"
@@ -230,7 +228,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
230
228
  [disabled]="disabled"
231
229
  [readonly]="readonly"
232
230
  [placeholder]="placeholder"
233
- [class]="'k-input-inner'"
231
+ class="k-input-inner"
234
232
  (input)="handleInput($event)"
235
233
  (keydown)="handleKeydown($event)"
236
234
  [kendoEventsOutsideAngular]="{
@@ -243,7 +241,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
243
241
  [attr.role]="role"
244
242
  aria-haspopup="listbox"
245
243
  [attr.aria-expanded]="ariaExpanded"
246
- [attr.aria-controls]="listId"
244
+ [attr.aria-controls]="ariaControls"
247
245
  [attr.aria-describedby]="tagListId"
248
246
  [attr.aria-activedescendant]="activeDescendant"
249
247
  [attr.aria-busy]="isLoading"
@@ -253,8 +251,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
253
251
  }]
254
252
  }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i0.Renderer2 }, { type: i0.Injector }]; }, propDecorators: { id: [{
255
253
  type: Input
256
- }], listId: [{
257
- type: Input
258
254
  }], tagListId: [{
259
255
  type: Input
260
256
  }], activeDescendant: [{
@@ -265,12 +261,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
265
261
  type: Input
266
262
  }], tabIndex: [{
267
263
  type: Input
268
- }], popupOpen: [{
269
- type: Input
270
264
  }], role: [{
271
265
  type: Input
272
266
  }], isLoading: [{
273
267
  type: Input
268
+ }], ariaControls: [{
269
+ type: Input
270
+ }], ariaExpanded: [{
271
+ type: Input
274
272
  }], isSuggestable: [{
275
273
  type: Input
276
274
  }], isFilterable: [{
@@ -4,7 +4,7 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  /* eslint-disable no-bitwise */
6
6
  import { isDocumentAvailable } from '@progress/kendo-angular-common';
7
- import { detectDesktopBrowser, detectMobileOS, getter as fieldAccessor } from '@progress/kendo-common';
7
+ import { getter as fieldAccessor } from '@progress/kendo-common';
8
8
  /**
9
9
  * @hidden
10
10
  */
@@ -328,15 +328,6 @@ export const getFillModeClass = (component, fillMode) => {
328
328
  * @hidden
329
329
  */
330
330
  export const filterAndMap = (arr, predicate, mapper) => arr.reduce((acc, curr) => predicate(curr) ? [...acc, mapper(curr)] : acc, []);
331
- /**
332
- * @hidden
333
- *
334
- * Returns true if the used browser is Safari.
335
- */
336
- export const isSafari = (userAgent) => {
337
- return detectDesktopBrowser(userAgent).safari ||
338
- (detectMobileOS(userAgent) && detectMobileOS(userAgent).browser === 'mobilesafari');
339
- };
340
331
  /**
341
332
  * @hidden
342
333
  *
@@ -365,8 +356,8 @@ export const getTextField = (field, level) => {
365
356
  /**
366
357
  * @hidden
367
358
  */
368
- export const getSearchableItems = (popupId, popupElement) => {
369
- const nodeSeletor = `kendo-popup[id='${popupId}'] li.k-treeview-item`;
359
+ export const getSearchableItems = (treeViewId, popupElement) => {
360
+ const nodeSeletor = `kendo-treeview[id='${treeViewId}'] li.k-treeview-item`;
370
361
  const liElements = Array.from(popupElement.querySelectorAll(nodeSeletor));
371
362
  return liElements.map((liElement) => {
372
363
  return { text: liElement.innerText, index: liElement.getAttribute('data-treeindex') };