@progress/kendo-angular-dropdowns 7.1.0-dev.202208301349 → 7.2.0-dev.202209121509

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/autocomplete/autocomplete.component.d.ts +0 -1
  2. package/bundles/kendo-angular-dropdowns.umd.js +1 -1
  3. package/comboboxes/combobox.component.d.ts +0 -1
  4. package/common/data.service.d.ts +5 -0
  5. package/common/list.component.d.ts +4 -1
  6. package/common/navigation/navigation-action.d.ts +6 -1
  7. package/common/navigation/navigation.service.d.ts +5 -0
  8. package/common/searchbar.component.d.ts +17 -6
  9. package/common/selection/selection.service.d.ts +18 -4
  10. package/common/shared.module.d.ts +1 -1
  11. package/common/util.d.ts +4 -0
  12. package/dropdownlist/dropdownlist.component.d.ts +22 -10
  13. package/esm2015/autocomplete/autocomplete.component.js +12 -8
  14. package/esm2015/comboboxes/combobox.component.js +14 -8
  15. package/esm2015/comboboxes/multicolumncombobox.component.js +13 -3
  16. package/esm2015/common/data.service.js +11 -1
  17. package/esm2015/common/list.component.js +17 -2
  18. package/esm2015/common/navigation/navigation-action.js +5 -0
  19. package/esm2015/common/navigation/navigation.service.js +22 -0
  20. package/esm2015/common/searchbar.component.js +79 -19
  21. package/esm2015/common/selection/selectable.directive.js +2 -1
  22. package/esm2015/common/selection/selection.service.js +70 -7
  23. package/esm2015/common/shared.module.js +6 -6
  24. package/esm2015/common/util.js +4 -0
  25. package/esm2015/dropdownlist/dropdownlist.component.js +73 -42
  26. package/esm2015/multiselect/multiselect.component.js +160 -44
  27. package/esm2015/package-metadata.js +1 -1
  28. package/fesm2015/kendo-angular-dropdowns.js +595 -251
  29. package/multiselect/multiselect.component.d.ts +14 -4
  30. package/package.json +1 -1
@@ -7,12 +7,12 @@ import { EventEmitter, Component, Input, Output, ViewChild, HostBinding, Directi
7
7
  import * as i9 from '@progress/kendo-angular-common';
8
8
  import { isDocumentAvailable, Keys, isChanged, hasObservers, KendoInput, anyChanged, guid as guid$1, ResizeSensorModule, EventsModule } from '@progress/kendo-angular-common';
9
9
  import * as i12 from '@angular/forms';
10
- import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
10
+ import { NgControl, NG_VALUE_ACCESSOR, FormsModule, ReactiveFormsModule } from '@angular/forms';
11
11
  import { validatePackage } from '@progress/kendo-licensing';
12
12
  import { getter as getter$1, pointers, touchEnabled } from '@progress/kendo-common';
13
+ import { Subscription, merge, fromEvent, Subject, of, interval } from 'rxjs';
13
14
  import * as i1 from '@progress/kendo-angular-l10n';
14
15
  import { ComponentMessages, LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
15
- import { merge, fromEvent, Subject, Subscription, of, interval } from 'rxjs';
16
16
  import * as i2 from '@progress/kendo-angular-popup';
17
17
  import { PopupModule } from '@progress/kendo-angular-popup';
18
18
  export { PopupComponent } from '@progress/kendo-angular-popup';
@@ -29,7 +29,7 @@ const packageMetadata = {
29
29
  name: '@progress/kendo-angular-dropdowns',
30
30
  productName: 'Kendo UI for Angular',
31
31
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
32
- publishDate: 1661867343,
32
+ publishDate: 1662995282,
33
33
  version: '',
34
34
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'
35
35
  };
@@ -354,13 +354,18 @@ const getFillModeClass = (component, fillMode) => {
354
354
  };
355
355
  return FILLMODE_CLASSES[fillMode];
356
356
  };
357
+ /**
358
+ * @hidden
359
+ */
360
+ const filterAndMap = (arr, predicate, mapper) => arr.reduce((acc, curr) => predicate(curr) ? [...acc, mapper(curr)] : acc, []);
357
361
 
358
362
  /**
359
363
  * @hidden
360
364
  */
361
365
  class SearchBarComponent {
362
- constructor(localization, renderer) {
366
+ constructor(localization, renderer, injector) {
363
367
  this.localization = localization;
368
+ this.injector = injector;
364
369
  this.valueChange = new EventEmitter();
365
370
  this.onBlur = new EventEmitter();
366
371
  this.onFocus = new EventEmitter();
@@ -370,9 +375,30 @@ class SearchBarComponent {
370
375
  this._userInput = "";
371
376
  this._previousValue = "";
372
377
  this._placeholder = "";
378
+ this._isSuggestable = false;
379
+ this._isFilterable = false;
380
+ this.subs = new Subscription();
373
381
  this.direction = localization.rtl ? 'rtl' : 'ltr';
374
382
  this.renderer = renderer;
375
383
  }
384
+ set isSuggestable(isSuggestable) {
385
+ this._isSuggestable = isSuggestable;
386
+ this.setAriaAutocomplete();
387
+ }
388
+ ;
389
+ get isSuggestable() {
390
+ return this._isSuggestable;
391
+ }
392
+ ;
393
+ set isFilterable(isFilterable) {
394
+ this._isFilterable = isFilterable;
395
+ this.setAriaAutocomplete();
396
+ }
397
+ ;
398
+ get isFilterable() {
399
+ return this._isFilterable;
400
+ }
401
+ ;
376
402
  get userInput() {
377
403
  return this._userInput;
378
404
  }
@@ -393,8 +419,19 @@ class SearchBarComponent {
393
419
  return this.role === 'combobox' ? this.popupOpen : null;
394
420
  }
395
421
  ngOnInit() {
396
- this.localizationChangeSubscription = this.localization
397
- .changes.subscribe(({ rtl }) => this.direction = rtl ? 'rtl' : 'ltr');
422
+ this.subs.add(this.localization
423
+ .changes.subscribe(({ rtl }) => this.direction = rtl ? 'rtl' : 'ltr'));
424
+ }
425
+ ngAfterContentChecked() {
426
+ var _a;
427
+ const formControl = (_a = this.injector.get(NgControl, null)) === null || _a === void 0 ? void 0 : _a.control;
428
+ this.control = formControl;
429
+ if (formControl) {
430
+ this.subs.add(formControl.valueChanges.subscribe(() => {
431
+ this.control = formControl;
432
+ }));
433
+ }
434
+ this.setAriaInvalid();
398
435
  }
399
436
  ngOnChanges(changes) {
400
437
  let previousUserInput;
@@ -426,9 +463,7 @@ class SearchBarComponent {
426
463
  }
427
464
  }
428
465
  ngOnDestroy() {
429
- if (this.localizationChangeSubscription) {
430
- this.localizationChangeSubscription.unsubscribe();
431
- }
466
+ this.subs.unsubscribe();
432
467
  }
433
468
  writeInputValue(text) {
434
469
  if (isDocumentAvailable()) {
@@ -445,6 +480,33 @@ class SearchBarComponent {
445
480
  }
446
481
  }
447
482
  }
483
+ setAriaInvalid() {
484
+ if (this.control) {
485
+ if (this.control.invalid) {
486
+ this.renderer.setAttribute(this.input.nativeElement, 'aria-invalid', 'true');
487
+ }
488
+ else {
489
+ this.renderer.setAttribute(this.input.nativeElement, 'aria-invalid', 'false');
490
+ }
491
+ }
492
+ else {
493
+ this.renderer.removeAttribute(this.input.nativeElement, 'aria-invalid');
494
+ }
495
+ }
496
+ setAriaAutocomplete() {
497
+ if (this.isFilterable) {
498
+ this.renderer.setAttribute(this.input.nativeElement, 'aria-autocomplete', 'list');
499
+ }
500
+ if (this.isSuggestable) {
501
+ this.renderer.setAttribute(this.input.nativeElement, 'aria-autocomplete', 'inline');
502
+ }
503
+ if (this.isFilterable && this.isSuggestable) {
504
+ this.renderer.setAttribute(this.input.nativeElement, 'aria-autocomplete', 'both');
505
+ }
506
+ if (!this.isFilterable && !this.isSuggestable) {
507
+ this.renderer.removeAttribute(this.input.nativeElement, 'aria-autocomplete');
508
+ }
509
+ }
448
510
  handleInput(event) {
449
511
  const value = event.target.value;
450
512
  if (value !== this.userInput) {
@@ -485,8 +547,8 @@ class SearchBarComponent {
485
547
  this.renderer.setAttribute(input, 'size', size.toString());
486
548
  }
487
549
  }
488
- SearchBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SearchBarComponent, deps: [{ token: i1.LocalizationService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
489
- SearchBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SearchBarComponent, selector: "kendo-searchbar", inputs: { id: "id", listId: "listId", tagListId: "tagListId", activeDescendant: "activeDescendant", noDataLabel: "noDataLabel", disabled: "disabled", readonly: "readonly", tabIndex: "tabIndex", popupOpen: "popupOpen", role: "role", 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: `
550
+ SearchBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SearchBarComponent, deps: [{ token: i1.LocalizationService }, { token: i0.Renderer2 }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
551
+ SearchBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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: `
490
552
  <input #input
491
553
  autocomplete="off"
492
554
  [id]="id"
@@ -504,14 +566,12 @@ SearchBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
504
566
  [attr.tabIndex]="tabIndex"
505
567
  [attr.dir]="direction"
506
568
  [attr.role]="role"
507
- [attr.aria-disabled]="disabled"
508
- [attr.aria-readonly]="readonly"
509
569
  aria-haspopup="listbox"
510
570
  [attr.aria-expanded]="ariaExpanded"
511
- [attr.aria-owns]="listId"
571
+ [attr.aria-controls]="listId"
512
572
  [attr.aria-describedby]="tagListId"
513
573
  [attr.aria-activedescendant]="activeDescendant"
514
- [attr.aria-label]="noDataLabel"
574
+ [attr.aria-busy]="isLoading"
515
575
  />
516
576
  `, isInline: true, directives: [{ type: i9.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }] });
517
577
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SearchBarComponent, decorators: [{
@@ -536,18 +596,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
536
596
  [attr.tabIndex]="tabIndex"
537
597
  [attr.dir]="direction"
538
598
  [attr.role]="role"
539
- [attr.aria-disabled]="disabled"
540
- [attr.aria-readonly]="readonly"
541
599
  aria-haspopup="listbox"
542
600
  [attr.aria-expanded]="ariaExpanded"
543
- [attr.aria-owns]="listId"
601
+ [attr.aria-controls]="listId"
544
602
  [attr.aria-describedby]="tagListId"
545
603
  [attr.aria-activedescendant]="activeDescendant"
546
- [attr.aria-label]="noDataLabel"
604
+ [attr.aria-busy]="isLoading"
547
605
  />
548
606
  `
549
607
  }]
550
- }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i0.Renderer2 }]; }, propDecorators: { id: [{
608
+ }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i0.Renderer2 }, { type: i0.Injector }]; }, propDecorators: { id: [{
551
609
  type: Input
552
610
  }], listId: [{
553
611
  type: Input
@@ -555,8 +613,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
555
613
  type: Input
556
614
  }], activeDescendant: [{
557
615
  type: Input
558
- }], noDataLabel: [{
559
- type: Input
560
616
  }], disabled: [{
561
617
  type: Input
562
618
  }], readonly: [{
@@ -567,6 +623,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
567
623
  type: Input
568
624
  }], role: [{
569
625
  type: Input
626
+ }], isLoading: [{
627
+ type: Input
628
+ }], isSuggestable: [{
629
+ type: Input
630
+ }], isFilterable: [{
631
+ type: Input
570
632
  }], userInput: [{
571
633
  type: Input
572
634
  }], suggestedText: [{
@@ -812,123 +874,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
812
874
  }]
813
875
  }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
814
876
 
815
- /**
816
- * @hidden
817
- */
818
- class SelectionService {
819
- constructor() {
820
- this.onSelect = new EventEmitter();
821
- this.onChange = new EventEmitter();
822
- this.onFocus = new EventEmitter();
823
- this.total = 0;
824
- this.selectedIndices = [];
825
- }
826
- getTotal() {
827
- return this.total;
828
- }
829
- isSelected(index) {
830
- return isPresent(this.selectedIndices.find(current => current === index));
831
- }
832
- isFocused(index) {
833
- return index === this.focused;
834
- }
835
- focus(index) {
836
- if (this.isFocused(index)) {
837
- return;
838
- }
839
- this.focused = index;
840
- this.onFocus.emit(index);
841
- }
842
- select(index) {
843
- if (this.isSelected(index)) {
844
- return;
845
- }
846
- this.selectedIndices = [index];
847
- this.focused = index;
848
- this.onSelect.emit({
849
- indices: [index],
850
- newSelection: isPresent(index)
851
- });
852
- }
853
- add(index) {
854
- if (this.isSelected(index)) {
855
- return;
856
- }
857
- this.selectedIndices.push(index);
858
- this.focused = index;
859
- this.onChange.emit({
860
- added: index,
861
- indices: this.selectedIndices.slice()
862
- });
863
- }
864
- unselect(index) {
865
- if (!this.isSelected(index)) {
866
- return;
867
- }
868
- const position = this.selectedIndices.indexOf(index);
869
- this.selectedIndices.splice(position, 1);
870
- this.focused = index;
871
- this.onChange.emit({
872
- indices: this.selectedIndices.slice(),
873
- removed: index
874
- });
875
- }
876
- change(index) {
877
- const newSelection = isPresent(index) && !this.isSelected(index);
878
- this.selectedIndices = [index];
879
- this.focused = index;
880
- this.onChange.emit({
881
- indices: [index],
882
- newSelection: newSelection
883
- });
884
- }
885
- resetSelection(index) {
886
- this.selectedIndices = index instanceof Array ? index : [index];
887
- this.focused = this.selectedIndices[this.selectedIndices.length - 1];
888
- }
889
- get selected() {
890
- return this.selectedIndices.slice();
891
- }
892
- get focused() {
893
- return this.focusedIndex;
894
- }
895
- set focused(index) {
896
- if (this.focusedIndex !== index) {
897
- this.focusedIndex = index;
898
- this.onFocus.emit(index);
899
- }
900
- }
901
- }
902
- SelectionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
903
- SelectionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SelectionService });
904
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SelectionService, decorators: [{
905
- type: Injectable
906
- }] });
907
-
908
- /**
909
- * @hidden
910
- */
911
- var NavigationAction;
912
- (function (NavigationAction) {
913
- // eslint-disable-next-line id-denylist
914
- NavigationAction[NavigationAction["Undefined"] = 0] = "Undefined";
915
- NavigationAction[NavigationAction["Open"] = 1] = "Open";
916
- NavigationAction[NavigationAction["Close"] = 2] = "Close";
917
- NavigationAction[NavigationAction["Enter"] = 3] = "Enter";
918
- NavigationAction[NavigationAction["Tab"] = 4] = "Tab";
919
- NavigationAction[NavigationAction["Esc"] = 5] = "Esc";
920
- NavigationAction[NavigationAction["Delete"] = 6] = "Delete";
921
- NavigationAction[NavigationAction["Backspace"] = 7] = "Backspace";
922
- NavigationAction[NavigationAction["Home"] = 8] = "Home";
923
- NavigationAction[NavigationAction["End"] = 9] = "End";
924
- NavigationAction[NavigationAction["Up"] = 10] = "Up";
925
- NavigationAction[NavigationAction["Down"] = 11] = "Down";
926
- NavigationAction[NavigationAction["Left"] = 12] = "Left";
927
- NavigationAction[NavigationAction["Right"] = 13] = "Right";
928
- NavigationAction[NavigationAction["PageDown"] = 14] = "PageDown";
929
- NavigationAction[NavigationAction["PageUp"] = 15] = "PageUp";
930
- })(NavigationAction || (NavigationAction = {}));
931
-
932
877
  /**
933
878
  * @hidden
934
879
  */
