@progress/kendo-angular-dropdowns 17.0.0-develop.9 → 17.0.0

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 (129) hide show
  1. package/README.md +40 -99
  2. package/autocomplete/autocomplete.component.d.ts +1 -1
  3. package/autocomplete/autocomplete.module.d.ts +1 -1
  4. package/comboboxes/combobox-column/combobox-column.component.d.ts +1 -1
  5. package/comboboxes/combobox.component.d.ts +1 -1
  6. package/comboboxes/combobox.module.d.ts +1 -1
  7. package/common/action-sheet.component.d.ts +1 -1
  8. package/common/disabled-items/item-disabled.d.ts +1 -1
  9. package/common/filter-input.directive.d.ts +1 -1
  10. package/common/filtering/filter.directive.d.ts +1 -1
  11. package/common/list.component.d.ts +1 -1
  12. package/common/localization/messages.d.ts +1 -1
  13. package/common/models/direction.d.ts +1 -1
  14. package/common/models/fillmode.d.ts +1 -1
  15. package/common/models/list-type.d.ts +1 -1
  16. package/common/models/rounded.d.ts +1 -1
  17. package/common/models/size.d.ts +1 -1
  18. package/common/searchbar.component.d.ts +1 -1
  19. package/common/selection/selectable.directive.d.ts +1 -1
  20. package/common/shared-events.directive.d.ts +1 -1
  21. package/common/taglist.component.d.ts +2 -2
  22. package/common/util.d.ts +2 -2
  23. package/dropdownlist/dropdownlist.component.d.ts +1 -1
  24. package/dropdowns.module.d.ts +1 -1
  25. package/dropdowntrees/checked-state/base-check.directive.d.ts +1 -1
  26. package/dropdowntrees/checked-state/check-all.directive.d.ts +1 -1
  27. package/dropdowntrees/checked-state/check.directive.d.ts +1 -1
  28. package/dropdowntrees/data-binding/dropdowntree/flat-binding.directive.d.ts +1 -1
  29. package/dropdowntrees/data-binding/dropdowntree/hierarchy-binding.directive.d.ts +1 -1
  30. package/dropdowntrees/data-binding/multiselecttree/flat-binding.directive.d.ts +1 -1
  31. package/dropdowntrees/data-binding/multiselecttree/hierarchy-binding.directive.d.ts +1 -1
  32. package/dropdowntrees/dropdowntree.component.d.ts +1 -1
  33. package/dropdowntrees/expanded-state/expand.directive.d.ts +1 -1
  34. package/dropdowntrees/multiselecttree.component.d.ts +1 -1
  35. package/dropdowntrees/summary-tag/summary-tag.directive.d.ts +1 -1
  36. package/{esm2020 → esm2022}/autocomplete/autocomplete.component.mjs +235 -173
  37. package/{esm2020 → esm2022}/autocomplete/autocomplete.module.mjs +11 -11
  38. package/{esm2020 → esm2022}/comboboxes/combobox-column/column-cell-template.directive.mjs +4 -3
  39. package/{esm2020 → esm2022}/comboboxes/combobox-column/column-header-template.directive.mjs +4 -3
  40. package/esm2022/comboboxes/combobox-column/combobox-column.component.mjs +105 -0
  41. package/{esm2020 → esm2022}/comboboxes/combobox.component.mjs +326 -248
  42. package/{esm2020 → esm2022}/comboboxes/combobox.module.mjs +11 -11
  43. package/{esm2020 → esm2022}/comboboxes/multicolumncombobox.component.mjs +53 -48
  44. package/{esm2020 → esm2022}/common/action-sheet.component.mjs +26 -14
  45. package/{esm2020 → esm2022}/common/data.service.mjs +8 -7
  46. package/{esm2020 → esm2022}/common/disabled-items/disabled-items.service.mjs +6 -4
  47. package/{esm2020 → esm2022}/common/filter-input.directive.mjs +6 -3
  48. package/{esm2020 → esm2022}/common/filtering/filter.directive.mjs +20 -13
  49. package/{esm2020 → esm2022}/common/filtering/filterable-component.mjs +21 -0
  50. package/{esm2020 → esm2022}/common/list-item.directive.mjs +4 -3
  51. package/{esm2020 → esm2022}/common/list.component.mjs +72 -36
  52. package/{esm2020 → esm2022}/common/localization/custom-messages.component.mjs +9 -8
  53. package/{esm2020 → esm2022}/common/localization/localized-messages.directive.mjs +9 -8
  54. package/esm2022/common/localization/messages.mjs +65 -0
  55. package/{esm2020 → esm2022}/common/models/preventable-event.mjs +1 -3
  56. package/{esm2020 → esm2022}/common/models/remove-tag-event.mjs +4 -0
  57. package/{esm2020 → esm2022}/common/navigation/navigation.service.mjs +27 -23
  58. package/{esm2020 → esm2022}/common/searchbar.component.mjs +45 -28
  59. package/{esm2020 → esm2022}/common/selection/selectable.directive.mjs +9 -5
  60. package/{esm2020 → esm2022}/common/selection/selection.service.mjs +13 -10
  61. package/{esm2020 → esm2022}/common/shared-events.directive.mjs +13 -7
  62. package/{esm2020 → esm2022}/common/taglist.component.mjs +36 -27
  63. package/{esm2020 → esm2022}/common/templates/custom-item-template.directive.mjs +4 -3
  64. package/{esm2020 → esm2022}/common/templates/fixed-group-template.directive.mjs +4 -3
  65. package/{esm2020 → esm2022}/common/templates/footer-template.directive.mjs +4 -3
  66. package/{esm2020 → esm2022}/common/templates/group-tag-template.directive.mjs +4 -3
  67. package/{esm2020 → esm2022}/common/templates/group-template.directive.mjs +4 -3
  68. package/{esm2020 → esm2022}/common/templates/header-template.directive.mjs +4 -3
  69. package/{esm2020 → esm2022}/common/templates/item-template.directive.mjs +4 -3
  70. package/{esm2020 → esm2022}/common/templates/no-data-template.directive.mjs +4 -3
  71. package/{esm2020 → esm2022}/common/templates/tag-template.directive.mjs +4 -3
  72. package/{esm2020 → esm2022}/common/templates/value-template.directive.mjs +4 -3
  73. package/{esm2020 → esm2022}/dropdownlist/dropdownlist.component.mjs +259 -184
  74. package/{esm2020 → esm2022}/dropdownlist/dropdownlist.module.mjs +8 -8
  75. package/esm2022/dropdowns.module.mjs +87 -0
  76. package/{esm2020 → esm2022}/dropdowntrees/checked-state/base-check.directive.mjs +10 -3
  77. package/{esm2020 → esm2022}/dropdowntrees/checked-state/check-all.directive.mjs +38 -21
  78. package/{esm2020 → esm2022}/dropdowntrees/checked-state/check.directive.mjs +31 -15
  79. package/{esm2020 → esm2022}/dropdowntrees/data-binding/dropdowntree/flat-binding.directive.mjs +12 -7
  80. package/{esm2020 → esm2022}/dropdowntrees/data-binding/dropdowntree/hierarchy-binding.directive.mjs +8 -7
  81. package/{esm2020 → esm2022}/dropdowntrees/data-binding/multiselecttree/flat-binding.directive.mjs +12 -7
  82. package/{esm2020 → esm2022}/dropdowntrees/data-binding/multiselecttree/hierarchy-binding.directive.mjs +8 -7
  83. package/{esm2020 → esm2022}/dropdowntrees/dropdowntree.component.mjs +309 -232
  84. package/{esm2020 → esm2022}/dropdowntrees/dropdowntrees.module.mjs +12 -12
  85. package/{esm2020 → esm2022}/dropdowntrees/expanded-state/expand.directive.mjs +8 -7
  86. package/{esm2020 → esm2022}/dropdowntrees/lookup/lookup.service.mjs +4 -6
  87. package/{esm2020 → esm2022}/dropdowntrees/multiselecttree.component.mjs +324 -254
  88. package/{esm2020 → esm2022}/dropdowntrees/summary-tag/summary-tag.directive.mjs +8 -7
  89. package/{esm2020 → esm2022}/dropdowntrees/templates/node-template.directive.mjs +4 -3
  90. package/{esm2020 → esm2022}/index.mjs +0 -2
  91. package/{esm2020 → esm2022}/multiselect/multiselect.component.mjs +328 -254
  92. package/{esm2020 → esm2022}/multiselect/multiselect.module.mjs +11 -11
  93. package/{esm2020 → esm2022}/multiselect/summary-tag.directive.mjs +8 -7
  94. package/{esm2020 → esm2022}/package-metadata.mjs +2 -2
  95. package/{fesm2020 → fesm2022}/progress-kendo-angular-dropdowns.mjs +2528 -1927
  96. package/index.d.ts +0 -2
  97. package/multiselect/multiselect.component.d.ts +1 -1
  98. package/multiselect/multiselect.module.d.ts +1 -1
  99. package/multiselect/summary-tag.directive.d.ts +1 -1
  100. package/package.json +18 -24
  101. package/schematics/ngAdd/index.js +3 -3
  102. package/common/shared-directives.module.d.ts +0 -37
  103. package/common/shared.module.d.ts +0 -29
  104. package/esm2020/comboboxes/combobox-column/combobox-column.component.mjs +0 -60
  105. package/esm2020/common/localization/messages.mjs +0 -33
  106. package/esm2020/common/shared-directives.module.mjs +0 -84
  107. package/esm2020/common/shared.module.mjs +0 -68
  108. package/esm2020/dropdowns.module.mjs +0 -87
  109. package/fesm2015/progress-kendo-angular-dropdowns.mjs +0 -17609
  110. /package/{esm2020 → esm2022}/comboboxes/combobox-column/util.mjs +0 -0
  111. /package/{esm2020 → esm2022}/common/constants/error-messages.mjs +0 -0
  112. /package/{esm2020 → esm2022}/common/disabled-items/item-disabled.mjs +0 -0
  113. /package/{esm2020 → esm2022}/common/filtering/filter-settings.mjs +0 -0
  114. /package/{esm2020 → esm2022}/common/models/checkboxes-settings.mjs +0 -0
  115. /package/{esm2020 → esm2022}/common/models/direction.mjs +0 -0
  116. /package/{esm2020 → esm2022}/common/models/fillmode.mjs +0 -0
  117. /package/{esm2020 → esm2022}/common/models/list-type.mjs +0 -0
  118. /package/{esm2020 → esm2022}/common/models/page-change-event.mjs +0 -0
  119. /package/{esm2020 → esm2022}/common/models/popup-settings.mjs +0 -0
  120. /package/{esm2020 → esm2022}/common/models/rounded.mjs +0 -0
  121. /package/{esm2020 → esm2022}/common/models/size.mjs +0 -0
  122. /package/{esm2020 → esm2022}/common/models/virtualization-settings.mjs +0 -0
  123. /package/{esm2020 → esm2022}/common/navigation/navigation-action.mjs +0 -0
  124. /package/{esm2020 → esm2022}/common/util.mjs +0 -0
  125. /package/{esm2020 → esm2022}/directives.mjs +0 -0
  126. /package/{esm2020 → esm2022}/dropdowntrees/checked-state/checkable-settings.mjs +0 -0
  127. /package/{esm2020 → esm2022}/dropdowntrees/checked-state/checked-item.mjs +0 -0
  128. /package/{esm2020 → esm2022}/dropdowntrees/lookup/lookup.mjs +0 -0
  129. /package/{esm2020 → esm2022}/progress-kendo-angular-dropdowns.mjs +0 -0
