@fundamental-ngx/core 0.33.4-rc.6 → 0.33.4

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 (156) hide show
  1. package/README.md +1 -3
  2. package/action-bar/package.json +3 -3
  3. package/action-sheet/package.json +3 -3
  4. package/alert/package.json +3 -3
  5. package/avatar/avatar.component.d.ts +2 -0
  6. package/avatar/esm2020/avatar.component.mjs +8 -5
  7. package/avatar/fesm2015/fundamental-ngx-core-avatar.mjs +7 -4
  8. package/avatar/fesm2015/fundamental-ngx-core-avatar.mjs.map +1 -1
  9. package/avatar/fesm2020/fundamental-ngx-core-avatar.mjs +7 -4
  10. package/avatar/fesm2020/fundamental-ngx-core-avatar.mjs.map +1 -1
  11. package/avatar/package.json +3 -3
  12. package/avatar-group/package.json +3 -3
  13. package/bar/package.json +3 -3
  14. package/breadcrumb/package.json +3 -3
  15. package/busy-indicator/package.json +3 -3
  16. package/button/package.json +3 -3
  17. package/calendar/package.json +3 -3
  18. package/card/package.json +3 -3
  19. package/carousel/package.json +3 -3
  20. package/checkbox/checkbox/checkbox.component.d.ts +30 -35
  21. package/checkbox/esm2020/checkbox/checkbox.component.mjs +61 -80
  22. package/checkbox/fesm2015/fundamental-ngx-core-checkbox.mjs +59 -77
  23. package/checkbox/fesm2015/fundamental-ngx-core-checkbox.mjs.map +1 -1
  24. package/checkbox/fesm2020/fundamental-ngx-core-checkbox.mjs +59 -77
  25. package/checkbox/fesm2020/fundamental-ngx-core-checkbox.mjs.map +1 -1
  26. package/checkbox/package.json +3 -3
  27. package/combobox/package.json +3 -3
  28. package/date-picker/package.json +3 -3
  29. package/datetime/package.json +3 -3
  30. package/datetime-picker/package.json +3 -3
  31. package/dialog/package.json +3 -3
  32. package/dynamic-page/package.json +3 -3
  33. package/dynamic-side-content/package.json +3 -3
  34. package/esm2020/avatar/avatar.component.mjs +8 -5
  35. package/esm2020/checkbox/checkbox/checkbox.component.mjs +61 -80
  36. package/esm2020/input-group/input-group.component.mjs +2 -2
  37. package/esm2020/list/list-item/list-item.component.mjs +6 -2
  38. package/esm2020/multi-input/multi-input.component.mjs +38 -11
  39. package/esm2020/utils/helpers/range-selector.mjs +113 -0
  40. package/esm2020/utils/public_api.mjs +2 -1
  41. package/facets/package.json +3 -3
  42. package/feed-input/package.json +3 -3
  43. package/feed-list-item/package.json +3 -3
  44. package/fesm2015/fundamental-ngx-core-avatar.mjs +7 -4
  45. package/fesm2015/fundamental-ngx-core-avatar.mjs.map +1 -1
  46. package/fesm2015/fundamental-ngx-core-checkbox.mjs +59 -77
  47. package/fesm2015/fundamental-ngx-core-checkbox.mjs.map +1 -1
  48. package/fesm2015/fundamental-ngx-core-input-group.mjs +2 -2
  49. package/fesm2015/fundamental-ngx-core-list.mjs +5 -1
  50. package/fesm2015/fundamental-ngx-core-list.mjs.map +1 -1
  51. package/fesm2015/fundamental-ngx-core-multi-input.mjs +40 -11
  52. package/fesm2015/fundamental-ngx-core-multi-input.mjs.map +1 -1
  53. package/fesm2015/fundamental-ngx-core-utils.mjs +114 -1
  54. package/fesm2015/fundamental-ngx-core-utils.mjs.map +1 -1
  55. package/fesm2020/fundamental-ngx-core-avatar.mjs +7 -4
  56. package/fesm2020/fundamental-ngx-core-avatar.mjs.map +1 -1
  57. package/fesm2020/fundamental-ngx-core-checkbox.mjs +59 -77
  58. package/fesm2020/fundamental-ngx-core-checkbox.mjs.map +1 -1
  59. package/fesm2020/fundamental-ngx-core-input-group.mjs +2 -2
  60. package/fesm2020/fundamental-ngx-core-list.mjs +5 -1
  61. package/fesm2020/fundamental-ngx-core-list.mjs.map +1 -1
  62. package/fesm2020/fundamental-ngx-core-multi-input.mjs +38 -11
  63. package/fesm2020/fundamental-ngx-core-multi-input.mjs.map +1 -1
  64. package/fesm2020/fundamental-ngx-core-utils.mjs +114 -1
  65. package/fesm2020/fundamental-ngx-core-utils.mjs.map +1 -1
  66. package/file-uploader/package.json +3 -3
  67. package/fixed-card-layout/package.json +3 -3
  68. package/flexible-column-layout/package.json +3 -3
  69. package/form/package.json +3 -3
  70. package/formatted-text/package.json +3 -3
  71. package/grid-list/package.json +3 -3
  72. package/icon/package.json +3 -3
  73. package/illustrated-message/package.json +3 -3
  74. package/infinite-scroll/package.json +3 -3
  75. package/info-label/package.json +3 -3
  76. package/inline-help/package.json +3 -3
  77. package/input-group/esm2020/input-group.component.mjs +2 -2
  78. package/input-group/fesm2015/fundamental-ngx-core-input-group.mjs +2 -2
  79. package/input-group/fesm2020/fundamental-ngx-core-input-group.mjs +2 -2
  80. package/input-group/package.json +3 -3
  81. package/layout-grid/package.json +3 -3
  82. package/layout-panel/package.json +3 -3
  83. package/link/package.json +3 -3
  84. package/list/esm2020/list-item/list-item.component.mjs +6 -2
  85. package/list/fesm2015/fundamental-ngx-core-list.mjs +5 -1
  86. package/list/fesm2015/fundamental-ngx-core-list.mjs.map +1 -1
  87. package/list/fesm2020/fundamental-ngx-core-list.mjs +5 -1
  88. package/list/fesm2020/fundamental-ngx-core-list.mjs.map +1 -1
  89. package/list/package.json +3 -3
  90. package/menu/package.json +3 -3
  91. package/message-box/package.json +3 -3
  92. package/message-page/package.json +2 -2
  93. package/message-strip/package.json +3 -3
  94. package/message-toast/package.json +3 -3
  95. package/micro-process-flow/package.json +3 -3
  96. package/mobile-mode/package.json +3 -3
  97. package/multi-input/esm2020/multi-input.component.mjs +38 -11
  98. package/multi-input/fesm2015/fundamental-ngx-core-multi-input.mjs +40 -11
  99. package/multi-input/fesm2015/fundamental-ngx-core-multi-input.mjs.map +1 -1
  100. package/multi-input/fesm2020/fundamental-ngx-core-multi-input.mjs +38 -11
  101. package/multi-input/fesm2020/fundamental-ngx-core-multi-input.mjs.map +1 -1
  102. package/multi-input/multi-input.component.d.ts +8 -1
  103. package/multi-input/package.json +3 -3
  104. package/nested-list/package.json +3 -3
  105. package/notification/package.json +3 -3
  106. package/object-identifier/package.json +3 -3
  107. package/object-marker/package.json +3 -3
  108. package/object-number/package.json +3 -3
  109. package/object-status/package.json +3 -3
  110. package/package.json +7 -7
  111. package/pagination/package.json +3 -3
  112. package/panel/package.json +3 -3
  113. package/popover/package.json +3 -3
  114. package/product-switch/package.json +3 -3
  115. package/progress-indicator/package.json +1 -1
  116. package/quick-view/package.json +3 -3
  117. package/radio/package.json +3 -3
  118. package/rating-indicator/package.json +3 -3
  119. package/resizable-card-layout/package.json +3 -3
  120. package/scroll-spy/package.json +3 -3
  121. package/scrollbar/package.json +3 -3
  122. package/segmented-button/package.json +3 -3
  123. package/select/package.json +3 -3
  124. package/shared/package.json +3 -3
  125. package/shellbar/package.json +3 -3
  126. package/side-navigation/package.json +3 -3
  127. package/slider/package.json +3 -3
  128. package/split-button/package.json +3 -3
  129. package/splitter/package.json +3 -3
  130. package/status-indicator/package.json +3 -3
  131. package/step-input/package.json +3 -3
  132. package/switch/package.json +3 -3
  133. package/table/package.json +3 -3
  134. package/tabs/package.json +3 -3
  135. package/tests/package.json +2 -2
  136. package/text/package.json +3 -3
  137. package/tile/package.json +3 -3
  138. package/time/package.json +3 -3
  139. package/time-picker/package.json +3 -3
  140. package/timeline/package.json +3 -3
  141. package/title/package.json +3 -3
  142. package/token/package.json +3 -3
  143. package/toolbar/package.json +3 -3
  144. package/tree/package.json +3 -3
  145. package/upload-collection/package.json +3 -3
  146. package/utils/esm2020/helpers/range-selector.mjs +113 -0
  147. package/utils/esm2020/public_api.mjs +2 -1
  148. package/utils/fesm2015/fundamental-ngx-core-utils.mjs +114 -1
  149. package/utils/fesm2015/fundamental-ngx-core-utils.mjs.map +1 -1
  150. package/utils/fesm2020/fundamental-ngx-core-utils.mjs +114 -1
  151. package/utils/fesm2020/fundamental-ngx-core-utils.mjs.map +1 -1
  152. package/utils/helpers/range-selector.d.ts +84 -0
  153. package/utils/package.json +6 -6
  154. package/utils/public_api.d.ts +1 -0
  155. package/vertical-navigation/package.json +3 -3
  156. package/wizard/package.json +3 -3
@@ -5,7 +5,7 @@ import { CommonModule } from '@angular/common';
5
5
  import { __decorate, __metadata } from 'tslib';
6
6
  import * as i10 from '@angular/forms';
7
7
  import { FormControl, NG_VALUE_ACCESSOR, FormsModule, ReactiveFormsModule } from '@angular/forms';
8
- import { DOWN_ARROW, UP_ARROW, ENTER, ESCAPE, TAB, SPACE } from '@angular/cdk/keycodes';
8
+ import { SPACE, ENTER, DOWN_ARROW, UP_ARROW, ESCAPE, TAB } from '@angular/cdk/keycodes';
9
9
  import { BehaviorSubject, Subscription, combineLatest } from 'rxjs';
10
10
  import * as i2$1 from '@fundamental-ngx/core/popover';
11
11
  import { PopoverComponent, PopoverModule } from '@fundamental-ngx/core/popover';
@@ -15,10 +15,10 @@ import { TokenizerComponent, TokenModule } from '@fundamental-ngx/core/token';
15
15
  import * as i6 from '@fundamental-ngx/core/list';
16
16
  import { ListComponent, ListModule } from '@fundamental-ngx/core/list';
17
17
  import * as i1$1 from '@fundamental-ngx/core/utils';
18
- import { uuidv4, KeyUtil, applyCssClass, PipeModule, AutoCompleteModule } from '@fundamental-ngx/core/utils';
18
+ import { RangeSelector, uuidv4, KeyUtil, applyCssClass, PipeModule, AutoCompleteModule } from '@fundamental-ngx/core/utils';
19
19
  import * as i1 from '@fundamental-ngx/core/dialog';
20
20
  import { DialogModule } from '@fundamental-ngx/core/dialog';
21
- import { takeUntil, startWith, map } from 'rxjs/operators';
21
+ import { takeUntil, distinctUntilChanged, first, startWith, map, shareReplay } from 'rxjs/operators';
22
22
  import { MobileModeBase, MobileModeControl, MOBILE_MODE_CONFIG } from '@fundamental-ngx/core/mobile-mode';
23
23
  import * as i2 from '@fundamental-ngx/core/title';
24
24
  import * as i3 from '@fundamental-ngx/core/button';