@@ -1102,6 +1047,16 @@ class DataService {
1102
1047
  }
1103
1048
  return this._flatData.find((item) => item.header && item.index === index);
1104
1049
  }
1050
+ /**
1051
+ * @hidden
1052
+ * Used to get all group items indices.
1053
+ */
1054
+ groupItemsIndices() {
1055
+ if (this.isGrouped) {
1056
+ return filterAndMap(this.data, item => item.header, mappedItem => mappedItem.index);
1057
+ }
1058
+ return [];
1059
+ }
1105
1060
  /**
1106
1061
  * @hidden
1107
1062
  * Used to get the field by which the data is grouped.
@@ -1197,6 +1152,190 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
1197
1152
  type: Injectable
1198
1153
  }], ctorParameters: function () { return [{ type: DataService }]; } });
1199
1154
 
1155
+ /**
1156
+ * @hidden
1157
+ */
1158
+ class SelectionService {
1159
+ constructor(disabledItemsService) {
1160
+ this.disabledItemsService = disabledItemsService;
1161
+ this.onSelect = new EventEmitter();
1162
+ this.onChange = new EventEmitter();
1163
+ this.onFocus = new EventEmitter();
1164
+ this.total = 0;
1165
+ this.selectedIndices = [];
1166
+ this.indicesToBeRemoved = [];
1167
+ this.indicesToBeAdded = [];
1168
+ }
1169
+ getTotal() {
1170
+ return this.total;
1171
+ }
1172
+ isSelected(index) {
1173
+ return isPresent(this.selectedIndices.find(current => current === index));
1174
+ }
1175
+ isFocused(index) {
1176
+ return index === this.focused;
1177
+ }
1178
+ focus(index) {
1179
+ if (this.isFocused(index)) {
1180
+ return;
1181
+ }
1182
+ this.focused = index;
1183
+ this.onFocus.emit(index);
1184
+ }
1185
+ select(index) {
1186
+ if (this.isSelected(index)) {
1187
+ return;
1188
+ }
1189
+ this.selectedIndices = [index];
1190
+ this.focused = index;
1191
+ this.onSelect.emit({
1192
+ indices: [index],
1193
+ newSelection: isPresent(index)
1194
+ });
1195
+ }
1196
+ add(index, preventClosingPopup) {
1197
+ if (this.isSelected(index)) {
1198
+ return;
1199
+ }
1200
+ this.selectedIndices.push(index);
1201
+ this.focused = index;
1202
+ this.onChange.emit({
1203
+ added: index,
1204
+ indices: this.selectedIndices.slice(),
1205
+ preventClosingPopup: preventClosingPopup
1206
+ });
1207
+ }
1208
+ emitMultipleAddedRemoved() {
1209
+ this.onChange.emit({
1210
+ added: this.indicesToBeAdded,
1211
+ removed: this.indicesToBeRemoved,
1212
+ indices: this.selectedIndices.slice(),
1213
+ preventClosingPopup: true,
1214
+ isMultipleSelection: true
1215
+ });
1216
+ this.indicesToBeAdded = [];
1217
+ this.indicesToBeRemoved = [];
1218
+ }
1219
+ addMultiple(indices) {
1220
+ this.indicesToBeAdded = indices.slice();
1221
+ this.selectedIndices.push(...indices);
1222
+ }
1223
+ deselect(index, preventClosingPopup) {
1224
+ if (!this.isSelected(index)) {
1225
+ return;
1226
+ }
1227
+ const position = this.selectedIndices.indexOf(index);
1228
+ this.selectedIndices.splice(position, 1);
1229
+ this.focused = index;
1230
+ if (this.selected.length === 0) {
1231
+ this.lastClickedIndex = null;
1232
+ }
1233
+ this.onChange.emit({
1234
+ indices: this.selectedIndices.slice(),
1235
+ removed: index,
1236
+ preventClosingPopup: preventClosingPopup
1237
+ });
1238
+ }
1239
+ unselectMultiple(indices) {
1240
+ indices.forEach((index) => {
1241
+ const position = this.selectedIndices.indexOf(index);
1242
+ this.selectedIndices.splice(position, 1);
1243
+ });
1244
+ this.indicesToBeRemoved = indices.slice();
1245
+ }
1246
+ change(index) {
1247
+ const newSelection = isPresent(index) && !this.isSelected(index);
1248
+ this.selectedIndices = [index];
1249
+ this.focused = index;
1250
+ this.onChange.emit({
1251
+ indices: [index],
1252
+ newSelection: newSelection
1253
+ });
1254
+ }
1255
+ resetSelection(index) {
1256
+ this.selectedIndices = index instanceof Array ? index : [index];
1257
+ this.focused = this.selectedIndices[this.selectedIndices.length - 1];
1258
+ }
1259
+ get selected() {
1260
+ return this.selectedIndices.slice();
1261
+ }
1262
+ get focused() {
1263
+ return this.focusedIndex;
1264
+ }
1265
+ set focused(index) {
1266
+ if (this.focusedIndex !== index) {
1267
+ this.focusedIndex = index;
1268
+ this.onFocus.emit(index);
1269
+ }
1270
+ }
1271
+ selectFromTo(from, to) {
1272
+ let addedIndices = [];
1273
+ for (let i = from; i <= to; i++) {
1274
+ if (!this.isSelected(i) && !this.disabledItemsService.isIndexDisabled(i)) {
1275
+ addedIndices.push(i);
1276
+ }
1277
+ }
1278
+ this.addMultiple(addedIndices);
1279
+ }
1280
+ unselectFromTo(from, to) {
1281
+ let indicesToBeUnselected = [];
1282
+ for (let i = from; i >= to; i--) {
1283
+ if (this.isSelected(i) && !this.disabledItemsService.isIndexDisabled(i)) {
1284
+ indicesToBeUnselected.push(i);
1285
+ }
1286
+ }
1287
+ this.unselectMultiple(indicesToBeUnselected);
1288
+ }
1289
+ unselectNotNeededIndices(startOfSelection, endOfSelection, totalItems) {
1290
+ let indicesToBeUnselected = [];
1291
+ for (let i = 0; i < startOfSelection; i++) {
1292
+ if (this.isSelected(i)) {
1293
+ indicesToBeUnselected.push(i);
1294
+ }
1295
+ }
1296
+ for (let i = endOfSelection + 1; i < totalItems; i++) {
1297
+ if (this.isSelected(i)) {
1298
+ indicesToBeUnselected.push(i);
1299
+ }
1300
+ }
1301
+ this.unselectMultiple(indicesToBeUnselected);
1302
+ }
1303
+ }
1304
+ SelectionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SelectionService, deps: [{ token: DisabledItemsService }], target: i0.ɵɵFactoryTarget.Injectable });
1305
+ SelectionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SelectionService });
1306
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SelectionService, decorators: [{
1307
+ type: Injectable
1308
+ }], ctorParameters: function () { return [{ type: DisabledItemsService }]; } });
1309
+
1310
+ /**
1311
+ * @hidden
1312
+ */
1313
+ var NavigationAction;
1314
+ (function (NavigationAction) {
1315
+ // eslint-disable-next-line id-denylist
1316
+ NavigationAction[NavigationAction["Undefined"] = 0] = "Undefined";
1317
+ NavigationAction[NavigationAction["Open"] = 1] = "Open";
1318
+ NavigationAction[NavigationAction["Close"] = 2] = "Close";
1319
+ NavigationAction[NavigationAction["Enter"] = 3] = "Enter";
1320
+ NavigationAction[NavigationAction["Tab"] = 4] = "Tab";
1321
+ NavigationAction[NavigationAction["Esc"] = 5] = "Esc";
1322
+ NavigationAction[NavigationAction["Delete"] = 6] = "Delete";
1323
+ NavigationAction[NavigationAction["Backspace"] = 7] = "Backspace";
1324
+ NavigationAction[NavigationAction["Home"] = 8] = "Home";
1325
+ NavigationAction[NavigationAction["End"] = 9] = "End";
1326
+ NavigationAction[NavigationAction["Up"] = 10] = "Up";
1327
+ NavigationAction[NavigationAction["Down"] = 11] = "Down";
1328
+ NavigationAction[NavigationAction["Left"] = 12] = "Left";
1329
+ NavigationAction[NavigationAction["Right"] = 13] = "Right";
1330
+ NavigationAction[NavigationAction["PageDown"] = 14] = "PageDown";
1331
+ NavigationAction[NavigationAction["PageUp"] = 15] = "PageUp";
1332
+ NavigationAction[NavigationAction["SelectPrevious"] = 16] = "SelectPrevious";
1333
+ NavigationAction[NavigationAction["SelectNext"] = 17] = "SelectNext";
1334
+ NavigationAction[NavigationAction["SelectAll"] = 18] = "SelectAll";
1335
+ NavigationAction[NavigationAction["SelectAllToBeginning"] = 19] = "SelectAllToBeginning";
1336
+ NavigationAction[NavigationAction["SelectAllToEnd"] = 20] = "SelectAllToEnd";
1337
+ })(NavigationAction || (NavigationAction = {}));
1338
+
1200
1339
  const MIN_INDEX = 0;