@@ -76,239 +76,43 @@ const DEFAULT_FILL_MODE = 'solid';
76
76
  * ```
77
77
  */
78
78
  export class MultiSelectComponent {
79
- constructor(wrapper, localization, popupService, dataService, selectionService, navigationService, disabledItemsService, cdr, differs, renderer, _zone, injector, hostElement) {
80
- this.wrapper = wrapper;
81
- this.localization = localization;
82
- this.popupService = popupService;
83
- this.dataService = dataService;
84
- this.selectionService = selectionService;
85
- this.navigationService = navigationService;
86
- this.disabledItemsService = disabledItemsService;
87
- this.cdr = cdr;
88
- this.differs = differs;
89
- this.renderer = renderer;
90
- this._zone = _zone;
91
- this.injector = injector;
92
- this.hostElement = hostElement;
93
- /**
94
- * @hidden
95
- */
96
- this.animationDuration = animationDuration;
97
- /**
98
- * @hidden
99
- */
100
- this.xIcon = xIcon;
101
- /**
102
- * @hidden
103
- */
104
- this.plusIcon = plusIcon;
105
- this.listBoxId = `k-${guid()}`;
106
- this.tagListId = `k-${guid()}`;
107
- this.tagPrefix = "tag-" + guid();
108
- this.optionPrefix = "option-" + guid();
109
- this.focusedTagIndex = undefined;
110
- /**
111
- * Shows or hides the current group sticky header when using grouped data.
112
- * By default the sticky header is displayed ([see example]({% slug grouping_autocomplete %}#toc-sticky-header)).
113
- */
114
- this.showStickyHeader = true;
115
- /**
116
- * @hidden
117
- */
118
- this.focusableId = `k-${guid()}`;
119
- /**
120
- * Determines whether to close the options list of the MultiSelect after the item selection is finished
121
- * ([see example]({% slug openstate_multiselect %}#toc-keeping-the-options-list-open-while-on-focus)).
122
- * @default true
123
- */
124
- this.autoClose = true;
125
- /**
126
- * Specifies the [`tabindex`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex) of the component.
127
- */
128
- this.tabindex = 0;
129
- /**
130
- * Enables or disables the adaptive mode. By default the adaptive rendering is disabled.
131
- */
132
- this.adaptiveMode = 'none';
133
- /**
134
- * Sets the title of the ActionSheet that is rendered instead of the Popup when using small screen devices.
135
- * By default the ActionSheet title uses the text provided for the label of the AutoComplete.
136
- */
137
- this.title = '';
138
- /**
139
- * Sets the disabled state of the component. To learn how to disable the component in reactive forms, refer to the article on [Forms Support](slug:formssupport_multiselect#toc-managing-the-multiselect-disabled-state-in-reactive-forms).
140
- */
141
- this.disabled = false;
142
- /**
143
- * Sets the read-only state of the component.
144
- *
145
- * @default false
146
- */
147
- this.readonly = false;
148
- /**
149
- * Enables the [filtering]({% slug filtering_multiselect %}) functionality of the MultiSelect.
150
- */
151
- this.filterable = false;
152
- this._listHeight = 200;
153
- /**
154
- * If set to `true`, renders a button on hovering over the component.
155
- * Clicking this button resets the value of the component to an empty array and triggers the `change` event.
156
- */
157
- this.clearButton = true;
158
- /**
159
- * A user-defined callback function which receives an array of selected data items and maps them to an array of tags
160
- * ([see examples]({% slug summarytagmode_multiselect %}#toc-rendering-of-tags)).
161
- *
162
- * @param { Any[] } dataItems - The selected data items from the list.
163
- * @returns { Any[] } - The tags that will be rendered by the component.
164
- */
165
- this.tagMapper = (tags) => tags || [];
166
- /**
167
- * Specifies whether the MultiSelect allows user-defined values that are not present in the dataset
168
- * ([more information and examples]({% slug custom_values_multiselect %})).
169
- * Defaults to `false`.
170
- *
171
- * The feature is not available when using adaptive mode.
172
- */
173
- this.allowCustom = false;
174
- /**
175
- * A user-defined callback function which returns normalized custom values.
176
- * Typically used when the data items are different from type `string`.
177
- *
178
- * @param { Any } value - The custom value that is defined by the user.
179
- * @returns { Any }
180
- *
181
- * @example
182
- * ```ts
183
- * import { map } from 'rxjs/operators';
184
- *
185
- * _@Component({
186
- * selector: 'my-app',
187
- * template: `
188
- * <kendo-multiselect
189
- * [allowCustom]="true"
190
- * [data]="listItems"
191
- * textField="text"
192
- * valueField="value"
193
- * [valueNormalizer]="valueNormalizer"
194
- * (valueChange)="onValueChange($event)"
195
- * >
196
- * </kendo-multiselect>
197
- * `
198
- * })
199
- *
200
- * class AppComponent {
201
- * public listItems: Array<{ text: string, value: number }> = [
202
- * { text: "Small", value: 1 },
203
- * { text: "Medium", value: 2 },
204
- * { text: "Large", value: 3 }
205
- * ];
206
- *
207
- * public onValueChange(value) {
208
- * console.log("valueChange : ", value);
209
- * }
210
- *
211
- * public valueNormalizer = (text$: Observable<string>) => text$.pipe(map((text: string) => {
212
- * return {
213
- * value: Math.floor(Math.random() * (1000 - 100) + 1000), //generate unique valueField
214
- * text: text };
215
- * }));
216
- *
217
- * }
218
- * ```
219
- */
220
- this.valueNormalizer = (text) => text.pipe(map((userInput) => {
221
- const comparer = (item) => typeof item === 'string' && userInput.toLowerCase() === item.toLowerCase();
222
- const matchingValue = this.value.find(comparer);
223
- if (matchingValue) {
224
- return matchingValue;
225
- }
226
- const matchingItem = this.dataService.find(comparer);
227
- return matchingItem ? matchingItem : userInput;
228
- }));
229
- /**
230
- * Fires each time the user types in the input field.
231
- * You can filter the source based on the passed filtration value.
232
- */
233
- this.filterChange = new EventEmitter();
234
- /**
235
- * Fires each time the value is changed&mdash;
236
- * when the component is blurred or the value is cleared through the **Clear** button
237
- * ([see example](slug:events_multiselect)).
238
- * When the value of the component is programmatically changed to `ngModel` or `formControl`
239
- * through its API or form binding, the `valueChange` event is not triggered because it
240
- * might cause a mix-up with the built-in `valueChange` mechanisms of the `ngModel` or `formControl` bindings.
241
- */
242
- this.valueChange = new EventEmitter();
243
- /**
244
- * Fires each time the popup is about to open
245
- * ([see example]({% slug openstate_multiselect %}#toc-preventing-opening-and-closing)).
246
- * This event is preventable. If you cancel it, the popup will remain closed.
247
- */
248
- this.open = new EventEmitter();
249
- /**
250
- * Fires after the popup has been opened.
251
- */
252
- this.opened = new EventEmitter();
253
- /**
254
- * Fires each time the popup is about to close
255
- * ([see example]({% slug openstate_multiselect %}#toc-preventing-opening-and-closing)).
256
- * This event is preventable. If you cancel it, the popup will remain open.
257
- */
258
- this.close = new EventEmitter();
259
- /**
260
- * Fires after the popup has been closed.
261
- */
262
- this.closed = new EventEmitter();
263
- /**
264
- * Fires each time the user focuses the MultiSelect.
265
- */
266
- this.onFocus = new EventEmitter();
267
- /**
268
- * Fires each time the MultiSelect gets blurred.
269
- */
270
- this.onBlur = new EventEmitter();
271
- /**
272
- * Fires each time the user focuses the `input` element.
273
- */
274
- this.inputFocus = new EventEmitter();
275
- /**
276
- * Fires each time the `input` element gets blurred.
277
- */
278
- this.inputBlur = new EventEmitter();
279
- /**
280
- * Fires each time a tag is about to be removed([see examples]({% slug summarytagmode_multiselecttree %}#toc-notifying-on-removing-group-tags)).
281
- * This event is preventable. If you cancel it, the tag will not be removed.
282
- */
283
- this.removeTag = new EventEmitter();
284
- this.hostClasses = true;
285
- /**
286
- * @hidden
287
- */
288
- this.windowSize = 'large';
289
- this.initialized = false;
290
- this._size = 'medium';
291
- this._rounded = 'medium';
292
- this._fillMode = 'solid';
293
- this._valueHolder = [];
294
- this.onChangeCallback = (_) => { };
295
- this.onTouchedCallback = (_) => { };
296
- this._placeholder = '';
297
- this._open = false;
298
- this._value = [];
299
- this._popupSettings = { animate: true };
300
- this._checkboxes = { enabled: false };
301
- this._isFocused = false;
302
- this.selectedDataItems = [];
303
- this.customValueSubject = new Subject();
304
- this.subs = new Subscription();
305
- validatePackage(packageMetadata);
306
- this.popupMouseDownHandler = this.onMouseDown.bind(this);
307
- this.data = [];
308
- this.direction = this.localization.rtl ? 'rtl' : 'ltr';
309
- this.subscribeEvents();
310
- this.subscribeTouchEvents();
311
- }
79
+ wrapper;
80
+ localization;
81
+ popupService;
82
+ dataService;
83
+ selectionService;
84
+ navigationService;
85
+ disabledItemsService;
86
+ cdr;
87
+ differs;
88
+ renderer;
89
+ _zone;
90
+ injector;
91
+ hostElement;
92
+ /**
93
+ * @hidden
94
+ */
95
+ animationDuration = animationDuration;
96
+ /**
97
+ * @hidden
98
+ */
99
+ xIcon = xIcon;
100
+ /**
101
+ * @hidden
102
+ */
103
+ plusIcon = plusIcon;
104
+ listBoxId = `k-${guid()}`;
105
+ tagListId = `k-${guid()}`;
106
+ tagPrefix = "tag-" + guid();
107
+ optionPrefix = "option-" + guid();
108
+ popupRef;
109
+ text;
110
+ tags;
111
+ focusedTagIndex = undefined;
112
+ /**
113
+ * @hidden
114
+ */
115
+ responsiveRendererComponent;
312
116
  /**
313
117
  * @hidden
314
118
  */
@@ -494,6 +298,25 @@ export class MultiSelectComponent {
494
298
  }
495
299
  return appendTo === 'component' ? this.container : appendTo;
496
300
  }
301
+ /**
302
+ * Shows or hides the current group sticky header when using grouped data.
303
+ * By default the sticky header is displayed ([see example]({% slug grouping_autocomplete %}#toc-sticky-header)).
304
+ */
305
+ showStickyHeader = true;
306
+ /**
307
+ * @hidden
308
+ */
309
+ focusableId = `k-${guid()}`;
310
+ /**
311
+ * Determines whether to close the options list of the MultiSelect after the item selection is finished
312
+ * ([see example]({% slug openstate_multiselect %}#toc-keeping-the-options-list-open-while-on-focus)).
313
+ * @default true
314
+ */
315
+ autoClose = true;
316
+ /**
317
+ * Sets and gets the loading state of the MultiSelect.
318
+ */
319
+ loading;
497
320
  /**
498
321
  * Sets the data of the MultiSelect.
499
322
  *
@@ -538,6 +361,24 @@ export class MultiSelectComponent {
538
361
  get value() {
539
362
  return this._value;
540
363
  }
364
+ /**
365
+ * Sets the data item field that represents the item value.
366
+ * If the data contains only primitive values, do not define it.
367
+ *
368
+ * > The `valueField` property can be set to point to a nested property value - e.g. `category.id`.
369
+ */
370
+ valueField;
371
+ /**
372
+ * Sets the data item field that represents the item text.
373
+ * If the data contains only primitive values, do not define it.
374
+ *
375
+ * > The `textField` property can be set to point to a nested property value - e.g. `category.name`.
376
+ */
377
+ textField;
378
+ /**
379
+ * Specifies the [`tabindex`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex) of the component.
380
+ */
381
+ tabindex = 0;
541
382
  /**
542
383
  * @hidden
543
384
  */
@@ -621,6 +462,15 @@ export class MultiSelectComponent {
621
462
  get placeholder() {
622
463
  return this.selectedDataItems.length ? '' : this._placeholder;
623
464
  }
465
+ /**
466
+ * Enables or disables the adaptive mode. By default the adaptive rendering is disabled.
467
+ */
468
+ adaptiveMode = 'none';
469
+ /**
470
+ * Sets the title of the ActionSheet that is rendered instead of the Popup when using small screen devices.
471
+ * By default the ActionSheet title uses the text provided for the label of the AutoComplete.
472
+ */
473
+ title = '';
624
474
  /**
625
475
  * Sets the subtitle of the ActionSheet that is rendered instead of the Popup when using small screen devices.
626
476
  * By default the ActionSheet subtitle uses the text provided for the `placeholder` of the AutoComplete.
@@ -637,6 +487,10 @@ export class MultiSelectComponent {
637
487
  get isAdaptiveModeEnabled() {
638
488
  return this.adaptiveMode === 'auto';
639
489
  }
490
+ /**
491
+ * Sets the disabled state of the component. To learn how to disable the component in reactive forms, refer to the article on [Forms Support](slug:formssupport_multiselect#toc-managing-the-multiselect-disabled-state-in-reactive-forms).
492
+ */
493
+ disabled = false;
640
494
  /**
641
495
  * Defines a Boolean function that is executed for each data item in the component
642
496
  * ([see examples]({% slug disableditems_multiselect %})). Determines whether the item will be disabled.
@@ -656,6 +510,16 @@ export class MultiSelectComponent {
656
510
  get checkboxes() {
657
511
  return this._checkboxes;
658
512
  }
513
+ /**
514
+ * Sets the read-only state of the component.
515
+ *
516
+ * @default false
517
+ */
518
+ readonly = false;
519
+ /**
520
+ * Enables the [filtering]({% slug filtering_multiselect %}) functionality of the MultiSelect.
521
+ */
522
+ filterable = false;
659
523
  /**
660
524
  * Enables the [virtualization]({% slug virtualization_multiselect %}) functionality.
661
525
  */
@@ -698,6 +562,7 @@ export class MultiSelectComponent {
698
562
  }
699
563
  return this._listHeight;
700
564
  }
565
+ _listHeight = 200;
701
566
  /**
702
567
  * Specifies the type of the selected value.
703
568
  * If set to `true`, the selected value has to be of the primitive type
@@ -712,6 +577,164 @@ export class MultiSelectComponent {
712
577
  }
713
578
  return this._valuePrimitive;
714
579
  }
580
+ /**
581
+ * If set to `true`, renders a button on hovering over the component.
582
+ * Clicking this button resets the value of the component to an empty array and triggers the `change` event.
583
+ */
584
+ clearButton = true;
585
+ /**
586
+ * A user-defined callback function which receives an array of selected data items and maps them to an array of tags
587
+ * ([see examples]({% slug summarytagmode_multiselect %}#toc-rendering-of-tags)).
588
+ *
589
+ * @param { Any[] } dataItems - The selected data items from the list.
590
+ * @returns { Any[] } - The tags that will be rendered by the component.
591
+ */
592
+ tagMapper = (tags) => tags || [];
593
+ /**
594
+ * Specifies whether the MultiSelect allows user-defined values that are not present in the dataset
595
+ * ([more information and examples]({% slug custom_values_multiselect %})).
596
+ * Defaults to `false`.
597
+ *
598
+ * The feature is not available when using adaptive mode.
599
+ */
600
+ allowCustom = false;
601
+ /**
602
+ * A user-defined callback function which returns normalized custom values.
603
+ * Typically used when the data items are different from type `string`.
604
+ *
605
+ * @param { Any } value - The custom value that is defined by the user.
606
+ * @returns { Any }
607
+ *
608
+ * @example
609
+ * ```ts
610
+ * import { map } from 'rxjs/operators';
611
+ *
612
+ * _@Component({
613
+ * selector: 'my-app',
614
+ * template: `
615
+ * <kendo-multiselect
616
+ * [allowCustom]="true"
617
+ * [data]="listItems"
618
+ * textField="text"
619
+ * valueField="value"
620
+ * [valueNormalizer]="valueNormalizer"
621
+ * (valueChange)="onValueChange($event)"
622
+ * >
623
+ * </kendo-multiselect>
624
+ * `
625
+ * })
626
+ *
627
+ * class AppComponent {
628
+ * public listItems: Array<{ text: string, value: number }> = [
629
+ * { text: "Small", value: 1 },
630
+ * { text: "Medium", value: 2 },
631
+ * { text: "Large", value: 3 }
632
+ * ];
633
+ *
634
+ * public onValueChange(value) {
635
+ * console.log("valueChange : ", value);
636
+ * }
637
+ *
638
+ * public valueNormalizer = (text$: Observable<string>) => text$.pipe(map((text: string) => {
639
+ * return {
640
+ * value: Math.floor(Math.random() * (1000 - 100) + 1000), //generate unique valueField
641
+ * text: text };
642
+ * }));
643
+ *
644
+ * }
645
+ * ```
646
+ */
647
+ valueNormalizer = (text) => text.pipe(map((userInput) => {
648
+ const comparer = (item) => typeof item === 'string' && userInput.toLowerCase() === item.toLowerCase();
649
+ const matchingValue = this.value.find(comparer);
650
+ if (matchingValue) {
651
+ return matchingValue;
652
+ }
653
+ const matchingItem = this.dataService.find(comparer);
654
+ return matchingItem ? matchingItem : userInput;
655
+ }));
656
+ /**
657
+ * Sets the HTML attributes of the inner focusable input element. Attributes which are essential for certain component functionalities cannot be changed.
658
+ */
659
+ inputAttributes;
660
+ /**
661
+ * Fires each time the user types in the input field.
662
+ * You can filter the source based on the passed filtration value.
663
+ */
664
+ filterChange = new EventEmitter();
665
+ /**
666
+ * Fires each time the value is changed&mdash;
667
+ * when the component is blurred or the value is cleared through the **Clear** button
668
+ * ([see example](slug:events_multiselect)).
669
+ * When the value of the component is programmatically changed to `ngModel` or `formControl`
670
+ * through its API or form binding, the `valueChange` event is not triggered because it
671
+ * might cause a mix-up with the built-in `valueChange` mechanisms of the `ngModel` or `formControl` bindings.
672
+ */
673
+ valueChange = new EventEmitter();
674
+ /**
675
+ * Fires each time the popup is about to open
676
+ * ([see example]({% slug openstate_multiselect %}#toc-preventing-opening-and-closing)).
677
+ * This event is preventable. If you cancel it, the popup will remain closed.
678
+ */
679
+ open = new EventEmitter();
680
+ /**
681
+ * Fires after the popup has been opened.
682
+ */
683
+ opened = new EventEmitter();
684
+ /**
685
+ * Fires each time the popup is about to close
686
+ * ([see example]({% slug openstate_multiselect %}#toc-preventing-opening-and-closing)).
687
+ * This event is preventable. If you cancel it, the popup will remain open.
688
+ */
689
+ close = new EventEmitter();
690
+ /**
691
+ * Fires after the popup has been closed.
692
+ */
693
+ closed = new EventEmitter();
694
+ /**
695
+ * Fires each time the user focuses the MultiSelect.
696
+ */
697
+ onFocus = new EventEmitter();
698
+ /**
699
+ * Fires each time the MultiSelect gets blurred.
700
+ */
701
+ onBlur = new EventEmitter();
702
+ /**
703
+ * Fires each time the user focuses the `input` element.
704
+ */
705
+ inputFocus = new EventEmitter();
706
+ /**
707
+ * Fires each time the `input` element gets blurred.
708
+ */
709
+ inputBlur = new EventEmitter();
710
+ /**
711
+ * Fires each time a tag is about to be removed([see examples]({% slug summarytagmode_multiselecttree %}#toc-notifying-on-removing-group-tags)).
712
+ * This event is preventable. If you cancel it, the tag will not be removed.
713
+ */
714
+ removeTag = new EventEmitter();
715
+ container;
716
+ searchbar;
717
+ tagList;
718
+ popupTemplate;
719
+ optionsList;
720
+ template;
721
+ customItemTemplate;
722
+ groupTemplate;
723
+ fixedGroupTemplate;
724
+ headerTemplate;
725
+ footerTemplate;
726
+ tagTemplate;
727
+ groupTagTemplate;
728
+ noDataTemplate;
729
+ /**
730
+ * @hidden
731
+ */
732
+ suffixTemplate;
733
+ /**
734
+ * @hidden
735
+ */
736
+ prefixTemplate;
737
+ hostClasses = true;
715
738
  get dir() {
716
739
  return this.direction;
717
740
  }
@@ -721,6 +744,10 @@ export class MultiSelectComponent {
721
744
  get isLoading() {
722
745
  return this.loading;
723
746
  }
747
+ /**
748
+ * @hidden
749
+ */
750
+ windowSize = 'large';
724
751
  /**
725
752
  * @hidden
726
753
  */
@@ -733,6 +760,34 @@ export class MultiSelectComponent {
733
760
  get isAdaptive() {
734
761
  return this.isAdaptiveModeEnabled && this.windowSize !== 'large';
735
762
  }
763
+ disabledIndices;
764
+ initialized = false;
765
+ _size = 'medium';
766
+ _rounded = 'medium';
767
+ _fillMode = 'solid';
768
+ _subtitle;
769
+ _valueHolder = [];
770
+ constructor(wrapper, localization, popupService, dataService, selectionService, navigationService, disabledItemsService, cdr, differs, renderer, _zone, injector, hostElement) {
771
+ this.wrapper = wrapper;
772
+ this.localization = localization;
773
+ this.popupService = popupService;
774
+ this.dataService = dataService;
775
+ this.selectionService = selectionService;
776
+ this.navigationService = navigationService;
777
+ this.disabledItemsService = disabledItemsService;
778
+ this.cdr = cdr;
779
+ this.differs = differs;
780
+ this.renderer = renderer;
781
+ this._zone = _zone;
782
+ this.injector = injector;
783
+ this.hostElement = hostElement;
784
+ validatePackage(packageMetadata);
785
+ this.popupMouseDownHandler = this.onMouseDown.bind(this);
786
+ this.data = [];
787
+ this.direction = this.localization.rtl ? 'rtl' : 'ltr';
788
+ this.subscribeEvents();
789
+ this.subscribeTouchEvents();
790
+ }
736
791
  get listContainerClasses() {
737
792
  const containerClasses = ['k-list-container', 'k-multiselect-popup'];
738
793
  if (this.popupSettings.popupClass) {
@@ -1173,6 +1228,16 @@ export class MultiSelectComponent {
1173
1228
  this.togglePopup(true);
1174
1229
  }
1175
1230
  }
1231
+ onChangeCallback = (_) => { };
1232
+ onTouchedCallback = (_) => { };
1233
+ _placeholder = '';
1234
+ _open = false;
1235
+ _value = [];
1236
+ _popupSettings = { animate: true };
1237
+ _virtualSettings;
1238
+ _valuePrimitive;
1239
+ _checkboxes = { enabled: false };
1240
+ _isFocused = false;
1176
1241
  set isFocused(isFocused) {
1177
1242
  this.renderer[isFocused ? 'addClass' : 'removeClass'](this.wrapper.nativeElement, 'k-focus');
1178
1243
  this._isFocused = isFocused;
@@ -1180,6 +1245,15 @@ export class MultiSelectComponent {
1180
1245
  get isFocused() {
1181
1246
  return this._isFocused;
1182
1247
  }
1248
+ selectedDataItems = [];
1249
+ popupMouseDownHandler;
1250
+ customValueSubject = new Subject();
1251
+ customValueSubscription;
1252
+ subs = new Subscription();
1253
+ touchstartDisposeHandler;
1254
+ direction;
1255
+ differ;
1256
+ valueChangeDetected;
1183
1257
  subscribeEvents() {
1184
1258
  if (!isDocumentAvailable()) {
1185
1259
  return;
@@ -1736,26 +1810,25 @@ export class MultiSelectComponent {
1736
1810
  this.selectionService.focus(this.selectionService.focused);
1737
1811
  this.actionSheetSearchBar.focus();
1738
1812
  }
1739
- }
1740
- MultiSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i0.ElementRef }, { token: i1.LocalizationService }, { token: i2.PopupService }, { token: i3.DataService }, { token: i4.SelectionService }, { token: i5.NavigationService }, { token: i6.DisabledItemsService }, { token: i0.ChangeDetectorRef }, { token: i0.KeyValueDiffers }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.Injector }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1741
- MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: MultiSelectComponent, isStandalone: true, selector: "kendo-multiselect", inputs: { showStickyHeader: "showStickyHeader", 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", adaptiveMode: "adaptiveMode", title: "title", subtitle: "subtitle", 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", inputAttributes: "inputAttributes" }, outputs: { filterChange: "filterChange", valueChange: "valueChange", open: "open", opened: "opened", close: "close", closed: "closed", onFocus: "focus", onBlur: "blur", inputFocus: "inputFocus", inputBlur: "inputBlur", removeTag: "removeTag" }, host: { properties: { "class.k-readonly": "this.readonly", "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: [
1742
- MULTISELECT_VALUE_ACCESSOR,
1743
- DataService,
1744
- SelectionService,
1745
- NavigationService,
1746
- DisabledItemsService,
1747
- LocalizationService,
1748
- {
1749
- provide: L10N_PREFIX,
1750
- useValue: 'kendo.multiselect'
1751
- },
1752
- {
1753
- provide: FilterableComponent, useExisting: forwardRef(() => MultiSelectComponent)
1754
- },
1755
- {
1756
- provide: KendoInput, useExisting: forwardRef(() => MultiSelectComponent)
1757
- }
1758
- ], queries: [{ propertyName: "template", first: true, predicate: ItemTemplateDirective, descendants: true }, { propertyName: "customItemTemplate", first: true, predicate: CustomItemTemplateDirective, descendants: true }, { propertyName: "groupTemplate", first: true, predicate: GroupTemplateDirective, descendants: true }, { propertyName: "fixedGroupTemplate", first: true, predicate: FixedGroupTemplateDirective, descendants: true }, { propertyName: "headerTemplate", first: true, predicate: HeaderTemplateDirective, descendants: true }, { propertyName: "footerTemplate", first: true, predicate: FooterTemplateDirective, descendants: true }, { propertyName: "tagTemplate", first: true, predicate: TagTemplateDirective, descendants: true }, { propertyName: "groupTagTemplate", first: true, predicate: GroupTagTemplateDirective, descendants: true }, { propertyName: "noDataTemplate", first: true, predicate: NoDataTemplateDirective, descendants: true }, { propertyName: "suffixTemplate", first: true, predicate: SuffixTemplateDirective, descendants: true }, { propertyName: "prefixTemplate", first: true, predicate: PrefixTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "responsiveRendererComponent", first: true, predicate: ResponsiveRendererComponent, descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "searchbar", first: true, predicate: SearchBarComponent, descendants: true, static: true }, { propertyName: "tagList", first: true, predicate: TagListComponent, descendants: true, static: true }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }, { propertyName: "optionsList", first: true, predicate: ["optionsList"], descendants: true }], exportAs: ["kendoMultiSelect"], usesOnChanges: true, ngImport: i0, template: `
1813
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i0.ElementRef }, { token: i1.LocalizationService }, { token: i2.PopupService }, { token: i3.DataService }, { token: i4.SelectionService }, { token: i5.NavigationService }, { token: i6.DisabledItemsService }, { token: i0.ChangeDetectorRef }, { token: i0.KeyValueDiffers }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.Injector }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1814
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MultiSelectComponent, isStandalone: true, selector: "kendo-multiselect", inputs: { showStickyHeader: "showStickyHeader", 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", adaptiveMode: "adaptiveMode", title: "title", subtitle: "subtitle", 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", inputAttributes: "inputAttributes" }, outputs: { filterChange: "filterChange", valueChange: "valueChange", open: "open", opened: "opened", close: "close", closed: "closed", onFocus: "focus", onBlur: "blur", inputFocus: "inputFocus", inputBlur: "inputBlur", removeTag: "removeTag" }, host: { properties: { "class.k-readonly": "this.readonly", "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: [
1815
+ MULTISELECT_VALUE_ACCESSOR,
1816
+ DataService,
1817
+ SelectionService,
1818
+ NavigationService,
1819
+ DisabledItemsService,
1820
+ LocalizationService,
1821
+ {
1822
+ provide: L10N_PREFIX,
1823
+ useValue: 'kendo.multiselect'
1824
+ },
1825
+ {
1826
+ provide: FilterableComponent, useExisting: forwardRef(() => MultiSelectComponent)
1827
+ },
1828
+ {
1829
+ provide: KendoInput, useExisting: forwardRef(() => MultiSelectComponent)
1830
+ }
1831
+ ], queries: [{ propertyName: "template", first: true, predicate: ItemTemplateDirective, descendants: true }, { propertyName: "customItemTemplate", first: true, predicate: CustomItemTemplateDirective, descendants: true }, { propertyName: "groupTemplate", first: true, predicate: GroupTemplateDirective, descendants: true }, { propertyName: "fixedGroupTemplate", first: true, predicate: FixedGroupTemplateDirective, descendants: true }, { propertyName: "headerTemplate", first: true, predicate: HeaderTemplateDirective, descendants: true }, { propertyName: "footerTemplate", first: true, predicate: FooterTemplateDirective, descendants: true }, { propertyName: "tagTemplate", first: true, predicate: TagTemplateDirective, descendants: true }, { propertyName: "groupTagTemplate", first: true, predicate: GroupTagTemplateDirective, descendants: true }, { propertyName: "noDataTemplate", first: true, predicate: NoDataTemplateDirective, descendants: true }, { propertyName: "suffixTemplate", first: true, predicate: SuffixTemplateDirective, descendants: true }, { propertyName: "prefixTemplate", first: true, predicate: PrefixTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "responsiveRendererComponent", first: true, predicate: ResponsiveRendererComponent, descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "searchbar", first: true, predicate: SearchBarComponent, descendants: true, static: true }, { propertyName: "tagList", first: true, predicate: TagListComponent, descendants: true, static: true }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }, { propertyName: "optionsList", first: true, predicate: ["optionsList"], descendants: true }], exportAs: ["kendoMultiSelect"], usesOnChanges: true, ngImport: i0, template: `
1759
1832
  <ng-container kendoMultiSelectLocalizedMessages
1760
1833
  i18n-noDataText="kendo.multiselect.noDataText|The text displayed in the popup when there are no items"
1761
1834
  noDataText="NO DATA FOUND"
@@ -1951,7 +2024,8 @@ MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", v
1951
2024
  </ng-template>
1952
2025
  </ng-template>
1953
2026
  `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "\n [kendoDropDownListLocalizedMessages],\n [kendoDropDownTreeLocalizedMessages],\n [kendoComboBoxLocalizedMessages],\n [kendoMultiColumnComboBoxLocalizedMessages],\n [kendoAutoCompleteLocalizedMessages],\n [kendoMultiSelectLocalizedMessages],\n [kendoMultiSelectTreeLocalizedMessages]\n " }, { kind: "directive", type: SharedDropDownEventsDirective, selector: "[kendoDropDownSharedEvents]", inputs: ["hostElement", "clearButtonClicked", "isFocused"], outputs: ["isFocusedChange", "onFocus", "handleBlur"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SeparatorComponent, selector: "kendo-separator", inputs: ["orientation"] }, { kind: "component", type: TagListComponent, selector: "kendo-taglist", inputs: ["tags", "textField", "valueField", "valueDepth", "focused", "template", "groupTemplate", "disabled", "tagPrefix", "id", "size", "rounded", "fillMode", "disabledIndices"], outputs: ["removeTag"] }, { kind: "component", type: SearchBarComponent, selector: "input[kendoSearchbar]", inputs: ["tagListId", "readonly", "disabled", "isRequired", "isSuggestable", "isFilterable", "userInput", "suggestedText", "inputAttributes", "id", "activeDescendant", "tabIndex", "isLoading", "ariaControls", "ariaExpanded", "placeholder"], outputs: ["valueChange", "onBlur", "onFocus", "onClick", "onNavigate"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "component", type: ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }, { kind: "component", type: ResponsiveRendererComponent, selector: "responsive-renderer", inputs: ["title", "showActionButtons", "subtitle", "size", "showTextInput", "sharedPopupActionSheetTemplate", "isActionSheetExpanded", "text", "placeholder"], outputs: ["closePopup", "textInputChange", "navigate", "onExpand", "onCollapse", "onApply", "onCancel"] }, { kind: "directive", type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: SelectableDirective, selector: "[kendoDropDownsSelectable]", inputs: ["index", "checkboxes", "height", "isMultiselect", "multipleSelection"] }, { kind: "component", type: ListComponent, selector: "kendo-list", inputs: ["selected", "focused", "textField", "valueField", "height", "template", "groupTemplate", "fixedGroupTemplate", "show", "id", "optionPrefix", "multipleSelection", "virtual", "type", "checkboxes", "ariaLive", "isMultiselect", "isActionSheetExpanded", "showStickyHeader", "data", "size", "rounded"], outputs: ["onClick", "pageChange", "listResize", "popupListScroll"] }] });
1954
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MultiSelectComponent, decorators: [{
2027
+ }
2028
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, decorators: [{
1955
2029
  type: Component,
1956
2030
  args: [{
1957
2031
  exportAs: 'kendoMultiSelect',