@fundamental-ngx/core 0.33.3 → 0.33.4-rc.11

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 (174) hide show
  1. package/README.md +1 -3
  2. package/action-bar/package.json +1 -1
  3. package/action-sheet/package.json +1 -1
  4. package/alert/package.json +1 -1
  5. package/avatar/package.json +1 -1
  6. package/avatar-group/package.json +1 -1
  7. package/bar/package.json +1 -1
  8. package/breadcrumb/package.json +1 -1
  9. package/busy-indicator/package.json +1 -1
  10. package/button/package.json +1 -1
  11. package/calendar/package.json +1 -1
  12. package/card/package.json +1 -1
  13. package/carousel/package.json +1 -1
  14. package/checkbox/checkbox/checkbox.component.d.ts +30 -35
  15. package/checkbox/esm2020/checkbox/checkbox.component.mjs +61 -80
  16. package/checkbox/fesm2015/fundamental-ngx-core-checkbox.mjs +59 -77
  17. package/checkbox/fesm2015/fundamental-ngx-core-checkbox.mjs.map +1 -1
  18. package/checkbox/fesm2020/fundamental-ngx-core-checkbox.mjs +59 -77
  19. package/checkbox/fesm2020/fundamental-ngx-core-checkbox.mjs.map +1 -1
  20. package/checkbox/package.json +1 -1
  21. package/combobox/package.json +1 -1
  22. package/date-picker/package.json +1 -1
  23. package/datetime/package.json +1 -1
  24. package/datetime-picker/package.json +1 -1
  25. package/dialog/package.json +1 -1
  26. package/dynamic-page/package.json +1 -1
  27. package/dynamic-side-content/package.json +1 -1
  28. package/esm2020/checkbox/checkbox/checkbox.component.mjs +61 -80
  29. package/esm2020/list/list-item/list-item.component.mjs +6 -2
  30. package/esm2020/message-box/message-box-body/message-box-body.component.mjs +12 -10
  31. package/esm2020/message-box/message-box-footer/message-box-footer.component.mjs +12 -9
  32. package/esm2020/message-box/message-box-header/message-box-header.component.mjs +30 -16
  33. package/esm2020/message-box/message-box-semantic-icon/message-box-semantic-icon.component.mjs +12 -14
  34. package/esm2020/message-box/message-box.component.mjs +5 -15
  35. package/esm2020/message-box/utils/message-box-config.class.mjs +3 -2
  36. package/esm2020/multi-input/multi-input.component.mjs +38 -11
  37. package/esm2020/upload-collection/upload-collection-item.directive.mjs +81 -8
  38. package/esm2020/utils/helpers/range-selector.mjs +113 -0
  39. package/esm2020/utils/public_api.mjs +2 -1
  40. package/facets/package.json +1 -1
  41. package/feed-input/package.json +1 -1
  42. package/feed-list-item/package.json +1 -1
  43. package/fesm2015/fundamental-ngx-core-checkbox.mjs +59 -77
  44. package/fesm2015/fundamental-ngx-core-checkbox.mjs.map +1 -1
  45. package/fesm2015/fundamental-ngx-core-list.mjs +5 -1
  46. package/fesm2015/fundamental-ngx-core-list.mjs.map +1 -1
  47. package/fesm2015/fundamental-ngx-core-message-box.mjs +67 -56
  48. package/fesm2015/fundamental-ngx-core-message-box.mjs.map +1 -1
  49. package/fesm2015/fundamental-ngx-core-multi-input.mjs +40 -11
  50. package/fesm2015/fundamental-ngx-core-multi-input.mjs.map +1 -1
  51. package/fesm2015/fundamental-ngx-core-upload-collection.mjs +80 -7
  52. package/fesm2015/fundamental-ngx-core-upload-collection.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-checkbox.mjs +59 -77
  56. package/fesm2020/fundamental-ngx-core-checkbox.mjs.map +1 -1
  57. package/fesm2020/fundamental-ngx-core-list.mjs +5 -1
  58. package/fesm2020/fundamental-ngx-core-list.mjs.map +1 -1
  59. package/fesm2020/fundamental-ngx-core-message-box.mjs +62 -55
  60. package/fesm2020/fundamental-ngx-core-message-box.mjs.map +1 -1
  61. package/fesm2020/fundamental-ngx-core-multi-input.mjs +38 -11
  62. package/fesm2020/fundamental-ngx-core-multi-input.mjs.map +1 -1
  63. package/fesm2020/fundamental-ngx-core-upload-collection.mjs +80 -7
  64. package/fesm2020/fundamental-ngx-core-upload-collection.mjs.map +1 -1
  65. package/fesm2020/fundamental-ngx-core-utils.mjs +114 -1
  66. package/fesm2020/fundamental-ngx-core-utils.mjs.map +1 -1
  67. package/file-uploader/package.json +1 -1
  68. package/fixed-card-layout/package.json +1 -1
  69. package/flexible-column-layout/package.json +1 -1
  70. package/form/package.json +1 -1
  71. package/formatted-text/package.json +1 -1
  72. package/grid-list/package.json +1 -1
  73. package/icon/package.json +1 -1
  74. package/illustrated-message/package.json +1 -1
  75. package/infinite-scroll/package.json +1 -1
  76. package/info-label/package.json +1 -1
  77. package/inline-help/package.json +1 -1
  78. package/input-group/package.json +1 -1
  79. package/layout-grid/package.json +1 -1
  80. package/layout-panel/package.json +1 -1
  81. package/link/package.json +1 -1
  82. package/list/esm2020/list-item/list-item.component.mjs +6 -2
  83. package/list/fesm2015/fundamental-ngx-core-list.mjs +5 -1
  84. package/list/fesm2015/fundamental-ngx-core-list.mjs.map +1 -1
  85. package/list/fesm2020/fundamental-ngx-core-list.mjs +5 -1
  86. package/list/fesm2020/fundamental-ngx-core-list.mjs.map +1 -1
  87. package/list/package.json +1 -1
  88. package/menu/package.json +1 -1
  89. package/message-box/esm2020/message-box-body/message-box-body.component.mjs +12 -10
  90. package/message-box/esm2020/message-box-footer/message-box-footer.component.mjs +12 -9
  91. package/message-box/esm2020/message-box-header/message-box-header.component.mjs +30 -16
  92. package/message-box/esm2020/message-box-semantic-icon/message-box-semantic-icon.component.mjs +12 -14
  93. package/message-box/esm2020/message-box.component.mjs +5 -15
  94. package/message-box/esm2020/utils/message-box-config.class.mjs +3 -2
  95. package/message-box/fesm2015/fundamental-ngx-core-message-box.mjs +67 -56
  96. package/message-box/fesm2015/fundamental-ngx-core-message-box.mjs.map +1 -1
  97. package/message-box/fesm2020/fundamental-ngx-core-message-box.mjs +62 -55
  98. package/message-box/fesm2020/fundamental-ngx-core-message-box.mjs.map +1 -1
  99. package/message-box/message-box-body/message-box-body.component.d.ts +6 -4
  100. package/message-box/message-box-footer/message-box-footer.component.d.ts +6 -4
  101. package/message-box/message-box-header/message-box-header.component.d.ts +16 -8
  102. package/message-box/message-box-semantic-icon/message-box-semantic-icon.component.d.ts +6 -4
  103. package/message-box/message-box.component.d.ts +4 -9
  104. package/message-box/package.json +1 -1
  105. package/message-box/utils/message-box-config.class.d.ts +2 -4
  106. package/message-strip/package.json +1 -1
  107. package/message-toast/package.json +1 -1
  108. package/micro-process-flow/package.json +1 -1
  109. package/mobile-mode/package.json +1 -1
  110. package/multi-input/esm2020/multi-input.component.mjs +38 -11
  111. package/multi-input/fesm2015/fundamental-ngx-core-multi-input.mjs +40 -11
  112. package/multi-input/fesm2015/fundamental-ngx-core-multi-input.mjs.map +1 -1
  113. package/multi-input/fesm2020/fundamental-ngx-core-multi-input.mjs +38 -11
  114. package/multi-input/fesm2020/fundamental-ngx-core-multi-input.mjs.map +1 -1
  115. package/multi-input/multi-input.component.d.ts +8 -1
  116. package/multi-input/package.json +1 -1
  117. package/nested-list/package.json +1 -1
  118. package/notification/package.json +1 -1
  119. package/object-identifier/package.json +1 -1
  120. package/object-marker/package.json +1 -1
  121. package/object-number/package.json +1 -1
  122. package/object-status/package.json +1 -1
  123. package/package.json +1 -1
  124. package/pagination/package.json +1 -1
  125. package/panel/package.json +1 -1
  126. package/popover/package.json +1 -1
  127. package/product-switch/package.json +1 -1
  128. package/progress-indicator/package.json +1 -1
  129. package/quick-view/package.json +1 -1
  130. package/radio/package.json +1 -1
  131. package/rating-indicator/package.json +1 -1
  132. package/resizable-card-layout/package.json +1 -1
  133. package/scroll-spy/package.json +1 -1
  134. package/scrollbar/package.json +1 -1
  135. package/segmented-button/package.json +1 -1
  136. package/select/package.json +1 -1
  137. package/shared/package.json +1 -1
  138. package/shellbar/package.json +1 -1
  139. package/side-navigation/package.json +1 -1
  140. package/slider/package.json +1 -1
  141. package/split-button/package.json +1 -1
  142. package/splitter/package.json +1 -1
  143. package/status-indicator/package.json +1 -1
  144. package/step-input/package.json +1 -1
  145. package/switch/package.json +1 -1
  146. package/table/package.json +1 -1
  147. package/tabs/package.json +1 -1
  148. package/text/package.json +1 -1
  149. package/tile/package.json +1 -1
  150. package/time/package.json +1 -1
  151. package/time-picker/package.json +1 -1
  152. package/timeline/package.json +1 -1
  153. package/title/package.json +1 -1
  154. package/token/package.json +1 -1
  155. package/toolbar/package.json +1 -1
  156. package/tree/package.json +1 -1
  157. package/upload-collection/esm2020/upload-collection-item.directive.mjs +81 -8
  158. package/upload-collection/fesm2015/fundamental-ngx-core-upload-collection.mjs +80 -7
  159. package/upload-collection/fesm2015/fundamental-ngx-core-upload-collection.mjs.map +1 -1
  160. package/upload-collection/fesm2020/fundamental-ngx-core-upload-collection.mjs +80 -7
  161. package/upload-collection/fesm2020/fundamental-ngx-core-upload-collection.mjs.map +1 -1
  162. package/upload-collection/package.json +1 -1
  163. package/upload-collection/upload-collection-item.directive.d.ts +32 -2
  164. package/utils/esm2020/helpers/range-selector.mjs +113 -0
  165. package/utils/esm2020/public_api.mjs +2 -1
  166. package/utils/fesm2015/fundamental-ngx-core-utils.mjs +114 -1
  167. package/utils/fesm2015/fundamental-ngx-core-utils.mjs.map +1 -1
  168. package/utils/fesm2020/fundamental-ngx-core-utils.mjs +114 -1
  169. package/utils/fesm2020/fundamental-ngx-core-utils.mjs.map +1 -1
  170. package/utils/helpers/range-selector.d.ts +84 -0
  171. package/utils/package.json +1 -1
  172. package/utils/public_api.d.ts +1 -0
  173. package/vertical-navigation/package.json +1 -1
  174. package/wizard/package.json +1 -1