1201
1340
  /**
1202
1341
  * @hidden
@@ -1232,10 +1371,17 @@ class NavigationService {
1232
1371
  this.end = new EventEmitter();
1233
1372
  this.pagedown = new EventEmitter();
1234
1373
  this.pageup = new EventEmitter();
1374
+ this.selectnext = new EventEmitter();
1375
+ this.selectprevious = new EventEmitter();
1376
+ this.selectall = new EventEmitter();
1377
+ this.selectalltobeginning = new EventEmitter();
1378
+ this.selectalltoend = new EventEmitter();
1235
1379
  }
1236
1380
  process(args) {
1237
1381
  const keyCode = args.originalEvent.keyCode;
1238
1382
  const altKey = args.originalEvent.altKey;
1383
+ const shiftKey = args.originalEvent.shiftKey;
1384
+ const ctrlKey = args.originalEvent.ctrlKey;
1239
1385
  let index;
1240
1386
  let action = NavigationAction.Undefined;
1241
1387
  if (altKey && keyCode === Keys.ArrowDown) {
@@ -1244,6 +1390,21 @@ class NavigationService {
1244
1390
  else if (altKey && keyCode === Keys.ArrowUp) {
1245
1391
  action = NavigationAction.Close;
1246
1392
  }
1393
+ else if (shiftKey && keyCode === Keys.ArrowUp) {
1394
+ action = NavigationAction.SelectPrevious;
1395
+ }
1396
+ else if (shiftKey && keyCode === Keys.ArrowDown) {
1397
+ action = NavigationAction.SelectNext;
1398
+ }
1399
+ else if (ctrlKey && keyCode === Keys.KeyA) {
1400
+ action = NavigationAction.SelectAll;
1401
+ }
1402
+ else if (ctrlKey && shiftKey && keyCode === Keys.Home) {
1403
+ action = NavigationAction.SelectAllToBeginning;
1404
+ }
1405
+ else if (ctrlKey && shiftKey && keyCode === Keys.End) {
1406
+ action = NavigationAction.SelectAllToEnd;
1407
+ }
1247
1408
  else if (keyCode === Keys.Enter) {
1248
1409
  action = NavigationAction.Enter;
1249
1410
  }
@@ -1504,12 +1665,13 @@ class SelectableDirective {
1504
1665
  }
1505
1666
  onClick(event) {
1506
1667
  event.stopPropagation();
1668
+ this.selectionService.lastClickedIndex = this.index;
1507
1669
  if (this.checkboxes.enabled && !this.checkboxes.checkOnClick) {
1508
1670
  return;
1509
1671
  }
1510
1672
  if (this.multipleSelection) {
1511
1673
  if (this.selectionService.isSelected(this.index)) {
1512
- this.selectionService.unselect(this.index);
1674
+ this.selectionService.deselect(this.index);
1513
1675
  }
1514
1676
  else {
1515
1677
  this.selectionService.add(this.index);
@@ -1679,7 +1841,7 @@ class ListComponent {
1679
1841
  this.selectionService.add(index);
1680
1842
  }
1681
1843
  if (!isChecked && this.selectionService.isSelected(index)) {
1682
- this.selectionService.unselect(index);
1844
+ this.selectionService.deselect(index);
1683
1845
  }
1684
1846
  }
1685
1847
  prepareClasses() {
@@ -1861,6 +2023,9 @@ class ListComponent {
1861
2023
  const hasVirtualScroll = isPresent(this.virtual) && this.hasVirtualScrollbar();
1862
2024
  return hasVirtualScroll || this.list.nativeElement.scrollHeight > this.content.nativeElement.offsetHeight;
1863
2025
  }
2026
+ isItemSelected(index) {
2027
+ return this.selectionService.isSelected(index) || null;
2028
+ }
1864
2029
  /**
1865
2030
  * Sets the list's content overflow (hides/shows scrollbar)
1866
2031
  */
@@ -1906,7 +2071,7 @@ class ListComponent {
1906
2071
  }
1907
2072
  }