@@ -252,6 +252,8 @@ class MultiInputComponent {
252
252
  /** @hidden */
253
253
  this._subscriptions = new Subscription();
254
254
  /** @hidden */
255
+ this._rangeSelector = new RangeSelector();
256
+ /** @hidden */
255
257
  this.onChange = () => { };
256
258
  /** @hidden */
257
259
  this.onTouched = () => { };
@@ -288,8 +290,10 @@ class MultiInputComponent {
288
290
  if (!this.inputId) {
289
291
  this.inputId = uuidv4();
290
292
  }
291
- this._subscriptions.add(this._searchTermCtrl.valueChanges.subscribe((searchTerm) => {
293
+ this._subscriptions.add(this._searchTermCtrl.valueChanges.pipe(distinctUntilChanged()).subscribe((searchTerm) => {
292
294
  this.searchTermChange.emit(searchTerm);
295
+ // resetting existing selection state, if any
296
+ this._rangeSelector.reset();
293
297
  }));
294
298
  }
295
299
  /** @hidden */
@@ -394,10 +398,34 @@ class MultiInputComponent {
394
398
  this._propagateChange();
395
399
  }
396
400
  /** @hidden */
397
- _handleSelect(checked, value, resetSearch = true, event) {
398
- if (event) {
399
- event.preventDefault(); // prevent this function from being called twice when checkbox updates
401
+ _onCheckboxKeyup(value, event, index) {
402
+ if (KeyUtil.isKeyCode(event, [SPACE, ENTER])) {
403
+ this._onCheckboxClick(value, event, index);
404
+ }
405
+ }
406
+ /** @hidden */
407
+ async _onCheckboxClick(value, event, index, isListItem = false) {
408
+ const toggledSelection = !this._selectionModel.isSelected(value);
409
+ this._rangeSelector.onRangeElementToggled(index, event);
410
+ const sub = this.viewModel$.pipe(first()).subscribe((vm) => {
411
+ this._rangeSelector.applyValueToEachInRange((idx) => this._handleSelect(toggledSelection, vm.displayedOptions[idx].value, false));
412
+ });
413
+ this._subscriptions.add(sub);
414
+ if (isListItem) {
415
+ this.openChangeHandle(false);
400
416
  }
417
+ else {
418
+ // stop propagation on the checkbox so event doesn't reach the list item
419
+ event.stopPropagation();
420
+ }
421
+ }
422
+ /** @hidden */
423
+ _onTokenClick(value, resetSearch, event) {
424
+ event?.preventDefault(); // prevent this function from being called twice when checkbox updates
425
+ this._handleSelect(false, value, resetSearch);
426
+ }
427
+ /** @hidden */
428
+ _handleSelect(checked, value, resetSearch = true) {
401
429
  const previousLength = this._selectionModel.selected.length;
402
430
  if (checked) {
403
431
  this._selectionModel.select(value);
@@ -416,7 +444,6 @@ class MultiInputComponent {
416
444
  // On Mobile mode changes are propagated only on approve.
417
445
  this._propagateChange();
418
446
  }
419
- /** @hidden */
420
447
  _handleInputKeydown(event) {
421
448
  if (KeyUtil.isKeyCode(event, DOWN_ARROW) && !this.mobile) {
422
449
  if (event.altKey) {
@@ -621,7 +648,7 @@ class MultiInputComponent {
621
648
  selectedOptions,
622
649
  displayedOptions
623
650
  };
624
- }));
651
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
625
652
  }
626
653
  }
627
654
  MultiInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.2", ngImport: i0, type: MultiInputComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$1.DynamicComponentService }, { token: i0.Injector }, { token: i0.ViewContainerRef }, { token: i1$1.RtlService, optional: true }, { token: i1$1.ContentDensityService, optional: true }, { token: i1$1.FocusTrapService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
@@ -632,7 +659,7 @@ MultiInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
632
659
  multi: true
633
660
  },
634
661
  MenuKeyboardService
635
- ], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["control"], descendants: true, read: TemplateRef }, { propertyName: "listTemplate", first: true, predicate: ["list"], descendants: true, read: TemplateRef }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true, read: ElementRef }, { propertyName: "tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"viewModel$ | async as vm\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container [ngTemplateOutlet]=\"control\" *ngIf=\"mobile && !open\"></ng-container>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"bodyMaxWidth\"\n [focusTrapped]=\"true\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container *ngTemplateOutlet=\"control\"></ng-container>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!vm.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control>\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"displayAddonButton\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && vm.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"displayAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked()\"\n >\n <fd-tokenizer\n [compactCollapse]=\"compactCollapse\"\n [compact]=\"compact\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n [class.fd-multi-input-tokenizer-custom--compact]=\"compact\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of vm.selectedOptions\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_handleSelect(false, option.value, true, $event)\"\n (onRemove)=\"_handleSelect(false, option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fd-auto-complete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [inputText]=\"_searchTermCtrl.value\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [compact]=\"compact\"\n [attr.aria-required]=\"required\"\n [class.fd-input--compact]=\"compact\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"vm.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [compact]=\"compact\"\n [style.maxHeight]=\"!mobile ? maxHeight : 'auto'\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.minWidth]=\"'100%'\"\n >\n <li\n *ngFor=\"let option of vm.displayedOptions\"\n fd-list-item\n (click)=\"dialogApprove()\"\n [selected]=\"_selectionModel.isSelected(option.value)\"\n >\n <fd-checkbox\n [compact]=\"compact\"\n (ngModelChange)=\"_handleSelect($event, option.value, false)\"\n [ngModel]=\"_selectionModel.isSelected(option.value)\"\n >\n <!-- TODO -->\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n <li\n *ngIf=\"showAllButton && vm.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value:highlight\"\n >\n </span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}.fd-multi-input-tokenizer-custom--compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-popover-custom.fd-popover-custom .fd-tokenizer{height:100%}.fd-multi-input-menu-overflow{max-width:37.5rem;overflow:auto}.fd-input.fd-multi-input-tokenizer-input{margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"], components: [{ type: i2$1.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { type: i2$1.PopoverControlComponent, selector: "fd-popover-control" }, { type: i2$1.PopoverBodyComponent, selector: "fd-popover-body" }, { type: i3$1.InputGroupComponent, selector: "fd-input-group", inputs: ["inputTemplate", "placement", "compact", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledby"], outputs: ["addOnButtonClicked", "search"] }, { type: i4$1.TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "ariaRoleDescription", "compact", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "moreTerm", "open"], outputs: ["moreClickedEvent"] }, { type: i4$1.TokenComponent, selector: "fd-token", inputs: ["disabled", "compact", "selected", "readOnly", "deleteButtonLabel", "ariaRoleDescription"], outputs: ["onCloseClick", "onRemove", "onTokenClick"] }, { type: i5.FormControlComponent, selector: "[fd-form-control]", inputs: ["state", "compact", "type", "class"] }, { type: i6.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "compact", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline"], outputs: ["focusEscapeList"] }, { type: i6.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "tabindex", "noData", "action", "interactive", "growing", "counter", "unread"], outputs: ["keyDown"] }, { type: i7.CheckboxComponent, selector: "fd-checkbox", inputs: ["ariaLabel", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "compact", "tristate", "tristateSelectable", "labelClass", "required", "values"], outputs: ["focusChange"] }, { type: i8.LinkComponent, selector: "[fdLink], [fd-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.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: i3$1.InputGroupInputDirective, selector: "[fd-input-group-input]", inputs: ["class", "compact"] }, { type: i1$1.AutoCompleteDirective, selector: "[fd-auto-complete]", inputs: ["options", "inputText", "enable", "displayFn"], outputs: ["onComplete"] }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }], pipes: { "async": i9.AsyncPipe, "highlight": i1$1.SearchHighlightPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
662
+ ], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["control"], descendants: true, read: TemplateRef }, { propertyName: "listTemplate", first: true, predicate: ["list"], descendants: true, read: TemplateRef }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true, read: ElementRef }, { propertyName: "tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"viewModel$ | async as vm\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container [ngTemplateOutlet]=\"control\" *ngIf=\"mobile && !open\"></ng-container>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"bodyMaxWidth\"\n [focusTrapped]=\"true\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container *ngTemplateOutlet=\"control\"></ng-container>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!vm.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control>\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"displayAddonButton\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && vm.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"displayAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked()\"\n >\n <fd-tokenizer\n [compactCollapse]=\"compactCollapse\"\n [compact]=\"compact\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n [class.fd-multi-input-tokenizer-custom--compact]=\"compact\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of vm.selectedOptions\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, true, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fd-auto-complete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [inputText]=\"_searchTermCtrl.value\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [compact]=\"compact\"\n [attr.aria-required]=\"required\"\n [class.fd-input--compact]=\"compact\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"vm.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [compact]=\"compact\"\n [style.maxHeight]=\"!mobile ? maxHeight : 'auto'\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.minWidth]=\"'100%'\"\n >\n <li\n *ngFor=\"let option of vm.displayedOptions; let idx = index\"\n fd-list-item\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"_selectionModel.isSelected(option.value)\"\n >\n <fd-checkbox\n [compact]=\"compact\"\n [value]=\"_selectionModel.isSelected(option.value)\"\n (click)=\"_onCheckboxClick(option.value, $event, idx)\"\n >\n <!-- TODO -->\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n <li\n *ngIf=\"showAllButton && vm.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value:highlight\"\n >\n </span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}.fd-multi-input-tokenizer-custom--compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-popover-custom.fd-popover-custom .fd-tokenizer{height:100%}.fd-multi-input-menu-overflow{max-width:37.5rem;overflow:auto}.fd-input.fd-multi-input-tokenizer-input{margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"], components: [{ type: i2$1.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { type: i2$1.PopoverControlComponent, selector: "fd-popover-control" }, { type: i2$1.PopoverBodyComponent, selector: "fd-popover-body" }, { type: i3$1.InputGroupComponent, selector: "fd-input-group", inputs: ["inputTemplate", "placement", "compact", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledby"], outputs: ["addOnButtonClicked", "search"] }, { type: i4$1.TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "ariaRoleDescription", "compact", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "moreTerm", "open"], outputs: ["moreClickedEvent"] }, { type: i4$1.TokenComponent, selector: "fd-token", inputs: ["disabled", "compact", "selected", "readOnly", "deleteButtonLabel", "ariaRoleDescription"], outputs: ["onCloseClick", "onRemove", "onTokenClick"] }, { type: i5.FormControlComponent, selector: "[fd-form-control]", inputs: ["state", "compact", "type", "class"] }, { type: i6.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "compact", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline"], outputs: ["focusEscapeList"] }, { type: i6.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "tabindex", "noData", "action", "interactive", "growing", "counter", "unread"], outputs: ["keyDown"] }, { type: i7.CheckboxComponent, selector: "fd-checkbox", inputs: ["ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "compact", "tristate", "tristateSelectable", "labelClass", "required", "values"], outputs: ["focusChange"] }, { type: i8.LinkComponent, selector: "[fdLink], [fd-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.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: i3$1.InputGroupInputDirective, selector: "[fd-input-group-input]", inputs: ["class", "compact"] }, { type: i1$1.AutoCompleteDirective, selector: "[fd-auto-complete]", inputs: ["options", "inputText", "enable", "displayFn"], outputs: ["onComplete"] }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i6.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }], pipes: { "async": i9.AsyncPipe, "highlight": i1$1.SearchHighlightPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
636
663
  __decorate([
637
664
  applyCssClass,
638
665
  __metadata("design:type", Function),
@@ -650,7 +677,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.2", ngImpor
650
677
  multi: true
651
678
  },
652
679
  MenuKeyboardService
653
- ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"viewModel$ | async as vm\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container [ngTemplateOutlet]=\"control\" *ngIf=\"mobile && !open\"></ng-container>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"bodyMaxWidth\"\n [focusTrapped]=\"true\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container *ngTemplateOutlet=\"control\"></ng-container>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!vm.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control>\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"displayAddonButton\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && vm.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"displayAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked()\"\n >\n <fd-tokenizer\n [compactCollapse]=\"compactCollapse\"\n [compact]=\"compact\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n [class.fd-multi-input-tokenizer-custom--compact]=\"compact\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of vm.selectedOptions\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_handleSelect(false, option.value, true, $event)\"\n (onRemove)=\"_handleSelect(false, option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fd-auto-complete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [inputText]=\"_searchTermCtrl.value\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [compact]=\"compact\"\n [attr.aria-required]=\"required\"\n [class.fd-input--compact]=\"compact\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"vm.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [compact]=\"compact\"\n [style.maxHeight]=\"!mobile ? maxHeight : 'auto'\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.minWidth]=\"'100%'\"\n >\n <li\n *ngFor=\"let option of vm.displayedOptions\"\n fd-list-item\n (click)=\"dialogApprove()\"\n [selected]=\"_selectionModel.isSelected(option.value)\"\n >\n <fd-checkbox\n [compact]=\"compact\"\n (ngModelChange)=\"_handleSelect($event, option.value, false)\"\n [ngModel]=\"_selectionModel.isSelected(option.value)\"\n >\n <!-- TODO -->\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n <li\n *ngIf=\"showAllButton && vm.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value:highlight\"\n >\n </span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}.fd-multi-input-tokenizer-custom--compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-popover-custom.fd-popover-custom .fd-tokenizer{height:100%}.fd-multi-input-menu-overflow{max-width:37.5rem;overflow:auto}.fd-input.fd-multi-input-tokenizer-input{margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"] }]
680
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"viewModel$ | async as vm\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container [ngTemplateOutlet]=\"control\" *ngIf=\"mobile && !open\"></ng-container>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"bodyMaxWidth\"\n [focusTrapped]=\"true\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container *ngTemplateOutlet=\"control\"></ng-container>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!vm.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control>\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"displayAddonButton\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && vm.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"displayAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked()\"\n >\n <fd-tokenizer\n [compactCollapse]=\"compactCollapse\"\n [compact]=\"compact\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n [class.fd-multi-input-tokenizer-custom--compact]=\"compact\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of vm.selectedOptions\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, true, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fd-auto-complete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [inputText]=\"_searchTermCtrl.value\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [compact]=\"compact\"\n [attr.aria-required]=\"required\"\n [class.fd-input--compact]=\"compact\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"vm.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [compact]=\"compact\"\n [style.maxHeight]=\"!mobile ? maxHeight : 'auto'\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.minWidth]=\"'100%'\"\n >\n <li\n *ngFor=\"let option of vm.displayedOptions; let idx = index\"\n fd-list-item\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"_selectionModel.isSelected(option.value)\"\n >\n <fd-checkbox\n [compact]=\"compact\"\n [value]=\"_selectionModel.isSelected(option.value)\"\n (click)=\"_onCheckboxClick(option.value, $event, idx)\"\n >\n <!-- TODO -->\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n <li\n *ngIf=\"showAllButton && vm.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value:highlight\"\n >\n </span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}.fd-multi-input-tokenizer-custom--compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-popover-custom.fd-popover-custom .fd-tokenizer{height:100%}.fd-multi-input-menu-overflow{max-width:37.5rem;overflow:auto}.fd-input.fd-multi-input-tokenizer-input{margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"] }]
654
681
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$1.DynamicComponentService }, { type: i0.Injector }, { type: i0.ViewContainerRef }, { type: i1$1.RtlService, decorators: [{
655
682
  type: Optional
656
683
  }] }, { type: i1$1.ContentDensityService, decorators: [{
@@ -1 +1 @@
1
- {"version":3,"file":"fundamental-ngx-core-multi-input.mjs","sources":["../../../../../libs/core/src/lib/multi-input/multi-input.interface.ts","../../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.component.ts","../../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.component.html","../../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.module.ts","../../../../../libs/core/src/lib/multi-input/multi-input.component.ts","../../../../../libs/core/src/lib/multi-input/multi-input.component.html","../../../../../libs/core/src/lib/multi-input/multi-input.module.ts","../../../../../libs/core/src/lib/multi-input/fundamental-ngx-core-multi-input.ts"],"sourcesContent":["import { EventEmitter, InjectionToken } from '@angular/core';\nimport { MobileMode } from '@fundamental-ngx/core/mobile-mode';\n\nexport const MULTI_INPUT_COMPONENT = new InjectionToken<string[]>('MultiInputComponent');\n\n/**\n * Multi Input Interface to have typing and avoid circular dependency between\n * MultiInputComponent <==> MultiInputMobileComponent\n */\nexport interface MultiInputInterface extends MobileMode {\n selected: any[];\n openChange: EventEmitter<boolean>;\n\n dialogApprove(): void;\n\n selectAllItems(): void;\n\n dialogDismiss(selectedBackup: any[]): void;\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Inject,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { DialogService } from '@fundamental-ngx/core/dialog';\nimport { takeUntil } from 'rxjs/operators';\nimport { MULTI_INPUT_COMPONENT, MultiInputInterface } from '../multi-input.interface';\nimport {\n MOBILE_MODE_CONFIG,\n MobileModeBase,\n MobileModeControl,\n MobileModeConfigToken\n} from '@fundamental-ngx/core/mobile-mode';\n\n@Component({\n selector: 'fd-multi-input-mobile',\n templateUrl: './multi-input-mobile.component.html',\n styleUrls: ['./multi-input-mobile.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class MultiInputMobileComponent\n extends MobileModeBase<MultiInputInterface>\n implements OnInit, AfterViewInit, OnDestroy\n{\n /** @hidden */\n @ViewChild('dialogTemplate') dialogTemplate: TemplateRef<any>;\n\n /** @hidden\n * For internal usage\n * Control element, which will be rendered inside dialog.\n * List element, which will be rendered inside dialog.\n */\n childContent: {\n listTemplate: TemplateRef<any>;\n controlTemplate: TemplateRef<any>;\n } = null;\n\n /** @hidden */\n private _selectedBackup: any[];\n\n constructor(\n elementRef: ElementRef,\n dialogService: DialogService,\n @Inject(MULTI_INPUT_COMPONENT) multiInputComponent: MultiInputInterface,\n @Optional() @Inject(MOBILE_MODE_CONFIG) mobileModes: MobileModeConfigToken[]\n ) {\n super(elementRef, dialogService, multiInputComponent, MobileModeControl.MULTI_INPUT, mobileModes);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this._listenOnMultiInputOpenChange();\n }\n\n /** @hidden */\n ngAfterViewInit(): void {\n this._open();\n this.dialogRef.hide(true);\n }\n\n ngOnDestroy(): void {\n this.dialogRef.close();\n super.onDestroy();\n }\n\n /** Throw select all event, it's handled by multi input component */\n selectAll(): void {\n this._component.selectAllItems();\n }\n\n /** @hidden */\n handleDismiss(): void {\n this.dialogRef.hide(true);\n this._component.dialogDismiss(this._selectedBackup);\n }\n\n /** @hidden */\n handleApprove(): void {\n this.dialogRef.hide(true);\n this._component.dialogApprove();\n }\n\n /** @hidden */\n private _toggleDialog(open: boolean): void {\n if (open) {\n this._selectedBackup = [...this._component.selected];\n if (!this._dialogService.hasOpenDialogs()) {\n this._open();\n }\n }\n this.dialogRef.hide(!open);\n }\n\n /** @hidden */\n private _listenOnMultiInputOpenChange(): void {\n this._component.openChange.pipe(takeUntil(this._onDestroy$)).subscribe((isOpen) => this._toggleDialog(isOpen));\n }\n\n /** @hidden */\n private _open(): void {\n this.dialogRef = this._dialogService.open(this.dialogTemplate, {\n mobile: true,\n verticalPadding: false,\n ...this.dialogConfig,\n backdropClickCloseable: false,\n escKeyCloseable: false,\n container: this._elementRef.nativeElement\n });\n }\n}\n","<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <h1 fd-title *ngIf=\"mobileConfig?.title\">{{ mobileConfig?.title }}</h1>\n <button\n fd-dialog-close-button\n [mobile]=\"true\"\n *ngIf=\"mobileConfig?.hasCloseButton\"\n (click)=\"handleDismiss()\"\n ></button>\n <ng-template fdTemplate=\"subheader\">\n <div fd-bar-middle>\n <fd-bar-element class=\"custom-multi-input-mobile-control-element\">\n <ng-container *ngTemplateOutlet=\"childContent?.controlTemplate\"></ng-container>\n </fd-bar-element>\n <fd-bar-element class=\"custom-multi-input-select-all-bar-element\">\n <button fd-button glyph=\"multiselect-all\" fdType=\"transparent\" (click)=\"selectAll()\"></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"childContent?.listTemplate\"></ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer>\n <fd-button-bar\n *ngIf=\"mobileConfig?.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig?.approveButtonText\"\n (click)=\"handleApprove()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig?.cancelButtonText\"\n [label]=\"mobileConfig?.cancelButtonText\"\n (click)=\"handleDismiss()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { BarModule } from '@fundamental-ngx/core/bar';\nimport { MultiInputMobileComponent } from './multi-input-mobile.component';\nimport { ButtonModule } from '@fundamental-ngx/core/button';\nimport { DialogModule } from '@fundamental-ngx/core/dialog';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [MultiInputMobileComponent],\n imports: [BarModule, DialogModule, ButtonModule, CommonModule],\n entryComponents: [MultiInputMobileComponent],\n exports: [MultiInputMobileComponent]\n})\nexport class MultiInputMobileModule {}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Injector,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DOWN_ARROW, TAB, SPACE, ENTER, UP_ARROW, ESCAPE } from '@angular/cdk/keycodes';\nimport { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';\n\nimport { PopoverComponent } from '@fundamental-ngx/core/popover';\nimport { MenuKeyboardService } from '@fundamental-ngx/core/menu';\nimport { FormStates, PopoverFillMode } from '@fundamental-ngx/core/shared';\nimport { MobileModeConfig } from '@fundamental-ngx/core/mobile-mode';\nimport { TokenizerComponent } from '@fundamental-ngx/core/token';\nimport { ListComponent } from '@fundamental-ngx/core/list';\nimport {\n ContentDensityService,\n CssClassBuilder,\n DynamicComponentService,\n RtlService,\n applyCssClass,\n FocusEscapeDirection,\n KeyUtil,\n FocusTrapService,\n uuidv4\n} from '@fundamental-ngx/core/utils';\n\nimport { MultiInputMobileComponent } from './multi-input-mobile/multi-input-mobile.component';\nimport { MultiInputMobileModule } from './multi-input-mobile/multi-input-mobile.module';\nimport { MULTI_INPUT_COMPONENT, MultiInputInterface } from './multi-input.interface';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { map, startWith } from 'rxjs/operators';\nimport { uniqBy } from 'lodash-es';\n\n/**\n * Input field with multiple selection enabled. Should be used when a user can select between a\n * limited number of pre-defined options with a filter-enabled context.\n *\n * Supports Angular Forms.\n */\n@Component({\n selector: 'fd-multi-input',\n templateUrl: './multi-input.component.html',\n styleUrls: ['./multi-input.component.scss'],\n host: {\n '(blur)': 'onTouched()'\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MultiInputComponent),\n multi: true\n },\n MenuKeyboardService\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MultiInputComponent\n implements MultiInputInterface, ControlValueAccessor, CssClassBuilder, OnInit, OnChanges, AfterViewInit, OnDestroy\n{\n /** Placeholder for the input field. */\n @Input()\n placeholder = '';\n\n /** Whether the input is disabled. */\n @Input()\n disabled = false;\n\n /** Whether the input is in compact mode. */\n @Input()\n compact?: boolean;\n\n /** If it is mandatory field */\n @Input()\n required = false;\n\n /** Whether to use cozy visuals but compact collapsing behavior. */\n @Input()\n compactCollapse = false;\n\n /** Max height of the popover. Any overflowing elements will be accessible through scrolling. */\n @Input()\n maxHeight = '300px';\n\n /** Icon of the button on the right of the input field. */\n @Input()\n glyph = 'value-help';\n\n /** Values to be displayed in the unfiltered dropdown. */\n @Input()\n dropdownValues: any[] = [];\n\n /** Search term, or more specifically the value of the inner input field. */\n @Input()\n get searchTerm(): string {\n return this._searchTermCtrl.value;\n }\n set searchTerm(value: string) {\n this._searchTermCtrl.setValue(value);\n }\n\n /** Id attribute for input element inside MultiInput component */\n @Input()\n inputId = '';\n\n /** Whether the search term should be highlighted in results. */\n @Input()\n highlight = true;\n\n /** Selected dropdown items. */\n @Input()\n get selected(): any[] {\n return this._selectionModel.selected;\n }\n set selected(values: any[]) {\n this._selectionModel.clear();\n values?.forEach((item) => this._selectionModel.select(item));\n }\n\n /** user's custom classes */\n @Input()\n class: string;\n\n /**\n * Filter function. Accepts an array and a string as arguments, and outputs an array.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n filterFn = this._defaultFilter;\n\n /**\n * Value function. Accepts an object of the same type as the\n * items passed to dropdownValues as argument, and outputs any property, that should be used as value.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n valueFn = this._defaultValueFn;\n\n /**\n * Display function. Accepts an object of the same type as the\n * items passed to dropdownValues as argument, and outputs a string.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n displayFn = this._defaultDisplay;\n\n /**\n * Parse function. Used for submitting new tokens. Accepts a string by default.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n newTokenParseFn = this._defaultParse;\n\n /**\n * Validate function. Used to check if new token can be added into list.\n * Works only, when `allowNewTokens` option is enabled.\n */\n @Input()\n newTokenValidateFn = this._defaultTokenValidate;\n\n /** Aria label for the multi input body. */\n @Input()\n multiInputBodyLabel = 'Multi input body';\n\n /**\n * Preset options for the Select body width, whatever is chosen, the body has a 600px limit.\n * * `at-least` will apply a minimum width to the body equivalent to the width of the control. - Default\n * * `equal` will apply a width to the body equivalent to the width of the control.\n * * 'fit-content' will apply width needed to properly display items inside, independent of control.\n */\n @Input()\n fillControlMode: PopoverFillMode = 'at-least';\n\n /**\n * The state of the form control - applies css classes.\n * Can be `success`, `error`, `warning`, `information` or blank for default.\n */\n @Input()\n state: FormStates;\n\n /**\n * Whether AddOn Button should be focusable\n * @default true\n */\n @Input()\n buttonFocusable = true;\n\n /** Whether the multi-input allows the creation of new tokens. */\n @Input()\n allowNewTokens = false;\n\n /** Whether the multi-input should be built on mobile mode */\n @Input()\n mobile = false;\n\n /** Whether the multi-input should have show all button. */\n @Input()\n showAllButton = true;\n\n /** Max width of multi input body in PX */\n @Input()\n bodyMaxWidth: number = null;\n\n /** Multi Input Mobile Configuration, it's applied only, when mobile is enabled */\n @Input()\n mobileConfig: MobileModeConfig = { hasCloseButton: true, approveButtonText: 'Select' };\n\n /**\n * Whether or not to return results where the input matches the entire string. By default, only results that start\n * with the input search term will be returned.\n */\n @Input()\n includes = false;\n\n /**\n * The template with which to display the individual listed items.\n * Use it by passing an ng-template with implicit content. See examples for more info.\n */\n @Input()\n itemTemplate: TemplateRef<any>;\n\n /**\n * The tooltip for the multi-input icon.\n */\n @Input()\n title: string;\n\n /** Whether the autocomplete should be enabled; Enabled by default */\n @Input()\n autoComplete = true;\n\n /** Event emitted when the search term changes. Use *$event* to access the new term. */\n @Output()\n readonly searchTermChange: EventEmitter<string> = new EventEmitter<string>();\n\n /** Event emitted when the selected items change. Use *$event* to access the new selected array. */\n @Output()\n readonly selectedChange: EventEmitter<any[]> = new EventEmitter<any[]>();\n\n /** Whether multi input popover body should be opened */\n @Input()\n open = false;\n\n /** Whether or not to display the addon button. */\n @Input()\n displayAddonButton = true;\n\n /** Event emitted, when the multi input's popover body is opened or closed */\n @Output()\n readonly openChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** @hidden */\n @ViewChild(PopoverComponent)\n popoverRef: PopoverComponent;\n\n /** @hidden */\n @ViewChild('control', { read: TemplateRef })\n controlTemplate: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild('list', { read: TemplateRef })\n listTemplate: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild(ListComponent)\n listComponent: ListComponent;\n\n /** @hidden */\n @ViewChild('searchInputElement', { read: ElementRef })\n searchInputElement: ElementRef<HTMLInputElement>;\n\n /** @hidden */\n @ViewChild(TokenizerComponent)\n tokenizer: TokenizerComponent;\n\n /** @hidden */\n readonly optionItems$ = new BehaviorSubject<OptionItem[]>([]);\n\n /** @hidden */\n readonly _searchTermCtrl = new FormControl('');\n\n /** @hidden */\n readonly _selectionModel = new SelectionModel<any>(true);\n\n /** @hidden */\n readonly viewModel$: Observable<ViewModel> = this._getViewModel();\n\n /** @hidden */\n _dir: string;\n\n /** @hidden */\n private _subscriptions = new Subscription();\n\n /** @hidden */\n onChange: (value: any) => void = () => {};\n\n /** @hidden */\n onTouched = (): void => {};\n\n /** @hidden */\n constructor(\n private readonly _elementRef: ElementRef,\n private readonly _changeDetRef: ChangeDetectorRef,\n private readonly _dynamicComponentService: DynamicComponentService,\n private readonly _injector: Injector,\n private readonly _viewContainerRef: ViewContainerRef,\n @Optional() private readonly _rtlService: RtlService,\n @Optional() private readonly _contentDensityService: ContentDensityService,\n @Optional() private readonly _focusTrapService: FocusTrapService\n ) {}\n\n /** @hidden */\n ngOnInit(): void {\n if (this.compact === undefined && this._contentDensityService) {\n this._subscriptions.add(\n this._contentDensityService._isCompactDensity.subscribe((isCompact) => {\n this.compact = isCompact;\n this.buildComponentCssClass();\n this._changeDetRef.markForCheck();\n })\n );\n }\n\n this.buildComponentCssClass();\n\n this._subscriptions.add(\n this._rtlService?.rtl.subscribe((isRtl) => {\n this._dir = isRtl ? 'rtl' : 'ltr';\n this.buildComponentCssClass();\n })\n );\n\n if (!this.inputId) {\n this.inputId = uuidv4();\n }\n\n this._subscriptions.add(\n this._searchTermCtrl.valueChanges.subscribe((searchTerm) => {\n this.searchTermChange.emit(searchTerm);\n })\n );\n }\n\n /** @hidden */\n ngOnChanges(changes: SimpleChanges): void {\n this.buildComponentCssClass();\n\n if (changes.dropdownValues || changes.searchTerm || changes.valueFn || changes.displayFn) {\n const optionItems = (this.dropdownValues ?? []).map((item) => this._getOptionItem(item));\n this.optionItems$.next(optionItems);\n this._changeDetRef.markForCheck();\n }\n\n if (changes.disabled) {\n this.disabled ? this._searchTermCtrl.disable() : this._searchTermCtrl.enable();\n }\n }\n\n /** @hidden */\n ngAfterViewInit(): void {\n if (this.mobile) {\n this._setUpMobileMode();\n }\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n @applyCssClass\n /** CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n buildComponentCssClass(): string[] {\n // TODO: this icon flip may be addressed in styles in the future\n if (this.glyph === 'value-help' && this._dir === 'rtl') {\n const icon = this.elementRef().nativeElement.querySelector('.sap-icon--value-help');\n if (icon) {\n icon.style.transform = 'scaleX(-1)';\n }\n }\n\n return ['fd-multi-input', 'fd-multi-input-custom', this.class];\n }\n\n /** @hidden */\n elementRef(): ElementRef<any> {\n return this._elementRef;\n }\n\n /** @hidden */\n registerOnChange(fn: (selected: any[]) => void): void {\n this.onChange = fn;\n }\n\n /** @hidden */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @hidden */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n if (isDisabled) {\n this._elementRef.nativeElement.style.pointerEvents = 'none';\n } else {\n this._elementRef.nativeElement.style.pointerEvents = 'auto';\n }\n\n this._changeDetRef.detectChanges();\n }\n\n /** @hidden */\n writeValue(selected: any[]): void {\n this.selected = selected;\n\n this._changeDetRef.markForCheck();\n }\n\n /** Method passed to list component */\n handleListFocusEscape(direction: FocusEscapeDirection): void {\n if (direction === 'up') {\n this.searchInputElement.nativeElement.focus();\n }\n }\n\n /** @hidden */\n openChangeHandle(open: boolean): void {\n if (this.disabled) {\n return;\n }\n\n if (!open && this.open && !this.mobile) {\n this.searchInputElement.nativeElement.focus();\n }\n\n if (this.open !== open) {\n this.openChange.emit(open);\n }\n\n this.open = open;\n\n if (!this.mobile) {\n this._popoverOpenHandle(open);\n }\n\n if (!this.open) {\n this._resetSearchTerm();\n this.enableParentFocusTrap();\n } else {\n this.disableParentFocusTrap();\n }\n\n this.tokenizer.removeSelectedTokens();\n\n this._changeDetRef.detectChanges();\n }\n\n /** Method that selects all possible options. */\n selectAllItems(): void {\n this.selected = [...this.dropdownValues];\n\n // On Mobile mode changes are propagated only on approve.\n this._propagateChange();\n }\n\n /** @hidden */\n _handleSelect(checked: any, value: any, resetSearch = true, event?: MouseEvent): void {\n if (event) {\n event.preventDefault(); // prevent this function from being called twice when checkbox updates\n }\n\n const previousLength = this._selectionModel.selected.length;\n if (checked) {\n this._selectionModel.select(value);\n } else {\n this._selectionModel.deselect(value);\n }\n\n // Handle popover placement update\n if (this._shouldPopoverBeUpdated(previousLength, this._selectionModel.selected.length)) {\n this.popoverRef.refreshPosition();\n }\n\n if (resetSearch) {\n this._resetSearchTerm();\n }\n\n this.searchInputElement.nativeElement.focus();\n\n // On Mobile mode changes are propagated only on approve.\n this._propagateChange();\n }\n\n /** @hidden */\n _handleInputKeydown(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, DOWN_ARROW) && !this.mobile) {\n if (event.altKey) {\n this.openChangeHandle(true);\n }\n\n if (this.listComponent) {\n this.listComponent.setItemActive(0);\n event.preventDefault();\n }\n } else if (KeyUtil.isKeyCode(event, [DOWN_ARROW, UP_ARROW, ENTER])) {\n this.openChangeHandle(true);\n } else if (KeyUtil.isKeyCode(event, ESCAPE)) {\n this.openChangeHandle(false);\n } else if (KeyUtil.isKeyCode(event, TAB) && this.open) {\n if (this.listComponent) {\n this.listComponent.setItemActive(0);\n event.preventDefault();\n }\n } else if (KeyUtil.isKeyType(event, 'alphabetical') || KeyUtil.isKeyType(event, 'numeric')) {\n if (!this.open) {\n this.openChangeHandle(true);\n }\n }\n }\n\n /** @hidden */\n _showAllClicked(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this._searchTermCtrl.setValue('');\n this.searchInputElement.nativeElement.focus();\n }\n\n /** @hidden */\n _showAllKeyDown(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, [SPACE, ENTER])) {\n this._showAllClicked(event);\n }\n }\n\n /** @hidden */\n _onSubmit(): void {\n const searchTerm = this.searchTerm;\n if (searchTerm === '') {\n return;\n }\n const isExist = this._selectFirstFiltered(searchTerm);\n if (!isExist && this.allowNewTokens && this.newTokenValidateFn(this._searchTermCtrl.value)) {\n const newToken = this.newTokenParseFn(this._searchTermCtrl.value);\n this._addNewTokenToDropDownValues(newToken);\n this._handleSelect(true, newToken);\n this._searchTermCtrl.setValue('');\n this.open = false;\n }\n }\n\n /** @hidden */\n _handleComplete({ term }): void {\n this.searchTerm = term;\n }\n\n /**\n * Handle dialog dismissing, closes popover and sets backup data.\n */\n dialogDismiss(selectedBackup: any[]): void {\n this.selected = selectedBackup;\n this.openChangeHandle(false);\n this._resetSearchTerm();\n }\n\n /**\n * Handle dialog approval, closes popover and propagates data changes.\n */\n dialogApprove(): void {\n this._propagateChange(true);\n this.openChangeHandle(false);\n this._resetSearchTerm();\n }\n\n /** @hidden */\n _moreClicked(): void {\n this.openChangeHandle(true);\n }\n\n /** @hidden */\n _addOnButtonClicked(): void {\n this.openChangeHandle(!this.open);\n }\n\n /** @hidden */\n disableParentFocusTrap(): void {\n this._focusTrapService?.pauseCurrentFocusTrap();\n }\n\n /** @hidden */\n enableParentFocusTrap(): void {\n this._focusTrapService?.unpauseCurrentFocusTrap();\n }\n\n /** @hidden */\n private _addNewTokenToDropDownValues(newToken): void {\n this.dropdownValues.push(newToken);\n const newOption = this._getOptionItem(newToken);\n this.optionItems$.next([...this.optionItems$.value, newOption]);\n }\n\n /** @hidden */\n private _selectFirstFiltered(searchTerm: string): boolean {\n const filtered = this.filterFn(this.dropdownValues, searchTerm);\n if (Array.isArray(filtered) && filtered.length > 0 && !this.includes && this.autoComplete) {\n this._handleSelect(true, filtered[0]);\n this._searchTermCtrl.setValue('');\n this.open = false;\n return true;\n }\n return false;\n }\n\n /** @hidden */\n private _defaultFilter(contentArray: any[], searchTerm: string = ''): any[] {\n const searchLower = searchTerm.toLocaleLowerCase();\n return contentArray.filter((item) => {\n if (item) {\n const displayedValue = this.displayFn(item);\n const term = typeof displayedValue === 'string' ? displayedValue.toLocaleLowerCase() : '';\n\n return this.includes ? term.includes(searchLower) : term.startsWith(searchLower);\n }\n });\n }\n\n /** @hidden */\n private _defaultValueFn(value: any): any {\n return value;\n }\n\n /** @hidden */\n private _defaultDisplay(str: any): string {\n return str;\n }\n\n /** @hidden */\n private _defaultParse(str: any): string {\n return str;\n }\n\n /** @hidden */\n private _defaultTokenValidate(str: string): boolean {\n return !!str;\n }\n\n /** @hidden */\n private _popoverOpenHandle(open: boolean): void {\n this.open = open;\n this.onTouched();\n }\n\n /** @hidden */\n private _propagateChange(emitInMobile?: boolean): void {\n if (!this.mobile || emitInMobile) {\n const selected = [...this._selectionModel.selected];\n this.onChange(selected);\n this.selectedChange.emit(selected);\n }\n }\n\n /** @hidden */\n private _shouldPopoverBeUpdated(previousLength: number, currentLength: number): boolean {\n return (\n !!this.popoverRef &&\n ((previousLength === 0 && currentLength === 1) || (previousLength === 1 && currentLength === 0))\n );\n }\n\n /** @hidden */\n private async _setUpMobileMode(): Promise<void> {\n const injector = Injector.create({\n providers: [{ provide: MULTI_INPUT_COMPONENT, useValue: this }],\n parent: this._injector\n });\n\n await this._dynamicComponentService.createDynamicModule(\n { listTemplate: this.listTemplate, controlTemplate: this.controlTemplate },\n MultiInputMobileModule,\n MultiInputMobileComponent,\n this._viewContainerRef,\n injector\n );\n }\n\n /** @hidden */\n private _resetSearchTerm(): void {\n this._searchTermCtrl.setValue('');\n this._changeDetRef.detectChanges();\n }\n\n /** @hidden */\n private _getOptionItem(item: any): OptionItem {\n return {\n item,\n label: this.displayFn(item),\n value: this.valueFn(item)\n };\n }\n\n /** @hidden */\n private _getViewModel(): Observable<ViewModel> {\n let previouslySelected: OptionItem[] = [];\n return combineLatest([\n this._searchTermCtrl.valueChanges.pipe(startWith(this._searchTermCtrl.value)),\n this.optionItems$,\n this._selectionModel.changed.pipe(startWith(undefined))\n ]).pipe(\n map(([, optionItems]) => {\n // not using \"searchTerm\" value from combineLatest as it will be wrong for late subscribers, if any\n const searchTerm = this._searchTermCtrl.value;\n let displayedOptions = optionItems;\n if (searchTerm) {\n const filtered = this.filterFn(this.dropdownValues, searchTerm);\n displayedOptions = (Array.isArray(filtered) ? filtered : []).map((item) =>\n this._getOptionItem(item)\n );\n }\n // selected options should be displayed in the same order as they're selected\n const orderMap = new Map(this._selectionModel.selected.map((v, i) => [v, i]));\n // combining previously selected options with current selection\n // in order to display selected items even if they're not present in the list of options\n // (e.g. if only a subset of all options is provided to the control)\n const selectedNotUnique = optionItems\n .concat(previouslySelected)\n .filter((item) => this._selectionModel.isSelected(item.value));\n const selectedOptions = uniqBy(selectedNotUnique, 'value').sort(\n (a, b) => orderMap.get(a.value) - orderMap.get(b.value)\n );\n\n previouslySelected = selectedOptions;\n return {\n selectedOptions,\n displayedOptions\n };\n })\n );\n }\n}\n\ninterface OptionItem<T = any> {\n label: string;\n value: any;\n item: T;\n}\n\ninterface ViewModel {\n selectedOptions: OptionItem[];\n displayedOptions: OptionItem[];\n}\n","<ng-container *ngIf=\"viewModel$ | async as vm\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container [ngTemplateOutlet]=\"control\" *ngIf=\"mobile && !open\"></ng-container>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"bodyMaxWidth\"\n [focusTrapped]=\"true\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container *ngTemplateOutlet=\"control\"></ng-container>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!vm.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control>\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"displayAddonButton\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && vm.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"displayAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked()\"\n >\n <fd-tokenizer\n [compactCollapse]=\"compactCollapse\"\n [compact]=\"compact\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n [class.fd-multi-input-tokenizer-custom--compact]=\"compact\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of vm.selectedOptions\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_handleSelect(false, option.value, true, $event)\"\n (onRemove)=\"_handleSelect(false, option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fd-auto-complete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [inputText]=\"_searchTermCtrl.value\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [compact]=\"compact\"\n [attr.aria-required]=\"required\"\n [class.fd-input--compact]=\"compact\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"vm.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [compact]=\"compact\"\n [style.maxHeight]=\"!mobile ? maxHeight : 'auto'\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.minWidth]=\"'100%'\"\n >\n <li\n *ngFor=\"let option of vm.displayedOptions\"\n fd-list-item\n (click)=\"dialogApprove()\"\n [selected]=\"_selectionModel.isSelected(option.value)\"\n >\n <fd-checkbox\n [compact]=\"compact\"\n (ngModelChange)=\"_handleSelect($event, option.value, false)\"\n [ngModel]=\"_selectionModel.isSelected(option.value)\"\n >\n <!-- TODO -->\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n <li\n *ngIf=\"showAllButton && vm.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value:highlight\"\n >\n </span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MultiInputComponent } from './multi-input.component';\nimport { TokenModule } from '@fundamental-ngx/core/token';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { PopoverModule } from '@fundamental-ngx/core/popover';\nimport { PipeModule } from '@fundamental-ngx/core/utils';\nimport { InputGroupModule } from '@fundamental-ngx/core/input-group';\nimport { FormModule } from '@fundamental-ngx/core/form';\nimport { CheckboxModule } from '@fundamental-ngx/core/checkbox';\nimport { ListModule } from '@fundamental-ngx/core/list';\nimport { LinkModule } from '@fundamental-ngx/core/link';\nimport { AutoCompleteModule } from '@fundamental-ngx/core/utils';\n\n@NgModule({\n declarations: [MultiInputComponent],\n imports: [\n CommonModule,\n TokenModule,\n FormsModule,\n ReactiveFormsModule,\n ListModule,\n PopoverModule,\n PipeModule,\n InputGroupModule,\n FormModule,\n CheckboxModule,\n LinkModule,\n AutoCompleteModule\n ],\n exports: [MultiInputComponent]\n})\nexport class MultiInputModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fundamental-ngx-core-multi-input.mjs","sources":["../../../../../libs/core/src/lib/multi-input/multi-input.interface.ts","../../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.component.ts","../../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.component.html","../../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.module.ts","../../../../../libs/core/src/lib/multi-input/multi-input.component.ts","../../../../../libs/core/src/lib/multi-input/multi-input.component.html","../../../../../libs/core/src/lib/multi-input/multi-input.module.ts","../../../../../libs/core/src/lib/multi-input/fundamental-ngx-core-multi-input.ts"],"sourcesContent":["import { EventEmitter, InjectionToken } from '@angular/core';\nimport { MobileMode } from '@fundamental-ngx/core/mobile-mode';\n\nexport const MULTI_INPUT_COMPONENT = new InjectionToken<string[]>('MultiInputComponent');\n\n/**\n * Multi Input Interface to have typing and avoid circular dependency between\n * MultiInputComponent <==> MultiInputMobileComponent\n */\nexport interface MultiInputInterface extends MobileMode {\n selected: any[];\n openChange: EventEmitter<boolean>;\n\n dialogApprove(): void;\n\n selectAllItems(): void;\n\n dialogDismiss(selectedBackup: any[]): void;\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Inject,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { DialogService } from '@fundamental-ngx/core/dialog';\nimport { takeUntil } from 'rxjs/operators';\nimport { MULTI_INPUT_COMPONENT, MultiInputInterface } from '../multi-input.interface';\nimport {\n MOBILE_MODE_CONFIG,\n MobileModeBase,\n MobileModeControl,\n MobileModeConfigToken\n} from '@fundamental-ngx/core/mobile-mode';\n\n@Component({\n selector: 'fd-multi-input-mobile',\n templateUrl: './multi-input-mobile.component.html',\n styleUrls: ['./multi-input-mobile.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class MultiInputMobileComponent\n extends MobileModeBase<MultiInputInterface>\n implements OnInit, AfterViewInit, OnDestroy\n{\n /** @hidden */\n @ViewChild('dialogTemplate') dialogTemplate: TemplateRef<any>;\n\n /** @hidden\n * For internal usage\n * Control element, which will be rendered inside dialog.\n * List element, which will be rendered inside dialog.\n */\n childContent: {\n listTemplate: TemplateRef<any>;\n controlTemplate: TemplateRef<any>;\n } = null;\n\n /** @hidden */\n private _selectedBackup: any[];\n\n constructor(\n elementRef: ElementRef,\n dialogService: DialogService,\n @Inject(MULTI_INPUT_COMPONENT) multiInputComponent: MultiInputInterface,\n @Optional() @Inject(MOBILE_MODE_CONFIG) mobileModes: MobileModeConfigToken[]\n ) {\n super(elementRef, dialogService, multiInputComponent, MobileModeControl.MULTI_INPUT, mobileModes);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this._listenOnMultiInputOpenChange();\n }\n\n /** @hidden */\n ngAfterViewInit(): void {\n this._open();\n this.dialogRef.hide(true);\n }\n\n ngOnDestroy(): void {\n this.dialogRef.close();\n super.onDestroy();\n }\n\n /** Throw select all event, it's handled by multi input component */\n selectAll(): void {\n this._component.selectAllItems();\n }\n\n /** @hidden */\n handleDismiss(): void {\n this.dialogRef.hide(true);\n this._component.dialogDismiss(this._selectedBackup);\n }\n\n /** @hidden */\n handleApprove(): void {\n this.dialogRef.hide(true);\n this._component.dialogApprove();\n }\n\n /** @hidden */\n private _toggleDialog(open: boolean): void {\n if (open) {\n this._selectedBackup = [...this._component.selected];\n if (!this._dialogService.hasOpenDialogs()) {\n this._open();\n }\n }\n this.dialogRef.hide(!open);\n }\n\n /** @hidden */\n private _listenOnMultiInputOpenChange(): void {\n this._component.openChange.pipe(takeUntil(this._onDestroy$)).subscribe((isOpen) => this._toggleDialog(isOpen));\n }\n\n /** @hidden */\n private _open(): void {\n this.dialogRef = this._dialogService.open(this.dialogTemplate, {\n mobile: true,\n verticalPadding: false,\n ...this.dialogConfig,\n backdropClickCloseable: false,\n escKeyCloseable: false,\n container: this._elementRef.nativeElement\n });\n }\n}\n","<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <h1 fd-title *ngIf=\"mobileConfig?.title\">{{ mobileConfig?.title }}</h1>\n <button\n fd-dialog-close-button\n [mobile]=\"true\"\n *ngIf=\"mobileConfig?.hasCloseButton\"\n (click)=\"handleDismiss()\"\n ></button>\n <ng-template fdTemplate=\"subheader\">\n <div fd-bar-middle>\n <fd-bar-element class=\"custom-multi-input-mobile-control-element\">\n <ng-container *ngTemplateOutlet=\"childContent?.controlTemplate\"></ng-container>\n </fd-bar-element>\n <fd-bar-element class=\"custom-multi-input-select-all-bar-element\">\n <button fd-button glyph=\"multiselect-all\" fdType=\"transparent\" (click)=\"selectAll()\"></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"childContent?.listTemplate\"></ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer>\n <fd-button-bar\n *ngIf=\"mobileConfig?.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig?.approveButtonText\"\n (click)=\"handleApprove()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig?.cancelButtonText\"\n [label]=\"mobileConfig?.cancelButtonText\"\n (click)=\"handleDismiss()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { BarModule } from '@fundamental-ngx/core/bar';\nimport { MultiInputMobileComponent } from './multi-input-mobile.component';\nimport { ButtonModule } from '@fundamental-ngx/core/button';\nimport { DialogModule } from '@fundamental-ngx/core/dialog';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [MultiInputMobileComponent],\n imports: [BarModule, DialogModule, ButtonModule, CommonModule],\n entryComponents: [MultiInputMobileComponent],\n exports: [MultiInputMobileComponent]\n})\nexport class MultiInputMobileModule {}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Injector,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DOWN_ARROW, TAB, SPACE, ENTER, UP_ARROW, ESCAPE } from '@angular/cdk/keycodes';\nimport { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';\n\nimport { PopoverComponent } from '@fundamental-ngx/core/popover';\nimport { MenuKeyboardService } from '@fundamental-ngx/core/menu';\nimport { FormStates, PopoverFillMode } from '@fundamental-ngx/core/shared';\nimport { MobileModeConfig } from '@fundamental-ngx/core/mobile-mode';\nimport { TokenizerComponent } from '@fundamental-ngx/core/token';\nimport { ListComponent } from '@fundamental-ngx/core/list';\nimport {\n ContentDensityService,\n CssClassBuilder,\n DynamicComponentService,\n RtlService,\n applyCssClass,\n FocusEscapeDirection,\n KeyUtil,\n FocusTrapService,\n uuidv4,\n RangeSelector\n} from '@fundamental-ngx/core/utils';\n\nimport { MultiInputMobileComponent } from './multi-input-mobile/multi-input-mobile.component';\nimport { MultiInputMobileModule } from './multi-input-mobile/multi-input-mobile.module';\nimport { MULTI_INPUT_COMPONENT, MultiInputInterface } from './multi-input.interface';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { distinctUntilChanged, first, map, shareReplay, startWith } from 'rxjs/operators';\nimport { uniqBy } from 'lodash-es';\n\n/**\n * Input field with multiple selection enabled. Should be used when a user can select between a\n * limited number of pre-defined options with a filter-enabled context.\n *\n * Supports Angular Forms.\n */\n@Component({\n selector: 'fd-multi-input',\n templateUrl: './multi-input.component.html',\n styleUrls: ['./multi-input.component.scss'],\n host: {\n '(blur)': 'onTouched()'\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MultiInputComponent),\n multi: true\n },\n MenuKeyboardService\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MultiInputComponent\n implements MultiInputInterface, ControlValueAccessor, CssClassBuilder, OnInit, OnChanges, AfterViewInit, OnDestroy\n{\n /** Placeholder for the input field. */\n @Input()\n placeholder = '';\n\n /** Whether the input is disabled. */\n @Input()\n disabled = false;\n\n /** Whether the input is in compact mode. */\n @Input()\n compact?: boolean;\n\n /** If it is mandatory field */\n @Input()\n required = false;\n\n /** Whether to use cozy visuals but compact collapsing behavior. */\n @Input()\n compactCollapse = false;\n\n /** Max height of the popover. Any overflowing elements will be accessible through scrolling. */\n @Input()\n maxHeight = '300px';\n\n /** Icon of the button on the right of the input field. */\n @Input()\n glyph = 'value-help';\n\n /** Values to be displayed in the unfiltered dropdown. */\n @Input()\n dropdownValues: any[] = [];\n\n /** Search term, or more specifically the value of the inner input field. */\n @Input()\n get searchTerm(): string {\n return this._searchTermCtrl.value;\n }\n set searchTerm(value: string) {\n this._searchTermCtrl.setValue(value);\n }\n\n /** Id attribute for input element inside MultiInput component */\n @Input()\n inputId = '';\n\n /** Whether the search term should be highlighted in results. */\n @Input()\n highlight = true;\n\n /** Selected dropdown items. */\n @Input()\n get selected(): any[] {\n return this._selectionModel.selected;\n }\n set selected(values: any[]) {\n this._selectionModel.clear();\n values?.forEach((item) => this._selectionModel.select(item));\n }\n\n /** user's custom classes */\n @Input()\n class: string;\n\n /**\n * Filter function. Accepts an array and a string as arguments, and outputs an array.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n filterFn = this._defaultFilter;\n\n /**\n * Value function. Accepts an object of the same type as the\n * items passed to dropdownValues as argument, and outputs any property, that should be used as value.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n valueFn = this._defaultValueFn;\n\n /**\n * Display function. Accepts an object of the same type as the\n * items passed to dropdownValues as argument, and outputs a string.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n displayFn = this._defaultDisplay;\n\n /**\n * Parse function. Used for submitting new tokens. Accepts a string by default.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n newTokenParseFn = this._defaultParse;\n\n /**\n * Validate function. Used to check if new token can be added into list.\n * Works only, when `allowNewTokens` option is enabled.\n */\n @Input()\n newTokenValidateFn = this._defaultTokenValidate;\n\n /** Aria label for the multi input body. */\n @Input()\n multiInputBodyLabel = 'Multi input body';\n\n /**\n * Preset options for the Select body width, whatever is chosen, the body has a 600px limit.\n * * `at-least` will apply a minimum width to the body equivalent to the width of the control. - Default\n * * `equal` will apply a width to the body equivalent to the width of the control.\n * * 'fit-content' will apply width needed to properly display items inside, independent of control.\n */\n @Input()\n fillControlMode: PopoverFillMode = 'at-least';\n\n /**\n * The state of the form control - applies css classes.\n * Can be `success`, `error`, `warning`, `information` or blank for default.\n */\n @Input()\n state: FormStates;\n\n /**\n * Whether AddOn Button should be focusable\n * @default true\n */\n @Input()\n buttonFocusable = true;\n\n /** Whether the multi-input allows the creation of new tokens. */\n @Input()\n allowNewTokens = false;\n\n /** Whether the multi-input should be built on mobile mode */\n @Input()\n mobile = false;\n\n /** Whether the multi-input should have show all button. */\n @Input()\n showAllButton = true;\n\n /** Max width of multi input body in PX */\n @Input()\n bodyMaxWidth: number = null;\n\n /** Multi Input Mobile Configuration, it's applied only, when mobile is enabled */\n @Input()\n mobileConfig: MobileModeConfig = { hasCloseButton: true, approveButtonText: 'Select' };\n\n /**\n * Whether or not to return results where the input matches the entire string. By default, only results that start\n * with the input search term will be returned.\n */\n @Input()\n includes = false;\n\n /**\n * The template with which to display the individual listed items.\n * Use it by passing an ng-template with implicit content. See examples for more info.\n */\n @Input()\n itemTemplate: TemplateRef<any>;\n\n /**\n * The tooltip for the multi-input icon.\n */\n @Input()\n title: string;\n\n /** Whether the autocomplete should be enabled; Enabled by default */\n @Input()\n autoComplete = true;\n\n /** Event emitted when the search term changes. Use *$event* to access the new term. */\n @Output()\n readonly searchTermChange: EventEmitter<string> = new EventEmitter<string>();\n\n /** Event emitted when the selected items change. Use *$event* to access the new selected array. */\n @Output()\n readonly selectedChange: EventEmitter<any[]> = new EventEmitter<any[]>();\n\n /** Whether multi input popover body should be opened */\n @Input()\n open = false;\n\n /** Whether or not to display the addon button. */\n @Input()\n displayAddonButton = true;\n\n /** Event emitted, when the multi input's popover body is opened or closed */\n @Output()\n readonly openChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** @hidden */\n @ViewChild(PopoverComponent)\n popoverRef: PopoverComponent;\n\n /** @hidden */\n @ViewChild('control', { read: TemplateRef })\n controlTemplate: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild('list', { read: TemplateRef })\n listTemplate: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild(ListComponent)\n listComponent: ListComponent;\n\n /** @hidden */\n @ViewChild('searchInputElement', { read: ElementRef })\n searchInputElement: ElementRef<HTMLInputElement>;\n\n /** @hidden */\n @ViewChild(TokenizerComponent)\n tokenizer: TokenizerComponent;\n\n /** @hidden */\n readonly optionItems$ = new BehaviorSubject<OptionItem[]>([]);\n\n /** @hidden */\n readonly _searchTermCtrl = new FormControl('');\n\n /** @hidden */\n readonly _selectionModel = new SelectionModel<any>(true);\n\n /** @hidden */\n readonly viewModel$: Observable<ViewModel> = this._getViewModel();\n\n /** @hidden */\n _dir: string;\n\n /** @hidden */\n private _subscriptions = new Subscription();\n\n /** @hidden */\n private readonly _rangeSelector = new RangeSelector();\n\n /** @hidden */\n onChange: (value: any) => void = () => {};\n\n /** @hidden */\n onTouched = (): void => {};\n\n /** @hidden */\n constructor(\n private readonly _elementRef: ElementRef,\n private readonly _changeDetRef: ChangeDetectorRef,\n private readonly _dynamicComponentService: DynamicComponentService,\n private readonly _injector: Injector,\n private readonly _viewContainerRef: ViewContainerRef,\n @Optional() private readonly _rtlService: RtlService,\n @Optional() private readonly _contentDensityService: ContentDensityService,\n @Optional() private readonly _focusTrapService: FocusTrapService\n ) {}\n\n /** @hidden */\n ngOnInit(): void {\n if (this.compact === undefined && this._contentDensityService) {\n this._subscriptions.add(\n this._contentDensityService._isCompactDensity.subscribe((isCompact) => {\n this.compact = isCompact;\n this.buildComponentCssClass();\n this._changeDetRef.markForCheck();\n })\n );\n }\n\n this.buildComponentCssClass();\n\n this._subscriptions.add(\n this._rtlService?.rtl.subscribe((isRtl) => {\n this._dir = isRtl ? 'rtl' : 'ltr';\n this.buildComponentCssClass();\n })\n );\n\n if (!this.inputId) {\n this.inputId = uuidv4();\n }\n\n this._subscriptions.add(\n this._searchTermCtrl.valueChanges.pipe(distinctUntilChanged()).subscribe((searchTerm) => {\n this.searchTermChange.emit(searchTerm);\n // resetting existing selection state, if any\n this._rangeSelector.reset();\n })\n );\n }\n\n /** @hidden */\n ngOnChanges(changes: SimpleChanges): void {\n this.buildComponentCssClass();\n\n if (changes.dropdownValues || changes.searchTerm || changes.valueFn || changes.displayFn) {\n const optionItems = (this.dropdownValues ?? []).map((item) => this._getOptionItem(item));\n this.optionItems$.next(optionItems);\n this._changeDetRef.markForCheck();\n }\n\n if (changes.disabled) {\n this.disabled ? this._searchTermCtrl.disable() : this._searchTermCtrl.enable();\n }\n }\n\n /** @hidden */\n ngAfterViewInit(): void {\n if (this.mobile) {\n this._setUpMobileMode();\n }\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n @applyCssClass\n /** CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n buildComponentCssClass(): string[] {\n // TODO: this icon flip may be addressed in styles in the future\n if (this.glyph === 'value-help' && this._dir === 'rtl') {\n const icon = this.elementRef().nativeElement.querySelector('.sap-icon--value-help');\n if (icon) {\n icon.style.transform = 'scaleX(-1)';\n }\n }\n\n return ['fd-multi-input', 'fd-multi-input-custom', this.class];\n }\n\n /** @hidden */\n elementRef(): ElementRef<any> {\n return this._elementRef;\n }\n\n /** @hidden */\n registerOnChange(fn: (selected: any[]) => void): void {\n this.onChange = fn;\n }\n\n /** @hidden */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @hidden */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n if (isDisabled) {\n this._elementRef.nativeElement.style.pointerEvents = 'none';\n } else {\n this._elementRef.nativeElement.style.pointerEvents = 'auto';\n }\n\n this._changeDetRef.detectChanges();\n }\n\n /** @hidden */\n writeValue(selected: any[]): void {\n this.selected = selected;\n\n this._changeDetRef.markForCheck();\n }\n\n /** Method passed to list component */\n handleListFocusEscape(direction: FocusEscapeDirection): void {\n if (direction === 'up') {\n this.searchInputElement.nativeElement.focus();\n }\n }\n\n /** @hidden */\n openChangeHandle(open: boolean): void {\n if (this.disabled) {\n return;\n }\n\n if (!open && this.open && !this.mobile) {\n this.searchInputElement.nativeElement.focus();\n }\n\n if (this.open !== open) {\n this.openChange.emit(open);\n }\n\n this.open = open;\n\n if (!this.mobile) {\n this._popoverOpenHandle(open);\n }\n\n if (!this.open) {\n this._resetSearchTerm();\n this.enableParentFocusTrap();\n } else {\n this.disableParentFocusTrap();\n }\n\n this.tokenizer.removeSelectedTokens();\n\n this._changeDetRef.detectChanges();\n }\n\n /** Method that selects all possible options. */\n selectAllItems(): void {\n this.selected = [...this.dropdownValues];\n\n // On Mobile mode changes are propagated only on approve.\n this._propagateChange();\n }\n\n /** @hidden */\n _onCheckboxKeyup(value: any, event: KeyboardEvent, index: number): void {\n if (KeyUtil.isKeyCode(event, [SPACE, ENTER])) {\n this._onCheckboxClick(value, event, index);\n }\n }\n\n /** @hidden */\n async _onCheckboxClick(\n value: any,\n event: PointerEvent | KeyboardEvent,\n index: number,\n isListItem = false\n ): Promise<void> {\n const toggledSelection = !this._selectionModel.isSelected(value);\n this._rangeSelector.onRangeElementToggled(index, event);\n const sub = this.viewModel$.pipe(first()).subscribe((vm) => {\n this._rangeSelector.applyValueToEachInRange((idx) =>\n this._handleSelect(toggledSelection, vm.displayedOptions[idx].value, false)\n );\n });\n this._subscriptions.add(sub);\n if (isListItem) {\n this.openChangeHandle(false);\n } else {\n // stop propagation on the checkbox so event doesn't reach the list item\n event.stopPropagation();\n }\n }\n\n /** @hidden */\n _onTokenClick(value: any, resetSearch: boolean, event?: PointerEvent): void {\n event?.preventDefault(); // prevent this function from being called twice when checkbox updates\n this._handleSelect(false, value, resetSearch);\n }\n\n /** @hidden */\n _handleSelect(checked: any, value: any, resetSearch = true): void {\n const previousLength = this._selectionModel.selected.length;\n if (checked) {\n this._selectionModel.select(value);\n } else {\n this._selectionModel.deselect(value);\n }\n\n // Handle popover placement update\n if (this._shouldPopoverBeUpdated(previousLength, this._selectionModel.selected.length)) {\n this.popoverRef.refreshPosition();\n }\n\n if (resetSearch) {\n this._resetSearchTerm();\n }\n\n this.searchInputElement.nativeElement.focus();\n\n // On Mobile mode changes are propagated only on approve.\n this._propagateChange();\n }\n\n _handleInputKeydown(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, DOWN_ARROW) && !this.mobile) {\n if (event.altKey) {\n this.openChangeHandle(true);\n }\n\n if (this.listComponent) {\n this.listComponent.setItemActive(0);\n event.preventDefault();\n }\n } else if (KeyUtil.isKeyCode(event, [DOWN_ARROW, UP_ARROW, ENTER])) {\n this.openChangeHandle(true);\n } else if (KeyUtil.isKeyCode(event, ESCAPE)) {\n this.openChangeHandle(false);\n } else if (KeyUtil.isKeyCode(event, TAB) && this.open) {\n if (this.listComponent) {\n this.listComponent.setItemActive(0);\n event.preventDefault();\n }\n } else if (KeyUtil.isKeyType(event, 'alphabetical') || KeyUtil.isKeyType(event, 'numeric')) {\n if (!this.open) {\n this.openChangeHandle(true);\n }\n }\n }\n\n /** @hidden */\n _showAllClicked(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this._searchTermCtrl.setValue('');\n this.searchInputElement.nativeElement.focus();\n }\n\n /** @hidden */\n _showAllKeyDown(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, [SPACE, ENTER])) {\n this._showAllClicked(event);\n }\n }\n\n /** @hidden */\n _onSubmit(): void {\n const searchTerm = this.searchTerm;\n if (searchTerm === '') {\n return;\n }\n const isExist = this._selectFirstFiltered(searchTerm);\n if (!isExist && this.allowNewTokens && this.newTokenValidateFn(this._searchTermCtrl.value)) {\n const newToken = this.newTokenParseFn(this._searchTermCtrl.value);\n this._addNewTokenToDropDownValues(newToken);\n this._handleSelect(true, newToken);\n this._searchTermCtrl.setValue('');\n this.open = false;\n }\n }\n\n /** @hidden */\n _handleComplete({ term }): void {\n this.searchTerm = term;\n }\n\n /**\n * Handle dialog dismissing, closes popover and sets backup data.\n */\n dialogDismiss(selectedBackup: any[]): void {\n this.selected = selectedBackup;\n this.openChangeHandle(false);\n this._resetSearchTerm();\n }\n\n /**\n * Handle dialog approval, closes popover and propagates data changes.\n */\n dialogApprove(): void {\n this._propagateChange(true);\n this.openChangeHandle(false);\n this._resetSearchTerm();\n }\n\n /** @hidden */\n _moreClicked(): void {\n this.openChangeHandle(true);\n }\n\n /** @hidden */\n _addOnButtonClicked(): void {\n this.openChangeHandle(!this.open);\n }\n\n /** @hidden */\n disableParentFocusTrap(): void {\n this._focusTrapService?.pauseCurrentFocusTrap();\n }\n\n /** @hidden */\n enableParentFocusTrap(): void {\n this._focusTrapService?.unpauseCurrentFocusTrap();\n }\n\n /** @hidden */\n private _addNewTokenToDropDownValues(newToken): void {\n this.dropdownValues.push(newToken);\n const newOption = this._getOptionItem(newToken);\n this.optionItems$.next([...this.optionItems$.value, newOption]);\n }\n\n /** @hidden */\n private _selectFirstFiltered(searchTerm: string): boolean {\n const filtered = this.filterFn(this.dropdownValues, searchTerm);\n if (Array.isArray(filtered) && filtered.length > 0 && !this.includes && this.autoComplete) {\n this._handleSelect(true, filtered[0]);\n this._searchTermCtrl.setValue('');\n this.open = false;\n return true;\n }\n return false;\n }\n\n /** @hidden */\n private _defaultFilter(contentArray: any[], searchTerm: string = ''): any[] {\n const searchLower = searchTerm.toLocaleLowerCase();\n return contentArray.filter((item) => {\n if (item) {\n const displayedValue = this.displayFn(item);\n const term = typeof displayedValue === 'string' ? displayedValue.toLocaleLowerCase() : '';\n\n return this.includes ? term.includes(searchLower) : term.startsWith(searchLower);\n }\n });\n }\n\n /** @hidden */\n private _defaultValueFn(value: any): any {\n return value;\n }\n\n /** @hidden */\n private _defaultDisplay(str: any): string {\n return str;\n }\n\n /** @hidden */\n private _defaultParse(str: any): string {\n return str;\n }\n\n /** @hidden */\n private _defaultTokenValidate(str: string): boolean {\n return !!str;\n }\n\n /** @hidden */\n private _popoverOpenHandle(open: boolean): void {\n this.open = open;\n this.onTouched();\n }\n\n /** @hidden */\n private _propagateChange(emitInMobile?: boolean): void {\n if (!this.mobile || emitInMobile) {\n const selected = [...this._selectionModel.selected];\n this.onChange(selected);\n this.selectedChange.emit(selected);\n }\n }\n\n /** @hidden */\n private _shouldPopoverBeUpdated(previousLength: number, currentLength: number): boolean {\n return (\n !!this.popoverRef &&\n ((previousLength === 0 && currentLength === 1) || (previousLength === 1 && currentLength === 0))\n );\n }\n\n /** @hidden */\n private async _setUpMobileMode(): Promise<void> {\n const injector = Injector.create({\n providers: [{ provide: MULTI_INPUT_COMPONENT, useValue: this }],\n parent: this._injector\n });\n\n await this._dynamicComponentService.createDynamicModule(\n { listTemplate: this.listTemplate, controlTemplate: this.controlTemplate },\n MultiInputMobileModule,\n MultiInputMobileComponent,\n this._viewContainerRef,\n injector\n );\n }\n\n /** @hidden */\n private _resetSearchTerm(): void {\n this._searchTermCtrl.setValue('');\n this._changeDetRef.detectChanges();\n }\n\n /** @hidden */\n private _getOptionItem(item: any): OptionItem {\n return {\n item,\n label: this.displayFn(item),\n value: this.valueFn(item)\n };\n }\n\n /** @hidden */\n private _getViewModel(): Observable<ViewModel> {\n let previouslySelected: OptionItem[] = [];\n return combineLatest([\n this._searchTermCtrl.valueChanges.pipe(startWith(this._searchTermCtrl.value)),\n this.optionItems$,\n this._selectionModel.changed.pipe(startWith(undefined))\n ]).pipe(\n map(([, optionItems]) => {\n // not using \"searchTerm\" value from combineLatest as it will be wrong for late subscribers, if any\n const searchTerm = this._searchTermCtrl.value;\n let displayedOptions = optionItems;\n if (searchTerm) {\n const filtered = this.filterFn(this.dropdownValues, searchTerm);\n displayedOptions = (Array.isArray(filtered) ? filtered : []).map((item) =>\n this._getOptionItem(item)\n );\n }\n // selected options should be displayed in the same order as they're selected\n const orderMap = new Map(this._selectionModel.selected.map((v, i) => [v, i]));\n // combining previously selected options with current selection\n // in order to display selected items even if they're not present in the list of options\n // (e.g. if only a subset of all options is provided to the control)\n const selectedNotUnique = optionItems\n .concat(previouslySelected)\n .filter((item) => this._selectionModel.isSelected(item.value));\n const selectedOptions = uniqBy(selectedNotUnique, 'value').sort(\n (a, b) => orderMap.get(a.value) - orderMap.get(b.value)\n );\n\n previouslySelected = selectedOptions;\n return {\n selectedOptions,\n displayedOptions\n };\n }),\n shareReplay({ refCount: true, bufferSize: 1 })\n );\n }\n}\n\ninterface OptionItem<T = any> {\n label: string;\n value: any;\n item: T;\n}\n\ninterface ViewModel {\n selectedOptions: OptionItem[];\n displayedOptions: OptionItem[];\n}\n","<ng-container *ngIf=\"viewModel$ | async as vm\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container [ngTemplateOutlet]=\"control\" *ngIf=\"mobile && !open\"></ng-container>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"bodyMaxWidth\"\n [focusTrapped]=\"true\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container *ngTemplateOutlet=\"control\"></ng-container>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!vm.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control>\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"displayAddonButton\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && vm.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"displayAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked()\"\n >\n <fd-tokenizer\n [compactCollapse]=\"compactCollapse\"\n [compact]=\"compact\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n [class.fd-multi-input-tokenizer-custom--compact]=\"compact\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of vm.selectedOptions\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, true, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fd-auto-complete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [inputText]=\"_searchTermCtrl.value\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [compact]=\"compact\"\n [attr.aria-required]=\"required\"\n [class.fd-input--compact]=\"compact\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"vm.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [compact]=\"compact\"\n [style.maxHeight]=\"!mobile ? maxHeight : 'auto'\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.minWidth]=\"'100%'\"\n >\n <li\n *ngFor=\"let option of vm.displayedOptions; let idx = index\"\n fd-list-item\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"_selectionModel.isSelected(option.value)\"\n >\n <fd-checkbox\n [compact]=\"compact\"\n [value]=\"_selectionModel.isSelected(option.value)\"\n (click)=\"_onCheckboxClick(option.value, $event, idx)\"\n >\n <!-- TODO -->\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n <li\n *ngIf=\"showAllButton && vm.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value:highlight\"\n >\n </span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MultiInputComponent } from './multi-input.component';\nimport { TokenModule } from '@fundamental-ngx/core/token';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { PopoverModule } from '@fundamental-ngx/core/popover';\nimport { PipeModule } from '@fundamental-ngx/core/utils';\nimport { InputGroupModule } from '@fundamental-ngx/core/input-group';\nimport { FormModule } from '@fundamental-ngx/core/form';\nimport { CheckboxModule } from '@fundamental-ngx/core/checkbox';\nimport { ListModule } from '@fundamental-ngx/core/list';\nimport { LinkModule } from '@fundamental-ngx/core/link';\nimport { AutoCompleteModule } from '@fundamental-ngx/core/utils';\n\n@NgModule({\n declarations: [MultiInputComponent],\n imports: [\n CommonModule,\n TokenModule,\n FormsModule,\n ReactiveFormsModule,\n ListModule,\n PopoverModule,\n PipeModule,\n InputGroupModule,\n FormModule,\n CheckboxModule,\n LinkModule,\n AutoCompleteModule\n ],\n exports: [MultiInputComponent]\n})\nexport class MultiInputModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAGa,qBAAqB,GAAG,IAAI,cAAc,CAAW,qBAAqB;;MC2B1E,yBACT,SAAQ,cAAmC;IAmB3C,YACI,UAAsB,EACtB,aAA4B,EACG,mBAAwC,EAC/B,WAAoC;QAE5E,KAAK,CAAC,UAAU,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;;;;;;QAdtG,iBAAY,GAGR,IAAI,CAAC;KAYR;;IAGD,QAAQ;QACJ,IAAI,CAAC,6BAA6B,EAAE,CAAC;KACxC;;IAGD,eAAe;QACX,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC7B;IAED,WAAW;QACP,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,KAAK,CAAC,SAAS,EAAE,CAAC;KACrB;;IAGD,SAAS;QACL,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;KACpC;;IAGD,aAAa;QACT,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;KACvD;;IAGD,aAAa;QACT,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;KACnC;;IAGO,aAAa,CAAC,IAAa;QAC/B,IAAI,IAAI,EAAE;YACN,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,EAAE;gBACvC,IAAI,CAAC,KAAK,EAAE,CAAC;aAChB;SACJ;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;KAC9B;;IAGO,6BAA6B;QACjC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;KAClH;;IAGO,KAAK;QACT,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YAC3D,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,KAAK;YACtB,GAAG,IAAI,CAAC,YAAY;YACpB,sBAAsB,EAAE,KAAK;YAC7B,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,aAAa;SAC5C,CAAC,CAAC;KACN;;sHAxFQ,yBAAyB,yEAuBtB,qBAAqB,aACT,kBAAkB;0GAxBjC,yBAAyB,sMC9BtC,42DA2CA;2FDba,yBAAyB;kBAPrC,SAAS;+BACI,uBAAuB,mBAGhB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI;;0BAyBhC,MAAM;2BAAC,qBAAqB;;0BAC5B,QAAQ;;0BAAI,MAAM;2BAAC,kBAAkB;4CAnBb,cAAc;sBAA1C,SAAS;uBAAC,gBAAgB;;;MEtBlB,sBAAsB;;mHAAtB,sBAAsB;oHAAtB,sBAAsB,iBALhB,yBAAyB,aAC9B,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,aAEnD,yBAAyB;oHAE1B,sBAAsB,YAJtB,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC;2FAIrD,sBAAsB;kBANlC,QAAQ;mBAAC;oBACN,YAAY,EAAE,CAAC,yBAAyB,CAAC;oBACzC,OAAO,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC;oBAC9D,eAAe,EAAE,CAAC,yBAAyB,CAAC;oBAC5C,OAAO,EAAE,CAAC,yBAAyB,CAAC;iBACvC;;;ACuCD;;;;;;MAwBa,mBAAmB;;IA0P5B,YACqB,WAAuB,EACvB,aAAgC,EAChC,wBAAiD,EACjD,SAAmB,EACnB,iBAAmC,EACvB,WAAuB,EACvB,sBAA6C,EAC7C,iBAAmC;QAP/C,gBAAW,GAAX,WAAW,CAAY;QACvB,kBAAa,GAAb,aAAa,CAAmB;QAChC,6BAAwB,GAAxB,wBAAwB,CAAyB;QACjD,cAAS,GAAT,SAAS,CAAU;QACnB,sBAAiB,GAAjB,iBAAiB,CAAkB;QACvB,gBAAW,GAAX,WAAW,CAAY;QACvB,2BAAsB,GAAtB,sBAAsB,CAAuB;QAC7C,sBAAiB,GAAjB,iBAAiB,CAAkB;;QA7PpE,gBAAW,GAAG,EAAE,CAAC;;QAIjB,aAAQ,GAAG,KAAK,CAAC;;QAQjB,aAAQ,GAAG,KAAK,CAAC;;QAIjB,oBAAe,GAAG,KAAK,CAAC;;QAIxB,cAAS,GAAG,OAAO,CAAC;;QAIpB,UAAK,GAAG,YAAY,CAAC;;QAIrB,mBAAc,GAAU,EAAE,CAAC;;QAa3B,YAAO,GAAG,EAAE,CAAC;;QAIb,cAAS,GAAG,IAAI,CAAC;;;;;;QAsBjB,aAAQ,GAAG,IAAI,CAAC,cAAc,CAAC;;;;;;;QAS/B,YAAO,GAAG,IAAI,CAAC,eAAe,CAAC;;;;;;;QAS/B,cAAS,GAAG,IAAI,CAAC,eAAe,CAAC;;;;;;QAQjC,oBAAe,GAAG,IAAI,CAAC,aAAa,CAAC;;;;;QAOrC,uBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC;;QAIhD,wBAAmB,GAAG,kBAAkB,CAAC;;;;;;;QASzC,oBAAe,GAAoB,UAAU,CAAC;;;;;QAc9C,oBAAe,GAAG,IAAI,CAAC;;QAIvB,mBAAc,GAAG,KAAK,CAAC;;QAIvB,WAAM,GAAG,KAAK,CAAC;;QAIf,kBAAa,GAAG,IAAI,CAAC;;QAIrB,iBAAY,GAAW,IAAI,CAAC;;QAI5B,iBAAY,GAAqB,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC;;;;;QAOvF,aAAQ,GAAG,KAAK,CAAC;;QAiBjB,iBAAY,GAAG,IAAI,CAAC;;QAIX,qBAAgB,GAAyB,IAAI,YAAY,EAAU,CAAC;;QAIpE,mBAAc,GAAwB,IAAI,YAAY,EAAS,CAAC;;QAIzE,SAAI,GAAG,KAAK,CAAC;;QAIb,uBAAkB,GAAG,IAAI,CAAC;;QAIjB,eAAU,GAA0B,IAAI,YAAY,EAAW,CAAC;;QA2BhE,iBAAY,GAAG,IAAI,eAAe,CAAe,EAAE,CAAC,CAAC;;QAGrD,oBAAe,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;;QAGtC,oBAAe,GAAG,IAAI,cAAc,CAAM,IAAI,CAAC,CAAC;;QAGhD,eAAU,GAA0B,IAAI,CAAC,aAAa,EAAE,CAAC;;QAM1D,mBAAc,GAAG,IAAI,YAAY,EAAE,CAAC;;QAG3B,mBAAc,GAAG,IAAI,aAAa,EAAE,CAAC;;QAGtD,aAAQ,GAAyB,SAAQ,CAAC;;QAG1C,cAAS,GAAG,SAAc,CAAC;KAYvB;;IA/NJ,IACI,UAAU;QACV,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;KACrC;IACD,IAAI,UAAU,CAAC,KAAa;QACxB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KACxC;;IAWD,IACI,QAAQ;QACR,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;KACxC;IACD,IAAI,QAAQ,CAAC,MAAa;QACtB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;KAChE;;IA0MD,QAAQ;QACJ,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAC3D,IAAI,CAAC,cAAc,CAAC,GAAG,CACnB,IAAI,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,SAAS;gBAC9D,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;gBACzB,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC9B,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;aACrC,CAAC,CACL,CAAC;SACL;QAED,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,IAAI,CAAC,cAAc,CAAC,GAAG,CACnB,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK;YAClC,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;YAClC,IAAI,CAAC,sBAAsB,EAAE,CAAC;SACjC,CAAC,CACL,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACf,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;SAC3B;QAED,IAAI,CAAC,cAAc,CAAC,GAAG,CACnB,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU;YAChF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;YAEvC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;SAC/B,CAAC,CACL,CAAC;KACL;;IAGD,WAAW,CAAC,OAAsB;QAC9B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE;YACtF,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;YACzF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACpC,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;SACrC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;SAClF;KACJ;;IAGD,eAAe;QACX,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,gBAAgB,EAAE,CAAC;SAC3B;KACJ;;IAGD,WAAW;QACP,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;KACrC;;;;;IAOD,sBAAsB;;QAElB,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;YACpF,IAAI,IAAI,EAAE;gBACN,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC;aACvC;SACJ;QAED,OAAO,CAAC,gBAAgB,EAAE,uBAAuB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;KAClE;;IAGD,UAAU;QACN,OAAO,IAAI,CAAC,WAAW,CAAC;KAC3B;;IAGD,gBAAgB,CAAC,EAA6B;QAC1C,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;KACtB;;IAGD,iBAAiB,CAAC,EAAc;QAC5B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;KACvB;;IAGD,gBAAgB,CAAC,UAAmB;QAChC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC;QAC3B,IAAI,UAAU,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;SAC/D;aAAM;YACH,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;SAC/D;QAED,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;KACtC;;IAGD,UAAU,CAAC,QAAe;QACtB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;KACrC;;IAGD,qBAAqB,CAAC,SAA+B;QACjD,IAAI,SAAS,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;SACjD;KACJ;;IAGD,gBAAgB,CAAC,IAAa;QAC1B,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,OAAO;SACV;QAED,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACpC,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;SACjD;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9B;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACd,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;SACjC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,qBAAqB,EAAE,CAAC;SAChC;aAAM;YACH,IAAI,CAAC,sBAAsB,EAAE,CAAC;SACjC;QAED,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC;QAEtC,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;KACtC;;IAGD,cAAc;QACV,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;;QAGzC,IAAI,CAAC,gBAAgB,EAAE,CAAC;KAC3B;;IAGD,gBAAgB,CAAC,KAAU,EAAE,KAAoB,EAAE,KAAa;QAC5D,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE;YAC1C,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC9C;KACJ;;IAGD,MAAM,gBAAgB,CAClB,KAAU,EACV,KAAmC,EACnC,KAAa,EACb,UAAU,GAAG,KAAK;QAElB,MAAM,gBAAgB,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACjE,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE;YACnD,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC,GAAG,KAC5C,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAC9E,CAAC;SACL,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,UAAU,EAAE;YACZ,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAChC;aAAM;;YAEH,KAAK,CAAC,eAAe,EAAE,CAAC;SAC3B;KACJ;;IAGD,aAAa,CAAC,KAAU,EAAE,WAAoB,EAAE,KAAoB;QAChE,KAAK,EAAE,cAAc,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;KACjD;;IAGD,aAAa,CAAC,OAAY,EAAE,KAAU,EAAE,WAAW,GAAG,IAAI;QACtD,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5D,IAAI,OAAO,EAAE;YACT,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACtC;aAAM;YACH,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACxC;;QAGD,IAAI,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;YACpF,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;SACrC;QAED,IAAI,WAAW,EAAE;YACb,IAAI,CAAC,gBAAgB,EAAE,CAAC;SAC3B;QAED,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;;QAG9C,IAAI,CAAC,gBAAgB,EAAE,CAAC;KAC3B;IAED,mBAAmB,CAAC,KAAoB;QACpC,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACtD,IAAI,KAAK,CAAC,MAAM,EAAE;gBACd,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;aAC/B;YAED,IAAI,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACpC,KAAK,CAAC,cAAc,EAAE,CAAC;aAC1B;SACJ;aAAM,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE;YAChE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;SAC/B;aAAM,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;YACzC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAChC;aAAM,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;YACnD,IAAI,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACpC,KAAK,CAAC,cAAc,EAAE,CAAC;aAC1B;SACJ;aAAM,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,cAAc,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE;YACxF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBACZ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;aAC/B;SACJ;KACJ;;IAGD,eAAe,CAAC,KAAY;QACxB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;KACjD;;IAGD,eAAe,CAAC,KAAoB;QAChC,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE;YAC1C,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SAC/B;KACJ;;IAGD,SAAS;QACL,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,UAAU,KAAK,EAAE,EAAE;YACnB,OAAO;SACV;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;YACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAClE,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;SACrB;KACJ;;IAGD,eAAe,CAAC,EAAE,IAAI,EAAE;QACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;KAC1B;;;;IAKD,aAAa,CAAC,cAAqB;QAC/B,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;KAC3B;;;;IAKD,aAAa;QACT,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;KAC3B;;IAGD,YAAY;QACR,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;KAC/B;;IAGD,mBAAmB;QACf,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACrC;;IAGD,sBAAsB;QAClB,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;KACnD;;IAGD,qBAAqB;QACjB,IAAI,CAAC,iBAAiB,EAAE,uBAAuB,EAAE,CAAC;KACrD;;IAGO,4BAA4B,CAAC,QAAQ;QACzC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;KACnE;;IAGO,oBAAoB,CAAC,UAAkB;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QAChE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE;YACvF,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;KAChB;;IAGO,cAAc,CAAC,YAAmB,EAAE,aAAqB,EAAE;QAC/D,MAAM,WAAW,GAAG,UAAU,CAAC,iBAAiB,EAAE,CAAC;QACnD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI;YAC5B,IAAI,IAAI,EAAE;gBACN,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC5C,MAAM,IAAI,GAAG,OAAO,cAAc,KAAK,QAAQ,GAAG,cAAc,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC;gBAE1F,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;aACpF;SACJ,CAAC,CAAC;KACN;;IAGO,eAAe,CAAC,KAAU;QAC9B,OAAO,KAAK,CAAC;KAChB;;IAGO,eAAe,CAAC,GAAQ;QAC5B,OAAO,GAAG,CAAC;KACd;;IAGO,aAAa,CAAC,GAAQ;QAC1B,OAAO,GAAG,CAAC;KACd;;IAGO,qBAAqB,CAAC,GAAW;QACrC,OAAO,CAAC,CAAC,GAAG,CAAC;KAChB;;IAGO,kBAAkB,CAAC,IAAa;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,EAAE,CAAC;KACpB;;IAGO,gBAAgB,CAAC,YAAsB;QAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,YAAY,EAAE;YAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACtC;KACJ;;IAGO,uBAAuB,CAAC,cAAsB,EAAE,aAAqB;QACzE,QACI,CAAC,CAAC,IAAI,CAAC,UAAU;aAChB,CAAC,cAAc,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,MAAM,cAAc,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,CAAC,CAAC,EAClG;KACL;;IAGO,MAAM,gBAAgB;QAC1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC7B,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC/D,MAAM,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,CACnD,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,EAC1E,sBAAsB,EACtB,yBAAyB,EACzB,IAAI,CAAC,iBAAiB,EACtB,QAAQ,CACX,CAAC;KACL;;IAGO,gBAAgB;QACpB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;KACtC;;IAGO,cAAc,CAAC,IAAS;QAC5B,OAAO;YACH,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC3B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;SAC5B,CAAC;KACL;;IAGO,aAAa;QACjB,IAAI,kBAAkB,GAAiB,EAAE,CAAC;QAC1C,OAAO,aAAa,CAAC;YACjB,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC7E,IAAI,CAAC,YAAY;YACjB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;SAC1D,CAAC,CAAC,IAAI,CACH,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC;;YAEhB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAC9C,IAAI,gBAAgB,GAAG,WAAW,CAAC;YACnC,IAAI,UAAU,EAAE;gBACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;gBAChE,gBAAgB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,KAClE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAC5B,CAAC;aACL;;YAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;;;YAI9E,MAAM,iBAAiB,GAAG,WAAW;iBAChC,MAAM,CAAC,kBAAkB,CAAC;iBAC1B,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACnE,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,IAAI,CAC3D,CAAC,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAC1D,CAAC;YAEF,kBAAkB,GAAG,eAAe,CAAC;YACrC,OAAO;gBACH,eAAe;gBACf,gBAAgB;aACnB,CAAC;SACL,CAAC,EACF,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CACjD,CAAC;KACL;;gHAptBQ,mBAAmB;oGAAnB,mBAAmB,wkCAXjB;QACP;YACI,OAAO,EAAE,iBAAiB;YAC1B,WAAW,EAAE,UAAU,CAAC,MAAM,mBAAmB,CAAC;YAClD,KAAK,EAAE,IAAI;SACd;QACD,mBAAmB;KACtB,sEA2MU,gBAAgB,wHAIG,WAAW,+FAId,WAAW,6DAI3B,aAAa,sIAIiB,UAAU,yDAIxC,kBAAkB,qECtSjC,yuMAsJA;AD4PI;IALC,aAAa;;;;iEAeb;2FAjVQ,mBAAmB;kBAlB/B,SAAS;+BACI,gBAAgB,QAGpB;wBACF,QAAQ,EAAE,aAAa;qBAC1B,aACU;wBACP;4BACI,OAAO,EAAE,iBAAiB;4BAC1B,WAAW,EAAE,UAAU,CAAC,yBAAyB,CAAC;4BAClD,KAAK,EAAE,IAAI;yBACd;wBACD,mBAAmB;qBACtB,iBACc,iBAAiB,CAAC,IAAI,mBACpB,uBAAuB,CAAC,MAAM;;0BAkQ1C,QAAQ;;0BACR,QAAQ;;0BACR,QAAQ;4CA7Pb,WAAW;sBADV,KAAK;gBAKN,QAAQ;sBADP,KAAK;gBAKN,OAAO;sBADN,KAAK;gBAKN,QAAQ;sBADP,KAAK;gBAKN,eAAe;sBADd,KAAK;gBAKN,SAAS;sBADR,KAAK;gBAKN,KAAK;sBADJ,KAAK;gBAKN,cAAc;sBADb,KAAK;gBAKF,UAAU;sBADb,KAAK;gBAUN,OAAO;sBADN,KAAK;gBAKN,SAAS;sBADR,KAAK;gBAKF,QAAQ;sBADX,KAAK;gBAWN,KAAK;sBADJ,KAAK;gBASN,QAAQ;sBADP,KAAK;gBAUN,OAAO;sBADN,KAAK;gBAUN,SAAS;sBADR,KAAK;gBASN,eAAe;sBADd,KAAK;gBAQN,kBAAkB;sBADjB,KAAK;gBAKN,mBAAmB;sBADlB,KAAK;gBAUN,eAAe;sBADd,KAAK;gBAQN,KAAK;sBADJ,KAAK;gBAQN,eAAe;sBADd,KAAK;gBAKN,cAAc;sBADb,KAAK;gBAKN,MAAM;sBADL,KAAK;gBAKN,aAAa;sBADZ,KAAK;gBAKN,YAAY;sBADX,KAAK;gBAKN,YAAY;sBADX,KAAK;gBAQN,QAAQ;sBADP,KAAK;gBAQN,YAAY;sBADX,KAAK;gBAON,KAAK;sBADJ,KAAK;gBAKN,YAAY;sBADX,KAAK;gBAKG,gBAAgB;sBADxB,MAAM;gBAKE,cAAc;sBADtB,MAAM;gBAKP,IAAI;sBADH,KAAK;gBAKN,kBAAkB;sBADjB,KAAK;gBAKG,UAAU;sBADlB,MAAM;gBAKP,UAAU;sBADT,SAAS;uBAAC,gBAAgB;gBAK3B,eAAe;sBADd,SAAS;uBAAC,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;gBAK3C,YAAY;sBADX,SAAS;uBAAC,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;gBAKxC,aAAa;sBADZ,SAAS;uBAAC,aAAa;gBAKxB,kBAAkB;sBADjB,SAAS;uBAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;gBAKrD,SAAS;sBADR,SAAS;uBAAC,kBAAkB;;;;;;QA4G7B,sBAAsB;;MElXb,gBAAgB;;6GAAhB,gBAAgB;8GAAhB,gBAAgB,iBAjBV,mBAAmB,aAE9B,YAAY;QACZ,WAAW;QACX,WAAW;QACX,mBAAmB;QACnB,UAAU;QACV,aAAa;QACb,UAAU;QACV,gBAAgB;QAChB,UAAU;QACV,cAAc;QACd,UAAU;QACV,kBAAkB,aAEZ,mBAAmB;8GAEpB,gBAAgB,YAhBhB;YACL,YAAY;YACZ,WAAW;YACX,WAAW;YACX,mBAAmB;YACnB,UAAU;YACV,aAAa;YACb,UAAU;YACV,gBAAgB;YAChB,UAAU;YACV,cAAc;YACd,UAAU;YACV,kBAAkB;SACrB;2FAGQ,gBAAgB;kBAlB5B,QAAQ;mBAAC;oBACN,YAAY,EAAE,CAAC,mBAAmB,CAAC;oBACnC,OAAO,EAAE;wBACL,YAAY;wBACZ,WAAW;wBACX,WAAW;wBACX,mBAAmB;wBACnB,UAAU;wBACV,aAAa;wBACb,UAAU;wBACV,gBAAgB;wBAChB,UAAU;wBACV,cAAc;wBACd,UAAU;wBACV,kBAAkB;qBACrB;oBACD,OAAO,EAAE,CAAC,mBAAmB,CAAC;iBACjC;;;AC/BD;;;;;;"}
@@ -164,6 +164,8 @@ export declare class MultiInputComponent implements MultiInputInterface, Control
164
164
  /** @hidden */
165
165
  private _subscriptions;
166
166
  /** @hidden */
167
+ private readonly _rangeSelector;
168
+ /** @hidden */
167
169
  onChange: (value: any) => void;
168
170
  /** @hidden */
169
171
  onTouched: () => void;
@@ -199,8 +201,13 @@ export declare class MultiInputComponent implements MultiInputInterface, Control
199
201
  /** Method that selects all possible options. */
200
202
  selectAllItems(): void;
201
203
  /** @hidden */
202
- _handleSelect(checked: any, value: any, resetSearch?: boolean, event?: MouseEvent): void;
204
+ _onCheckboxKeyup(value: any, event: KeyboardEvent, index: number): void;
205
+ /** @hidden */
206
+ _onCheckboxClick(value: any, event: PointerEvent | KeyboardEvent, index: number, isListItem?: boolean): Promise<void>;
207
+ /** @hidden */
208
+ _onTokenClick(value: any, resetSearch: boolean, event?: PointerEvent): void;
203
209
  /** @hidden */
210
+ _handleSelect(checked: any, value: any, resetSearch?: boolean): void;
204
211
  _handleInputKeydown(event: KeyboardEvent): void;
205
212
  /** @hidden */
206
213
  _showAllClicked(event: Event): void;
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/multi-input",
3
- "version": "0.33.4-rc.6",
3
+ "version": "0.33.4",
4
4
  "peerDependencies": {
5
- "@angular/common": "^13,.0.0",
6
- "@angular/core": "^13,.0.0"
5
+ "@angular/common": "^13.0.0",
6
+ "@angular/core": "^13.0.0"
7
7
  },
8
8
  "dependencies": {
9
9
  "tslib": "^2.0.0"
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/nested-list",
3
- "version": "0.33.4-rc.6",
3
+ "version": "0.33.4",
4
4
  "peerDependencies": {
5
- "@angular/common": "^13,.0.0",
6
- "@angular/core": "^13,.0.0"
5
+ "@angular/common": "^13.0.0",
6
+ "@angular/core": "^13.0.0"
7
7
  },
8
8
  "dependencies": {
9
9
  "tslib": "^2.0.0"
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/notification",
3
- "version": "0.33.4-rc.6",
3
+ "version": "0.33.4",
4
4
  "peerDependencies": {
5
- "@angular/common": "^13,.0.0",
6
- "@angular/core": "^13,.0.0"
5
+ "@angular/common": "^13.0.0",
6
+ "@angular/core": "^13.0.0"
7
7
  },
8
8
  "dependencies": {
9
9
  "tslib": "^2.0.0"
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/object-identifier",
3
- "version": "0.33.4-rc.6",
3
+ "version": "0.33.4",
4
4
  "peerDependencies": {
5
- "@angular/common": "^13,.0.0",
6
- "@angular/core": "^13,.0.0"
5
+ "@angular/common": "^13.0.0",
6
+ "@angular/core": "^13.0.0"
7
7
  },
8
8
  "dependencies": {
9
9
  "tslib": "^2.0.0"
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/object-marker",
3
- "version": "0.33.4-rc.6",
3
+ "version": "0.33.4",
4
4
  "peerDependencies": {
5
- "@angular/common": "^13,.0.0",
6
- "@angular/core": "^13,.0.0"
5
+ "@angular/common": "^13.0.0",
6
+ "@angular/core": "^13.0.0"
7
7
  },
8
8
  "dependencies": {
9
9
  "tslib": "^2.0.0"