@@ -5,7 +5,7 @@ import { CommonModule } from '@angular/common';
5
5
  import { __awaiter, __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,8 +15,8 @@ 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';
19
- import { takeUntil, startWith, map } from 'rxjs/operators';
18
+ import { RangeSelector, uuidv4, KeyUtil, applyCssClass, PipeModule, AutoCompleteModule } from '@fundamental-ngx/core/utils';
19
+ import { takeUntil, distinctUntilChanged, first, startWith, map, shareReplay } from 'rxjs/operators';
20
20
  import { MobileModeBase, MobileModeControl, MOBILE_MODE_CONFIG } from '@fundamental-ngx/core/mobile-mode';
21
21
  import * as i1 from '@fundamental-ngx/core/dialog';
22
22
  import { DialogModule } from '@fundamental-ngx/core/dialog';
@@ -247,6 +247,8 @@ class MultiInputComponent {
247
247
  /** @hidden */
248
248
  this._subscriptions = new Subscription();
249
249
  /** @hidden */
250
+ this._rangeSelector = new RangeSelector();
251
+ /** @hidden */
250
252
  this.onChange = () => { };
251
253
  /** @hidden */
252
254
  this.onTouched = () => { };
@@ -284,8 +286,10 @@ class MultiInputComponent {
284
286
  if (!this.inputId) {
285
287
  this.inputId = uuidv4();
286
288
  }
287
- this._subscriptions.add(this._searchTermCtrl.valueChanges.subscribe((searchTerm) => {
289
+ this._subscriptions.add(this._searchTermCtrl.valueChanges.pipe(distinctUntilChanged()).subscribe((searchTerm) => {
288
290
  this.searchTermChange.emit(searchTerm);
291
+ // resetting existing selection state, if any
292
+ this._rangeSelector.reset();
289
293
  }));
290
294
  }
291
295
  /** @hidden */
@@ -391,10 +395,36 @@ class MultiInputComponent {
391
395
  this._propagateChange();
392
396
  }
393
397
  /** @hidden */
394
- _handleSelect(checked, value, resetSearch = true, event) {
395
- if (event) {
396
- event.preventDefault(); // prevent this function from being called twice when checkbox updates
398
+ _onCheckboxKeyup(value, event, index) {
399
+ if (KeyUtil.isKeyCode(event, [SPACE, ENTER])) {
400
+ this._onCheckboxClick(value, event, index);
397
401
  }
402
+ }
403
+ /** @hidden */
404
+ _onCheckboxClick(value, event, index, isListItem = false) {
405
+ return __awaiter(this, void 0, void 0, function* () {
406
+ const toggledSelection = !this._selectionModel.isSelected(value);
407
+ this._rangeSelector.onRangeElementToggled(index, event);
408
+ const sub = this.viewModel$.pipe(first()).subscribe((vm) => {
409
+ this._rangeSelector.applyValueToEachInRange((idx) => this._handleSelect(toggledSelection, vm.displayedOptions[idx].value, false));
410
+ });
411
+ this._subscriptions.add(sub);
412
+ if (isListItem) {
413
+ this.openChangeHandle(false);
414
+ }
415
+ else {
416
+ // stop propagation on the checkbox so event doesn't reach the list item
417
+ event.stopPropagation();
418
+ }
419
+ });
420
+ }
421
+ /** @hidden */
422
+ _onTokenClick(value, resetSearch, event) {
423
+ event === null || event === void 0 ? void 0 : event.preventDefault(); // prevent this function from being called twice when checkbox updates
424
+ this._handleSelect(false, value, resetSearch);
425
+ }
426
+ /** @hidden */
427
+ _handleSelect(checked, value, resetSearch = true) {
398
428
  const previousLength = this._selectionModel.selected.length;
399
429
  if (checked) {
400
430
  this._selectionModel.select(value);
@@ -413,7 +443,6 @@ class MultiInputComponent {
413
443
  // On Mobile mode changes are propagated only on approve.
414
444
  this._propagateChange();
415
445
  }
416
- /** @hidden */
417
446
  _handleInputKeydown(event) {
418
447
  if (KeyUtil.isKeyCode(event, DOWN_ARROW) && !this.mobile) {
419
448
  if (event.altKey) {
@@ -622,7 +651,7 @@ class MultiInputComponent {
622
651
  selectedOptions,
623
652
  displayedOptions
624
653
  };
625
- }));
654
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
626
655
  }
627
656
  }
628
657
  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 });
@@ -633,7 +662,7 @@ MultiInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
633
662
  multi: true
634
663
  },
635
664
  MenuKeyboardService
636
- ], 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 });
665
+ ], 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 });
637
666
  __decorate([
638
667
  applyCssClass,
639
668
  __metadata("design:type", Function),
@@ -651,7 +680,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.2", ngImpor
651
680
  multi: true
652
681
  },
653
682
  MenuKeyboardService
654
- ], 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"] }]
683
+ ], 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"] }]
655
684
  }], ctorParameters: function () {
656
685
  return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$1.DynamicComponentService }, { type: i0.Injector }, { type: i0.ViewContainerRef }, { type: i1$1.RtlService, decorators: [{
657
686
  type: Optional
@@ -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":"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"}