1908
2073
  ListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ListComponent, deps: [{ token: DataService }, { token: i0.ElementRef }, { token: SelectionService }, { token: DisabledItemsService }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
1909
- ListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: ListComponent, selector: "kendo-list", inputs: { selected: "selected", focused: "focused", textField: "textField", valueField: "valueField", height: "height", template: "template", groupTemplate: "groupTemplate", fixedGroupTemplate: "fixedGroupTemplate", show: "show", id: "id", optionPrefix: "optionPrefix", multipleSelection: "multipleSelection", virtual: "virtual", type: "type", checkboxes: "checkboxes", data: "data", size: "size", rounded: "rounded" }, outputs: { onClick: "onClick", pageChange: "pageChange", listResize: "listResize" }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true, static: true }, { propertyName: "list", first: true, predicate: ["list"], descendants: true, static: true }, { propertyName: "virtualContainer", first: true, predicate: ["virtualContainer"], descendants: true }, { propertyName: "items", predicate: ListItemDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
2074
+ ListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: ListComponent, selector: "kendo-list", inputs: { selected: "selected", focused: "focused", textField: "textField", valueField: "valueField", height: "height", template: "template", groupTemplate: "groupTemplate", fixedGroupTemplate: "fixedGroupTemplate", show: "show", id: "id", optionPrefix: "optionPrefix", multipleSelection: "multipleSelection", virtual: "virtual", type: "type", checkboxes: "checkboxes", ariaLive: "ariaLive", isMultiselect: "isMultiselect", data: "data", size: "size", rounded: "rounded" }, outputs: { onClick: "onClick", pageChange: "pageChange", listResize: "listResize" }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true, static: true }, { propertyName: "list", first: true, predicate: ["list"], descendants: true, static: true }, { propertyName: "virtualContainer", first: true, predicate: ["virtualContainer"], descendants: true }, { propertyName: "items", predicate: ListItemDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
1910
2075
  <div *ngIf="dataService.grouped"
1911
2076
  [class]="listGroupStickyHeaderClass"
1912
2077
  [ngStyle]="{
@@ -1931,6 +2096,8 @@ ListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
1931
2096
  role="listbox"
1932
2097
  [class]="listClass"
1933
2098
  [attr.id]="id"
2099
+ [attr.aria-live]="ariaLive"
2100
+ [attr.aria-multiselectable]="isMultiselect"
1934
2101
  [attr.aria-hidden]="!show">
1935
2102
  <ng-template *ngIf="!dataService.grouped && show" ngFor let-dataItem let-itemIndex="index" [ngForOf]="data">
1936
2103
  <li
@@ -1942,6 +2109,7 @@ ListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
1942
2109
  [multipleSelection]="multipleSelection"
1943
2110
  [attr.id]="optionPrefix + '-' + getValue(dataItem)"
1944
2111
  [attr.tabIndex]="-1"
2112
+ [attr.aria-selected]="isItemSelected(itemIndex)"
1945
2113
  [class]="listItemClass"
1946
2114
  [ngClass]="{
1947
2115
  'k-disabled': isDisabled(itemIndex),
@@ -1998,6 +2166,7 @@ ListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
1998
2166
  [attr.absolute-index]="dataItem.index"
1999
2167
  [attr.id]="optionPrefix + '-' + getValue(dataItem.value)"
2000
2168
  [attr.tabIndex]="-1"
2169
+ [attr.aria-selected]="isItemSelected(dataItem.offsetIndex)"
2001
2170
  [class]="listItemClass"
2002
2171
  [ngClass]="{
2003
2172
  'k-disabled': isDisabled(dataItem.offsetIndex),
@@ -2055,6 +2224,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
2055
2224
  role="listbox"
2056
2225
  [class]="listClass"
2057
2226
  [attr.id]="id"
2227
+ [attr.aria-live]="ariaLive"
2228
+ [attr.aria-multiselectable]="isMultiselect"
2058
2229
  [attr.aria-hidden]="!show">
2059
2230
  <ng-template *ngIf="!dataService.grouped && show" ngFor let-dataItem let-itemIndex="index" [ngForOf]="data">
2060
2231
  <li
@@ -2066,6 +2237,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
2066
2237
  [multipleSelection]="multipleSelection"
2067
2238
  [attr.id]="optionPrefix + '-' + getValue(dataItem)"
2068
2239
  [attr.tabIndex]="-1"
2240
+ [attr.aria-selected]="isItemSelected(itemIndex)"
2069
2241
  [class]="listItemClass"
2070
2242
  [ngClass]="{
2071
2243
  'k-disabled': isDisabled(itemIndex),
@@ -2122,6 +2294,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
2122
2294
  [attr.absolute-index]="dataItem.index"
2123
2295
  [attr.id]="optionPrefix + '-' + getValue(dataItem.value)"
2124
2296
  [attr.tabIndex]="-1"
2297
+ [attr.aria-selected]="isItemSelected(dataItem.offsetIndex)"
2125
2298
  [class]="listItemClass"
2126
2299
  [ngClass]="{
2127
2300
  'k-disabled': isDisabled(dataItem.offsetIndex),
@@ -2181,6 +2354,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
2181
2354
  type: Input
2182
2355
  }], checkboxes: [{
2183
2356
  type: Input
2357
+ }], ariaLive: [{
2358
+ type: Input
2359
+ }], isMultiselect: [{
2360
+ type: Input
2184
2361
  }], data: [{
2185
2362
  type: Input
2186
2363
  }], size: [{
@@ -2498,11 +2675,6 @@ class AutoCompleteComponent {
2498
2675
  const dataItem = this.dataService.itemAt(this.selectionService.focused);
2499
2676
  return this.optionPrefix + "-" + getter(dataItem, this.valueField);
2500
2677
  }
2501
- get noDataLabel() {
2502
- if (this.data.length === 0) {
2503
- return this.messageFor('noDataText');
2504
- }
2505
- }
2506
2678
  /**
2507
2679
  * Sets the data of the AutoComplete.
2508
2680
  *
@@ -3055,6 +3227,11 @@ class AutoCompleteComponent {
3055
3227
  popupWrapper.style.width = max;
3056
3228
  popupWrapper.style.height = this.height;
3057
3229
  popupWrapper.setAttribute("dir", this.direction);
3230
+ const listBox = popupWrapper.querySelector('ul.k-list-ul');
3231
+ const ariaLabel = this.searchbar.input.nativeElement.getAttribute('aria-labelledby');
3232
+ if (ariaLabel) {
3233
+ listBox.setAttribute('aria-labelledby', ariaLabel);
3234
+ }
3058
3235
  this.popupRef.popupOpen.subscribe(() => {
3059
3236
  this.cdr.detectChanges();
3060
3237
  this.optionsList.scrollToItem(this.selectionService.focused);
@@ -3158,10 +3335,12 @@ AutoCompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
3158
3335
  </ng-container>
3159
3336
  <kendo-searchbar #searchbar
3160
3337
  [role]="'combobox'"
3338
+ [isSuggestable]="suggest"
3339
+ [isFilterable]="filterable"
3340
+ [isLoading]="isLoading"
3161
3341
  [id]="focusableId"
3162
3342
  [listId]="listBoxId"
3163
3343
  [activeDescendant]="activeDescendant"
3164
- [noDataLabel]="noDataLabel"
3165
3344
  [userInput]="text"
3166
3345
  [suggestedText]="suggestion"
3167
3346
  [disabled]="disabled"
@@ -3235,7 +3414,7 @@ AutoCompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
3235
3414
  <kendo-resize-sensor (resize)="onResize()"></kendo-resize-sensor>
3236
3415
  </ng-template>
3237
3416
  <ng-container #container></ng-container>
3238
- `, isInline: true, components: [{ type: SearchBarComponent, selector: "kendo-searchbar", inputs: ["id", "listId", "tagListId", "activeDescendant", "noDataLabel", "disabled", "readonly", "tabIndex", "popupOpen", "role", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i9.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: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
3417
+ `, 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: 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: i9.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: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
3239
3418
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: AutoCompleteComponent, decorators: [{
3240
3419
  type: Component,
3241
3420
  args: [{
@@ -3272,10 +3451,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
3272
3451
  </ng-container>
3273
3452
  <kendo-searchbar #searchbar
3274
3453
  [role]="'combobox'"
3454
+ [isSuggestable]="suggest"
3455
+ [isFilterable]="filterable"
3456
+ [isLoading]="isLoading"
3275
3457
  [id]="focusableId"
3276
3458
  [listId]="listBoxId"
3277
3459
  [activeDescendant]="activeDescendant"
3278
- [noDataLabel]="noDataLabel"
3279
3460
  [userInput]="text"
3280
3461
  [suggestedText]="suggestion"
3281
3462
  [disabled]="disabled"
@@ -3760,11 +3941,6 @@ class ComboBoxComponent {
3760
3941
  const dataItem = this.dataService.itemAt(this.selectionService.focused);
3761
3942
  return this.optionPrefix + "-" + (dataItem ? getter(dataItem, this.valueField) : "");
3762
3943
  }
3763
- get noDataLabel() {
3764
- if (this.data.length === 0) {
3765
- return this.messageFor('noDataText');
3766
- }
3767
- }
3768
3944
  get appendTo() {
3769
3945
  const { appendTo } = this.popupSettings;
3770
3946
  if (!appendTo || appendTo === 'root') {
@@ -4682,6 +4858,11 @@ class ComboBoxComponent {
4682
4858
  popupWrapper.style.width = max;
4683
4859
  popupWrapper.style.height = this.popupHeight;
4684
4860
  popupWrapper.setAttribute("dir", this.direction);
4861
+ const listBox = this.popupRef.popupElement.querySelector('ul.k-list-ul');
4862
+ const ariaLabel = this.searchbar.input.nativeElement.getAttribute('aria-labelledby');
4863
+ if (ariaLabel) {
4864
+ listBox.setAttribute('aria-labelledby', ariaLabel);
4865
+ }
4685
4866
  this.popupRef.popupOpen.subscribe(() => {
4686
4867
  this.cdr.detectChanges();
4687
4868
  this.optionsList.scrollToItem(this.selectionService.focused);
@@ -4786,8 +4967,10 @@ ComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
4786
4967
  [role]="'combobox'"
4787
4968
  [id]="focusableId"
4788
4969
  [listId]="listBoxId"
4970
+ [isLoading]="loading"
4971
+ [isSuggestable]="suggest"
4972
+ [isFilterable]="filterable"
4789
4973
  [activeDescendant]="activeDescendant"
4790
- [noDataLabel]="noDataLabel"
4791
4974
  [userInput]="text"
4792
4975
  [suggestedText]="getSuggestion()"
4793
4976
  [disabled]="disabled"
@@ -4815,6 +4998,7 @@ ComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
4815
4998
  </span>
4816
4999
  <button
4817
5000
  #select
5001
+ tabindex="-1"
4818
5002
  unselectable="on"
4819
5003
  type="button"
4820
5004
  class="k-input-button k-button k-icon-button"
@@ -4874,7 +5058,7 @@ ComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
4874
5058
  <kendo-resize-sensor (resize)="onResize()"></kendo-resize-sensor>
4875
5059
  </ng-template>
4876
5060
  <ng-container #container></ng-container>
4877
- `, isInline: true, components: [{ type: SearchBarComponent, selector: "kendo-searchbar", inputs: ["id", "listId", "tagListId", "activeDescendant", "noDataLabel", "disabled", "readonly", "tabIndex", "popupOpen", "role", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i9.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: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
5061
+ `, 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: 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: i9.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: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }] });
4878
5062
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ComboBoxComponent, decorators: [{
4879
5063
  type: Component,
4880
5064
  args: [{
@@ -4914,8 +5098,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
4914
5098
  [role]="'combobox'"
4915
5099
  [id]="focusableId"
4916
5100
  [listId]="listBoxId"
5101
+ [isLoading]="loading"
5102
+ [isSuggestable]="suggest"
5103
+ [isFilterable]="filterable"
4917
5104
  [activeDescendant]="activeDescendant"
4918
- [noDataLabel]="noDataLabel"
4919
5105
  [userInput]="text"
4920
5106
  [suggestedText]="getSuggestion()"
4921
5107
  [disabled]="disabled"
@@ -4943,6 +5129,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
4943
5129
  </span>
4944
5130
  <button
4945
5131
  #select
5132
+ tabindex="-1"
4946
5133
  unselectable="on"
4947
5134
  type="button"
4948
5135
  class="k-input-button k-button k-icon-button"
@@ -5231,7 +5418,7 @@ const DEFAULT_FILL_MODE$3 = 'solid';
5231
5418
  * ```
5232
5419
  */
5233
5420
  class DropDownListComponent {
5234
- constructor(wrapper, localization, popupService, selectionService, navigationService, disabledItemsService, dataService, _zone, renderer, cdr, touchEnabled) {
5421
+ constructor(wrapper, localization, popupService, selectionService, navigationService, disabledItemsService, dataService, _zone, renderer, cdr, touchEnabled, injector) {
5235
5422
  this.wrapper = wrapper;
5236
5423
  this.localization = localization;
5237
5424
  this.popupService = popupService;
@@ -5243,6 +5430,7 @@ class DropDownListComponent {
5243
5430
  this.renderer = renderer;
5244
5431
  this.cdr = cdr;
5245
5432
  this.touchEnabled = touchEnabled;
5433
+ this.injector = injector;
5246
5434
  /**
5247
5435
  * Sets the height of the options list. By default, `listHeight` is 200px.
5248
5436
  *
@@ -5250,10 +5438,6 @@ class DropDownListComponent {
5250
5438
  * > To set the height of the popup container, use `popupSettings.height`.
5251
5439
  */
5252
5440
  this.listHeight = 200;
5253
- /**
5254
- * Sets the disabled state of the component.
5255
- */
5256
- this.disabled = false;
5257
5441
  /**
5258
5442
  * Sets the read-only state of the component.
5259
5443
  */
@@ -5325,7 +5509,8 @@ class DropDownListComponent {
5325
5509
  * @hidden
5326
5510
  */
5327
5511
  this.focusableId = `k-${guid()}`;
5328
- this.role = 'listbox';
5512
+ this.role = 'combobox';
5513
+ this.haspopup = 'listbox';
5329
5514
  this.groupIndices = [];
5330
5515
  this.listBoxId = guid();
5331
5516
  this.optionPrefix = guid();
@@ -5375,7 +5560,7 @@ class DropDownListComponent {
5375
5560
  get ariaExpanded() {
5376
5561
  return this.isOpen;
5377
5562
  }
5378
- get ariaOwns() {
5563
+ get ariaControls() {
5379
5564
  if (!this.isOpen) {
5380
5565
  return;
5381
5566
  }
@@ -5387,11 +5572,6 @@ class DropDownListComponent {
5387
5572
  }
5388
5573
  return this.optionPrefix + "-" + getter(this.dataItem, this.valueField);
5389
5574
  }
5390
- get noDataLabel() {
5391
- if (this.dataService.itemsCount === 0) {
5392
- return this.messageFor('noDataText');
5393
- }
5394
- }
5395
5575
  get appendTo() {
5396
5576
  const { appendTo } = this.popupSettings;
5397
5577
  if (!appendTo || appendTo === 'root') {
@@ -5399,6 +5579,12 @@ class DropDownListComponent {
5399
5579
  }
5400
5580
  return appendTo === 'component' ? this.container : appendTo;
5401
5581
  }
5582
+ /**
5583
+ * @hidden
5584
+ */
5585
+ get ariaLive() {
5586
+ return this.filterable ? 'polite' : 'off';
5587
+ }
5402
5588
  /**
5403
5589
  * Sets the data of the DropDownList.
5404
5590
  *
@@ -5607,9 +5793,12 @@ class DropDownListComponent {
5607
5793
  popupWrapper.style.width = max;
5608
5794
  }
5609
5795
  }
5610
- get isDisabled() {
5796
+ get isDisabledClass() {
5611
5797
  return this.disabled;
5612
5798
  }
5799
+ get isDisabledAttribute() {
5800
+ return this.disabled ? '' : null;
5801
+ }
5613
5802
  get isLoading() {
5614
5803
  return this.loading;
5615
5804
  }
@@ -5619,21 +5808,28 @@ class DropDownListComponent {
5619
5808
  get hostTabIndex() {
5620
5809
  return this.widgetTabIndex;
5621
5810
  }
5622
- get isReadonly() {
5811
+ get readonlyClass() {
5623
5812
  return this.readonly;
5624
5813
  }
5814
+ get readonlyAttr() {
5815
+ return this.readonly ? '' : null;
5816
+ }
5817
+ get isBusy() {
5818
+ return this.isLoading;
5819
+ }
5625
5820
  get isAriaExpanded() {
5626
5821
  return this.ariaExpanded;
5627
5822
  }
5628
- get hostAriaOwns() {
5629
- return this.ariaOwns;
5823
+ get hostAriaControls() {
5824
+ return this.ariaControls;
5825
+ }
5826
+ get hostAriaInvalid() {
5827
+ var _a;
5828
+ return this.formControl ? (_a = this.formControl) === null || _a === void 0 ? void 0 : _a.invalid.toString() : null;
5630
5829
  }
5631
5830
  get hostAriaActivedescendant() {
5632
5831
  return this.ariaActivedescendant;
5633
5832
  }
5634
- get hostNoDataLabel() {
5635
- return this.noDataLabel;
5636
- }
5637
5833
  /**
5638
5834
  * @hidden
5639
5835
  */
@@ -5760,6 +5956,13 @@ class DropDownListComponent {
5760
5956
  ngAfterContentChecked() {
5761
5957
  this.verifySettings();
5762
5958
  }
5959
+ /**
5960
+ * @hidden
5961
+ */
5962
+ get formControl() {
5963
+ const ngControl = this.injector.get(NgControl, null);
5964
+ return (ngControl === null || ngControl === void 0 ? void 0 : ngControl.control) || null;
5965
+ }
5763
5966
  /**
5764
5967
  * Focuses a specific item of the DropDownList based on a provided index.
5765
5968
  * If there is a default item it is positioned at index -1.
@@ -5789,6 +5992,7 @@ class DropDownListComponent {
5789
5992
  blur() {
5790
5993
  if (!this.disabled) {
5791
5994
  this.wrapper.nativeElement.blur();
5995
+ this.cdr.detectChanges();
5792
5996
  }
5793
5997
  }
5794
5998
  /**
@@ -5960,6 +6164,11 @@ class DropDownListComponent {
5960
6164
  popupWrapper.style.width = max;
5961
6165
  popupWrapper.style.height = this.height;
5962
6166
  popupWrapper.setAttribute("dir", this.direction);
6167
+ const listBox = popupWrapper.querySelector('ul.k-list-ul');
6168
+ const ariaLabel = this.wrapper.nativeElement.getAttribute('aria-labelledby');
6169
+ if (ariaLabel) {
6170
+ listBox.setAttribute('aria-labelledby', ariaLabel);
6171
+ }
5963
6172
  this.subs.add(this.popupRef.popupOpen.subscribe(() => {
5964
6173
  this.cdr.detectChanges();
5965
6174
  this.optionsList.scrollToItem(this.selectionService.focused);
@@ -6362,8 +6571,8 @@ class DropDownListComponent {
6362
6571
  }
6363
6572
  }
6364
6573
  }
6365
- DropDownListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", 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 }], target: i0.ɵɵFactoryTarget.Component });
6366
- DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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.isDisabled", "attr.aria-disabled": "this.isDisabled", "class.k-loading": "this.isLoading", "attr.id": "this.focusableId", "attr.dir": "this.dir", "attr.tabindex": "this.hostTabIndex", "attr.readonly": "this.isReadonly", "attr.aria-readonly": "this.isReadonly", "attr.role": "this.role", "attr.aria-haspopup": "this.role", "attr.aria-expanded": "this.isAriaExpanded", "attr.aria-owns": "this.hostAriaOwns", "attr.aria-activedescendant": "this.hostAriaActivedescendant", "attr.aria-label": "this.hostNoDataLabel" } }, providers: [
6574
+ DropDownListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", 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 });
6575
+ DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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: [
6367
6576
  DROPDOWNLIST_VALUE_ACCESSOR,
6368
6577
  DataService,
6369
6578
  SelectionService,
@@ -6389,7 +6598,7 @@ DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
6389
6598
  selectButtonText="Select"
6390
6599
  >
6391
6600
  </ng-container>
6392
- <span class="k-input-inner" unselectable="on" role="option" [id]="valueLabelId">
6601
+ <span class="k-input-inner" unselectable="on" [id]="valueLabelId">
6393
6602
  <span class="k-input-value-text">
6394
6603
  <ng-template *ngIf="valueTemplate"
6395
6604
  [templateContext]="{
@@ -6428,9 +6637,11 @@ DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
6428
6637
  >
6429
6638
  <span class="k-input-icon k-icon k-i-search" unselectable="on"></span>
6430
6639
  <input
6431
- [attr.aria-owns]="ariaOwns"
6640
+ role="searchbox"
6641
+ aria-autocomplete="list"
6642
+ aria-haspopup="listbox"
6643
+ [attr.aria-controls]="ariaControls"
6432
6644
  [attr.aria-activedescendant]="ariaActivedescendant"
6433
- [attr.aria-label]="noDataLabel"
6434
6645
  tabindex="-1"
6435
6646
  [filterInput]="isFocused && !touchEnabled"
6436
6647
  [dir]="direction"
@@ -6491,6 +6702,7 @@ DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
6491
6702
  [height]="listHeight"
6492
6703
  [show]="isOpen"
6493
6704
  [virtual]="virtual"
6705
+ [ariaLive]="ariaLive"
6494
6706
  (pageChange)="pageChange($event)"
6495
6707
  >
6496
6708
  </kendo-list>
@@ -6516,7 +6728,7 @@ DropDownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
6516
6728
  <kendo-resize-sensor (resize)="onResize()"></kendo-resize-sensor>
6517
6729
  </ng-template>
6518
6730
  <ng-container #container></ng-container>
6519
- `, isInline: true, components: [{ type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i9.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: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: FilterInputDirective, selector: "[filterInput]", inputs: ["filterInput"] }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: SelectableDirective, selector: "[kendoDropDownsSelectable]", inputs: ["index", "checkboxes", "height", "multipleSelection"] }] });
6731
+ `, isInline: true, components: [{ 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: i9.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: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: FilterInputDirective, selector: "[filterInput]", inputs: ["filterInput"] }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: SelectableDirective, selector: "[kendoDropDownsSelectable]", inputs: ["index", "checkboxes", "height", "multipleSelection"] }] });
6520
6732
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: DropDownListComponent, decorators: [{
6521
6733
  type: Component,
6522
6734
  args: [{
@@ -6549,7 +6761,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
6549
6761
  selectButtonText="Select"
6550
6762
  >
6551
6763
  </ng-container>
6552
- <span class="k-input-inner" unselectable="on" role="option" [id]="valueLabelId">
6764
+ <span class="k-input-inner" unselectable="on" [id]="valueLabelId">
6553
6765
  <span class="k-input-value-text">
6554
6766
  <ng-template *ngIf="valueTemplate"
6555
6767
  [templateContext]="{
@@ -6588,9 +6800,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
6588
6800
  >
6589
6801
  <span class="k-input-icon k-icon k-i-search" unselectable="on"></span>
6590
6802
  <input
6591
- [attr.aria-owns]="ariaOwns"
6803
+ role="searchbox"
6804
+ aria-autocomplete="list"
6805
+ aria-haspopup="listbox"
6806
+ [attr.aria-controls]="ariaControls"
6592
6807
  [attr.aria-activedescendant]="ariaActivedescendant"
6593
- [attr.aria-label]="noDataLabel"
6594
6808
  tabindex="-1"
6595
6809
  [filterInput]="isFocused && !touchEnabled"
6596
6810
  [dir]="direction"
@@ -6651,6 +6865,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
6651
6865
  [height]="listHeight"
6652
6866
  [show]="isOpen"
6653
6867
  [virtual]="virtual"
6868
+ [ariaLive]="ariaLive"
6654
6869
  (pageChange)="pageChange($event)"
6655
6870
  >
6656
6871
  </kendo-list>
@@ -6683,7 +6898,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
6683
6898
  }, {
6684
6899
  type: Inject,
6685
6900
  args: [TOUCH_ENABLED]
6686
- }] }]; }, propDecorators: { iconClass: [{
6901
+ }] }, { type: i0.Injector }]; }, propDecorators: { iconClass: [{
6687
6902
  type: Input
6688
6903
  }], loading: [{
6689
6904
  type: Input
@@ -6784,12 +6999,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
6784
6999
  }, {
6785
7000
  type: HostBinding,
6786
7001
  args: ['class.k-picker']
6787
- }], isDisabled: [{
7002
+ }], isDisabledClass: [{
6788
7003
  type: HostBinding,
6789
7004
  args: ['class.k-disabled']
6790
- }, {
7005
+ }], isDisabledAttribute: [{
6791
7006
  type: HostBinding,
6792
- args: ['attr.aria-disabled']
7007
+ args: ['attr.disabled']
6793
7008
  }], isLoading: [{
6794
7009
  type: HostBinding,
6795
7010
  args: ['class.k-loading']
@@ -6805,30 +7020,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
6805
7020
  }], hostTabIndex: [{
6806
7021
  type: HostBinding,
6807
7022
  args: ['attr.tabindex']
6808
- }], isReadonly: [{
7023
+ }], readonlyClass: [{
6809
7024
  type: HostBinding,
6810
7025
  args: ['attr.readonly']
6811
- }, {
7026
+ }], readonlyAttr: [{
6812
7027
  type: HostBinding,
6813
- args: ['attr.aria-readonly']
7028
+ args: ['attr.readonly']
7029
+ }], isBusy: [{
7030
+ type: HostBinding,
7031
+ args: ['attr.aria-busy']
6814
7032
  }], role: [{
6815
7033
  type: HostBinding,
6816
7034
  args: ['attr.role']
6817
- }, {
7035
+ }], haspopup: [{
6818
7036
  type: HostBinding,
6819
7037
  args: ['attr.aria-haspopup']
6820
7038
  }], isAriaExpanded: [{
6821
7039
  type: HostBinding,
6822
7040
  args: ['attr.aria-expanded']
6823
- }], hostAriaOwns: [{
7041
+ }], hostAriaControls: [{
6824
7042
  type: HostBinding,
6825
- args: ['attr.aria-owns']
7043
+ args: ['attr.aria-controls']
7044
+ }], hostAriaInvalid: [{
7045
+ type: HostBinding,
7046
+ args: ['attr.aria-invalid']
6826
7047
  }], hostAriaActivedescendant: [{
6827
7048
  type: HostBinding,
6828
7049
  args: ['attr.aria-activedescendant']
6829
- }], hostNoDataLabel: [{
6830
- type: HostBinding,
6831
- args: ['attr.aria-label']
6832
7050
  }], keydown: [{
6833
7051
  type: HostListener,
6834
7052
  args: ['keydown', ['$event']]
@@ -7426,7 +7644,6 @@ class MultiSelectComponent {
7426
7644
  */
7427
7645
  this.removeTag = new EventEmitter();
7428
7646
  this.hostClasses = true;
7429
- this.role = 'combobox';
7430
7647
  this.initialized = false;
7431
7648
  this._size = 'medium';
7432
7649
  this._rounded = 'medium';
@@ -7739,8 +7956,15 @@ class MultiSelectComponent {
7739
7956
  get isLoading() {
7740
7957
  return this.loading;
7741
7958
  }
7742
- get isAriaExpanded() {
7743
- return this.isOpen;
7959
+ /**
7960
+ * @hidden
7961
+ */
7962
+ handleKeyboardEvent(event) {
7963
+ if (event.ctrlKey && event.keyCode === Keys.KeyA) {
7964
+ event.preventDefault();
7965
+ event.stopImmediatePropagation();
7966
+ this.handleSelectAll();
7967
+ }
7744
7968
  }
7745
7969
  /**
7746
7970
  * @hidden
@@ -7803,11 +8027,6 @@ class MultiSelectComponent {
7803
8027
  }
7804
8028
  return prefix + "-" + getter(item, this.valueField);
7805
8029
  }
7806
- get noDataLabel() {
7807
- if (this.dataService.itemsCount === 0) {
7808
- return this.messageFor('noDataText');
7809
- }
7810
- }
7811
8030
  get clearButtonVisiblity() {
7812
8031
  if (this.touchEnabled) {
7813
8032
  return 'visible';
@@ -7838,23 +8057,45 @@ class MultiSelectComponent {
7838
8057
  * @hidden
7839
8058
  */
7840
8059
  change(event) {
7841
- const isCustomItem = (isPresent(event.added) || isPresent(event.removed)) && (event.added === -1 || event.removed === -1);
7842
- if (isCustomItem) {
7843
- this.addCustomValue(this.text);
7844
- return; // The change is emited asynchronosly.
7845
- }
7846
- // Existing items.
7847
- if (isPresent(event.added)) {
7848
- const dataItem = this.dataService.itemAt(event.added);
7849
- const newItem = (this.valuePrimitive && isPresent(dataItem) && isPresent(dataItem[this.valueField])) ? dataItem[this.valueField] : dataItem;
7850
- this.value = [...this.value, newItem];
7851
- }
7852
- if (isPresent(event.removed)) {
7853
- const dataItem = this.dataService.itemAt(event.removed);
7854
- const filter = (item) => getter(item, this.valueField) !== getter(dataItem, this.valueField);
7855
- this.value = this.value.filter(filter);
7856
- this.selectionService.focused = event.removed;
7857
- this.cdr.detectChanges();
8060
+ if (event.isMultipleSelection) {
8061
+ // Existing items.
8062
+ if (isPresent(event.added) && event.added.length > 0) {
8063
+ event.added.forEach((itemIndex) => {
8064
+ const dataItem = this.dataService.itemAt(itemIndex);
8065
+ const newItem = (this.valuePrimitive && isPresent(dataItem) && isPresent(dataItem[this.valueField])) ? dataItem[this.valueField] : dataItem;
8066
+ if (newItem) {
8067
+ this.value = [...this.value, newItem];
8068
+ }
8069
+ });
8070
+ }
8071
+ if (isPresent(event.removed) && event.removed.length > 0) {
8072
+ event.removed.forEach((itemIndex) => {
8073
+ const dataItem = this.dataService.itemAt(itemIndex);
8074
+ const filter = (item) => getter(item, this.valueField) !== getter(dataItem, this.valueField);
8075
+ this.value = this.value.filter(filter);
8076
+ });
8077
+ this.cdr.detectChanges();
8078
+ }
8079
+ }
8080
+ else {
8081
+ const isCustomItem = (isPresent(event.added) || isPresent(event.removed)) && (event.added === -1 || event.removed === -1);
8082
+ if (isCustomItem) {
8083
+ this.addCustomValue(this.text);
8084
+ return; // The change is emited asynchronosly.
8085
+ }
8086
+ // Existing items.
8087
+ if (isPresent(event.added)) {
8088
+ const dataItem = this.dataService.itemAt(event.added);
8089
+ const newItem = (this.valuePrimitive && isPresent(dataItem) && isPresent(dataItem[this.valueField])) ? dataItem[this.valueField] : dataItem;
8090
+ this.value = [...this.value, newItem];
8091
+ }
8092
+ if (isPresent(event.removed)) {
8093
+ const dataItem = this.dataService.itemAt(event.removed);
8094
+ const filter = (item) => getter(item, this.valueField) !== getter(dataItem, this.valueField);
8095
+ this.value = this.value.filter(filter);
8096
+ this.selectionService.focused = event.removed;
8097
+ this.cdr.detectChanges();
8098
+ }
7858
8099
  }
7859
8100
  this.emitValueChange();
7860
8101
  }
@@ -7987,10 +8228,11 @@ class MultiSelectComponent {
7987
8228
  * @hidden
7988
8229
  */
7989
8230
  clearAll(event) {
7990
- event.stopImmediatePropagation();
7991
- event.preventDefault();
8231
+ event === null || event === void 0 ? void 0 : event.stopImmediatePropagation();
8232
+ event === null || event === void 0 ? void 0 : event.preventDefault();
7992
8233
  this.focus();
7993
8234
  this.clearFilter();
8235
+ this.selectionService.lastClickedIndex = null;
7994
8236
  const selected = this.selectionService.selected;
7995
8237
  this.value = this.value.filter((_item, index) => this.disabledItemsService.isIndexDisabled(selected[index]));
7996
8238
  this.emitValueChange();
@@ -8139,7 +8381,11 @@ class MultiSelectComponent {
8139
8381
  this.navigationService.delete.pipe(filter(isTagFocused)).subscribe(this.handleDelete.bind(this)),
8140
8382
  this.navigationService.left.subscribe(this.direction === 'rtl' ? this.handleRightKey.bind(this) : this.handleLeftKey.bind(this)),
8141
8383
  this.navigationService.right.subscribe(this.direction === 'rtl' ? this.handleLeftKey.bind(this) : this.handleRightKey.bind(this)),
8142
- this.navigationService.down.subscribe((event) => this.handleDownKey(event.index))
8384
+ this.navigationService.down.subscribe((event) => this.handleDownKey(event.index)),
8385
+ this.navigationService.selectprevious.pipe(filter(isOpen)).subscribe((event) => this.handleSelectUpDown(event)),
8386
+ this.navigationService.selectnext.pipe(filter(isOpen)).subscribe((event) => this.handleSelectUpDown(event)),
8387
+ this.navigationService.selectalltobeginning.pipe(filter(isOpen)).subscribe(() => this.handleSelectAllToBeginning()),
8388
+ this.navigationService.selectalltoend.pipe(filter(isOpen)).subscribe(() => this.handleSelectAllToEnd())
8143
8389
  ].forEach(s => this.observableSubscriptions.add(s));
8144
8390
  }
8145
8391
  subscribeTouchEvents() {
@@ -8198,7 +8444,7 @@ class MultiSelectComponent {
8198
8444
  return;
8199
8445
  }
8200
8446
  if (isNumber(index)) {
8201
- this.selectionService.unselect(index);
8447
+ this.selectionService.deselect(index);
8202
8448
  this.selectionService.focused = index;
8203
8449
  this.togglePopup(false);
8204
8450
  }
@@ -8263,7 +8509,7 @@ class MultiSelectComponent {
8263
8509
  }
8264
8510
  else {
8265
8511
  if (!customItem && this.selectionService.isSelected(itemIndex)) {
8266
- this.selectionService.unselect(itemIndex);
8512
+ this.selectionService.deselect(itemIndex);
8267
8513
  this.selectionService.focused = itemIndex;
8268
8514
  }
8269
8515
  else {
@@ -8285,7 +8531,7 @@ class MultiSelectComponent {
8285
8531
  }
8286
8532
  handleItemChange(event) {
8287
8533
  this.change(event);
8288
- if (this.autoClose) {
8534
+ if (this.autoClose && !event.preventClosingPopup) {
8289
8535
  this.togglePopup(false);
8290
8536
  }
8291
8537
  if (this.autoClose || !this.filterable) {
@@ -8295,6 +8541,7 @@ class MultiSelectComponent {
8295
8541
  handleEnter(event) {
8296
8542
  const service = this.selectionService;
8297
8543
  const focusedIndex = this.selectionService.focused;
8544
+ this.selectionService.lastClickedIndex = focusedIndex;
8298
8545
  if (this.isOpen) {
8299
8546
  event.originalEvent.preventDefault();
8300
8547
  }
@@ -8305,7 +8552,7 @@ class MultiSelectComponent {
8305
8552
  return; // Clear filter & close are done at customValueSubscription due to race conditions.
8306
8553
  }
8307
8554
  if (service.isSelected(focusedIndex)) {
8308
- service.unselect(focusedIndex);
8555
+ service.deselect(focusedIndex);
8309
8556
  service.focused = focusedIndex;
8310
8557
  }
8311
8558
  else {
@@ -8328,6 +8575,85 @@ class MultiSelectComponent {
8328
8575
  handleHome() {
8329
8576
  this.focusedTagIndex = 0;
8330
8577
  }
8578
+ sortSelectionAscending() {
8579
+ return this.selectionService.selected.sort((a, b) => a - b);
8580
+ }
8581
+ handleSelectAll() {
8582
+ const selectedItemsCount = this.selectionService.selected.length;
8583
+ const dataItemsCount = this.dataService.data.length;
8584
+ const dataItemsWithoutHeadersCount = this.dataService.data.filter(i => !i.header).length;
8585
+ if ((!this.dataService.grouped && selectedItemsCount === dataItemsCount) ||
8586
+ (this.dataService.grouped && selectedItemsCount === dataItemsWithoutHeadersCount)) {
8587
+ this.clearAll();
8588
+ }
8589
+ else {
8590
+ this.selectionService.selectFromTo(0, dataItemsCount - 1);
8591
+ this.selectionService.emitMultipleAddedRemoved();
8592
+ }
8593
+ }
8594
+ handleSelectAllToBeginning() {
8595
+ const selectedItemsCount = this.selectionService.selected.length;
8596
+ const dataItemsCount = this.dataService.data.length;
8597
+ const focusedItem = this.selectionService.focused;
8598
+ const largestIndex = this.sortSelectionAscending()[selectedItemsCount - 1];
8599
+ if (selectedItemsCount !== dataItemsCount) {
8600
+ this.selectionService.unselectFromTo(largestIndex, focusedItem + 1);
8601
+ this.selectionService.selectFromTo(0, focusedItem);
8602
+ }
8603
+ this.nextTick(() => this.selectionService.focus(0));
8604
+ this.selectionService.emitMultipleAddedRemoved();
8605
+ }
8606
+ handleSelectAllToEnd() {
8607
+ const selectedItemsCount = this.selectionService.selected.length;
8608
+ const dataItemsCount = this.dataService.data.length;
8609
+ const focusedItem = this.selectionService.focused;
8610
+ if (selectedItemsCount !== dataItemsCount) {
8611
+ this.selectionService.unselectFromTo(focusedItem - 1, 0);
8612
+ this.selectionService.selectFromTo(focusedItem, dataItemsCount - 1);
8613
+ }
8614
+ if (this.dataService.grouped) {
8615
+ const lastItemIndex = this.dataService.groupIndices[this.dataService.groupIndices.length - 1] - 1;
8616
+ this.nextTick(() => this.selectionService.focus(lastItemIndex));
8617
+ }
8618
+ else {
8619
+ this.nextTick(() => this.selectionService.focus(dataItemsCount - 1));
8620
+ }
8621
+ this.selectionService.emitMultipleAddedRemoved();
8622
+ }
8623
+ handleSelectUpDown(event) {
8624
+ const focusedIndex = this.selectionService.focused;
8625
+ if (!isPresent(focusedIndex)) {
8626
+ return;
8627
+ }
8628
+ let indexToSelect;
8629
+ if (event.originalEvent.key === 'ArrowUp') {
8630
+ indexToSelect = focusedIndex > 0 ? focusedIndex - 1 : focusedIndex;
8631
+ }
8632
+ else {
8633
+ indexToSelect = focusedIndex < this.dataService.data.length - 1 ? focusedIndex + 1 : focusedIndex;
8634
+ }
8635
+ if (!isPresent(this.selectionService.lastClickedIndex)) {
8636
+ this.selectionService.lastClickedIndex = focusedIndex;
8637
+ }
8638
+ this.selectRangeFromTo(indexToSelect);
8639
+ }
8640
+ /**
8641
+ * Selects all items between the focused item and the last clicked item (index). Also removes all other selected items.
8642
+ */
8643
+ selectRangeFromTo(indexToSelect) {
8644
+ const lastClickedIndex = this.selectionService.lastClickedIndex;
8645
+ if (lastClickedIndex > indexToSelect) {
8646
+ this.selectionService.unselectNotNeededIndices(indexToSelect, lastClickedIndex, this.dataService.data.length);
8647
+ this.selectionService.selectFromTo(indexToSelect, this.selectionService.lastClickedIndex);
8648
+ this.selectionService.emitMultipleAddedRemoved();
8649
+ }
8650
+ else {
8651
+ this.selectionService.unselectNotNeededIndices(lastClickedIndex, indexToSelect, this.dataService.data.length);
8652
+ this.selectionService.selectFromTo(lastClickedIndex, indexToSelect);
8653
+ this.selectionService.emitMultipleAddedRemoved();
8654
+ }
8655
+ this.nextTick(() => this.selectionService.focus(indexToSelect));
8656
+ }
8331
8657
  handleUp(index) {
8332
8658
  this.selectionService.focused = index;
8333
8659
  }
@@ -8463,6 +8789,11 @@ class MultiSelectComponent {
8463
8789
  popupWrapper.style.width = max;
8464
8790
  popupWrapper.style.height = this.height;
8465
8791
  popupWrapper.setAttribute("dir", this.direction);
8792
+ const listBox = popupWrapper.querySelector('ul.k-list-ul');
8793
+ const ariaLabel = this.searchbar.input.nativeElement.getAttribute('aria-labelledby');
8794
+ if (ariaLabel) {
8795
+ listBox.setAttribute('aria-labelledby', ariaLabel);
8796
+ }
8466
8797
  this.popupRef.popupOpen.subscribe(() => {
8467
8798
  this.cdr.detectChanges();
8468
8799
  this.optionsList.scrollToItem(this.selectionService.focused);
@@ -8521,7 +8852,7 @@ class MultiSelectComponent {
8521
8852
  }
8522
8853
  }
8523
8854
  MultiSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i0.ElementRef }, { token: i1.LocalizationService }, { token: i2.PopupService }, { token: DataService }, { token: SelectionService }, { token: NavigationService }, { token: DisabledItemsService }, { token: i0.ChangeDetectorRef }, { token: i0.KeyValueDiffers }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: TOUCH_ENABLED, optional: true }], target: i0.ɵɵFactoryTarget.Component });
8524
- MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: MultiSelectComponent, selector: "kendo-multiselect", inputs: { focusableId: "focusableId", autoClose: "autoClose", loading: "loading", data: "data", value: "value", valueField: "valueField", textField: "textField", tabindex: "tabindex", tabIndex: "tabIndex", size: "size", rounded: "rounded", fillMode: "fillMode", placeholder: "placeholder", disabled: "disabled", itemDisabled: "itemDisabled", checkboxes: "checkboxes", readonly: "readonly", filterable: "filterable", virtual: "virtual", popupSettings: "popupSettings", listHeight: "listHeight", valuePrimitive: "valuePrimitive", clearButton: "clearButton", tagMapper: "tagMapper", allowCustom: "allowCustom", valueNormalizer: "valueNormalizer" }, outputs: { filterChange: "filterChange", valueChange: "valueChange", open: "open", opened: "opened", close: "close", closed: "closed", onFocus: "focus", onBlur: "blur", removeTag: "removeTag" }, host: { listeners: { "mousedown": "hostMousedown($event)" }, properties: { "class.k-multiselect": "this.hostClasses", "class.k-input": "this.hostClasses", "attr.dir": "this.dir", "class.k-disabled": "this.disabledClass", "class.k-loading": "this.isLoading", "attr.role": "this.role", "attr.aria-expanded": "this.isAriaExpanded" } }, providers: [
8855
+ MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: MultiSelectComponent, selector: "kendo-multiselect", inputs: { focusableId: "focusableId", autoClose: "autoClose", loading: "loading", data: "data", value: "value", valueField: "valueField", textField: "textField", tabindex: "tabindex", tabIndex: "tabIndex", size: "size", rounded: "rounded", fillMode: "fillMode", placeholder: "placeholder", disabled: "disabled", itemDisabled: "itemDisabled", checkboxes: "checkboxes", readonly: "readonly", filterable: "filterable", virtual: "virtual", popupSettings: "popupSettings", listHeight: "listHeight", valuePrimitive: "valuePrimitive", clearButton: "clearButton", tagMapper: "tagMapper", allowCustom: "allowCustom", valueNormalizer: "valueNormalizer" }, outputs: { filterChange: "filterChange", valueChange: "valueChange", open: "open", opened: "opened", close: "close", closed: "closed", onFocus: "focus", onBlur: "blur", removeTag: "removeTag" }, host: { listeners: { "document:keydown": "handleKeyboardEvent($event)", "mousedown": "hostMousedown($event)" }, properties: { "class.k-multiselect": "this.hostClasses", "class.k-input": "this.hostClasses", "attr.dir": "this.dir", "class.k-disabled": "this.disabledClass", "class.k-loading": "this.isLoading" } }, providers: [
8525
8856
  MULTISELECT_VALUE_ACCESSOR,
8526
8857
  DataService,
8527
8858
  SelectionService,
@@ -8566,10 +8897,12 @@ MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
8566
8897
  <kendo-searchbar
8567
8898
  #searchbar
8568
8899
  [id]="focusableId"
8569
- [role]="'textbox'"
8900
+ [role]="'combobox'"
8570
8901
  [tagListId]="tagListId"
8902
+ [listId]="listBoxId"
8903
+ [isLoading]="loading"
8904
+ [isFilterable]="filterable"
8571
8905
  [activeDescendant]="activeDescendant"
8572
- [noDataLabel]="noDataLabel"
8573
8906
  [userInput]="text"
8574
8907
  [disabled]="disabled"
8575
8908
  [readonly]="readonly"
@@ -8643,6 +8976,7 @@ MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
8643
8976
  [virtual]="virtual"
8644
8977
  (pageChange)="pageChange($event)"
8645
8978
  [checkboxes]="checkboxes"
8979
+ [isMultiselect]="true"
8646
8980
  >
8647
8981
  </kendo-list>
8648
8982
  <!--no data template-->
@@ -8667,7 +9001,7 @@ MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
8667
9001
  <kendo-resize-sensor (resize)="onResize()"></kendo-resize-sensor>
8668
9002
  </ng-template>
8669
9003
  <ng-container #container></ng-container>
8670
- `, 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", "noDataLabel", "disabled", "readonly", "tabIndex", "popupOpen", "role", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i9.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: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: SelectableDirective, selector: "[kendoDropDownsSelectable]", inputs: ["index", "checkboxes", "height", "multipleSelection"] }] });
9004
+ `, 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: 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: i9.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: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: SelectableDirective, selector: "[kendoDropDownsSelectable]", inputs: ["index", "checkboxes", "height", "multipleSelection"] }] });
8671
9005
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: MultiSelectComponent, decorators: [{
8672
9006
  type: Component,
8673
9007
  args: [{
@@ -8719,10 +9053,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
8719
9053
  <kendo-searchbar
8720
9054
  #searchbar
8721
9055
  [id]="focusableId"
8722
- [role]="'textbox'"
9056
+ [role]="'combobox'"
8723
9057
  [tagListId]="tagListId"
9058
+ [listId]="listBoxId"
9059
+ [isLoading]="loading"
9060
+ [isFilterable]="filterable"
8724
9061
  [activeDescendant]="activeDescendant"
8725
- [noDataLabel]="noDataLabel"
8726
9062
  [userInput]="text"
8727
9063
  [disabled]="disabled"
8728
9064
  [readonly]="readonly"
@@ -8796,6 +9132,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
8796
9132
  [virtual]="virtual"
8797
9133
  (pageChange)="pageChange($event)"
8798
9134
  [checkboxes]="checkboxes"
9135
+ [isMultiselect]="true"
8799
9136
  >
8800
9137
  </kendo-list>
8801
9138
  <!--no data template-->
@@ -8954,12 +9291,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
8954
9291
  }], isLoading: [{
8955
9292
  type: HostBinding,
8956
9293
  args: ['class.k-loading']
8957
- }], role: [{
8958
- type: HostBinding,
8959
- args: ['attr.role']
8960
- }], isAriaExpanded: [{
8961
- type: HostBinding,
8962
- args: ['attr.aria-expanded']
9294
+ }], handleKeyboardEvent: [{
9295
+ type: HostListener,
9296
+ args: ['document:keydown', ['$event']]
8963
9297
  }], hostMousedown: [{
8964
9298
  type: HostListener,
8965
9299
  args: ['mousedown', ['$event']]
@@ -9266,6 +9600,9 @@ MultiColumnComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
9266
9600
 
9267
9601
  i18n-clearTitle="kendo.multicolumncombobox.clearTitle|The title of the clear button"
9268
9602
  clearTitle="clear"
9603
+
9604
+ i18n-selectButtonText="kendo.multicolumncombobox.selectButtonText|The title of the select button"
9605
+ selectButtonText="Select"
9269
9606
  >
9270
9607
  </ng-container>
9271
9608
  <kendo-searchbar
@@ -9273,8 +9610,10 @@ MultiColumnComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
9273
9610
  [role]="'combobox'"
9274
9611
  [id]="focusableId"
9275
9612
  [listId]="listBoxId"
9613
+ [isLoading]="loading"
9614
+ [isSuggestable]="suggest"
9615
+ [isFilterable]="filterable"
9276
9616
  [activeDescendant]="activeDescendant"
9277
- [noDataLabel]="noDataLabel"
9278
9617
  [userInput]="text"
9279
9618
  [suggestedText]="getSuggestion()"
9280
9619
  [disabled]="disabled"
@@ -9472,7 +9811,7 @@ MultiColumnComboBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
9472
9811
 
9473
9812
  <!-- when the popupSettings.appendTo value is set to 'component', this container is used -->
9474
9813
  <ng-container #container></ng-container>
9475
- `, isInline: true, components: [{ type: SearchBarComponent, selector: "kendo-searchbar", inputs: ["id", "listId", "tagListId", "activeDescendant", "noDataLabel", "disabled", "readonly", "tabIndex", "popupOpen", "role", "userInput", "suggestedText", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize"] }, { type: i9.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: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
9814
+ `, 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: 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: i9.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: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
9476
9815
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: MultiColumnComboBoxComponent, decorators: [{
9477
9816
  type: Component,
9478
9817
  args: [{
@@ -9510,6 +9849,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
9510
9849
 
9511
9850
  i18n-clearTitle="kendo.multicolumncombobox.clearTitle|The title of the clear button"
9512
9851
  clearTitle="clear"
9852
+
9853
+ i18n-selectButtonText="kendo.multicolumncombobox.selectButtonText|The title of the select button"
9854
+ selectButtonText="Select"
9513
9855
  >
9514
9856
  </ng-container>
9515
9857
  <kendo-searchbar
@@ -9517,8 +9859,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
9517
9859
  [role]="'combobox'"
9518
9860
  [id]="focusableId"
9519
9861
  [listId]="listBoxId"
9862
+ [isLoading]="loading"
9863
+ [isSuggestable]="suggest"
9864
+ [isFilterable]="filterable"
9520
9865
  [activeDescendant]="activeDescendant"
9521
- [noDataLabel]="noDataLabel"
9522
9866
  [userInput]="text"
9523
9867
  [suggestedText]="getSuggestion()"
9524
9868
  [disabled]="disabled"
@@ -13839,21 +14183,21 @@ SharedModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "
13839
14183
  TemplateContextDirective,
13840
14184
  TagListComponent,
13841
14185
  CheckDirective,
13842
- CheckAllDirective], imports: [CommonModule, FormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule], exports: [ListComponent,
14186
+ CheckAllDirective], imports: [CommonModule, FormsModule, ReactiveFormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule], exports: [ListComponent,
13843
14187
  ListItemDirective,
13844
14188
  SelectableDirective,
13845
14189
  SearchBarComponent,
13846
14190
  TemplateContextDirective,
13847
14191
  TagListComponent,
13848
14192
  CheckDirective,
13849
- CheckAllDirective, CommonModule, FormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule] });
13850
- SharedModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SharedModule, imports: [[CommonModule, FormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule], CommonModule, FormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule] });
14193
+ CheckAllDirective, CommonModule, FormsModule, ReactiveFormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule] });
14194
+ SharedModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SharedModule, imports: [[CommonModule, FormsModule, ReactiveFormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule], CommonModule, FormsModule, ReactiveFormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule] });
13851
14195
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SharedModule, decorators: [{
13852
14196
  type: NgModule,
13853
14197
  args: [{
13854
14198
  declarations: [INTERNAL_DIRECTIVES],
13855
- exports: [INTERNAL_DIRECTIVES, CommonModule, FormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule],
13856
- imports: [CommonModule, FormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule]
14199
+ exports: [INTERNAL_DIRECTIVES, CommonModule, FormsModule, ReactiveFormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule],
14200
+ imports: [CommonModule, FormsModule, ReactiveFormsModule, PopupModule, ResizeSensorModule, SharedDirectivesModule, EventsModule]
13857
14201
  }]
13858
14202
  }] });
13859
14203