@fundamental-ngx/core 0.62.0-rc.52 → 0.62.0-rc.53
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.
|
@@ -13,7 +13,7 @@ import * as i2 from '@fundamental-ngx/cdk/forms';
|
|
|
13
13
|
import { isSelectItem, CvaControl, CvaDirective, isOptionItem, isSelectableOptionItem } from '@fundamental-ngx/cdk/forms';
|
|
14
14
|
import { ListFocusItem, FD_LIST_COMPONENT, ListComponent, ListGroupHeaderDirective, ListTitleDirective, ListItemComponent, ListSecondaryDirective } from '@fundamental-ngx/core/list';
|
|
15
15
|
import { ContentDensityObserver, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';
|
|
16
|
-
import {
|
|
16
|
+
import { skip, timer, Subscription, isObservable, Subject } from 'rxjs';
|
|
17
17
|
import { debounceTime } from 'rxjs/operators';
|
|
18
18
|
import { PopoverComponent, PopoverControlComponent, PopoverBodyComponent } from '@fundamental-ngx/core/popover';
|
|
19
19
|
import { shallowEqual } from 'fast-equals';
|
|
@@ -294,10 +294,11 @@ class BaseMultiCombobox {
|
|
|
294
294
|
this._rangeSelector = new RangeSelector();
|
|
295
295
|
/**
|
|
296
296
|
* Flag indicating whether the data source has changed.
|
|
297
|
-
*
|
|
297
|
+
* Guard flag: true while waiting for a new data source's first real data emission.
|
|
298
|
+
* Prevents the provider's initial empty emission from being treated as "no results."
|
|
298
299
|
* @hidden
|
|
299
300
|
*/
|
|
300
|
-
this._dataSourceChanged =
|
|
301
|
+
this._dataSourceChanged = true;
|
|
301
302
|
/**
|
|
302
303
|
* Signal reference to the popover component.
|
|
303
304
|
* Used for controlling popover visibility and position.
|
|
@@ -548,41 +549,34 @@ class BaseMultiCombobox {
|
|
|
548
549
|
* Prepares the data stream and subscribes to it.
|
|
549
550
|
*/
|
|
550
551
|
_openDataStream(matchingStrategy) {
|
|
551
|
-
|
|
552
|
-
if (!dataSourceProvider) {
|
|
552
|
+
if (!this.dataSourceDirective.dataSourceProvider) {
|
|
553
553
|
throw new Error(`[dataSource] source did not match an array, Observable, or DataSource`);
|
|
554
554
|
}
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
const matchingBy = {
|
|
558
|
-
firstBy: this._displayFn
|
|
559
|
-
};
|
|
560
|
-
if (this.secondaryKey()) {
|
|
561
|
-
matchingBy.secondaryBy = this._secondaryFn;
|
|
562
|
-
}
|
|
563
|
-
dataSourceProvider.dataProvider.setMatchingBy(matchingBy);
|
|
564
|
-
dataSourceProvider.dataProvider.setMatchingStrategy(matchingStrategy);
|
|
555
|
+
this._matchingStrategy = matchingStrategy;
|
|
556
|
+
this._configureDataSourceProvider(matchingStrategy);
|
|
565
557
|
// initial data fetch
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
map.set('limit', this._mapLimit);
|
|
570
|
-
}
|
|
571
|
-
else {
|
|
572
|
-
dataSourceProvider.dataProvider['defaultLimit'] = Number.MAX_SAFE_INTEGER;
|
|
573
|
-
}
|
|
574
|
-
dataSourceProvider.match(map);
|
|
575
|
-
this._dsSubscription = new Subscription();
|
|
576
|
-
this._dsSubscription.add(this.dataSourceDirective.dataSourceProvider?.dataRequested.subscribe((value) => this.dataRequested.emit(value)));
|
|
577
|
-
this._dsSubscription.add(this.dataSourceDirective.dataSourceProvider?.dataReceived.subscribe((value) => this.dataReceived.emit(value)));
|
|
578
|
-
this.dataSourceDirective.dataSourceChanged
|
|
579
|
-
.pipe(startWith(true), takeUntilDestroyed(this._destroyRef))
|
|
580
|
-
.subscribe(() => {
|
|
558
|
+
this._fetchInitialData();
|
|
559
|
+
this._subscribeToDsEvents();
|
|
560
|
+
this.dataSourceDirective.dataSourceChanged.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {
|
|
581
561
|
this._dataSourceChanged = true;
|
|
562
|
+
this._subscribeToDsEvents();
|
|
563
|
+
this._configureDataSourceProvider(this._matchingStrategy);
|
|
564
|
+
this._fetchInitialData();
|
|
582
565
|
});
|
|
583
566
|
this.dataSourceDirective.dataChanged$.pipe(skip(0), takeUntilDestroyed(this._destroyRef)).subscribe((data) => {
|
|
584
567
|
if (data.length === 0) {
|
|
585
|
-
this.
|
|
568
|
+
if (this._dataSourceChanged) {
|
|
569
|
+
// Data source transition: skip the invalid-entry handling (_processingEmptyData)
|
|
570
|
+
// because the new provider's BehaviorSubject starts with [] before match('*') populates it.
|
|
571
|
+
// But still clear stale suggestions and reset the flag.
|
|
572
|
+
this._dataSourceChanged = false;
|
|
573
|
+
this._suggestions.set([]);
|
|
574
|
+
this._flatSuggestions.set([]);
|
|
575
|
+
this._fullFlatSuggestions.set([]);
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
this._processingEmptyData();
|
|
579
|
+
}
|
|
586
580
|
return;
|
|
587
581
|
}
|
|
588
582
|
this._previousInputText = this.inputText();
|
|
@@ -642,6 +636,56 @@ class BaseMultiCombobox {
|
|
|
642
636
|
this._timerSub$ = timer(this.invalidEntryDisplayTime()).subscribe(() => this._unsetInvalidEntry());
|
|
643
637
|
this._cd.detectChanges();
|
|
644
638
|
}
|
|
639
|
+
/**
|
|
640
|
+
* @hidden
|
|
641
|
+
* Configures the data source provider with matching settings.
|
|
642
|
+
*/
|
|
643
|
+
_configureDataSourceProvider(matchingStrategy) {
|
|
644
|
+
const dataSourceProvider = this.dataSourceDirective.dataSourceProvider;
|
|
645
|
+
if (!dataSourceProvider) {
|
|
646
|
+
return;
|
|
647
|
+
}
|
|
648
|
+
dataSourceProvider.limitless = this.limitless();
|
|
649
|
+
dataSourceProvider.dataProvider.setLookupKey(this.lookupKey());
|
|
650
|
+
const matchingBy = {
|
|
651
|
+
firstBy: this._displayFn
|
|
652
|
+
};
|
|
653
|
+
if (this.secondaryKey()) {
|
|
654
|
+
matchingBy.secondaryBy = this._secondaryFn;
|
|
655
|
+
}
|
|
656
|
+
dataSourceProvider.dataProvider.setMatchingBy(matchingBy);
|
|
657
|
+
dataSourceProvider.dataProvider.setMatchingStrategy(matchingStrategy);
|
|
658
|
+
}
|
|
659
|
+
/**
|
|
660
|
+
* @hidden
|
|
661
|
+
* Triggers the initial data fetch on the current data source provider.
|
|
662
|
+
*/
|
|
663
|
+
_fetchInitialData() {
|
|
664
|
+
const dataSourceProvider = this.dataSourceDirective.dataSourceProvider;
|
|
665
|
+
if (!dataSourceProvider) {
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
const map = new Map();
|
|
669
|
+
map.set('query', '*');
|
|
670
|
+
if (!this.limitless()) {
|
|
671
|
+
map.set('limit', this._mapLimit);
|
|
672
|
+
}
|
|
673
|
+
else {
|
|
674
|
+
dataSourceProvider.dataProvider['defaultLimit'] = Number.MAX_SAFE_INTEGER;
|
|
675
|
+
}
|
|
676
|
+
dataSourceProvider.match(map);
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* @hidden
|
|
680
|
+
* Subscribes to dataRequested/dataReceived events from the current data source provider.
|
|
681
|
+
* Unsubscribes from previous provider's events first.
|
|
682
|
+
*/
|
|
683
|
+
_subscribeToDsEvents() {
|
|
684
|
+
this._dsSubscription?.unsubscribe();
|
|
685
|
+
this._dsSubscription = new Subscription();
|
|
686
|
+
this._dsSubscription.add(this.dataSourceDirective.dataSourceProvider?.dataRequested.subscribe((value) => this.dataRequested.emit(value)));
|
|
687
|
+
this._dsSubscription.add(this.dataSourceDirective.dataSourceProvider?.dataReceived.subscribe((value) => this.dataReceived.emit(value)));
|
|
688
|
+
}
|
|
645
689
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: BaseMultiCombobox, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
646
690
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.1.0", type: BaseMultiCombobox, isStandalone: true, viewQueries: [{ propertyName: "popover", first: true, predicate: PopoverComponent, descendants: true, isSignal: true }], ngImport: i0 }); }
|
|
647
691
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fundamental-ngx-core-multi-combobox.mjs","sources":["../../../../libs/core/multi-combobox/multi-announcer/multi-announcer.directive.ts","../../../../libs/core/multi-combobox/helpers.ts","../../../../libs/core/multi-combobox/models/selection-change.event.ts","../../../../libs/core/multi-combobox/multi-combobox-config.ts","../../../../libs/core/multi-combobox/base-multi-combobox.class.ts","../../../../libs/core/multi-combobox/multi-combobox.token.ts","../../../../libs/core/multi-combobox/mobile/mobile-multi-combobox.component.ts","../../../../libs/core/multi-combobox/mobile/mobile-multi-combobox.component.html","../../../../libs/core/multi-combobox/data-source/multi-combobox-data-source.ts","../../../../libs/core/multi-combobox/data-source/multi-combobox-data-source-parser.ts","../../../../libs/core/multi-combobox/select-all-toggler/select-all-toggler.component.ts","../../../../libs/core/multi-combobox/multi-combobox.component.ts","../../../../libs/core/multi-combobox/multi-combobox.component.html","../../../../libs/core/multi-combobox/multi-combobox.module.ts","../../../../libs/core/multi-combobox/fundamental-ngx-core-multi-combobox.ts"],"sourcesContent":["import { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { ContentChildren, Directive, HostListener, inject, Input, QueryList } from '@angular/core';\nimport { KeyUtil } from '@fundamental-ngx/cdk/utils';\nimport { TokenComponent } from '@fundamental-ngx/core/token';\nimport { FdLanguageKeyIdentifier, resolveTranslationSignalFn } from '@fundamental-ngx/i18n';\n\n@Directive({\n selector: '[fdMultiAnnouncer]',\n exportAs: 'fdMultiAnnouncer',\n standalone: true\n})\nexport class MultiAnnouncerDirective {\n /** @hidden */\n @Input()\n multiAnnouncerOptions: unknown[];\n\n /** @hidden */\n @ContentChildren(TokenComponent, { descendants: true })\n private _tokens: QueryList<TokenComponent>;\n\n /** @hidden */\n private _noResultsAnnounced = false;\n\n /** @hidden */\n private _resultsAnnounced = false;\n\n /** @hidden */\n private _announcement = '';\n\n /** @hidden */\n private readonly _liveAnnouncer: LiveAnnouncer = inject(LiveAnnouncer);\n\n /** @hidden */\n private _resolveTranslation = resolveTranslationSignalFn();\n\n /** @hidden */\n @HostListener('keyup', ['$event'])\n protected _makeSearchTermChangeAnnouncements(event: KeyboardEvent): void {\n if (KeyUtil.isKeyType(event, 'alphabetical') || KeyUtil.isKeyType(event, 'numeric')) {\n this._liveAnnouncer.clear();\n const count = this.multiAnnouncerOptions?.length;\n if (!count && !this._noResultsAnnounced) {\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.noResults')());\n this._noResultsAnnounced = true;\n this._resultsAnnounced = false;\n } else if (count) {\n const trKey: FdLanguageKeyIdentifier =\n count === 1 ? 'coreMultiInput.countListResultsSingular' : 'coreMultiInput.countListResultsPlural';\n this._buildAnnouncement(this._resolveTranslation(trKey, { count })());\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.navigateSelectionsWithArrows')());\n if (!this._resultsAnnounced) {\n this._noResultsAnnounced = false;\n this._resultsAnnounced = true;\n }\n }\n if (this._tokens?.length) {\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.escapeNavigateTokens')());\n }\n this._makeAnnouncement(this._announcement);\n }\n }\n\n /** @hidden */\n private _buildAnnouncement(message: string): void {\n this._announcement = this._announcement + message + ' ';\n }\n\n /** @hidden */\n private async _makeAnnouncement(message: string): Promise<void> {\n await this._liveAnnouncer.announce(message, 'assertive').then(() => {\n this._announcement = '';\n });\n }\n}\n","import { isSelectItem, SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { isFunction, isJsObject, isString } from '@fundamental-ngx/cdk/utils';\nimport { shallowEqual } from 'fast-equals';\n\n/** @hidden */\nexport function lookupValue(item: unknown, lookupKey: string): string {\n if (isSelectItem(item)) {\n return lookupKey && item ? item.value[lookupKey] : item.value;\n } else {\n return lookupKey && item ? item[lookupKey] : (item as string);\n }\n}\n\n/** @hidden */\nexport function displayValue(item: unknown, displayKey: string): string {\n if (isSelectItem(item)) {\n return item.label;\n } else if (isJsObject(item) && displayKey) {\n const currentItem = objectGet(item, displayKey);\n\n return isFunction(currentItem) ? currentItem() : currentItem;\n } else {\n return item as string;\n }\n}\n\n/** @hidden */\nexport function objectGet(obj: unknown, is: string | string[] | undefined): any {\n if (!isJsObject(obj)) {\n return obj;\n } else if (isString(is)) {\n return objectGet(obj, is.split('.'));\n } else if (!is?.length) {\n return obj;\n } else {\n return objectGet(obj[is[0]], is.slice(1));\n }\n}\n\n/** @hidden */\nexport function getSelectItemByInputValue<T>(\n suggestions: SelectableOptionItem<T>[],\n needleValue: string\n): SelectableOptionItem<T> | undefined {\n return suggestions.find((value) => value.label === needleValue);\n}\n\n/** @hidden\n * Map grouped values to array. */\nexport function flattenGroups(items: SelectableOptionItem[]): SelectableOptionItem[] {\n return items.reduce((result, item) => result.concat(item.children ?? []), <SelectableOptionItem[]>[]);\n}\n\n/** @hidden */\nexport function getTokenIndexByIdlOrValue(item: SelectableOptionItem, suggestions: SelectableOptionItem[]): number {\n return suggestions.findIndex((token) => token.id === item.id || shallowEqual(token.value, item.value));\n}\n","import { SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { BaseMultiCombobox } from '../base-multi-combobox.class';\n\nexport class MultiComboboxSelectionChangeEvent {\n /**\n * Multi Combobox selection change event\n * @param source Multi Combobox component\n * @param selectedItems Selected items\n */\n constructor(\n public source: BaseMultiCombobox,\n public selectedItems: SelectableOptionItem['value'] // Contains selected items\n ) {}\n}\n","import { Injectable } from '@angular/core';\nimport { DataProvider, MatchingStrategy } from '@fundamental-ngx/cdk/data-source';\n\nimport { ContentDensity } from '@fundamental-ngx/cdk/utils';\n// import { PlatformConfig } from '@fundamental-ngx/platform/shared';\n\n/**\n * Default options for Multi-Combobox\n */\n@Injectable({ providedIn: 'root' })\nexport class MultiComboboxConfig {\n /**\n * Content Density of element. 'cozy' | 'compact'\n */\n contentDensity: ContentDensity;\n\n /**\n * String matching strategy for typeahead list. Default: 'starts with per term'\n */\n matchingStrategy: MatchingStrategy = MatchingStrategy.STARTS_WITH_PER_TERM;\n\n /**\n * Maps data providers\n */\n providers: Map<string, DataProvider<any>> | null = new Map();\n\n /**\n * Create Provider factory function\n */\n // static createProviderFactory(\n // obj: Partial<MultiComboboxConfig>\n // ): (platformConfig: PlatformConfig) => MultiComboboxConfig {\n // const useFactory = (platformConfig: PlatformConfig): MultiComboboxConfig =>\n // Object.assign(new MultiComboboxConfig(platformConfig), obj);\n // return useFactory;\n // }\n\n /** @hidden */\n // constructor(platformConfig: PlatformConfig) {\n // this.contentDensity = platformConfig.contentDensity;\n // }\n}\n","import {\n ALT,\n BACKSPACE,\n CONTROL,\n DOWN_ARROW,\n ENTER,\n ESCAPE,\n LEFT_ARROW,\n RIGHT_ARROW,\n SHIFT,\n TAB,\n UP_ARROW\n} from '@angular/cdk/keycodes';\nimport {\n ChangeDetectorRef,\n DestroyRef,\n Directive,\n ElementRef,\n Injector,\n InputSignal,\n InputSignalWithTransform,\n ModelSignal,\n OutputEmitterRef,\n Signal,\n WritableSignal,\n afterNextRender,\n inject,\n signal,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DataSourceDirective, MatchingBy, MatchingStrategy } from '@fundamental-ngx/cdk/data-source';\nimport {\n CvaControl,\n CvaDirective,\n FormStates,\n SelectableOptionItem,\n isOptionItem,\n isSelectableOptionItem\n} from '@fundamental-ngx/cdk/forms';\nimport { RangeSelector, coerceArraySafe, isFunction, isJsObject, isString } from '@fundamental-ngx/cdk/utils';\nimport { ContentDensityObserver } from '@fundamental-ngx/core/content-density';\nimport { FormControlComponent } from '@fundamental-ngx/core/form';\nimport { PopoverComponent } from '@fundamental-ngx/core/popover';\nimport { shallowEqual } from 'fast-equals';\nimport { Subscription, skip, startWith, timer } from 'rxjs';\nimport {\n FdMultiComboBoxDataSource,\n FdMultiComboboxAcceptableDataSource\n} from './data-source/multi-combobox-data-source';\nimport { displayValue, flattenGroups, lookupValue, objectGet } from './helpers';\nimport { MultiComboboxSelectionChangeEvent } from './models/selection-change.event';\nimport { MultiComboboxConfig } from './multi-combobox-config';\nimport { FD_MAP_LIMIT } from './multi-combobox.component';\n\nexport type TextAlignment = 'left' | 'right';\n\n@Directive()\nexport abstract class BaseMultiCombobox<T = any> {\n /**\n * Currently selected items in the multi-combobox.\n * To modify selections, use the `writeValue()` or `setValue()` methods.\n */\n abstract selectedItems: T[];\n\n /**\n * Determines whether items should be grouped in the dropdown.\n * When enabled, items will be organized into groups based on the `groupKey` property.\n */\n abstract group: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * The property name used to group items when `group` is enabled.\n * This key is used to extract the grouping value from each item object.\n *\n * @example\n * ```typescript\n * // If items are: [{name: 'Apple', category: 'Fruit'}, {name: 'Carrot', category: 'Vegetable'}]\n * groupKey = 'category'; // Groups by 'Fruit' and 'Vegetable'\n * ```\n */\n abstract groupKey: InputSignal<string>;\n\n /**\n * The property name used to display item labels in the dropdown.\n * For primitive types (strings, numbers), this is ignored and the value itself is displayed.\n * For objects, this specifies which property to use as the display text.\n *\n * @example\n * ```typescript\n * displayKey = 'name'; // Displays item.name for each item\n * ```\n */\n abstract displayKey: InputSignal<string>;\n\n /**\n * The property name used to display secondary text below the main label.\n * Only displayed when `showSecondaryText` is enabled.\n */\n abstract secondaryKey: InputSignal<string>;\n\n /**\n * Controls whether secondary text should be displayed for each item.\n * When enabled, uses the `secondaryKey` property to extract and display secondary text.\n */\n abstract showSecondaryText: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * The property name used as a unique identifier for each item.\n * Used for item comparison, deduplication, and tracking selections.\n * If not specified, the entire object is compared.\n */\n abstract lookupKey: InputSignal<string>;\n\n /**\n * Signal containing the error message displayed when an invalid entry is detected.\n * Displayed temporarily when the user enters text that doesn't match any available options.\n */\n abstract invalidEntryMessage: InputSignal<string | null | undefined>;\n\n /**\n * Signal containing the duration (in milliseconds) to display the invalid entry message.\n * After this duration expires, the error message is automatically hidden.\n */\n abstract invalidEntryDisplayTime: Signal<number>;\n\n /**\n * Model signal controlling whether limitless mode is enabled.\n * In limitless mode, all available items are loaded without pagination limits.\n * Use with caution for large datasets as it may impact performance.\n */\n abstract limitless: ModelSignal<boolean>;\n\n /**\n * Signal indicating whether the current configuration uses grouped items.\n *\n * @remarks\n * Computed based on whether both `group` and `groupKey` are defined.\n * Used internally to determine rendering strategy.\n */\n abstract isGroup: Signal<boolean>;\n\n /**\n * Signal containing the current text in the search input field.\n * Updates reactively as the user types. Used for filtering and autocomplete functionality.\n */\n abstract inputText: Signal<string>;\n\n /**\n * Signal containing a reference to the search input element.\n */\n abstract searchInputElement: Signal<FormControlComponent | undefined>;\n\n /**\n * Output emitter for selection change events.\n */\n abstract selectionChange: OutputEmitterRef<MultiComboboxSelectionChangeEvent>;\n\n /**\n * Output emitter for data received events.\n */\n abstract dataReceived: OutputEmitterRef<boolean>;\n\n /**\n * Output emitter for data request events.\n */\n abstract dataRequested: OutputEmitterRef<boolean>;\n\n /**\n * Internal writable signal for selected items.\n * Must be implemented by subclass. Provides write access to the selection state.\n * @hidden\n */\n protected abstract _selectedItems: WritableSignal<T[]>;\n\n /**\n * Internal writable signal for input text.\n * Must be implemented by subclass. Provides write access to the input text.\n *\n * @hidden\n */\n protected abstract _inputText: WritableSignal<string>;\n\n /**\n * Protected method for internal writes to selectedItems with coercion.\n * Ensures the value is properly coerced to an array before setting.\n *\n * @param value - The new array of selected items\n * @hidden\n */\n protected abstract _setSelectedItems(value: T[]): void;\n\n /**\n * Protected method for setting input text with side effects.\n * Triggers `onTouched()` callback to mark the control as touched.\n *\n * @param value - The new input text value\n * @hidden\n */\n protected abstract _setInputText(value: string): void;\n\n /**\n * Control value accessor instance for forms integration.\n * @hidden\n */\n readonly cvaControl: CvaControl<T> = inject(CvaControl);\n\n /**\n * Data source directive instance for managing async data loading and filtering.\n * @hidden\n */\n readonly dataSourceDirective: DataSourceDirective<T, FdMultiComboBoxDataSource<T>> = inject(DataSourceDirective);\n\n /** Control Value Accessor directive for forms support. */\n readonly _cva = inject(CvaDirective<T>, {\n self: true\n });\n\n /** Multi combobox config. */\n readonly _multiComboboxConfig = inject(MultiComboboxConfig, {\n optional: true\n });\n\n /** Content Density Observer */\n readonly contentDensityObserver = inject(ContentDensityObserver);\n\n /**\n * Signal containing currently selected suggestion items.\n * @hidden\n */\n _selectedSuggestions = signal<SelectableOptionItem<T>[]>([]);\n\n /**\n * Signal containing currently matched suggestion items based on search text.\n * Updates when the user types in the search field.\n * Contains filtered options that match the current query.\n * @hidden\n */\n _suggestions = signal<SelectableOptionItem[]>([]);\n\n /**\n * Signal containing flattened suggestion items (groups expanded to flat list).\n * @hidden\n */\n _flatSuggestions = signal<SelectableOptionItem[]>([]);\n\n /**\n * Signal containing the complete flattened list of all available items.\n * @hidden\n */\n _fullFlatSuggestions = signal<SelectableOptionItem[]>([]);\n\n /**\n * Signal indicating whether the \"show selected only\" mode is active.\n * In mobile mode, toggles between showing all items and showing only selected items.\n * @hidden\n */\n selectedShown = signal(false);\n\n /**\n * Writable signal for overriding the invalid entry message with i18n translations.\n * @hidden\n */\n protected readonly _invalidEntryMessageOverride = signal<string | null>(null);\n\n /** @hidden */\n protected readonly _elmRef = inject(ElementRef<HTMLElement>);\n\n /** @hidden */\n protected readonly _cd = inject(ChangeDetectorRef);\n\n /**\n * Maximum number of items to load per page when limitless mode is disabled.\n * Controls pagination size for large datasets.\n * @hidden\n */\n protected readonly _mapLimit = inject(FD_MAP_LIMIT);\n\n /** @hidden */\n protected readonly _destroyRef = inject(DestroyRef);\n\n /** @hidden */\n protected readonly _injector = inject(Injector);\n\n /** @hidden */\n protected _dataSource: FdMultiComboboxAcceptableDataSource<T>;\n\n /**\n * Previous input text value before the last change.\n * Used for restoring the input on invalid entry or cancellation.\n * @hidden\n */\n protected _previousInputText: string;\n\n /**\n * Matching strategy for filtering items based on user input.\n * Determines how items are matched: starts with, contains, etc.\n * Defaults to value from config or `MatchingStrategy.CONTAINS`.\n * @hidden\n */\n protected _matchingStrategy: MatchingStrategy =\n this._multiComboboxConfig?.matchingStrategy ?? MatchingStrategy.CONTAINS;\n\n /**\n * Subscription for data source events.\n * @hidden\n */\n protected _dsSubscription: Subscription | null = null;\n\n /**\n * Reference to the host element.\n * @hidden\n */\n protected _element: HTMLElement = this._elmRef.nativeElement;\n\n /**\n * @hidden\n * Keys, that won't trigger the popover's open state, when dispatched on search input.\n */\n protected readonly _nonOpeningKeys: number[] = [\n BACKSPACE,\n ESCAPE,\n ENTER,\n CONTROL,\n TAB,\n SHIFT,\n UP_ARROW,\n RIGHT_ARROW,\n DOWN_ARROW,\n LEFT_ARROW,\n ALT\n ];\n\n /**\n * Timer subscription for displaying invalid entry message.\n * Auto-hides the error message after the configured duration.\n * @hidden\n */\n protected _timerSub$: Subscription;\n\n /**\n * Previous form state before displaying invalid entry error.\n * Stored to restore the original state after error is cleared.\n * @hidden\n */\n protected _previousState?: FormStates;\n\n /**\n * Previous state message before displaying invalid entry error.\n */\n protected _previousStateMessage: string | null | undefined;\n\n /**\n * Range selector utility for handling shift+click multi-selection.\n */\n protected readonly _rangeSelector = new RangeSelector();\n\n /**\n * Flag indicating whether the data source has changed.\n * Set to true when a new data source is assigned, triggering a refresh of suggestions.\n * @hidden\n */\n private _dataSourceChanged = false;\n\n /**\n * Signal reference to the popover component.\n * Used for controlling popover visibility and position.\n * @hidden\n */\n private readonly popover = viewChild(PopoverComponent);\n\n /**\n * Writes a value to the control from the forms API.\n *\n * @param value - Array of items to set as selected\n * @remarks\n * Part of the ControlValueAccessor interface. Called by Angular forms\n * when the form model changes.\n * @hidden\n */\n writeValue(value: T[]): void {\n this._setSelectedItems(coerceArraySafe(value));\n this._cva.writeValue(this._selectedItems());\n this._setSelectedSuggestions();\n this._emitChangeEvent();\n }\n\n /**\n * Used to change the value of a control.\n * @param value the value to be applied\n * @param emitOnChange whether to emit \"onChange\" event.\n * Should be \"false\", if the change is made programmatically (internally) by the control, \"true\" otherwise\n */\n setValue(value: T[], emitOnChange = true): void {\n this._setSelectedItems(coerceArraySafe(value));\n this._cva.setValue(this._selectedItems(), emitOnChange);\n this._setSelectedSuggestions();\n this._emitChangeEvent();\n }\n\n /** @hidden */\n protected _displayFn = (value: T): string => displayValue(value, this.displayKey());\n\n /** @hidden */\n protected _secondaryFn = (value: T): string => {\n if (isOptionItem(value)) {\n return value.secondaryText ?? '';\n } else if (isJsObject(value) && this.secondaryKey()) {\n const currentItem = objectGet(value, this.secondaryKey());\n\n return isFunction(currentItem) ? currentItem() : currentItem;\n } else {\n return value as string;\n }\n };\n\n /**\n * @hidden\n * Method to emit change event\n */\n protected _emitChangeEvent(): void {\n const event = new MultiComboboxSelectionChangeEvent(this, this._selectedItems());\n\n this.selectionChange.emit(event);\n\n // Wait for Angular to complete the current render cycle, then refresh popover position after selection changes\n afterNextRender(\n () => {\n this.popover()?.refreshPosition();\n },\n { injector: this._injector }\n );\n }\n\n /** @hidden */\n protected _setSelectedSuggestions(): void {\n this._selectedSuggestions.set([]);\n\n const selectedItems = this._selectedItems();\n if (!selectedItems?.length) {\n return;\n }\n\n const fullFlatSuggestions = this._fullFlatSuggestions();\n const selectedSuggestions: SelectableOptionItem<T>[] = [];\n\n // Update immutably\n const updatedSuggestions = fullFlatSuggestions.map((item) => {\n const isSelected = selectedItems.some(\n (selectedItem) => item.label === selectedItem || item.value === selectedItem\n );\n\n if (isSelected) {\n selectedSuggestions.push({ ...item, selected: true });\n return { ...item, selected: true };\n } else if (item.selected) {\n // Item was selected but is now deselected - must update to false\n return { ...item, selected: false };\n }\n\n // Item was not and is not selected - no change needed\n return item;\n });\n\n this._selectedSuggestions.set(selectedSuggestions);\n this._fullFlatSuggestions.set(updatedSuggestions);\n }\n\n /**\n * Convert original data to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertToOptionItems(items: T[]): SelectableOptionItem<T>[] {\n const item = items[0];\n\n const elementTypeIsOptionItem = isSelectableOptionItem(item);\n if (elementTypeIsOptionItem) {\n return items as SelectableOptionItem[];\n }\n\n const elementTypeIsObject = isJsObject(item);\n if (elementTypeIsObject) {\n return this._convertObjectsToOptionItems(items);\n }\n\n const elementTypeIsString = isString(item);\n if (elementTypeIsString) {\n return this._convertPrimitiveToOptionItems(items);\n }\n\n return [];\n }\n\n /**\n * Convert data to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertObjectsToOptionItems(items: T[]): SelectableOptionItem<T>[] {\n if (this.isGroup()) {\n return this._convertObjectsToGroupOptionItems(items);\n } else if (this.showSecondaryText() && this.secondaryKey()) {\n return this._convertObjectsToSecondaryOptionItems(items);\n } else {\n return this._convertObjectsToDefaultOptionItems(items);\n }\n }\n\n /**\n * Convert object[] data to Group OptionItems Interface\n * @hidden\n */\n protected _convertObjectsToGroupOptionItems<K extends T>(items: K[]): SelectableOptionItem<T>[] {\n const group: Record<string, K[]> = {};\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const keyValue = item[this.groupKey()];\n if (!keyValue) {\n continue;\n }\n\n if (!group[keyValue]) {\n group[keyValue] = [];\n }\n\n group[keyValue].push(item);\n }\n\n return Object.keys(group).map((key) => {\n const selectItem: SelectableOptionItem = {\n label: key,\n value: null,\n isGroup: true\n };\n\n const currentGroup = group[key];\n\n if (this.showSecondaryText() && this.secondaryKey()) {\n selectItem.children = this._convertObjectsToSecondaryOptionItems(currentGroup);\n } else {\n selectItem.children = this._convertObjectsToDefaultOptionItems(currentGroup);\n }\n\n return selectItem;\n });\n }\n\n /**\n * Convert T[] data to Secondary SelectableOptionItems<T> Interface\n * @hidden\n */\n protected _convertObjectsToSecondaryOptionItems<K extends T>(items: K[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n const selectedItems = this._selectedItems();\n\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: displayValue(value, this.displayKey()),\n id: lookupValue(value, this.lookupKey()),\n secondaryText: objectGet(value, this.secondaryKey()),\n value,\n selected: selectedItems.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /**\n * Convert Primitive data(Boolean, String, Number) to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertPrimitiveToOptionItems(items: any[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n const selectedItems = this._selectedItems();\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: value,\n id: lookupValue(value, this.lookupKey()),\n value,\n selected: selectedItems.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /**\n * Convert T[] to SelectableOptionItems<T> Interface (Default)\n * @hidden\n */\n protected _convertObjectsToDefaultOptionItems(items: T[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n const selectedItems = this._selectedItems();\n\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: displayValue(value, this.displayKey()),\n id: lookupValue(value, this.lookupKey()),\n value,\n selected: selectedItems.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /** @hidden */\n protected _setInvalidEntry(): void {\n if (this._previousState || this._previousStateMessage) {\n return;\n }\n\n this._previousState = this._cva.state;\n this._cva.state = 'error';\n\n this._previousStateMessage = this._cva.stateMessage;\n const overrideMessage = this._invalidEntryMessageOverride();\n this._cva.stateMessage = overrideMessage ?? this.invalidEntryMessage() ?? null;\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n protected _unsetInvalidEntry(): void {\n this._cva.state = this._previousState;\n this._previousState = undefined;\n\n this._cva.stateMessage = this._previousStateMessage;\n this._previousStateMessage = undefined;\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n protected _focusToSearchField(): void {\n this.searchInputElement()?.elementRef.nativeElement.focus();\n }\n\n /** @hidden */\n protected _mapAndUpdateModel(): void {\n const selectedItems = this._selectedSuggestions().map(({ value }) => value);\n\n const shouldEmitChangeEvent = !shallowEqual(this._selectedItems(), selectedItems);\n\n if (!shouldEmitChangeEvent) {\n return;\n }\n\n this.writeValue(selectedItems);\n\n this._cva.onChange(selectedItems);\n\n this._emitChangeEvent();\n }\n\n /**\n * @hidden\n * Prepares the data stream and subscribes to it.\n */\n protected _openDataStream(matchingStrategy: MatchingStrategy): void {\n const dataSourceProvider = this.dataSourceDirective.dataSourceProvider;\n\n if (!dataSourceProvider) {\n throw new Error(`[dataSource] source did not match an array, Observable, or DataSource`);\n }\n\n dataSourceProvider.limitless = this.limitless();\n\n dataSourceProvider.dataProvider.setLookupKey(this.lookupKey());\n const matchingBy: MatchingBy = {\n firstBy: this._displayFn\n };\n\n if (this.secondaryKey()) {\n matchingBy.secondaryBy = this._secondaryFn;\n }\n\n dataSourceProvider.dataProvider.setMatchingBy(matchingBy);\n dataSourceProvider.dataProvider.setMatchingStrategy(matchingStrategy);\n\n // initial data fetch\n const map = new Map();\n map.set('query', '*');\n\n if (!this.limitless()) {\n map.set('limit', this._mapLimit);\n } else {\n dataSourceProvider.dataProvider['defaultLimit'] = Number.MAX_SAFE_INTEGER;\n }\n\n dataSourceProvider.match(map);\n\n this._dsSubscription = new Subscription();\n\n this._dsSubscription.add(\n this.dataSourceDirective.dataSourceProvider?.dataRequested.subscribe((value) =>\n this.dataRequested.emit(value)\n )\n );\n this._dsSubscription.add(\n this.dataSourceDirective.dataSourceProvider?.dataReceived.subscribe((value) =>\n this.dataReceived.emit(value)\n )\n );\n\n this.dataSourceDirective.dataSourceChanged\n .pipe(startWith(true), takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n this._dataSourceChanged = true;\n });\n\n this.dataSourceDirective.dataChanged$.pipe(skip(0), takeUntilDestroyed(this._destroyRef)).subscribe((data) => {\n if (data.length === 0) {\n this._processingEmptyData();\n return;\n }\n\n this._previousInputText = this.inputText();\n\n this._parseDataSourceValue(data);\n\n this._cva.stateChanges.next('initDataSource.open().');\n\n this._cd.markForCheck();\n });\n }\n\n /**\n * Parses the data from the data stream and updates the model if needed.\n * @param data array of objects from the data stream.\n */\n protected _parseDataSourceValue(data: T[]): void {\n this._convertDataSourceSuggestions(data);\n\n const selectedSuggestions = this._selectedSuggestions();\n if (selectedSuggestions.length > 0) {\n this._suggestions.update((suggestions) =>\n suggestions.map((suggestion) => {\n const isSelected = selectedSuggestions.some((item) => shallowEqual(item.value, suggestion.value));\n return isSelected ? { ...suggestion, selected: true } : suggestion;\n })\n );\n }\n\n if (this._dataSourceChanged) {\n const currentSuggestions = this._suggestions();\n this._flatSuggestions.set(this.isGroup() ? flattenGroups(currentSuggestions) : currentSuggestions);\n this._fullFlatSuggestions.set(this._flatSuggestions());\n\n this._setSelectedSuggestions();\n\n this._mapAndUpdateModel();\n\n this._dataSourceChanged = false;\n }\n }\n\n /**\n * Transforms plain array into `SelectableOptionItem<T>`\n * @param data\n */\n protected _convertDataSourceSuggestions(data: T[]): void {\n const selectedSuggestions = this._selectedSuggestions();\n this._suggestions.set(\n this._convertToOptionItems(data).map((optionItem) => {\n const selectedElement = selectedSuggestions.find((selectedItem) => selectedItem.id === optionItem.id);\n if (selectedElement) {\n return { ...optionItem, selected: selectedElement.selected };\n }\n return optionItem;\n })\n );\n }\n\n /** @hidden */\n protected _processingEmptyData(): void {\n if (this._cva.disabled) {\n return;\n }\n\n if (this._cva.controlInvalid && this._cva.ngControl?.hasError) {\n this._setInvalidEntry();\n\n if (this._timerSub$) {\n this._timerSub$.unsubscribe();\n }\n }\n this._setInputText(this._previousInputText);\n\n this._timerSub$ = timer(this.invalidEntryDisplayTime()).subscribe(() => this._unsetInvalidEntry());\n\n this._cd.detectChanges();\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const MULTI_COMBOBOX_COMPONENT = new InjectionToken('FdMultiComboboxInterface');\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, Inject, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { Nullable, TemplateDirective } from '@fundamental-ngx/cdk/utils';\nimport { BarElementDirective, BarMiddleDirective, ButtonBarComponent } from '@fundamental-ngx/core/bar';\nimport { ButtonComponent } from '@fundamental-ngx/core/button';\nimport {\n DialogBodyComponent,\n DialogCloseButtonComponent,\n DialogComponent,\n DialogFooterComponent,\n DialogHeaderComponent\n} from '@fundamental-ngx/core/dialog';\nimport { MobileModeBase, MobileModeControl } from '@fundamental-ngx/core/mobile-mode';\nimport { TitleComponent } from '@fundamental-ngx/core/title';\nimport { FdTranslatePipe } from '@fundamental-ngx/i18n';\nimport { MobileMultiComboboxInterface } from '../models/multi-combobox.interface';\nimport { MULTI_COMBOBOX_COMPONENT } from '../multi-combobox.token';\n\n@Component({\n selector: 'fd-mobile-multi-combobox',\n templateUrl: './mobile-multi-combobox.component.html',\n styleUrl: './mobile-multi-combobox.component.scss',\n imports: [\n BarMiddleDirective,\n BarElementDirective,\n ButtonBarComponent,\n TitleComponent,\n TitleComponent,\n TemplateDirective,\n BarMiddleDirective,\n BarElementDirective,\n NgTemplateOutlet,\n ButtonComponent,\n ButtonBarComponent,\n FdTranslatePipe,\n DialogComponent,\n DialogHeaderComponent,\n DialogCloseButtonComponent,\n DialogBodyComponent,\n DialogFooterComponent\n ]\n})\nexport class MobileMultiComboboxComponent extends MobileModeBase<MobileMultiComboboxInterface> implements OnInit {\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: Nullable<{\n listTemplate: TemplateRef<any>;\n controlTemplate: TemplateRef<any>;\n }> = null;\n\n /** @hidden */\n selectedShown = this._component.selectedShown;\n\n /** @hidden */\n private _selectedBackup: SelectableOptionItem[];\n\n /** @hidden */\n constructor(@Inject(MULTI_COMBOBOX_COMPONENT) multiComboboxComponent: MobileMultiComboboxInterface) {\n super(multiComboboxComponent, MobileModeControl.MULTI_COMBOBOX);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this._listenOnMultiComboboxOpenChange();\n }\n\n /** @hidden */\n showSelected(): void {\n const isSelectedShown = this.selectedShown();\n\n if (isSelectedShown) {\n this._component._searchTermChanged();\n this.selectedShown.set(false);\n return;\n }\n\n this._component._moreClicked();\n }\n\n /** @hidden */\n handleDismiss(): void {\n this.dialogRef.dismiss();\n this._component._dialogDismiss(this._selectedBackup);\n }\n\n /** @hidden */\n handleApprove(): void {\n this.dialogRef.close();\n this._component._dialogApprove();\n }\n\n /** @hidden */\n private _toggleDialog(open: boolean): void {\n if (!open) {\n return;\n }\n\n const selectedSuggestions = this._component._selectedSuggestions();\n this._selectedBackup = selectedSuggestions?.length ? [...selectedSuggestions] : [];\n if (!this._dialogService.hasOpenDialogs()) {\n this._open();\n }\n }\n\n /** @hidden */\n private _listenOnMultiComboboxOpenChange(): void {\n this._component.openChange\n .pipe(takeUntilDestroyed(this._destroyRef))\n .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 ...this.dialogConfig,\n backdropClickCloseable: false,\n escKeyCloseable: false,\n container: this._elementRef.nativeElement,\n disablePaddings: true\n });\n }\n}\n","<ng-template [fdDialogTemplate] let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n @if (mobileConfig.title) {\n <h1 fd-title fd-dialog-title>{{ mobileConfig.title }}</h1>\n }\n @if (mobileConfig.hasCloseButton) {\n <button fd-dialog-close-button [mobile]=\"true\" (click)=\"handleDismiss()\"></button>\n }\n <ng-template fdkTemplate=\"subheader\">\n <div fd-bar-middle>\n <fd-bar-element [fullWidth]=\"true\">\n <ng-template [ngTemplateOutlet]=\"childContent?.controlTemplate || null\"></ng-template>\n @if (selectedShown()) {\n <button\n fd-button\n glyph=\"multiselect-all\"\n fdType=\"emphasized\"\n [title]=\"('platformMultiCombobox.mobileShowAllItemsButton' | fdTranslate)()\"\n [attr.aria-label]=\"('platformMultiCombobox.mobileShowAllItemsButton' | fdTranslate)()\"\n class=\"fd-margin-begin--tiny\"\n (click)=\"showSelected()\"\n ></button>\n }\n @if (selectedShown() === false) {\n <button\n fd-button\n glyph=\"multiselect-all\"\n fdType=\"transparent\"\n [title]=\"('platformMultiCombobox.mobileShowSelectedItemsButton' | fdTranslate)()\"\n [attr.aria-label]=\"\n ('platformMultiCombobox.mobileShowSelectedItemsButton' | fdTranslate)()\n \"\n class=\"fd-margin-begin--tiny\"\n (click)=\"showSelected()\"\n ></button>\n }\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n <fd-dialog-body>\n <ng-template [ngTemplateOutlet]=\"childContent?.listTemplate || null\"></ng-template>\n </fd-dialog-body>\n <fd-dialog-footer>\n @if (mobileConfig.approveButtonText) {\n <fd-button-bar fdType=\"emphasized\" [label]=\"mobileConfig.approveButtonText!\" (click)=\"handleApprove()\">\n </fd-button-bar>\n }\n @if (mobileConfig.cancelButtonText) {\n <fd-button-bar [label]=\"mobileConfig.cancelButtonText!\" (click)=\"handleDismiss()\"> </fd-button-bar>\n }\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n","import { AbstractDataProvider, BaseDataSource, DataProvider } from '@fundamental-ngx/cdk/data-source';\nimport { Observable } from 'rxjs';\n\nexport class FdMultiComboBoxDataSource<T> extends BaseDataSource<T> {\n /** @hidden */\n limitless = false;\n /** @hidden */\n constructor(public dataProvider: AbstractDataProvider<T>) {\n super(dataProvider);\n }\n}\n\nexport class ArrayMultiComboBoxDataSource<T> extends FdMultiComboBoxDataSource<T> {\n /** @hidden */\n constructor(data: T[]) {\n super(new DataProvider(data));\n }\n}\n\nexport class ObservableMultiComboBoxDataSource<T> extends FdMultiComboBoxDataSource<T> {\n /** @hidden */\n constructor(data: Observable<T[]>) {\n super(new DataProvider(data));\n }\n}\n\n/**\n * Type of acceptable objects as a datasource for the Multi-Combo Box component.\n */\nexport type FdMultiComboboxAcceptableDataSource<T> = FdMultiComboBoxDataSource<T> | Observable<T[]> | T[];\n","import { DataSourceParser, isDataSource } from '@fundamental-ngx/cdk/data-source';\nimport { isObservable } from 'rxjs';\nimport {\n ArrayMultiComboBoxDataSource,\n FdMultiComboBoxDataSource,\n FdMultiComboboxAcceptableDataSource,\n ObservableMultiComboBoxDataSource\n} from './multi-combobox-data-source';\n\nexport class MultiComboboxDataSourceParser<T> implements DataSourceParser<T, FdMultiComboBoxDataSource<T>> {\n /**\n * Transforms plain array or observable into DataSource class.\n * @param source\n */\n parse(source: FdMultiComboboxAcceptableDataSource<T>): FdMultiComboBoxDataSource<T> | undefined {\n if (isDataSource(source)) {\n return source as FdMultiComboBoxDataSource<T>;\n }\n\n if (Array.isArray(source)) {\n return new ArrayMultiComboBoxDataSource<T>(source);\n }\n\n if (isObservable(source)) {\n return new ObservableMultiComboBoxDataSource<T>(source);\n }\n\n return undefined;\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n HostListener,\n inject,\n Input,\n OnInit,\n ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { CheckboxComponent } from '@fundamental-ngx/core/checkbox';\nimport { FormItemComponent } from '@fundamental-ngx/core/form';\nimport { ListFocusItem } from '@fundamental-ngx/core/list';\nimport { ToolbarComponent } from '@fundamental-ngx/core/toolbar';\nimport { FdTranslatePipe } from '@fundamental-ngx/i18n';\nimport { Observable } from 'rxjs';\n\n@Component({\n selector: 'fd-multi-combobox-select-all-toggler',\n template: `\n <fd-toolbar>\n <div fd-form-item class=\"fd-multi-combobox-select-all__form-item\">\n <fd-checkbox tabIndexValue=\"-1\" [ngModel]=\"checkboxValue\" [tristate]=\"true\">\n {{\n (\n 'coreMultiComboBox.selectAllLabel'\n | fdTranslate: { selectedItems: selectedItems.length, totalItems: flatItems.length }\n )()\n }}\n </fd-checkbox>\n </div>\n </fd-toolbar>\n `,\n styleUrl: './select-all-toggler.component.scss',\n providers: [\n {\n provide: ListFocusItem,\n useExisting: SelectAllTogglerComponent\n }\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ToolbarComponent, FormItemComponent, CheckboxComponent, FormsModule, FdTranslatePipe]\n})\nexport class SelectAllTogglerComponent extends ListFocusItem implements OnInit {\n /**\n * Handler for the select all items\n * */\n @Input() selectAllHandler: (select: boolean) => void;\n\n /**\n * Stream for receiving information about the value changes,\n */\n @Input() valueChanges: Observable<unknown>;\n\n /** @hidden */\n @Input()\n selectedItems: Array<unknown> = [];\n\n /** @hidden */\n @Input()\n flatItems: Array<unknown> = [];\n\n /** @hidden */\n get allAreSelected(): boolean {\n return this.selectedItems.length === this.flatItems.length;\n }\n\n /** @hidden */\n get someAreSelected(): boolean {\n return this.selectedItems.length > 0 && !this.allAreSelected;\n }\n\n /** @hidden */\n get checkboxValue(): boolean | null {\n if (this.allAreSelected) {\n return true;\n }\n if (this.someAreSelected) {\n return null;\n }\n return false;\n }\n\n /** @hidden */\n private _destroyRef = inject(DestroyRef);\n\n /** @hidden */\n private changeDetector: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n /** @hidden */\n @HostListener('keydown.enter', ['$event'])\n @HostListener('keydown.space', ['$event'])\n onKeyDown($event: Event): void {\n $event.preventDefault();\n this.change(!this.checkboxValue);\n }\n\n /** @hidden */\n @HostListener('click')\n onClick(): void {\n this.elementRef.nativeElement.focus();\n this.change(!this.checkboxValue);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this.tabindex = 0;\n this.valueChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\n this.changeDetector.detectChanges();\n });\n }\n\n /** @hidden */\n change(value: boolean): void {\n this.selectAllHandler(value);\n }\n}\n","import { A, CONTROL, DOWN_ARROW, ENTER, ESCAPE, SPACE, UP_ARROW } from '@angular/cdk/keycodes';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InjectionToken,\n Injector,\n Input,\n OnInit,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n viewChildren\n} from '@angular/core';\nimport { outputToObservable } from '@angular/core/rxjs-interop';\nimport { DataSourceDirective, FD_DATA_SOURCE_TRANSFORMER, MatchingStrategy } from '@fundamental-ngx/cdk/data-source';\nimport { CvaControl, CvaDirective, OptionItem, SelectItem, SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport {\n AutoCompleteDirective,\n AutoCompleteEvent,\n ContentDensity,\n DynamicComponentService,\n FocusEscapeDirection,\n FocusTrapService,\n KeyUtil,\n SearchHighlightPipe,\n TemplateDirective,\n TruncatedTitleDirective,\n coerceArraySafe,\n resizeObservable\n} from '@fundamental-ngx/cdk/utils';\nimport {\n FD_LIST_COMPONENT,\n ListComponent,\n ListGroupHeaderDirective,\n ListItemComponent,\n ListSecondaryDirective,\n ListTitleDirective\n} from '@fundamental-ngx/core/list';\nimport { MobileModeConfig } from '@fundamental-ngx/core/mobile-mode';\nimport { PopoverFillMode } from '@fundamental-ngx/core/shared';\n\nimport { contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';\nimport { TokenComponent, TokenizerComponent } from '@fundamental-ngx/core/token';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { BaseMultiCombobox } from './base-multi-combobox.class';\nimport { MobileMultiComboboxComponent } from './mobile/mobile-multi-combobox.component';\nimport { MULTI_COMBOBOX_COMPONENT } from './multi-combobox.token';\n\nimport { MultiComboboxDataSourceParser } from './data-source/multi-combobox-data-source-parser';\n\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { CheckboxComponent } from '@fundamental-ngx/core/checkbox';\nimport { FormControlComponent, FormInputMessageGroupComponent, FormMessageComponent } from '@fundamental-ngx/core/form';\nimport { InputGroupComponent, InputGroupInputDirective } from '@fundamental-ngx/core/input-group';\nimport { PopoverBodyComponent, PopoverComponent, PopoverControlComponent } from '@fundamental-ngx/core/popover';\nimport { FD_LANGUAGE_SIGNAL, FdTranslatePipe, TranslationResolver } from '@fundamental-ngx/i18n';\nimport { shallowEqual } from 'fast-equals';\nimport { getSelectItemByInputValue, getTokenIndexByIdlOrValue } from './helpers';\nimport { MultiComboboxSelectionChangeEvent } from './models/selection-change.event';\nimport { MultiAnnouncerDirective } from './multi-announcer/multi-announcer.directive';\nimport { SelectAllTogglerComponent } from './select-all-toggler/select-all-toggler.component';\n\nexport const FD_MAP_LIMIT = new InjectionToken<number>('Map limit≥', { factory: () => 12 });\n\n@Component({\n selector: 'fd-multi-combobox',\n templateUrl: './multi-combobox.component.html',\n styleUrl: './multi-combobox.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CvaDirective,\n inputs: ['id:inputId', 'placeholder', 'state', 'stateMessage', 'disabled', 'readonly', 'name']\n },\n {\n directive: DataSourceDirective,\n inputs: ['dataSource'],\n outputs: ['dataChanged']\n }\n ],\n providers: [\n CvaControl,\n DynamicComponentService,\n contentDensityObserverProviders(),\n {\n provide: FD_DATA_SOURCE_TRANSFORMER,\n useClass: MultiComboboxDataSourceParser\n },\n {\n provide: MULTI_COMBOBOX_COMPONENT,\n useExisting: MultiComboboxComponent\n }\n ],\n imports: [\n NgTemplateOutlet,\n PopoverComponent,\n PopoverControlComponent,\n PopoverBodyComponent,\n FormInputMessageGroupComponent,\n InputGroupComponent,\n TokenizerComponent,\n TokenComponent,\n FormsModule,\n AutoCompleteDirective,\n FormControlComponent,\n InputGroupInputDirective,\n FormMessageComponent,\n ListComponent,\n SelectAllTogglerComponent,\n ListGroupHeaderDirective,\n ListTitleDirective,\n ListItemComponent,\n CheckboxComponent,\n NgClass,\n ListSecondaryDirective,\n FdTranslatePipe,\n SearchHighlightPipe,\n MultiAnnouncerDirective,\n TruncatedTitleDirective\n ]\n})\nexport class MultiComboboxComponent<T = any> extends BaseMultiCombobox<T> implements AfterViewInit, OnInit {\n /**\n * Configuration object for mobile mode appearance and behavior.\n * Only applies when `mobile` is true.\n */\n @Input()\n mobileConfig: MobileModeConfig;\n\n /**\n * Sets the currently selected items.\n */\n @Input()\n set selectedItems(value: T[] | null | undefined) {\n this._setSelectedItems(coerceArraySafe(value as T | T[]));\n }\n\n /**\n * Read-only array of currently selected items (backward-compatible API).\n */\n get selectedItems(): T[] {\n return this._selectedItems();\n }\n\n /**\n * Sets or gets the currently selected value.\n */\n @Input()\n set value(value: T[]) {\n this.setValue(value, true);\n }\n\n /**\n * Gets the current value from the form control.\n * @returns The current array of selected items\n */\n get value(): T[] {\n return this._cva.value;\n }\n\n /**\n * Show select all checkbox\n * @defaultValue false\n */\n readonly showSelectAll = input(false, { transform: booleanAttribute });\n\n /**\n * Maximum height of the dropdown options panel.\n * @defaultValue '250px'\n */\n readonly maxHeight = input('250px');\n\n /**\n * Controls whether the addon button can receive keyboard focus.\n * @defaultValue false\n */\n readonly buttonFocusable = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the autocomplete should be enabled; Enabled by default.\n * @defaultValue true\n */\n readonly autoComplete = input(true, { transform: booleanAttribute });\n\n /**\n * Whether list item options should be rendered as byline.\n * @defaultValue false\n */\n readonly byline = input(false, { transform: booleanAttribute });\n\n /**\n * Max width of multi combobox dropdown body.\n * `none` will not limit width of the dropdown.\n * `container` will limit width of the dropdown to the width of the multi-input itself.\n * `number` will limit width of the dropdown by provided number in pixels.\n *\n * @defaultValue 'none'\n */\n readonly bodyMaxWidth = input<'none' | 'container' | number>('none');\n\n /**\n * Computed maximum width for the popover in pixels.\n * @hidden\n */\n get _popoverMaxWidth(): number | null {\n const bodyMaxWidth = this.bodyMaxWidth();\n if (bodyMaxWidth === 'none') {\n return null;\n }\n\n if (typeof bodyMaxWidth === 'number') {\n return bodyMaxWidth;\n }\n\n return this._elementRef.nativeElement.getBoundingClientRect().width;\n }\n\n /**\n * TODO: Name of the entity for which DataProvider will be loaded. You can either pass list of\n * items or use this entityClass and internally we should be able to do lookup to some registry\n * and retrieve the best matching DataProvider that is set on application level\n */\n readonly entityClass = input<string>();\n\n /**\n * Enables mobile-optimized rendering mode.\n * When enabled, displays the combobox in a full-screen dialog optimized for touch devices.\n * Requires `mobileConfig` for full customization.\n *\n * @defaultValue false\n */\n readonly mobile = input(false, { transform: booleanAttribute });\n\n /**\n * Controls whether items should be grouped in the dropdown.\n * When enabled, items are organized by the property specified in `groupKey`.\n * Groups display as headers with items nested underneath.\n *\n * @defaultValue false\n */\n group = input(false, { transform: booleanAttribute });\n\n /**\n * Property path for grouping items.\n * Specifies which property to use for grouping items when `group` is enabled.\n *\n * @example\n * ```typescript\n * groupKey = input('department'); // Groups by item.department\n * ```\n *\n * @defaultValue ''\n */\n groupKey = input<string>('');\n\n /**\n * Property path for secondary text display.\n * When `showSecondaryText` is enabled, displays this property as secondary text below the main label.\n *\n * @defaultValue ''\n */\n secondaryKey = input<string>('');\n\n /**\n * Controls visibility of the secondary text column.\n * When enabled, displays secondary text from the `secondaryKey` property in a two-column layout.\n *\n * @defaultValue false\n */\n showSecondaryText = input(false, { transform: booleanAttribute });\n\n /**\n * Horizontally align text inside the second column (applicable for two columns layout).\n *\n * @defaultValue 'right'\n */\n readonly secondaryTextAlignment = input<'left' | 'right'>('right');\n\n /**\n * Enables automatic width adjustment of the dropdown.\n * When enabled, the dropdown width automatically adjusts based on content.\n * Disable for fixed-width dropdowns.\n *\n * @defaultValue true\n */\n readonly autoResize = input(true, { transform: booleanAttribute });\n\n /**\n * Controls whether clicking the addon button opens the dropdown.\n * @defaultValue true\n */\n readonly openDropdownOnAddOnClicked = input(true, { transform: booleanAttribute });\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 readonly fillControlMode = input<PopoverFillMode>('at-least');\n\n /** Sets title attribute to addon button. */\n readonly addonIconTitle = input<string>();\n\n /**\n * @deprecated Use the i18n module to modify the translation for this string.\n * Sets invalid entry message.\n * */\n invalidEntryMessage = input<string | null | undefined>(null);\n\n /** Turns limitless mode, ON or OFF */\n limitless = model<boolean>(false);\n\n /**\n * Used in filters and any kind of comparators when we work with objects and this identify\n * unique field name based on which we are going to do the job\n */\n lookupKey = input<string>('');\n\n /**\n * When we deal with unknown object we can use `displayKey` to retrieve value from specific\n * property of the object to act as display value.\n *\n * @See ComboBox, Select, RadioGroup, CheckBox Group\n */\n displayKey = input<string>('');\n\n /**\n * List of values, it can be of type SelectItem, string or any object.\n * Generic object type is among the list of types,\n * because we allow to get labels and values using `displayKey` and `lookupKey` inputs accordingly.\n */\n readonly list = input<Array<SelectItem | string | object>>();\n\n /**\n * Time in ms for how long message of invalid entry should be displayed.\n * @defaultValue 3000\n */\n invalidEntryDisplayTime = input<number>(3000);\n\n /**\n * String matching strategy for typeahead list.\n * Available options: 'starts with per term', 'starts with', 'contains'\n * @defaultValue MatchingStrategy.STARTS_WITH_PER_TERM\n */\n readonly matchingStrategy = input(MatchingStrategy.STARTS_WITH_PER_TERM);\n\n /** Event emitted when item is selected. */\n selectionChange = output<MultiComboboxSelectionChangeEvent>();\n\n /** @hidden Emits event when the menu is opened/closed. */\n isOpenChange = output<boolean>();\n\n /** Emits event when the addon button is clicked. */\n addOnButtonClicked = output<Event>();\n\n /** Event emitted when data loading is started. */\n dataRequested = output<boolean>();\n\n /** Event emitted when data loading is finished. */\n dataReceived = output<boolean>();\n\n /**\n * References the search input element within the template.\n * @hidden\n */\n readonly searchInputElement = viewChild<FormControlComponent>('searchInputElement');\n\n /**\n * @hidden\n * Custom Option item Template.\n */\n optionItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Group Header item Template.\n */\n groupItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Secondary item Template.\n */\n secondaryItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Selected option item Template.\n */\n selectedItemTemplate: TemplateRef<any>;\n\n /**\n * Observable version of selectionChange for template use.\n *\n * @remarks\n * Used internally for components that require an Observable instead of OutputEmitterRef until we migrate everything to signals\n * Converts the output signal to an RxJS Observable.\n *\n * @hidden\n */\n readonly selectionChange$ = outputToObservable(this.selectionChange);\n\n /**\n * Content density mode for the component.\n * @hidden\n */\n _contentDensity: ContentDensity = this._multiComboboxConfig?.contentDensity ?? 'cozy';\n\n /**\n * Computed signal for the current input text value.\n * @returns Computed signal containing the current input text\n */\n inputText = computed(() => this._inputText() || '');\n\n /**\n * Indicates whether the search field is empty.\n * @returns true if the search field is empty, false otherwise\n */\n get isEmptyValue(): boolean {\n return this.inputText().trim().length === 0;\n }\n\n /**\n * Computed signal indicating whether grouping is active.\n * @hidden\n */\n isGroup = computed(() => !!(this.group() && this.groupKey()));\n\n /**\n * Tracks whether the dropdown is currently open.\n */\n isOpen = false;\n\n /**\n * @hidden\n * Max width of list container\n */\n maxWidth: number;\n\n /**\n * @hidden\n * Min width of list container\n */\n minWidth: number;\n\n /**\n * @hidden\n * Subject for communicating dropdown open/close state to mobile mode component.\n */\n openChange = new Subject<boolean>();\n\n /**\n * Internal writable signal storing the array of selected items.\n *\n * @remarks\n * Provides the underlying storage for the `selectedItems` property.\n * Modified through `_setSelectedItems()` to ensure proper coercion.\n *\n * @hidden Internal writable signal for selected items\n */\n protected readonly _selectedItems = signal<T[]>([]);\n\n /**\n * Internal writable signal storing the current input text.\n *\n * @remarks\n * Provides the underlying storage for the `inputText` computed signal.\n * Modified through `_setInputText()` to ensure side effects (like `onTouched`) are triggered.\n *\n * @hidden Internal writable signal for input text\n */\n protected readonly _inputText = signal<string>('');\n\n /**\n * Reference to the list component instance.\n * @hidden\n */\n private readonly listComponent = viewChild(FD_LIST_COMPONENT);\n\n /**\n * Collection of custom templates provided by content projection.\n * @hidden\n */\n private readonly customTemplates = contentChildren(TemplateDirective);\n\n /**\n * Template reference for the mobile mode control.\n * @hidden\n */\n private readonly mobileControlTemplate = viewChild<TemplateRef<any>>('mobileControlTemplate');\n\n /**\n * Template reference for the dropdown list.\n * @hidden\n */\n private readonly listTemplate = viewChild<TemplateRef<any>>('listTemplate');\n\n /**\n * Reference to the tokenizer component instance.\n * @hidden\n */\n private readonly _tokenizer = viewChild<TokenizerComponent>(TokenizerComponent);\n\n /**\n * Reference to the input group element.\n * @hidden\n */\n private readonly _inputGroup = viewChild('inputGroup', { read: ElementRef });\n\n /**\n * @hidden\n */\n private readonly items = viewChildren('item', { read: ElementRef });\n\n /**\n * Observable stream of the current language configuration.\n * @hidden\n */\n private readonly _langSignal = inject(FD_LANGUAGE_SIGNAL);\n\n /**\n * Helper for resolving translation keys to localized strings.\n * @hidden\n */\n private _translationResolver = new TranslationResolver();\n\n /** @hidden */\n constructor(\n private readonly _elementRef: ElementRef,\n private readonly _viewContainerRef: ViewContainerRef,\n private readonly _dynamicComponentService: DynamicComponentService,\n private readonly _focusTrapService: FocusTrapService\n ) {\n super();\n\n this.contentDensityObserver.subscribe();\n\n // Effect for language changes\n effect(() => {\n const lang = this._langSignal();\n this._invalidEntryMessageOverride.set(\n this._translationResolver.resolve(lang, 'platformMultiCombobox.invalidEntryError')\n );\n });\n }\n\n /** @hidden */\n ngOnInit(): void {\n this.cvaControl.listenToChanges();\n this._openDataStream(this.matchingStrategy());\n }\n\n /** @hidden */\n async ngAfterViewInit(): Promise<void> {\n if (this.mobile()) {\n await this._setUpMobileMode();\n }\n\n this._assignCustomTemplates();\n\n this._initWindowResize();\n }\n\n /** @hidden */\n _toggleSelection(item: SelectableOptionItem, fromTokenCloseClick = false): void {\n const selectedSuggestions = this._selectedSuggestions();\n const idx = getTokenIndexByIdlOrValue(item, selectedSuggestions);\n if (idx === -1) {\n this._selectedSuggestions.set([...selectedSuggestions, item]);\n } else {\n this._selectedSuggestions.set(selectedSuggestions.filter((_, i) => i !== idx));\n }\n\n item.selected = !item.selected;\n\n this._propagateChange(fromTokenCloseClick);\n\n this._cd.detectChanges();\n }\n\n /** @hidden */\n _onOptionCheckboxClicked(event: MouseEvent, index: number): void {\n event.stopPropagation();\n this._onListElementClicked(event, index);\n this._setInputText('');\n this._searchTermChanged('');\n }\n\n /** @hidden */\n _onCompleteTerm(event: AutoCompleteEvent): void {\n if (event.forceClose) {\n this._toggleSelectionByInputText(event.term);\n this.close();\n }\n }\n\n /**\n * @hidden\n * Method that selects all possible options.\n * *select* attribute – if *true* select all, if *false* unselect all\n * */\n _handleSelectAllItems = (select: boolean): void => {\n this._flatSuggestions.update((items) => items.map((item) => ({ ...item, selected: select })));\n this._suggestions.update((items) => this._updateSelectionRecursive(items, select));\n this._selectedSuggestions.set(select ? [...this._flatSuggestions()] : []);\n this._rangeSelector.reset();\n this._setInputText('');\n\n this._propagateChange();\n };\n\n /** @hidden */\n _navigateByTokens(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, [DOWN_ARROW, UP_ARROW]) && this.isOpen) {\n this.listComponent()?.items?.first.focus();\n }\n }\n\n /** @hidden */\n _removeToken(token: SelectableOptionItem, event?: MouseEvent): void {\n if (event) {\n event.preventDefault();\n }\n const optionItem = this._flatSuggestions().find((s) => s.value === token.value);\n if (optionItem) {\n this._toggleSelection(optionItem, true);\n this._rangeSelector.reset();\n }\n }\n\n /** @hidden */\n _moreClicked(): void {\n const selectedSuggestions = this._selectedSuggestions();\n this._suggestions.set(\n this.isGroup()\n ? this._convertObjectsToGroupOptionItems(selectedSuggestions.map(({ value }) => value))\n : this._suggestions().filter((value) =>\n selectedSuggestions.some((item) => shallowEqual(item.value, value.value))\n )\n );\n\n this._showList(true);\n this.selectedShown.set(true);\n this._cd.detectChanges();\n }\n\n /** @hidden */\n _onBlur(event: FocusEvent): void {\n const target = event.relatedTarget as HTMLElement;\n if (target) {\n const isList = !!target.closest('.fd-multi-combobox__list-container');\n if (isList) {\n return;\n }\n const suggestions = this._suggestions();\n if (suggestions?.length === 1 && suggestions[0].label === this.inputText() && !suggestions[0].selected) {\n this._toggleSelection(suggestions[0]);\n }\n this._showList(false);\n this._setInputText('');\n }\n this._cva.onTouched();\n }\n\n /** @hidden */\n _onItemKeyDownHandler(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, ESCAPE)) {\n this._focusToSearchField();\n } else if ((event.ctrlKey || event.metaKey) && event.shiftKey && KeyUtil.isKeyCode(event, A)) {\n event.preventDefault();\n this._handleSelectAllItems(false);\n } else if ((event.ctrlKey || event.metaKey) && KeyUtil.isKeyCode(event, A)) {\n event.preventDefault();\n this._handleSelectAllItems(true);\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n if (!this.mobile()) {\n this.close();\n }\n this._rangeSelector.reset();\n } else if (KeyUtil.isKeyCode(event, SPACE)) {\n this._rangeSelector.reset();\n }\n }\n\n /** @hidden */\n _onOptionClicked(event: MouseEvent, index: number): void {\n this._onListElementClicked(event, index);\n this.close();\n }\n\n /**\n * @hidden\n * Handle dialog dismissing, closes popover and sets backup data.\n */\n _dialogDismiss(backup: SelectableOptionItem[]): void {\n this._selectedSuggestions.set([...backup]);\n this._setInputText('');\n this._showList(false);\n this.selectedShown.set(false);\n }\n\n /**\n * @hidden\n * Handle dialog approval, closes popover and propagates data changes.\n */\n _dialogApprove(): void {\n this._setInputText('');\n this._showList(false);\n this._propagateChange(true);\n }\n\n /** @hidden */\n _popoverOpenChangeHandle(isOpen: boolean): void {\n this.isOpen = isOpen;\n\n /** Allow combobox up and down arrows to work properly when multi combobox is inside a dialog with a trapped focus */\n if (this.isOpen) {\n this._focusTrapService.pauseCurrentFocusTrap();\n } else {\n this._focusTrapService.unpauseCurrentFocusTrap();\n }\n\n this._rangeSelector.reset();\n if (!isOpen) {\n this._cva.onTouched();\n }\n }\n\n /** Opens the select popover body. */\n open(): void {\n this.isOpen = true;\n this.isOpenChange.emit(this.isOpen);\n this._cd.markForCheck();\n }\n\n /** Closes the select popover body. */\n close(): void {\n this._focusToSearchField();\n this._rangeSelector.reset();\n this.selectedShown.set(false);\n this._setInputText('');\n\n this.isOpen = false;\n this.isOpenChange.emit(this.isOpen);\n this._cva.onTouched();\n this._cd.markForCheck();\n }\n\n /** @hidden */\n _showList(isOpen: boolean): void {\n if (this.isOpen !== isOpen) {\n this.isOpen = isOpen;\n this._cva.onTouched();\n this.openChange.next(isOpen);\n }\n\n if (!this.isOpen) {\n this._searchTermChanged('');\n }\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n _searchTermChanged(text: string = this.inputText()): void {\n const map = new Map();\n map.set('query', text);\n\n if (!this.limitless()) {\n map.set('limit', this._mapLimit);\n } else {\n map.set('limit', Number.MAX_SAFE_INTEGER);\n }\n\n this.dataSourceDirective.dataSourceProvider?.match(map);\n\n if (text) {\n this.open();\n }\n\n this._cd.markForCheck();\n }\n\n /**\n * Handle Click on Button\n * @hidden\n */\n _onPrimaryButtonClick(isOpen: boolean): void {\n if (!isOpen) {\n this._searchTermChanged('');\n }\n\n if (this.openDropdownOnAddOnClicked()) {\n this._showList(!isOpen);\n } else if (this.isOpen) {\n this._showList(false);\n }\n\n if (this.isOpen) {\n this.searchInputElement()?.elementRef.nativeElement.focus();\n }\n }\n\n /**\n * Handle Keydown on Input\n * @hidden\n */\n _onInputKeydownHandler(event: KeyboardEvent): void {\n if (this._cva.readonly) {\n return;\n }\n\n if (KeyUtil.isKeyCode(event, DOWN_ARROW)) {\n event.preventDefault();\n\n if (event.altKey) {\n this._showList(true);\n }\n\n const listComponent = this.listComponent();\n if (this.isOpen && listComponent) {\n listComponent.setItemActive(0);\n } else if (!this.isOpen) {\n this._chooseOtherItem(1);\n }\n } else if (KeyUtil.isKeyCode(event, UP_ARROW)) {\n event.preventDefault();\n\n this._chooseOtherItem(-1);\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n this._toggleSelectionByInputText();\n } else if (!KeyUtil.isKeyCode(event, [...this._nonOpeningKeys, CONTROL])) {\n this._showList(true);\n const acceptedKeys =\n !KeyUtil.isKeyType(event, 'alphabetical') &&\n !KeyUtil.isKeyType(event, 'numeric') &&\n !KeyUtil.isKeyType(event, 'ime');\n if (acceptedKeys) {\n // SetTimeout is needed for input to receive new value.\n setTimeout(() => {\n if (this.isEmptyValue) {\n this.listComponent()?.setItemActive(0);\n }\n });\n }\n }\n }\n\n /**\n * @hidden\n * Method passed to list component.\n */\n _handleListFocusEscape(direction: FocusEscapeDirection): void {\n if (direction === 'up') {\n this._focusToSearchField();\n }\n }\n\n /**\n * @hidden\n */\n _addOnClicked($event: Event): void {\n this.addOnButtonClicked.emit($event);\n if (!this.mobile()) {\n this._onPrimaryButtonClick(this.isOpen);\n }\n }\n\n /** @hidden */\n _setLimitless(limitless: boolean): void {\n this.limitless.set(limitless);\n }\n\n /** @hidden */\n _getMapLimit(): number {\n return this.limitless() ? (this.dataSourceDirective.dataSource as any[]).length : this._mapLimit;\n }\n\n /** @hidden */\n _getGroupItemIds(groupIndex: number): string {\n const items = this.items();\n if (!items?.length) {\n return '';\n }\n\n const groupItemIds = items\n .filter((el) => {\n const idWithGroup = el.nativeElement.getAttribute('id-with-group-index');\n if (!idWithGroup) {\n return false;\n }\n const groupIdx = idWithGroup.split('-')[idWithGroup.split('-').length - 1];\n return groupIdx === String(groupIndex);\n })\n .map((el) => el.nativeElement.getAttribute('id'));\n\n return groupItemIds?.join(' ');\n }\n\n /**\n * Updates the selected items with proper array coercion.\n *\n * @param value - The new array of selected items\n *\n * @remarks\n * Ensures the value is always a valid array, even if null or undefined is provided.\n * Use this method instead of directly setting `_selectedItems`.\n *\n * @hidden Protected method for internal writes with coercion\n */\n protected _setSelectedItems(value: T[]): void {\n this._selectedItems.set(coerceArraySafe(value));\n }\n\n /**\n * Updates the input text and triggers form control touch event.\n *\n * @param value - The new input text value\n *\n * @remarks\n * Sets the input text and calls `onTouched()` to mark the form control as touched.\n * Ensures proper integration with Angular forms and validation.\n *\n * @hidden Protected method for setting input text with side effects\n */\n protected _setInputText(value: string): void {\n this._inputText.set(value);\n this._cva.onTouched();\n }\n\n /**\n * @hidden\n * Recursively update selection state for items and their children (for grouped suggestions)\n */\n private _updateSelectionRecursive(items: SelectableOptionItem[], selected: boolean): SelectableOptionItem[] {\n return items.map((item) => ({\n ...item,\n selected,\n children: item.children ? this._updateSelectionRecursive(item.children, selected) : undefined\n }));\n }\n\n /** @hidden */\n private _toggleSelectionByInputText(text = this.inputText()): void {\n const item = getSelectItemByInputValue<T>(this._fullFlatSuggestions(), text);\n if (item) {\n this._toggleSelection(item);\n this._setInputText('');\n }\n\n this._searchTermChanged();\n }\n\n /**\n * @hidden\n * Method to set input text as item label.\n */\n private _setInputTextFromOptionItem(item: OptionItem): void {\n this._setInputText(item.label);\n\n if (this.mobile()) {\n return;\n }\n\n this._showList(false);\n }\n\n /**\n * @hidden\n * applying range selection. Note, that this function will be invoked after combobox item's value has been changed\n */\n private _onListElementClicked(event: MouseEvent, index: number): void {\n // value has been changed at this point, so it can be safely used\n const flatSuggestions = this._flatSuggestions();\n const selectionState = flatSuggestions[index].selected;\n this._rangeSelector.onRangeElementToggled(index, event);\n\n // Collect items to add/remove from selected suggestions\n const toRemove = new Set<any>();\n const toAdd: SelectableOptionItem[] = [];\n const indicesToUpdate = new Set<number>();\n\n this._rangeSelector.applyValueToEachInRange((idx) => {\n const item = flatSuggestions[idx];\n if (item.selected !== selectionState) {\n indicesToUpdate.add(idx);\n // Track what will change based on OLD state before the update\n if (item.selected) {\n // Item is currently selected, will be deselected\n toRemove.add(item.value);\n } else {\n // Item is currently not selected, will be selected\n toAdd.push({ ...item, selected: selectionState });\n }\n }\n });\n\n // Update flat suggestions immutably\n this._flatSuggestions.update((items) =>\n items.map((item, idx) => (indicesToUpdate.has(idx) ? { ...item, selected: selectionState } : item))\n );\n\n // Update selected suggestions\n this._selectedSuggestions.update((selected) => [...selected.filter((s) => !toRemove.has(s.value)), ...toAdd]);\n\n this._propagateChange();\n\n const tokenizer = this._tokenizer();\n if (tokenizer !== undefined) {\n tokenizer.onResize();\n tokenizer.tokenizerInnerEl.nativeElement.scrollLeft = tokenizer.tokenizerInnerEl.nativeElement.scrollWidth;\n }\n }\n\n /** @hidden */\n private _propagateChange(emitInMobile?: boolean): void {\n if (!this.mobile() || emitInMobile) {\n this._mapAndUpdateModel();\n }\n }\n\n /** @hidden */\n private async _setUpMobileMode(): Promise<void> {\n const injector = Injector.create({\n providers: [{ provide: MULTI_COMBOBOX_COMPONENT, useValue: this }],\n parent: this._injector\n });\n\n this._dynamicComponentService.createDynamicComponent(\n { listTemplate: this.listTemplate(), controlTemplate: this.mobileControlTemplate() },\n MobileMultiComboboxComponent,\n {\n containerRef: this._viewContainerRef\n },\n { injector }\n );\n }\n\n /**\n * @hidden\n * Method that picks other value moved from current one by offset, called only when Multi Combobox is closed.\n */\n private _chooseOtherItem(offset: number): void {\n const selectedSuggestions = this._selectedSuggestions();\n const flatSuggestions = this._flatSuggestions();\n if (selectedSuggestions?.length === flatSuggestions.length) {\n this._setInputText('');\n return;\n }\n\n const fullFlatSuggestions = this._fullFlatSuggestions();\n const activeValue = getSelectItemByInputValue<T>(fullFlatSuggestions, this.inputText());\n const index = flatSuggestions.findIndex((value) => value === activeValue);\n const position = !this.inputText() && offset === -1 ? flatSuggestions.length - 1 : index + offset;\n const item = flatSuggestions[position];\n\n if (item) {\n this._setInputTextFromOptionItem(item);\n }\n\n const selectedIndex = selectedSuggestions.findIndex((value) => value.label === item?.label);\n if (selectedIndex !== -1) {\n this._chooseOtherItem(offset);\n }\n }\n\n /** @hidden */\n private _initWindowResize(): void {\n this._getOptionsListWidth();\n\n if (!this.autoResize()) {\n return;\n }\n\n resizeObservable(this._inputGroup()?.nativeElement)\n .pipe(debounceTime(30), takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._getOptionsListWidth());\n }\n\n /** @hidden */\n private _getOptionsListWidth(): void {\n const body = document.body;\n const rect = this._inputGroup()?.nativeElement.getBoundingClientRect();\n const scrollBarWidth = body.offsetWidth - body.clientWidth;\n this.maxWidth = this.autoResize() ? window.innerWidth - scrollBarWidth - rect.left : this.minWidth;\n this._cd.detectChanges();\n }\n\n /**\n * @hidden\n * Assign custom templates\n */\n private _assignCustomTemplates(): void {\n this.customTemplates().forEach((template) => {\n switch (template.name()) {\n case 'optionItemTemplate':\n this.optionItemTemplate = template.templateRef;\n break;\n case 'groupItemTemplate':\n this.groupItemTemplate = template.templateRef;\n break;\n case 'secondaryItemTemplate':\n this.secondaryItemTemplate = template.templateRef;\n break;\n case 'selectedItemTemplate':\n this.selectedItemTemplate = template.templateRef;\n break;\n }\n });\n }\n}\n","<div class=\"fd-multi-combobox\">\n @if (mobile()) {\n <ng-template [ngTemplateOutlet]=\"controlTemplate\"></ng-template>\n } @else {\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list fd-multi-combobox__list-container\"\n (isOpenChange)=\"_popoverOpenChangeHandle($event)\"\n [isOpen]=\"isOpen\"\n [triggers]=\"[]\"\n [disabled]=\"_cva.disabled\"\n [maxWidth]=\"_popoverMaxWidth\"\n [fillControlMode]=\"fillControlMode()\"\n >\n <fd-popover-control>\n <ng-template [ngTemplateOutlet]=\"controlTemplate\"></ng-template>\n </fd-popover-control>\n <fd-popover-body [style.width.%]=\"!autoResize() && 100\">\n <ng-template [ngTemplateOutlet]=\"listTemplate\"></ng-template>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n }\n</div>\n<ng-template #controlTemplate>\n <fd-form-input-message-group>\n <fd-input-group\n #inputGroup\n [id]=\"_cva.id + '-input-group-container'\"\n [state]=\"_cva.state\"\n [buttonFocusable]=\"buttonFocusable()\"\n [button]=\"!_cva.readonly\"\n [glyph]=\"!_cva.readonly ? 'navigation-down-arrow' : ' '\"\n [isControl]=\"true\"\n [disabled]=\"_cva.disabled || _cva.readonly\"\n [isExpanded]=\"!mobile() && isOpen && _suggestions().length > 0\"\n [attr.aria-disabled]=\"_cva.disabled || _cva.readonly\"\n [attr.aria-readonly]=\"_cva.readonly\"\n [glyphAriaLabel]=\"_cva.ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)()\"\n [iconTitle]=\"addonIconTitle() || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)()\"\n (addOnButtonClicked)=\"_addOnClicked($event)\"\n (click)=\"mobile() && !isOpen && _onPrimaryButtonClick(false)\"\n (keydown)=\"_navigateByTokens($event)\"\n >\n <fd-tokenizer\n [tokenizerFocusable]=\"false\"\n [compactCollapse]=\"true\"\n [showOverflowPopover]=\"false\"\n #tokenizer\n class=\"fd-multi-combobox-tokenizer-custom\"\n (moreClickedEvent)=\"_moreClicked()\"\n fdMultiAnnouncer\n [multiAnnouncerOptions]=\"_suggestions()\"\n >\n @for (token of _selectedSuggestions(); track token.id) {\n <fd-token [readOnly]=\"_cva.disabled\" (onCloseClick)=\"_removeToken(token, $event)\">\n {{ token.label }}\n </fd-token>\n }\n <input\n #searchInputElement\n fdkAutoComplete\n (onComplete)=\"_onCompleteTerm($event)\"\n [options]=\"_suggestions()\"\n [inputText]=\"_inputText()\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [ariaLabel]=\"('coreMultiComboBox.multiComboBoxAriaLabel' | fdTranslate)()\"\n [attr.aria-labelledby]=\"_cva.ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete() && !mobile() ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete() && !mobile() ? _cva.id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete() && !mobile()\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"_cva.id\"\n [name]=\"_cva.name\"\n (keydown)=\"_onInputKeydownHandler($event)\"\n [disabled]=\"_cva.disabled\"\n [ngModel]=\"_inputText()\"\n (ngModelChange)=\"_setInputText($event); _searchTermChanged()\"\n [attr.placeholder]=\"_selectedSuggestions().length ? null : _cva.placeholder\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"!mobile() && _onBlur($event); tokenizer._hideTokens()\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"_cva.readonly\"\n [attr.aria-readonly]=\"_cva.readonly\"\n [attr.aria-required]=\"_cva.required\"\n [displayFn]=\"_displayFn\"\n class=\"fd-tokenizer__input fd-input-group__input\"\n />\n </fd-tokenizer>\n </fd-input-group>\n @if (mobile() && isOpen ? false : !!_cva.stateMessage) {\n <fd-form-message [type]=\"_cva.state\" [innerHtml]=\"_cva.stateMessage\"></fd-form-message>\n }\n </fd-form-input-message-group>\n</ng-template>\n<ng-template #mobileControlTemplate>\n <fd-input-group\n [id]=\"_cva.id + '-input-group-container'\"\n class=\"fd-multi-combobox-input-group-custom\"\n [state]=\"_cva.state\"\n [buttonFocusable]=\"false\"\n [isControl]=\"true\"\n [disabled]=\"_cva.disabled || _cva.readonly\"\n [isExpanded]=\"!mobile() && isOpen && _suggestions().length > 0\"\n [attr.aria-disabled]=\"_cva.disabled || _cva.readonly\"\n [attr.aria-readonly]=\"_cva.readonly\"\n [glyphAriaLabel]=\"_cva.ariaLabel\"\n >\n <input\n fdkAutoComplete\n (onComplete)=\"_onCompleteTerm($event)\"\n [options]=\"_suggestions()\"\n [inputText]=\"_inputText()\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [ariaLabel]=\"('coreMultiComboBox.multiComboBoxAriaLabel' | fdTranslate)()\"\n [attr.aria-labelledby]=\"_cva.ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete() && !mobile() ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete() && !mobile() ? _cva.id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete() && !mobile()\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"_cva.id\"\n [name]=\"_cva.name\"\n (keydown)=\"_onInputKeydownHandler($event)\"\n [disabled]=\"_cva.disabled\"\n [ngModel]=\"_inputText()\"\n (ngModelChange)=\"_setInputText($event); _searchTermChanged()\"\n [placeholder]=\"_cva.placeholder\"\n (focus)=\"_cva.onTouched()\"\n (blur)=\"!mobile() && _onBlur($event)\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"_cva.readonly\"\n [attr.aria-readonly]=\"_cva.readonly\"\n [displayFn]=\"_displayFn\"\n />\n </fd-input-group>\n</ng-template>\n<ng-template #listTemplate>\n <ul\n fd-list\n [byline]=\"byline()\"\n [selection]=\"byline()\"\n (focusEscapeList)=\"_handleListFocusEscape($event)\"\n class=\"fd-multi-combobox__list fd-list--multi-input\"\n [id]=\"_cva.id + '-result'\"\n role=\"listbox\"\n [style.max-height]=\"!mobile() && maxHeight()\"\n [style.min-width.px]=\"!mobile() && minWidth\"\n [style.max-width.px]=\"autoResize() && maxWidth\"\n [attr.aria-labelledby]=\"_cva.id + '-search'\"\n aria-multiselectable=\"true\"\n [tabindex]=\"0\"\n (keydown.tab)=\"close()\"\n (keydown.shift.tab)=\"close()\"\n (keydown.escape)=\"close()\"\n >\n @if (!!_cva.stateMessage) {\n <fd-form-message [type]=\"_cva.state\" [innerHtml]=\"_cva.stateMessage\"></fd-form-message>\n }\n @if (showSelectAll()) {\n <fd-multi-combobox-select-all-toggler\n [selectAllHandler]=\"_handleSelectAllItems\"\n [valueChanges]=\"selectionChange$\"\n [selectedItems]=\"_selectedSuggestions()\"\n [flatItems]=\"_flatSuggestions()\"\n ></fd-multi-combobox-select-all-toggler>\n }\n <ng-content></ng-content>\n @if (isGroup()) {\n @for (group of _suggestions(); track group.label; let groupIndex = $index) {\n @if (!groupItemTemplate) {\n <li\n fd-list-item\n fd-list-group-header\n ariaRole=\"group\"\n [attr.aria-roledescription]=\"('coreMultiComboBox.listGroupHeader' | fdTranslate)()\"\n [attr.aria-owns]=\"_getGroupItemIds(groupIndex)\"\n [attr.aria-label]=\"group.label\"\n >\n <span fd-list-title>{{ group.label }}</span>\n </li>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"groupItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { label: group.label } }\"\n ></ng-template>\n }\n @for (optionItem of group.children; track optionItem.id; let i = $index) {\n <li\n fd-list-item\n #item=\"fdListItem\"\n role=\"option\"\n (click)=\"!mobile() && _onOptionClicked($event, i)\"\n (keydown)=\"_onItemKeyDownHandler($event)\"\n [selected]=\"!!optionItem.selected\"\n [attr.id-with-group-index]=\"item.id + '-group-' + groupIndex\"\n [attr.aria-setsize]=\"group.children?.length\"\n [attr.aria-posinset]=\"i + 1\"\n >\n <fd-checkbox\n role=\"presentation\"\n (click)=\"_onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"_toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-template\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-template>\n </li>\n }\n }\n } @else {\n @for (optionItem of _suggestions(); track optionItem.id; let i = $index) {\n <li\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile() && _onOptionClicked($event, i)\"\n (keydown)=\"_onItemKeyDownHandler($event)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n role=\"presentation\"\n (click)=\"_onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"_toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-template\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-template>\n </li>\n }\n }\n </ul>\n</ng-template>\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #listItem>\n @if (optionItem.selected && !!selectedItemTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-template>\n }\n @if (!(optionItem.selected && selectedItemTemplate)) {\n <ng-template\n [ngTemplateOutlet]=\"optionItemSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: index }\"\n ></ng-template>\n <ng-template\n [ngTemplateOutlet]=\"secondaryTextSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem }\"\n ></ng-template>\n }\n</ng-template>\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #optionItemSource>\n @if (!optionItemTemplate) {\n <span\n fd-list-title\n [attr.title]=\"optionItem.label\"\n [innerHTML]=\"optionItem.label | highlight: _inputText()\"\n fdTruncatedTitle\n ></span>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"optionItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-template>\n }\n</ng-template>\n<ng-template let-optionItem=\"optionItem\" #secondaryTextSource>\n @if (showSecondaryText()) {\n @if (!secondaryItemTemplate) {\n <span\n [style.text-align]=\"secondaryTextAlignment()\"\n fd-list-secondary\n [attr.title]=\"optionItem.secondaryText\"\n [innerHTML]=\"optionItem.secondaryText | highlight: _inputText()\"\n ></span>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"secondaryItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value }\"\n ></ng-template>\n }\n }\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { MultiAnnouncerDirective } from './multi-announcer/multi-announcer.directive';\nimport { MultiComboboxComponent } from './multi-combobox.component';\nimport { SelectAllTogglerComponent } from './select-all-toggler/select-all-toggler.component';\n\n/**\n * @deprecated\n * Use direct imports of components and directives.\n */\n@NgModule({\n imports: [MultiComboboxComponent, SelectAllTogglerComponent, MultiAnnouncerDirective],\n exports: [MultiComboboxComponent, SelectAllTogglerComponent, MultiAnnouncerDirective]\n})\nexport class MultiComboboxModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fundamental-ngx-core-multi-combobox.mjs","sources":["../../../../libs/core/multi-combobox/multi-announcer/multi-announcer.directive.ts","../../../../libs/core/multi-combobox/helpers.ts","../../../../libs/core/multi-combobox/models/selection-change.event.ts","../../../../libs/core/multi-combobox/multi-combobox-config.ts","../../../../libs/core/multi-combobox/base-multi-combobox.class.ts","../../../../libs/core/multi-combobox/multi-combobox.token.ts","../../../../libs/core/multi-combobox/mobile/mobile-multi-combobox.component.ts","../../../../libs/core/multi-combobox/mobile/mobile-multi-combobox.component.html","../../../../libs/core/multi-combobox/data-source/multi-combobox-data-source.ts","../../../../libs/core/multi-combobox/data-source/multi-combobox-data-source-parser.ts","../../../../libs/core/multi-combobox/select-all-toggler/select-all-toggler.component.ts","../../../../libs/core/multi-combobox/multi-combobox.component.ts","../../../../libs/core/multi-combobox/multi-combobox.component.html","../../../../libs/core/multi-combobox/multi-combobox.module.ts","../../../../libs/core/multi-combobox/fundamental-ngx-core-multi-combobox.ts"],"sourcesContent":["import { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { ContentChildren, Directive, HostListener, inject, Input, QueryList } from '@angular/core';\nimport { KeyUtil } from '@fundamental-ngx/cdk/utils';\nimport { TokenComponent } from '@fundamental-ngx/core/token';\nimport { FdLanguageKeyIdentifier, resolveTranslationSignalFn } from '@fundamental-ngx/i18n';\n\n@Directive({\n selector: '[fdMultiAnnouncer]',\n exportAs: 'fdMultiAnnouncer',\n standalone: true\n})\nexport class MultiAnnouncerDirective {\n /** @hidden */\n @Input()\n multiAnnouncerOptions: unknown[];\n\n /** @hidden */\n @ContentChildren(TokenComponent, { descendants: true })\n private _tokens: QueryList<TokenComponent>;\n\n /** @hidden */\n private _noResultsAnnounced = false;\n\n /** @hidden */\n private _resultsAnnounced = false;\n\n /** @hidden */\n private _announcement = '';\n\n /** @hidden */\n private readonly _liveAnnouncer: LiveAnnouncer = inject(LiveAnnouncer);\n\n /** @hidden */\n private _resolveTranslation = resolveTranslationSignalFn();\n\n /** @hidden */\n @HostListener('keyup', ['$event'])\n protected _makeSearchTermChangeAnnouncements(event: KeyboardEvent): void {\n if (KeyUtil.isKeyType(event, 'alphabetical') || KeyUtil.isKeyType(event, 'numeric')) {\n this._liveAnnouncer.clear();\n const count = this.multiAnnouncerOptions?.length;\n if (!count && !this._noResultsAnnounced) {\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.noResults')());\n this._noResultsAnnounced = true;\n this._resultsAnnounced = false;\n } else if (count) {\n const trKey: FdLanguageKeyIdentifier =\n count === 1 ? 'coreMultiInput.countListResultsSingular' : 'coreMultiInput.countListResultsPlural';\n this._buildAnnouncement(this._resolveTranslation(trKey, { count })());\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.navigateSelectionsWithArrows')());\n if (!this._resultsAnnounced) {\n this._noResultsAnnounced = false;\n this._resultsAnnounced = true;\n }\n }\n if (this._tokens?.length) {\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.escapeNavigateTokens')());\n }\n this._makeAnnouncement(this._announcement);\n }\n }\n\n /** @hidden */\n private _buildAnnouncement(message: string): void {\n this._announcement = this._announcement + message + ' ';\n }\n\n /** @hidden */\n private async _makeAnnouncement(message: string): Promise<void> {\n await this._liveAnnouncer.announce(message, 'assertive').then(() => {\n this._announcement = '';\n });\n }\n}\n","import { isSelectItem, SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { isFunction, isJsObject, isString } from '@fundamental-ngx/cdk/utils';\nimport { shallowEqual } from 'fast-equals';\n\n/** @hidden */\nexport function lookupValue(item: unknown, lookupKey: string): string {\n if (isSelectItem(item)) {\n return lookupKey && item ? item.value[lookupKey] : item.value;\n } else {\n return lookupKey && item ? item[lookupKey] : (item as string);\n }\n}\n\n/** @hidden */\nexport function displayValue(item: unknown, displayKey: string): string {\n if (isSelectItem(item)) {\n return item.label;\n } else if (isJsObject(item) && displayKey) {\n const currentItem = objectGet(item, displayKey);\n\n return isFunction(currentItem) ? currentItem() : currentItem;\n } else {\n return item as string;\n }\n}\n\n/** @hidden */\nexport function objectGet(obj: unknown, is: string | string[] | undefined): any {\n if (!isJsObject(obj)) {\n return obj;\n } else if (isString(is)) {\n return objectGet(obj, is.split('.'));\n } else if (!is?.length) {\n return obj;\n } else {\n return objectGet(obj[is[0]], is.slice(1));\n }\n}\n\n/** @hidden */\nexport function getSelectItemByInputValue<T>(\n suggestions: SelectableOptionItem<T>[],\n needleValue: string\n): SelectableOptionItem<T> | undefined {\n return suggestions.find((value) => value.label === needleValue);\n}\n\n/** @hidden\n * Map grouped values to array. */\nexport function flattenGroups(items: SelectableOptionItem[]): SelectableOptionItem[] {\n return items.reduce((result, item) => result.concat(item.children ?? []), <SelectableOptionItem[]>[]);\n}\n\n/** @hidden */\nexport function getTokenIndexByIdlOrValue(item: SelectableOptionItem, suggestions: SelectableOptionItem[]): number {\n return suggestions.findIndex((token) => token.id === item.id || shallowEqual(token.value, item.value));\n}\n","import { SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { BaseMultiCombobox } from '../base-multi-combobox.class';\n\nexport class MultiComboboxSelectionChangeEvent {\n /**\n * Multi Combobox selection change event\n * @param source Multi Combobox component\n * @param selectedItems Selected items\n */\n constructor(\n public source: BaseMultiCombobox,\n public selectedItems: SelectableOptionItem['value'] // Contains selected items\n ) {}\n}\n","import { Injectable } from '@angular/core';\nimport { DataProvider, MatchingStrategy } from '@fundamental-ngx/cdk/data-source';\n\nimport { ContentDensity } from '@fundamental-ngx/cdk/utils';\n// import { PlatformConfig } from '@fundamental-ngx/platform/shared';\n\n/**\n * Default options for Multi-Combobox\n */\n@Injectable({ providedIn: 'root' })\nexport class MultiComboboxConfig {\n /**\n * Content Density of element. 'cozy' | 'compact'\n */\n contentDensity: ContentDensity;\n\n /**\n * String matching strategy for typeahead list. Default: 'starts with per term'\n */\n matchingStrategy: MatchingStrategy = MatchingStrategy.STARTS_WITH_PER_TERM;\n\n /**\n * Maps data providers\n */\n providers: Map<string, DataProvider<any>> | null = new Map();\n\n /**\n * Create Provider factory function\n */\n // static createProviderFactory(\n // obj: Partial<MultiComboboxConfig>\n // ): (platformConfig: PlatformConfig) => MultiComboboxConfig {\n // const useFactory = (platformConfig: PlatformConfig): MultiComboboxConfig =>\n // Object.assign(new MultiComboboxConfig(platformConfig), obj);\n // return useFactory;\n // }\n\n /** @hidden */\n // constructor(platformConfig: PlatformConfig) {\n // this.contentDensity = platformConfig.contentDensity;\n // }\n}\n","import {\n ALT,\n BACKSPACE,\n CONTROL,\n DOWN_ARROW,\n ENTER,\n ESCAPE,\n LEFT_ARROW,\n RIGHT_ARROW,\n SHIFT,\n TAB,\n UP_ARROW\n} from '@angular/cdk/keycodes';\nimport {\n ChangeDetectorRef,\n DestroyRef,\n Directive,\n ElementRef,\n Injector,\n InputSignal,\n InputSignalWithTransform,\n ModelSignal,\n OutputEmitterRef,\n Signal,\n WritableSignal,\n afterNextRender,\n inject,\n signal,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DataSourceDirective, MatchingBy, MatchingStrategy } from '@fundamental-ngx/cdk/data-source';\nimport {\n CvaControl,\n CvaDirective,\n FormStates,\n SelectableOptionItem,\n isOptionItem,\n isSelectableOptionItem\n} from '@fundamental-ngx/cdk/forms';\nimport { RangeSelector, coerceArraySafe, isFunction, isJsObject, isString } from '@fundamental-ngx/cdk/utils';\nimport { ContentDensityObserver } from '@fundamental-ngx/core/content-density';\nimport { FormControlComponent } from '@fundamental-ngx/core/form';\nimport { PopoverComponent } from '@fundamental-ngx/core/popover';\nimport { shallowEqual } from 'fast-equals';\nimport { Subscription, skip, timer } from 'rxjs';\nimport {\n FdMultiComboBoxDataSource,\n FdMultiComboboxAcceptableDataSource\n} from './data-source/multi-combobox-data-source';\nimport { displayValue, flattenGroups, lookupValue, objectGet } from './helpers';\nimport { MultiComboboxSelectionChangeEvent } from './models/selection-change.event';\nimport { MultiComboboxConfig } from './multi-combobox-config';\nimport { FD_MAP_LIMIT } from './multi-combobox.component';\n\nexport type TextAlignment = 'left' | 'right';\n\n@Directive()\nexport abstract class BaseMultiCombobox<T = any> {\n /**\n * Currently selected items in the multi-combobox.\n * To modify selections, use the `writeValue()` or `setValue()` methods.\n */\n abstract selectedItems: T[];\n\n /**\n * Determines whether items should be grouped in the dropdown.\n * When enabled, items will be organized into groups based on the `groupKey` property.\n */\n abstract group: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * The property name used to group items when `group` is enabled.\n * This key is used to extract the grouping value from each item object.\n *\n * @example\n * ```typescript\n * // If items are: [{name: 'Apple', category: 'Fruit'}, {name: 'Carrot', category: 'Vegetable'}]\n * groupKey = 'category'; // Groups by 'Fruit' and 'Vegetable'\n * ```\n */\n abstract groupKey: InputSignal<string>;\n\n /**\n * The property name used to display item labels in the dropdown.\n * For primitive types (strings, numbers), this is ignored and the value itself is displayed.\n * For objects, this specifies which property to use as the display text.\n *\n * @example\n * ```typescript\n * displayKey = 'name'; // Displays item.name for each item\n * ```\n */\n abstract displayKey: InputSignal<string>;\n\n /**\n * The property name used to display secondary text below the main label.\n * Only displayed when `showSecondaryText` is enabled.\n */\n abstract secondaryKey: InputSignal<string>;\n\n /**\n * Controls whether secondary text should be displayed for each item.\n * When enabled, uses the `secondaryKey` property to extract and display secondary text.\n */\n abstract showSecondaryText: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * The property name used as a unique identifier for each item.\n * Used for item comparison, deduplication, and tracking selections.\n * If not specified, the entire object is compared.\n */\n abstract lookupKey: InputSignal<string>;\n\n /**\n * Signal containing the error message displayed when an invalid entry is detected.\n * Displayed temporarily when the user enters text that doesn't match any available options.\n */\n abstract invalidEntryMessage: InputSignal<string | null | undefined>;\n\n /**\n * Signal containing the duration (in milliseconds) to display the invalid entry message.\n * After this duration expires, the error message is automatically hidden.\n */\n abstract invalidEntryDisplayTime: Signal<number>;\n\n /**\n * Model signal controlling whether limitless mode is enabled.\n * In limitless mode, all available items are loaded without pagination limits.\n * Use with caution for large datasets as it may impact performance.\n */\n abstract limitless: ModelSignal<boolean>;\n\n /**\n * Signal indicating whether the current configuration uses grouped items.\n *\n * @remarks\n * Computed based on whether both `group` and `groupKey` are defined.\n * Used internally to determine rendering strategy.\n */\n abstract isGroup: Signal<boolean>;\n\n /**\n * Signal containing the current text in the search input field.\n * Updates reactively as the user types. Used for filtering and autocomplete functionality.\n */\n abstract inputText: Signal<string>;\n\n /**\n * Signal containing a reference to the search input element.\n */\n abstract searchInputElement: Signal<FormControlComponent | undefined>;\n\n /**\n * Output emitter for selection change events.\n */\n abstract selectionChange: OutputEmitterRef<MultiComboboxSelectionChangeEvent>;\n\n /**\n * Output emitter for data received events.\n */\n abstract dataReceived: OutputEmitterRef<boolean>;\n\n /**\n * Output emitter for data request events.\n */\n abstract dataRequested: OutputEmitterRef<boolean>;\n\n /**\n * Internal writable signal for selected items.\n * Must be implemented by subclass. Provides write access to the selection state.\n * @hidden\n */\n protected abstract _selectedItems: WritableSignal<T[]>;\n\n /**\n * Internal writable signal for input text.\n * Must be implemented by subclass. Provides write access to the input text.\n *\n * @hidden\n */\n protected abstract _inputText: WritableSignal<string>;\n\n /**\n * Protected method for internal writes to selectedItems with coercion.\n * Ensures the value is properly coerced to an array before setting.\n *\n * @param value - The new array of selected items\n * @hidden\n */\n protected abstract _setSelectedItems(value: T[]): void;\n\n /**\n * Protected method for setting input text with side effects.\n * Triggers `onTouched()` callback to mark the control as touched.\n *\n * @param value - The new input text value\n * @hidden\n */\n protected abstract _setInputText(value: string): void;\n\n /**\n * Control value accessor instance for forms integration.\n * @hidden\n */\n readonly cvaControl: CvaControl<T> = inject(CvaControl);\n\n /**\n * Data source directive instance for managing async data loading and filtering.\n * @hidden\n */\n readonly dataSourceDirective: DataSourceDirective<T, FdMultiComboBoxDataSource<T>> = inject(DataSourceDirective);\n\n /** Control Value Accessor directive for forms support. */\n readonly _cva = inject(CvaDirective<T>, {\n self: true\n });\n\n /** Multi combobox config. */\n readonly _multiComboboxConfig = inject(MultiComboboxConfig, {\n optional: true\n });\n\n /** Content Density Observer */\n readonly contentDensityObserver = inject(ContentDensityObserver);\n\n /**\n * Signal containing currently selected suggestion items.\n * @hidden\n */\n _selectedSuggestions = signal<SelectableOptionItem<T>[]>([]);\n\n /**\n * Signal containing currently matched suggestion items based on search text.\n * Updates when the user types in the search field.\n * Contains filtered options that match the current query.\n * @hidden\n */\n _suggestions = signal<SelectableOptionItem[]>([]);\n\n /**\n * Signal containing flattened suggestion items (groups expanded to flat list).\n * @hidden\n */\n _flatSuggestions = signal<SelectableOptionItem[]>([]);\n\n /**\n * Signal containing the complete flattened list of all available items.\n * @hidden\n */\n _fullFlatSuggestions = signal<SelectableOptionItem[]>([]);\n\n /**\n * Signal indicating whether the \"show selected only\" mode is active.\n * In mobile mode, toggles between showing all items and showing only selected items.\n * @hidden\n */\n selectedShown = signal(false);\n\n /**\n * Writable signal for overriding the invalid entry message with i18n translations.\n * @hidden\n */\n protected readonly _invalidEntryMessageOverride = signal<string | null>(null);\n\n /** @hidden */\n protected readonly _elmRef = inject(ElementRef<HTMLElement>);\n\n /** @hidden */\n protected readonly _cd = inject(ChangeDetectorRef);\n\n /**\n * Maximum number of items to load per page when limitless mode is disabled.\n * Controls pagination size for large datasets.\n * @hidden\n */\n protected readonly _mapLimit = inject(FD_MAP_LIMIT);\n\n /** @hidden */\n protected readonly _destroyRef = inject(DestroyRef);\n\n /** @hidden */\n protected readonly _injector = inject(Injector);\n\n /** @hidden */\n protected _dataSource: FdMultiComboboxAcceptableDataSource<T>;\n\n /**\n * Previous input text value before the last change.\n * Used for restoring the input on invalid entry or cancellation.\n * @hidden\n */\n protected _previousInputText: string;\n\n /**\n * Matching strategy for filtering items based on user input.\n * Determines how items are matched: starts with, contains, etc.\n * Defaults to value from config or `MatchingStrategy.CONTAINS`.\n * @hidden\n */\n protected _matchingStrategy: MatchingStrategy =\n this._multiComboboxConfig?.matchingStrategy ?? MatchingStrategy.CONTAINS;\n\n /**\n * Subscription for data source events.\n * @hidden\n */\n protected _dsSubscription: Subscription | null = null;\n\n /**\n * Reference to the host element.\n * @hidden\n */\n protected _element: HTMLElement = this._elmRef.nativeElement;\n\n /**\n * @hidden\n * Keys, that won't trigger the popover's open state, when dispatched on search input.\n */\n protected readonly _nonOpeningKeys: number[] = [\n BACKSPACE,\n ESCAPE,\n ENTER,\n CONTROL,\n TAB,\n SHIFT,\n UP_ARROW,\n RIGHT_ARROW,\n DOWN_ARROW,\n LEFT_ARROW,\n ALT\n ];\n\n /**\n * Timer subscription for displaying invalid entry message.\n * Auto-hides the error message after the configured duration.\n * @hidden\n */\n protected _timerSub$: Subscription;\n\n /**\n * Previous form state before displaying invalid entry error.\n * Stored to restore the original state after error is cleared.\n * @hidden\n */\n protected _previousState?: FormStates;\n\n /**\n * Previous state message before displaying invalid entry error.\n */\n protected _previousStateMessage: string | null | undefined;\n\n /**\n * Range selector utility for handling shift+click multi-selection.\n */\n protected readonly _rangeSelector = new RangeSelector();\n\n /**\n * Flag indicating whether the data source has changed.\n * Guard flag: true while waiting for a new data source's first real data emission.\n * Prevents the provider's initial empty emission from being treated as \"no results.\"\n * @hidden\n */\n private _dataSourceChanged = true;\n\n /**\n * Signal reference to the popover component.\n * Used for controlling popover visibility and position.\n * @hidden\n */\n private readonly popover = viewChild(PopoverComponent);\n\n /**\n * Writes a value to the control from the forms API.\n *\n * @param value - Array of items to set as selected\n * @remarks\n * Part of the ControlValueAccessor interface. Called by Angular forms\n * when the form model changes.\n * @hidden\n */\n writeValue(value: T[]): void {\n this._setSelectedItems(coerceArraySafe(value));\n this._cva.writeValue(this._selectedItems());\n this._setSelectedSuggestions();\n this._emitChangeEvent();\n }\n\n /**\n * Used to change the value of a control.\n * @param value the value to be applied\n * @param emitOnChange whether to emit \"onChange\" event.\n * Should be \"false\", if the change is made programmatically (internally) by the control, \"true\" otherwise\n */\n setValue(value: T[], emitOnChange = true): void {\n this._setSelectedItems(coerceArraySafe(value));\n this._cva.setValue(this._selectedItems(), emitOnChange);\n this._setSelectedSuggestions();\n this._emitChangeEvent();\n }\n\n /** @hidden */\n protected _displayFn = (value: T): string => displayValue(value, this.displayKey());\n\n /** @hidden */\n protected _secondaryFn = (value: T): string => {\n if (isOptionItem(value)) {\n return value.secondaryText ?? '';\n } else if (isJsObject(value) && this.secondaryKey()) {\n const currentItem = objectGet(value, this.secondaryKey());\n\n return isFunction(currentItem) ? currentItem() : currentItem;\n } else {\n return value as string;\n }\n };\n\n /**\n * @hidden\n * Method to emit change event\n */\n protected _emitChangeEvent(): void {\n const event = new MultiComboboxSelectionChangeEvent(this, this._selectedItems());\n\n this.selectionChange.emit(event);\n\n // Wait for Angular to complete the current render cycle, then refresh popover position after selection changes\n afterNextRender(\n () => {\n this.popover()?.refreshPosition();\n },\n { injector: this._injector }\n );\n }\n\n /** @hidden */\n protected _setSelectedSuggestions(): void {\n this._selectedSuggestions.set([]);\n\n const selectedItems = this._selectedItems();\n if (!selectedItems?.length) {\n return;\n }\n\n const fullFlatSuggestions = this._fullFlatSuggestions();\n const selectedSuggestions: SelectableOptionItem<T>[] = [];\n\n // Update immutably\n const updatedSuggestions = fullFlatSuggestions.map((item) => {\n const isSelected = selectedItems.some(\n (selectedItem) => item.label === selectedItem || item.value === selectedItem\n );\n\n if (isSelected) {\n selectedSuggestions.push({ ...item, selected: true });\n return { ...item, selected: true };\n } else if (item.selected) {\n // Item was selected but is now deselected - must update to false\n return { ...item, selected: false };\n }\n\n // Item was not and is not selected - no change needed\n return item;\n });\n\n this._selectedSuggestions.set(selectedSuggestions);\n this._fullFlatSuggestions.set(updatedSuggestions);\n }\n\n /**\n * Convert original data to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertToOptionItems(items: T[]): SelectableOptionItem<T>[] {\n const item = items[0];\n\n const elementTypeIsOptionItem = isSelectableOptionItem(item);\n if (elementTypeIsOptionItem) {\n return items as SelectableOptionItem[];\n }\n\n const elementTypeIsObject = isJsObject(item);\n if (elementTypeIsObject) {\n return this._convertObjectsToOptionItems(items);\n }\n\n const elementTypeIsString = isString(item);\n if (elementTypeIsString) {\n return this._convertPrimitiveToOptionItems(items);\n }\n\n return [];\n }\n\n /**\n * Convert data to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertObjectsToOptionItems(items: T[]): SelectableOptionItem<T>[] {\n if (this.isGroup()) {\n return this._convertObjectsToGroupOptionItems(items);\n } else if (this.showSecondaryText() && this.secondaryKey()) {\n return this._convertObjectsToSecondaryOptionItems(items);\n } else {\n return this._convertObjectsToDefaultOptionItems(items);\n }\n }\n\n /**\n * Convert object[] data to Group OptionItems Interface\n * @hidden\n */\n protected _convertObjectsToGroupOptionItems<K extends T>(items: K[]): SelectableOptionItem<T>[] {\n const group: Record<string, K[]> = {};\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const keyValue = item[this.groupKey()];\n if (!keyValue) {\n continue;\n }\n\n if (!group[keyValue]) {\n group[keyValue] = [];\n }\n\n group[keyValue].push(item);\n }\n\n return Object.keys(group).map((key) => {\n const selectItem: SelectableOptionItem = {\n label: key,\n value: null,\n isGroup: true\n };\n\n const currentGroup = group[key];\n\n if (this.showSecondaryText() && this.secondaryKey()) {\n selectItem.children = this._convertObjectsToSecondaryOptionItems(currentGroup);\n } else {\n selectItem.children = this._convertObjectsToDefaultOptionItems(currentGroup);\n }\n\n return selectItem;\n });\n }\n\n /**\n * Convert T[] data to Secondary SelectableOptionItems<T> Interface\n * @hidden\n */\n protected _convertObjectsToSecondaryOptionItems<K extends T>(items: K[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n const selectedItems = this._selectedItems();\n\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: displayValue(value, this.displayKey()),\n id: lookupValue(value, this.lookupKey()),\n secondaryText: objectGet(value, this.secondaryKey()),\n value,\n selected: selectedItems.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /**\n * Convert Primitive data(Boolean, String, Number) to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertPrimitiveToOptionItems(items: any[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n const selectedItems = this._selectedItems();\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: value,\n id: lookupValue(value, this.lookupKey()),\n value,\n selected: selectedItems.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /**\n * Convert T[] to SelectableOptionItems<T> Interface (Default)\n * @hidden\n */\n protected _convertObjectsToDefaultOptionItems(items: T[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n const selectedItems = this._selectedItems();\n\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: displayValue(value, this.displayKey()),\n id: lookupValue(value, this.lookupKey()),\n value,\n selected: selectedItems.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /** @hidden */\n protected _setInvalidEntry(): void {\n if (this._previousState || this._previousStateMessage) {\n return;\n }\n\n this._previousState = this._cva.state;\n this._cva.state = 'error';\n\n this._previousStateMessage = this._cva.stateMessage;\n const overrideMessage = this._invalidEntryMessageOverride();\n this._cva.stateMessage = overrideMessage ?? this.invalidEntryMessage() ?? null;\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n protected _unsetInvalidEntry(): void {\n this._cva.state = this._previousState;\n this._previousState = undefined;\n\n this._cva.stateMessage = this._previousStateMessage;\n this._previousStateMessage = undefined;\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n protected _focusToSearchField(): void {\n this.searchInputElement()?.elementRef.nativeElement.focus();\n }\n\n /** @hidden */\n protected _mapAndUpdateModel(): void {\n const selectedItems = this._selectedSuggestions().map(({ value }) => value);\n\n const shouldEmitChangeEvent = !shallowEqual(this._selectedItems(), selectedItems);\n\n if (!shouldEmitChangeEvent) {\n return;\n }\n\n this.writeValue(selectedItems);\n\n this._cva.onChange(selectedItems);\n\n this._emitChangeEvent();\n }\n\n /**\n * @hidden\n * Prepares the data stream and subscribes to it.\n */\n protected _openDataStream(matchingStrategy: MatchingStrategy): void {\n if (!this.dataSourceDirective.dataSourceProvider) {\n throw new Error(`[dataSource] source did not match an array, Observable, or DataSource`);\n }\n\n this._matchingStrategy = matchingStrategy;\n this._configureDataSourceProvider(matchingStrategy);\n\n // initial data fetch\n this._fetchInitialData();\n\n this._subscribeToDsEvents();\n\n this.dataSourceDirective.dataSourceChanged.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\n this._dataSourceChanged = true;\n this._subscribeToDsEvents();\n this._configureDataSourceProvider(this._matchingStrategy);\n this._fetchInitialData();\n });\n\n this.dataSourceDirective.dataChanged$.pipe(skip(0), takeUntilDestroyed(this._destroyRef)).subscribe((data) => {\n if (data.length === 0) {\n if (this._dataSourceChanged) {\n // Data source transition: skip the invalid-entry handling (_processingEmptyData)\n // because the new provider's BehaviorSubject starts with [] before match('*') populates it.\n // But still clear stale suggestions and reset the flag.\n this._dataSourceChanged = false;\n this._suggestions.set([]);\n this._flatSuggestions.set([]);\n this._fullFlatSuggestions.set([]);\n } else {\n this._processingEmptyData();\n }\n return;\n }\n\n this._previousInputText = this.inputText();\n\n this._parseDataSourceValue(data);\n\n this._cva.stateChanges.next('initDataSource.open().');\n\n this._cd.markForCheck();\n });\n }\n\n /**\n * Parses the data from the data stream and updates the model if needed.\n * @param data array of objects from the data stream.\n */\n protected _parseDataSourceValue(data: T[]): void {\n this._convertDataSourceSuggestions(data);\n\n const selectedSuggestions = this._selectedSuggestions();\n if (selectedSuggestions.length > 0) {\n this._suggestions.update((suggestions) =>\n suggestions.map((suggestion) => {\n const isSelected = selectedSuggestions.some((item) => shallowEqual(item.value, suggestion.value));\n return isSelected ? { ...suggestion, selected: true } : suggestion;\n })\n );\n }\n\n if (this._dataSourceChanged) {\n const currentSuggestions = this._suggestions();\n this._flatSuggestions.set(this.isGroup() ? flattenGroups(currentSuggestions) : currentSuggestions);\n this._fullFlatSuggestions.set(this._flatSuggestions());\n\n this._setSelectedSuggestions();\n\n this._mapAndUpdateModel();\n\n this._dataSourceChanged = false;\n }\n }\n\n /**\n * Transforms plain array into `SelectableOptionItem<T>`\n * @param data\n */\n protected _convertDataSourceSuggestions(data: T[]): void {\n const selectedSuggestions = this._selectedSuggestions();\n this._suggestions.set(\n this._convertToOptionItems(data).map((optionItem) => {\n const selectedElement = selectedSuggestions.find((selectedItem) => selectedItem.id === optionItem.id);\n if (selectedElement) {\n return { ...optionItem, selected: selectedElement.selected };\n }\n return optionItem;\n })\n );\n }\n\n /** @hidden */\n protected _processingEmptyData(): void {\n if (this._cva.disabled) {\n return;\n }\n\n if (this._cva.controlInvalid && this._cva.ngControl?.hasError) {\n this._setInvalidEntry();\n\n if (this._timerSub$) {\n this._timerSub$.unsubscribe();\n }\n }\n this._setInputText(this._previousInputText);\n\n this._timerSub$ = timer(this.invalidEntryDisplayTime()).subscribe(() => this._unsetInvalidEntry());\n\n this._cd.detectChanges();\n }\n\n /**\n * @hidden\n * Configures the data source provider with matching settings.\n */\n private _configureDataSourceProvider(matchingStrategy: MatchingStrategy): void {\n const dataSourceProvider = this.dataSourceDirective.dataSourceProvider;\n\n if (!dataSourceProvider) {\n return;\n }\n\n dataSourceProvider.limitless = this.limitless();\n\n dataSourceProvider.dataProvider.setLookupKey(this.lookupKey());\n const matchingBy: MatchingBy = {\n firstBy: this._displayFn\n };\n\n if (this.secondaryKey()) {\n matchingBy.secondaryBy = this._secondaryFn;\n }\n\n dataSourceProvider.dataProvider.setMatchingBy(matchingBy);\n dataSourceProvider.dataProvider.setMatchingStrategy(matchingStrategy);\n }\n\n /**\n * @hidden\n * Triggers the initial data fetch on the current data source provider.\n */\n private _fetchInitialData(): void {\n const dataSourceProvider = this.dataSourceDirective.dataSourceProvider;\n\n if (!dataSourceProvider) {\n return;\n }\n\n const map = new Map();\n map.set('query', '*');\n\n if (!this.limitless()) {\n map.set('limit', this._mapLimit);\n } else {\n dataSourceProvider.dataProvider['defaultLimit'] = Number.MAX_SAFE_INTEGER;\n }\n\n dataSourceProvider.match(map);\n }\n\n /**\n * @hidden\n * Subscribes to dataRequested/dataReceived events from the current data source provider.\n * Unsubscribes from previous provider's events first.\n */\n private _subscribeToDsEvents(): void {\n this._dsSubscription?.unsubscribe();\n this._dsSubscription = new Subscription();\n\n this._dsSubscription.add(\n this.dataSourceDirective.dataSourceProvider?.dataRequested.subscribe((value) =>\n this.dataRequested.emit(value)\n )\n );\n this._dsSubscription.add(\n this.dataSourceDirective.dataSourceProvider?.dataReceived.subscribe((value) =>\n this.dataReceived.emit(value)\n )\n );\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const MULTI_COMBOBOX_COMPONENT = new InjectionToken('FdMultiComboboxInterface');\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, Inject, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { Nullable, TemplateDirective } from '@fundamental-ngx/cdk/utils';\nimport { BarElementDirective, BarMiddleDirective, ButtonBarComponent } from '@fundamental-ngx/core/bar';\nimport { ButtonComponent } from '@fundamental-ngx/core/button';\nimport {\n DialogBodyComponent,\n DialogCloseButtonComponent,\n DialogComponent,\n DialogFooterComponent,\n DialogHeaderComponent\n} from '@fundamental-ngx/core/dialog';\nimport { MobileModeBase, MobileModeControl } from '@fundamental-ngx/core/mobile-mode';\nimport { TitleComponent } from '@fundamental-ngx/core/title';\nimport { FdTranslatePipe } from '@fundamental-ngx/i18n';\nimport { MobileMultiComboboxInterface } from '../models/multi-combobox.interface';\nimport { MULTI_COMBOBOX_COMPONENT } from '../multi-combobox.token';\n\n@Component({\n selector: 'fd-mobile-multi-combobox',\n templateUrl: './mobile-multi-combobox.component.html',\n styleUrl: './mobile-multi-combobox.component.scss',\n imports: [\n BarMiddleDirective,\n BarElementDirective,\n ButtonBarComponent,\n TitleComponent,\n TitleComponent,\n TemplateDirective,\n BarMiddleDirective,\n BarElementDirective,\n NgTemplateOutlet,\n ButtonComponent,\n ButtonBarComponent,\n FdTranslatePipe,\n DialogComponent,\n DialogHeaderComponent,\n DialogCloseButtonComponent,\n DialogBodyComponent,\n DialogFooterComponent\n ]\n})\nexport class MobileMultiComboboxComponent extends MobileModeBase<MobileMultiComboboxInterface> implements OnInit {\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: Nullable<{\n listTemplate: TemplateRef<any>;\n controlTemplate: TemplateRef<any>;\n }> = null;\n\n /** @hidden */\n selectedShown = this._component.selectedShown;\n\n /** @hidden */\n private _selectedBackup: SelectableOptionItem[];\n\n /** @hidden */\n constructor(@Inject(MULTI_COMBOBOX_COMPONENT) multiComboboxComponent: MobileMultiComboboxInterface) {\n super(multiComboboxComponent, MobileModeControl.MULTI_COMBOBOX);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this._listenOnMultiComboboxOpenChange();\n }\n\n /** @hidden */\n showSelected(): void {\n const isSelectedShown = this.selectedShown();\n\n if (isSelectedShown) {\n this._component._searchTermChanged();\n this.selectedShown.set(false);\n return;\n }\n\n this._component._moreClicked();\n }\n\n /** @hidden */\n handleDismiss(): void {\n this.dialogRef.dismiss();\n this._component._dialogDismiss(this._selectedBackup);\n }\n\n /** @hidden */\n handleApprove(): void {\n this.dialogRef.close();\n this._component._dialogApprove();\n }\n\n /** @hidden */\n private _toggleDialog(open: boolean): void {\n if (!open) {\n return;\n }\n\n const selectedSuggestions = this._component._selectedSuggestions();\n this._selectedBackup = selectedSuggestions?.length ? [...selectedSuggestions] : [];\n if (!this._dialogService.hasOpenDialogs()) {\n this._open();\n }\n }\n\n /** @hidden */\n private _listenOnMultiComboboxOpenChange(): void {\n this._component.openChange\n .pipe(takeUntilDestroyed(this._destroyRef))\n .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 ...this.dialogConfig,\n backdropClickCloseable: false,\n escKeyCloseable: false,\n container: this._elementRef.nativeElement,\n disablePaddings: true\n });\n }\n}\n","<ng-template [fdDialogTemplate] let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n @if (mobileConfig.title) {\n <h1 fd-title fd-dialog-title>{{ mobileConfig.title }}</h1>\n }\n @if (mobileConfig.hasCloseButton) {\n <button fd-dialog-close-button [mobile]=\"true\" (click)=\"handleDismiss()\"></button>\n }\n <ng-template fdkTemplate=\"subheader\">\n <div fd-bar-middle>\n <fd-bar-element [fullWidth]=\"true\">\n <ng-template [ngTemplateOutlet]=\"childContent?.controlTemplate || null\"></ng-template>\n @if (selectedShown()) {\n <button\n fd-button\n glyph=\"multiselect-all\"\n fdType=\"emphasized\"\n [title]=\"('platformMultiCombobox.mobileShowAllItemsButton' | fdTranslate)()\"\n [attr.aria-label]=\"('platformMultiCombobox.mobileShowAllItemsButton' | fdTranslate)()\"\n class=\"fd-margin-begin--tiny\"\n (click)=\"showSelected()\"\n ></button>\n }\n @if (selectedShown() === false) {\n <button\n fd-button\n glyph=\"multiselect-all\"\n fdType=\"transparent\"\n [title]=\"('platformMultiCombobox.mobileShowSelectedItemsButton' | fdTranslate)()\"\n [attr.aria-label]=\"\n ('platformMultiCombobox.mobileShowSelectedItemsButton' | fdTranslate)()\n \"\n class=\"fd-margin-begin--tiny\"\n (click)=\"showSelected()\"\n ></button>\n }\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n <fd-dialog-body>\n <ng-template [ngTemplateOutlet]=\"childContent?.listTemplate || null\"></ng-template>\n </fd-dialog-body>\n <fd-dialog-footer>\n @if (mobileConfig.approveButtonText) {\n <fd-button-bar fdType=\"emphasized\" [label]=\"mobileConfig.approveButtonText!\" (click)=\"handleApprove()\">\n </fd-button-bar>\n }\n @if (mobileConfig.cancelButtonText) {\n <fd-button-bar [label]=\"mobileConfig.cancelButtonText!\" (click)=\"handleDismiss()\"> </fd-button-bar>\n }\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n","import { AbstractDataProvider, BaseDataSource, DataProvider } from '@fundamental-ngx/cdk/data-source';\nimport { Observable } from 'rxjs';\n\nexport class FdMultiComboBoxDataSource<T> extends BaseDataSource<T> {\n /** @hidden */\n limitless = false;\n /** @hidden */\n constructor(public dataProvider: AbstractDataProvider<T>) {\n super(dataProvider);\n }\n}\n\nexport class ArrayMultiComboBoxDataSource<T> extends FdMultiComboBoxDataSource<T> {\n /** @hidden */\n constructor(data: T[]) {\n super(new DataProvider(data));\n }\n}\n\nexport class ObservableMultiComboBoxDataSource<T> extends FdMultiComboBoxDataSource<T> {\n /** @hidden */\n constructor(data: Observable<T[]>) {\n super(new DataProvider(data));\n }\n}\n\n/**\n * Type of acceptable objects as a datasource for the Multi-Combo Box component.\n */\nexport type FdMultiComboboxAcceptableDataSource<T> = FdMultiComboBoxDataSource<T> | Observable<T[]> | T[];\n","import { DataSourceParser, isDataSource } from '@fundamental-ngx/cdk/data-source';\nimport { isObservable } from 'rxjs';\nimport {\n ArrayMultiComboBoxDataSource,\n FdMultiComboBoxDataSource,\n FdMultiComboboxAcceptableDataSource,\n ObservableMultiComboBoxDataSource\n} from './multi-combobox-data-source';\n\nexport class MultiComboboxDataSourceParser<T> implements DataSourceParser<T, FdMultiComboBoxDataSource<T>> {\n /**\n * Transforms plain array or observable into DataSource class.\n * @param source\n */\n parse(source: FdMultiComboboxAcceptableDataSource<T>): FdMultiComboBoxDataSource<T> | undefined {\n if (isDataSource(source)) {\n return source as FdMultiComboBoxDataSource<T>;\n }\n\n if (Array.isArray(source)) {\n return new ArrayMultiComboBoxDataSource<T>(source);\n }\n\n if (isObservable(source)) {\n return new ObservableMultiComboBoxDataSource<T>(source);\n }\n\n return undefined;\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n HostListener,\n inject,\n Input,\n OnInit,\n ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { CheckboxComponent } from '@fundamental-ngx/core/checkbox';\nimport { FormItemComponent } from '@fundamental-ngx/core/form';\nimport { ListFocusItem } from '@fundamental-ngx/core/list';\nimport { ToolbarComponent } from '@fundamental-ngx/core/toolbar';\nimport { FdTranslatePipe } from '@fundamental-ngx/i18n';\nimport { Observable } from 'rxjs';\n\n@Component({\n selector: 'fd-multi-combobox-select-all-toggler',\n template: `\n <fd-toolbar>\n <div fd-form-item class=\"fd-multi-combobox-select-all__form-item\">\n <fd-checkbox tabIndexValue=\"-1\" [ngModel]=\"checkboxValue\" [tristate]=\"true\">\n {{\n (\n 'coreMultiComboBox.selectAllLabel'\n | fdTranslate: { selectedItems: selectedItems.length, totalItems: flatItems.length }\n )()\n }}\n </fd-checkbox>\n </div>\n </fd-toolbar>\n `,\n styleUrl: './select-all-toggler.component.scss',\n providers: [\n {\n provide: ListFocusItem,\n useExisting: SelectAllTogglerComponent\n }\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ToolbarComponent, FormItemComponent, CheckboxComponent, FormsModule, FdTranslatePipe]\n})\nexport class SelectAllTogglerComponent extends ListFocusItem implements OnInit {\n /**\n * Handler for the select all items\n * */\n @Input() selectAllHandler: (select: boolean) => void;\n\n /**\n * Stream for receiving information about the value changes,\n */\n @Input() valueChanges: Observable<unknown>;\n\n /** @hidden */\n @Input()\n selectedItems: Array<unknown> = [];\n\n /** @hidden */\n @Input()\n flatItems: Array<unknown> = [];\n\n /** @hidden */\n get allAreSelected(): boolean {\n return this.selectedItems.length === this.flatItems.length;\n }\n\n /** @hidden */\n get someAreSelected(): boolean {\n return this.selectedItems.length > 0 && !this.allAreSelected;\n }\n\n /** @hidden */\n get checkboxValue(): boolean | null {\n if (this.allAreSelected) {\n return true;\n }\n if (this.someAreSelected) {\n return null;\n }\n return false;\n }\n\n /** @hidden */\n private _destroyRef = inject(DestroyRef);\n\n /** @hidden */\n private changeDetector: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n /** @hidden */\n @HostListener('keydown.enter', ['$event'])\n @HostListener('keydown.space', ['$event'])\n onKeyDown($event: Event): void {\n $event.preventDefault();\n this.change(!this.checkboxValue);\n }\n\n /** @hidden */\n @HostListener('click')\n onClick(): void {\n this.elementRef.nativeElement.focus();\n this.change(!this.checkboxValue);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this.tabindex = 0;\n this.valueChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\n this.changeDetector.detectChanges();\n });\n }\n\n /** @hidden */\n change(value: boolean): void {\n this.selectAllHandler(value);\n }\n}\n","import { A, CONTROL, DOWN_ARROW, ENTER, ESCAPE, SPACE, UP_ARROW } from '@angular/cdk/keycodes';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InjectionToken,\n Injector,\n Input,\n OnInit,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n viewChildren\n} from '@angular/core';\nimport { outputToObservable } from '@angular/core/rxjs-interop';\nimport { DataSourceDirective, FD_DATA_SOURCE_TRANSFORMER, MatchingStrategy } from '@fundamental-ngx/cdk/data-source';\nimport { CvaControl, CvaDirective, OptionItem, SelectItem, SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport {\n AutoCompleteDirective,\n AutoCompleteEvent,\n ContentDensity,\n DynamicComponentService,\n FocusEscapeDirection,\n FocusTrapService,\n KeyUtil,\n SearchHighlightPipe,\n TemplateDirective,\n TruncatedTitleDirective,\n coerceArraySafe,\n resizeObservable\n} from '@fundamental-ngx/cdk/utils';\nimport {\n FD_LIST_COMPONENT,\n ListComponent,\n ListGroupHeaderDirective,\n ListItemComponent,\n ListSecondaryDirective,\n ListTitleDirective\n} from '@fundamental-ngx/core/list';\nimport { MobileModeConfig } from '@fundamental-ngx/core/mobile-mode';\nimport { PopoverFillMode } from '@fundamental-ngx/core/shared';\n\nimport { contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';\nimport { TokenComponent, TokenizerComponent } from '@fundamental-ngx/core/token';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { BaseMultiCombobox } from './base-multi-combobox.class';\nimport { MobileMultiComboboxComponent } from './mobile/mobile-multi-combobox.component';\nimport { MULTI_COMBOBOX_COMPONENT } from './multi-combobox.token';\n\nimport { MultiComboboxDataSourceParser } from './data-source/multi-combobox-data-source-parser';\n\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { CheckboxComponent } from '@fundamental-ngx/core/checkbox';\nimport { FormControlComponent, FormInputMessageGroupComponent, FormMessageComponent } from '@fundamental-ngx/core/form';\nimport { InputGroupComponent, InputGroupInputDirective } from '@fundamental-ngx/core/input-group';\nimport { PopoverBodyComponent, PopoverComponent, PopoverControlComponent } from '@fundamental-ngx/core/popover';\nimport { FD_LANGUAGE_SIGNAL, FdTranslatePipe, TranslationResolver } from '@fundamental-ngx/i18n';\nimport { shallowEqual } from 'fast-equals';\nimport { getSelectItemByInputValue, getTokenIndexByIdlOrValue } from './helpers';\nimport { MultiComboboxSelectionChangeEvent } from './models/selection-change.event';\nimport { MultiAnnouncerDirective } from './multi-announcer/multi-announcer.directive';\nimport { SelectAllTogglerComponent } from './select-all-toggler/select-all-toggler.component';\n\nexport const FD_MAP_LIMIT = new InjectionToken<number>('Map limit≥', { factory: () => 12 });\n\n@Component({\n selector: 'fd-multi-combobox',\n templateUrl: './multi-combobox.component.html',\n styleUrl: './multi-combobox.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CvaDirective,\n inputs: ['id:inputId', 'placeholder', 'state', 'stateMessage', 'disabled', 'readonly', 'name']\n },\n {\n directive: DataSourceDirective,\n inputs: ['dataSource'],\n outputs: ['dataChanged']\n }\n ],\n providers: [\n CvaControl,\n DynamicComponentService,\n contentDensityObserverProviders(),\n {\n provide: FD_DATA_SOURCE_TRANSFORMER,\n useClass: MultiComboboxDataSourceParser\n },\n {\n provide: MULTI_COMBOBOX_COMPONENT,\n useExisting: MultiComboboxComponent\n }\n ],\n imports: [\n NgTemplateOutlet,\n PopoverComponent,\n PopoverControlComponent,\n PopoverBodyComponent,\n FormInputMessageGroupComponent,\n InputGroupComponent,\n TokenizerComponent,\n TokenComponent,\n FormsModule,\n AutoCompleteDirective,\n FormControlComponent,\n InputGroupInputDirective,\n FormMessageComponent,\n ListComponent,\n SelectAllTogglerComponent,\n ListGroupHeaderDirective,\n ListTitleDirective,\n ListItemComponent,\n CheckboxComponent,\n NgClass,\n ListSecondaryDirective,\n FdTranslatePipe,\n SearchHighlightPipe,\n MultiAnnouncerDirective,\n TruncatedTitleDirective\n ]\n})\nexport class MultiComboboxComponent<T = any> extends BaseMultiCombobox<T> implements AfterViewInit, OnInit {\n /**\n * Configuration object for mobile mode appearance and behavior.\n * Only applies when `mobile` is true.\n */\n @Input()\n mobileConfig: MobileModeConfig;\n\n /**\n * Sets the currently selected items.\n */\n @Input()\n set selectedItems(value: T[] | null | undefined) {\n this._setSelectedItems(coerceArraySafe(value as T | T[]));\n }\n\n /**\n * Read-only array of currently selected items (backward-compatible API).\n */\n get selectedItems(): T[] {\n return this._selectedItems();\n }\n\n /**\n * Sets or gets the currently selected value.\n */\n @Input()\n set value(value: T[]) {\n this.setValue(value, true);\n }\n\n /**\n * Gets the current value from the form control.\n * @returns The current array of selected items\n */\n get value(): T[] {\n return this._cva.value;\n }\n\n /**\n * Show select all checkbox\n * @defaultValue false\n */\n readonly showSelectAll = input(false, { transform: booleanAttribute });\n\n /**\n * Maximum height of the dropdown options panel.\n * @defaultValue '250px'\n */\n readonly maxHeight = input('250px');\n\n /**\n * Controls whether the addon button can receive keyboard focus.\n * @defaultValue false\n */\n readonly buttonFocusable = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the autocomplete should be enabled; Enabled by default.\n * @defaultValue true\n */\n readonly autoComplete = input(true, { transform: booleanAttribute });\n\n /**\n * Whether list item options should be rendered as byline.\n * @defaultValue false\n */\n readonly byline = input(false, { transform: booleanAttribute });\n\n /**\n * Max width of multi combobox dropdown body.\n * `none` will not limit width of the dropdown.\n * `container` will limit width of the dropdown to the width of the multi-input itself.\n * `number` will limit width of the dropdown by provided number in pixels.\n *\n * @defaultValue 'none'\n */\n readonly bodyMaxWidth = input<'none' | 'container' | number>('none');\n\n /**\n * Computed maximum width for the popover in pixels.\n * @hidden\n */\n get _popoverMaxWidth(): number | null {\n const bodyMaxWidth = this.bodyMaxWidth();\n if (bodyMaxWidth === 'none') {\n return null;\n }\n\n if (typeof bodyMaxWidth === 'number') {\n return bodyMaxWidth;\n }\n\n return this._elementRef.nativeElement.getBoundingClientRect().width;\n }\n\n /**\n * TODO: Name of the entity for which DataProvider will be loaded. You can either pass list of\n * items or use this entityClass and internally we should be able to do lookup to some registry\n * and retrieve the best matching DataProvider that is set on application level\n */\n readonly entityClass = input<string>();\n\n /**\n * Enables mobile-optimized rendering mode.\n * When enabled, displays the combobox in a full-screen dialog optimized for touch devices.\n * Requires `mobileConfig` for full customization.\n *\n * @defaultValue false\n */\n readonly mobile = input(false, { transform: booleanAttribute });\n\n /**\n * Controls whether items should be grouped in the dropdown.\n * When enabled, items are organized by the property specified in `groupKey`.\n * Groups display as headers with items nested underneath.\n *\n * @defaultValue false\n */\n group = input(false, { transform: booleanAttribute });\n\n /**\n * Property path for grouping items.\n * Specifies which property to use for grouping items when `group` is enabled.\n *\n * @example\n * ```typescript\n * groupKey = input('department'); // Groups by item.department\n * ```\n *\n * @defaultValue ''\n */\n groupKey = input<string>('');\n\n /**\n * Property path for secondary text display.\n * When `showSecondaryText` is enabled, displays this property as secondary text below the main label.\n *\n * @defaultValue ''\n */\n secondaryKey = input<string>('');\n\n /**\n * Controls visibility of the secondary text column.\n * When enabled, displays secondary text from the `secondaryKey` property in a two-column layout.\n *\n * @defaultValue false\n */\n showSecondaryText = input(false, { transform: booleanAttribute });\n\n /**\n * Horizontally align text inside the second column (applicable for two columns layout).\n *\n * @defaultValue 'right'\n */\n readonly secondaryTextAlignment = input<'left' | 'right'>('right');\n\n /**\n * Enables automatic width adjustment of the dropdown.\n * When enabled, the dropdown width automatically adjusts based on content.\n * Disable for fixed-width dropdowns.\n *\n * @defaultValue true\n */\n readonly autoResize = input(true, { transform: booleanAttribute });\n\n /**\n * Controls whether clicking the addon button opens the dropdown.\n * @defaultValue true\n */\n readonly openDropdownOnAddOnClicked = input(true, { transform: booleanAttribute });\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 readonly fillControlMode = input<PopoverFillMode>('at-least');\n\n /** Sets title attribute to addon button. */\n readonly addonIconTitle = input<string>();\n\n /**\n * @deprecated Use the i18n module to modify the translation for this string.\n * Sets invalid entry message.\n * */\n invalidEntryMessage = input<string | null | undefined>(null);\n\n /** Turns limitless mode, ON or OFF */\n limitless = model<boolean>(false);\n\n /**\n * Used in filters and any kind of comparators when we work with objects and this identify\n * unique field name based on which we are going to do the job\n */\n lookupKey = input<string>('');\n\n /**\n * When we deal with unknown object we can use `displayKey` to retrieve value from specific\n * property of the object to act as display value.\n *\n * @See ComboBox, Select, RadioGroup, CheckBox Group\n */\n displayKey = input<string>('');\n\n /**\n * List of values, it can be of type SelectItem, string or any object.\n * Generic object type is among the list of types,\n * because we allow to get labels and values using `displayKey` and `lookupKey` inputs accordingly.\n */\n readonly list = input<Array<SelectItem | string | object>>();\n\n /**\n * Time in ms for how long message of invalid entry should be displayed.\n * @defaultValue 3000\n */\n invalidEntryDisplayTime = input<number>(3000);\n\n /**\n * String matching strategy for typeahead list.\n * Available options: 'starts with per term', 'starts with', 'contains'\n * @defaultValue MatchingStrategy.STARTS_WITH_PER_TERM\n */\n readonly matchingStrategy = input(MatchingStrategy.STARTS_WITH_PER_TERM);\n\n /** Event emitted when item is selected. */\n selectionChange = output<MultiComboboxSelectionChangeEvent>();\n\n /** @hidden Emits event when the menu is opened/closed. */\n isOpenChange = output<boolean>();\n\n /** Emits event when the addon button is clicked. */\n addOnButtonClicked = output<Event>();\n\n /** Event emitted when data loading is started. */\n dataRequested = output<boolean>();\n\n /** Event emitted when data loading is finished. */\n dataReceived = output<boolean>();\n\n /**\n * References the search input element within the template.\n * @hidden\n */\n readonly searchInputElement = viewChild<FormControlComponent>('searchInputElement');\n\n /**\n * @hidden\n * Custom Option item Template.\n */\n optionItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Group Header item Template.\n */\n groupItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Secondary item Template.\n */\n secondaryItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Selected option item Template.\n */\n selectedItemTemplate: TemplateRef<any>;\n\n /**\n * Observable version of selectionChange for template use.\n *\n * @remarks\n * Used internally for components that require an Observable instead of OutputEmitterRef until we migrate everything to signals\n * Converts the output signal to an RxJS Observable.\n *\n * @hidden\n */\n readonly selectionChange$ = outputToObservable(this.selectionChange);\n\n /**\n * Content density mode for the component.\n * @hidden\n */\n _contentDensity: ContentDensity = this._multiComboboxConfig?.contentDensity ?? 'cozy';\n\n /**\n * Computed signal for the current input text value.\n * @returns Computed signal containing the current input text\n */\n inputText = computed(() => this._inputText() || '');\n\n /**\n * Indicates whether the search field is empty.\n * @returns true if the search field is empty, false otherwise\n */\n get isEmptyValue(): boolean {\n return this.inputText().trim().length === 0;\n }\n\n /**\n * Computed signal indicating whether grouping is active.\n * @hidden\n */\n isGroup = computed(() => !!(this.group() && this.groupKey()));\n\n /**\n * Tracks whether the dropdown is currently open.\n */\n isOpen = false;\n\n /**\n * @hidden\n * Max width of list container\n */\n maxWidth: number;\n\n /**\n * @hidden\n * Min width of list container\n */\n minWidth: number;\n\n /**\n * @hidden\n * Subject for communicating dropdown open/close state to mobile mode component.\n */\n openChange = new Subject<boolean>();\n\n /**\n * Internal writable signal storing the array of selected items.\n *\n * @remarks\n * Provides the underlying storage for the `selectedItems` property.\n * Modified through `_setSelectedItems()` to ensure proper coercion.\n *\n * @hidden Internal writable signal for selected items\n */\n protected readonly _selectedItems = signal<T[]>([]);\n\n /**\n * Internal writable signal storing the current input text.\n *\n * @remarks\n * Provides the underlying storage for the `inputText` computed signal.\n * Modified through `_setInputText()` to ensure side effects (like `onTouched`) are triggered.\n *\n * @hidden Internal writable signal for input text\n */\n protected readonly _inputText = signal<string>('');\n\n /**\n * Reference to the list component instance.\n * @hidden\n */\n private readonly listComponent = viewChild(FD_LIST_COMPONENT);\n\n /**\n * Collection of custom templates provided by content projection.\n * @hidden\n */\n private readonly customTemplates = contentChildren(TemplateDirective);\n\n /**\n * Template reference for the mobile mode control.\n * @hidden\n */\n private readonly mobileControlTemplate = viewChild<TemplateRef<any>>('mobileControlTemplate');\n\n /**\n * Template reference for the dropdown list.\n * @hidden\n */\n private readonly listTemplate = viewChild<TemplateRef<any>>('listTemplate');\n\n /**\n * Reference to the tokenizer component instance.\n * @hidden\n */\n private readonly _tokenizer = viewChild<TokenizerComponent>(TokenizerComponent);\n\n /**\n * Reference to the input group element.\n * @hidden\n */\n private readonly _inputGroup = viewChild('inputGroup', { read: ElementRef });\n\n /**\n * @hidden\n */\n private readonly items = viewChildren('item', { read: ElementRef });\n\n /**\n * Observable stream of the current language configuration.\n * @hidden\n */\n private readonly _langSignal = inject(FD_LANGUAGE_SIGNAL);\n\n /**\n * Helper for resolving translation keys to localized strings.\n * @hidden\n */\n private _translationResolver = new TranslationResolver();\n\n /** @hidden */\n constructor(\n private readonly _elementRef: ElementRef,\n private readonly _viewContainerRef: ViewContainerRef,\n private readonly _dynamicComponentService: DynamicComponentService,\n private readonly _focusTrapService: FocusTrapService\n ) {\n super();\n\n this.contentDensityObserver.subscribe();\n\n // Effect for language changes\n effect(() => {\n const lang = this._langSignal();\n this._invalidEntryMessageOverride.set(\n this._translationResolver.resolve(lang, 'platformMultiCombobox.invalidEntryError')\n );\n });\n }\n\n /** @hidden */\n ngOnInit(): void {\n this.cvaControl.listenToChanges();\n this._openDataStream(this.matchingStrategy());\n }\n\n /** @hidden */\n async ngAfterViewInit(): Promise<void> {\n if (this.mobile()) {\n await this._setUpMobileMode();\n }\n\n this._assignCustomTemplates();\n\n this._initWindowResize();\n }\n\n /** @hidden */\n _toggleSelection(item: SelectableOptionItem, fromTokenCloseClick = false): void {\n const selectedSuggestions = this._selectedSuggestions();\n const idx = getTokenIndexByIdlOrValue(item, selectedSuggestions);\n if (idx === -1) {\n this._selectedSuggestions.set([...selectedSuggestions, item]);\n } else {\n this._selectedSuggestions.set(selectedSuggestions.filter((_, i) => i !== idx));\n }\n\n item.selected = !item.selected;\n\n this._propagateChange(fromTokenCloseClick);\n\n this._cd.detectChanges();\n }\n\n /** @hidden */\n _onOptionCheckboxClicked(event: MouseEvent, index: number): void {\n event.stopPropagation();\n this._onListElementClicked(event, index);\n this._setInputText('');\n this._searchTermChanged('');\n }\n\n /** @hidden */\n _onCompleteTerm(event: AutoCompleteEvent): void {\n if (event.forceClose) {\n this._toggleSelectionByInputText(event.term);\n this.close();\n }\n }\n\n /**\n * @hidden\n * Method that selects all possible options.\n * *select* attribute – if *true* select all, if *false* unselect all\n * */\n _handleSelectAllItems = (select: boolean): void => {\n this._flatSuggestions.update((items) => items.map((item) => ({ ...item, selected: select })));\n this._suggestions.update((items) => this._updateSelectionRecursive(items, select));\n this._selectedSuggestions.set(select ? [...this._flatSuggestions()] : []);\n this._rangeSelector.reset();\n this._setInputText('');\n\n this._propagateChange();\n };\n\n /** @hidden */\n _navigateByTokens(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, [DOWN_ARROW, UP_ARROW]) && this.isOpen) {\n this.listComponent()?.items?.first.focus();\n }\n }\n\n /** @hidden */\n _removeToken(token: SelectableOptionItem, event?: MouseEvent): void {\n if (event) {\n event.preventDefault();\n }\n const optionItem = this._flatSuggestions().find((s) => s.value === token.value);\n if (optionItem) {\n this._toggleSelection(optionItem, true);\n this._rangeSelector.reset();\n }\n }\n\n /** @hidden */\n _moreClicked(): void {\n const selectedSuggestions = this._selectedSuggestions();\n this._suggestions.set(\n this.isGroup()\n ? this._convertObjectsToGroupOptionItems(selectedSuggestions.map(({ value }) => value))\n : this._suggestions().filter((value) =>\n selectedSuggestions.some((item) => shallowEqual(item.value, value.value))\n )\n );\n\n this._showList(true);\n this.selectedShown.set(true);\n this._cd.detectChanges();\n }\n\n /** @hidden */\n _onBlur(event: FocusEvent): void {\n const target = event.relatedTarget as HTMLElement;\n if (target) {\n const isList = !!target.closest('.fd-multi-combobox__list-container');\n if (isList) {\n return;\n }\n const suggestions = this._suggestions();\n if (suggestions?.length === 1 && suggestions[0].label === this.inputText() && !suggestions[0].selected) {\n this._toggleSelection(suggestions[0]);\n }\n this._showList(false);\n this._setInputText('');\n }\n this._cva.onTouched();\n }\n\n /** @hidden */\n _onItemKeyDownHandler(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, ESCAPE)) {\n this._focusToSearchField();\n } else if ((event.ctrlKey || event.metaKey) && event.shiftKey && KeyUtil.isKeyCode(event, A)) {\n event.preventDefault();\n this._handleSelectAllItems(false);\n } else if ((event.ctrlKey || event.metaKey) && KeyUtil.isKeyCode(event, A)) {\n event.preventDefault();\n this._handleSelectAllItems(true);\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n if (!this.mobile()) {\n this.close();\n }\n this._rangeSelector.reset();\n } else if (KeyUtil.isKeyCode(event, SPACE)) {\n this._rangeSelector.reset();\n }\n }\n\n /** @hidden */\n _onOptionClicked(event: MouseEvent, index: number): void {\n this._onListElementClicked(event, index);\n this.close();\n }\n\n /**\n * @hidden\n * Handle dialog dismissing, closes popover and sets backup data.\n */\n _dialogDismiss(backup: SelectableOptionItem[]): void {\n this._selectedSuggestions.set([...backup]);\n this._setInputText('');\n this._showList(false);\n this.selectedShown.set(false);\n }\n\n /**\n * @hidden\n * Handle dialog approval, closes popover and propagates data changes.\n */\n _dialogApprove(): void {\n this._setInputText('');\n this._showList(false);\n this._propagateChange(true);\n }\n\n /** @hidden */\n _popoverOpenChangeHandle(isOpen: boolean): void {\n this.isOpen = isOpen;\n\n /** Allow combobox up and down arrows to work properly when multi combobox is inside a dialog with a trapped focus */\n if (this.isOpen) {\n this._focusTrapService.pauseCurrentFocusTrap();\n } else {\n this._focusTrapService.unpauseCurrentFocusTrap();\n }\n\n this._rangeSelector.reset();\n if (!isOpen) {\n this._cva.onTouched();\n }\n }\n\n /** Opens the select popover body. */\n open(): void {\n this.isOpen = true;\n this.isOpenChange.emit(this.isOpen);\n this._cd.markForCheck();\n }\n\n /** Closes the select popover body. */\n close(): void {\n this._focusToSearchField();\n this._rangeSelector.reset();\n this.selectedShown.set(false);\n this._setInputText('');\n\n this.isOpen = false;\n this.isOpenChange.emit(this.isOpen);\n this._cva.onTouched();\n this._cd.markForCheck();\n }\n\n /** @hidden */\n _showList(isOpen: boolean): void {\n if (this.isOpen !== isOpen) {\n this.isOpen = isOpen;\n this._cva.onTouched();\n this.openChange.next(isOpen);\n }\n\n if (!this.isOpen) {\n this._searchTermChanged('');\n }\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n _searchTermChanged(text: string = this.inputText()): void {\n const map = new Map();\n map.set('query', text);\n\n if (!this.limitless()) {\n map.set('limit', this._mapLimit);\n } else {\n map.set('limit', Number.MAX_SAFE_INTEGER);\n }\n\n this.dataSourceDirective.dataSourceProvider?.match(map);\n\n if (text) {\n this.open();\n }\n\n this._cd.markForCheck();\n }\n\n /**\n * Handle Click on Button\n * @hidden\n */\n _onPrimaryButtonClick(isOpen: boolean): void {\n if (!isOpen) {\n this._searchTermChanged('');\n }\n\n if (this.openDropdownOnAddOnClicked()) {\n this._showList(!isOpen);\n } else if (this.isOpen) {\n this._showList(false);\n }\n\n if (this.isOpen) {\n this.searchInputElement()?.elementRef.nativeElement.focus();\n }\n }\n\n /**\n * Handle Keydown on Input\n * @hidden\n */\n _onInputKeydownHandler(event: KeyboardEvent): void {\n if (this._cva.readonly) {\n return;\n }\n\n if (KeyUtil.isKeyCode(event, DOWN_ARROW)) {\n event.preventDefault();\n\n if (event.altKey) {\n this._showList(true);\n }\n\n const listComponent = this.listComponent();\n if (this.isOpen && listComponent) {\n listComponent.setItemActive(0);\n } else if (!this.isOpen) {\n this._chooseOtherItem(1);\n }\n } else if (KeyUtil.isKeyCode(event, UP_ARROW)) {\n event.preventDefault();\n\n this._chooseOtherItem(-1);\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n this._toggleSelectionByInputText();\n } else if (!KeyUtil.isKeyCode(event, [...this._nonOpeningKeys, CONTROL])) {\n this._showList(true);\n const acceptedKeys =\n !KeyUtil.isKeyType(event, 'alphabetical') &&\n !KeyUtil.isKeyType(event, 'numeric') &&\n !KeyUtil.isKeyType(event, 'ime');\n if (acceptedKeys) {\n // SetTimeout is needed for input to receive new value.\n setTimeout(() => {\n if (this.isEmptyValue) {\n this.listComponent()?.setItemActive(0);\n }\n });\n }\n }\n }\n\n /**\n * @hidden\n * Method passed to list component.\n */\n _handleListFocusEscape(direction: FocusEscapeDirection): void {\n if (direction === 'up') {\n this._focusToSearchField();\n }\n }\n\n /**\n * @hidden\n */\n _addOnClicked($event: Event): void {\n this.addOnButtonClicked.emit($event);\n if (!this.mobile()) {\n this._onPrimaryButtonClick(this.isOpen);\n }\n }\n\n /** @hidden */\n _setLimitless(limitless: boolean): void {\n this.limitless.set(limitless);\n }\n\n /** @hidden */\n _getMapLimit(): number {\n return this.limitless() ? (this.dataSourceDirective.dataSource as any[]).length : this._mapLimit;\n }\n\n /** @hidden */\n _getGroupItemIds(groupIndex: number): string {\n const items = this.items();\n if (!items?.length) {\n return '';\n }\n\n const groupItemIds = items\n .filter((el) => {\n const idWithGroup = el.nativeElement.getAttribute('id-with-group-index');\n if (!idWithGroup) {\n return false;\n }\n const groupIdx = idWithGroup.split('-')[idWithGroup.split('-').length - 1];\n return groupIdx === String(groupIndex);\n })\n .map((el) => el.nativeElement.getAttribute('id'));\n\n return groupItemIds?.join(' ');\n }\n\n /**\n * Updates the selected items with proper array coercion.\n *\n * @param value - The new array of selected items\n *\n * @remarks\n * Ensures the value is always a valid array, even if null or undefined is provided.\n * Use this method instead of directly setting `_selectedItems`.\n *\n * @hidden Protected method for internal writes with coercion\n */\n protected _setSelectedItems(value: T[]): void {\n this._selectedItems.set(coerceArraySafe(value));\n }\n\n /**\n * Updates the input text and triggers form control touch event.\n *\n * @param value - The new input text value\n *\n * @remarks\n * Sets the input text and calls `onTouched()` to mark the form control as touched.\n * Ensures proper integration with Angular forms and validation.\n *\n * @hidden Protected method for setting input text with side effects\n */\n protected _setInputText(value: string): void {\n this._inputText.set(value);\n this._cva.onTouched();\n }\n\n /**\n * @hidden\n * Recursively update selection state for items and their children (for grouped suggestions)\n */\n private _updateSelectionRecursive(items: SelectableOptionItem[], selected: boolean): SelectableOptionItem[] {\n return items.map((item) => ({\n ...item,\n selected,\n children: item.children ? this._updateSelectionRecursive(item.children, selected) : undefined\n }));\n }\n\n /** @hidden */\n private _toggleSelectionByInputText(text = this.inputText()): void {\n const item = getSelectItemByInputValue<T>(this._fullFlatSuggestions(), text);\n if (item) {\n this._toggleSelection(item);\n this._setInputText('');\n }\n\n this._searchTermChanged();\n }\n\n /**\n * @hidden\n * Method to set input text as item label.\n */\n private _setInputTextFromOptionItem(item: OptionItem): void {\n this._setInputText(item.label);\n\n if (this.mobile()) {\n return;\n }\n\n this._showList(false);\n }\n\n /**\n * @hidden\n * applying range selection. Note, that this function will be invoked after combobox item's value has been changed\n */\n private _onListElementClicked(event: MouseEvent, index: number): void {\n // value has been changed at this point, so it can be safely used\n const flatSuggestions = this._flatSuggestions();\n const selectionState = flatSuggestions[index].selected;\n this._rangeSelector.onRangeElementToggled(index, event);\n\n // Collect items to add/remove from selected suggestions\n const toRemove = new Set<any>();\n const toAdd: SelectableOptionItem[] = [];\n const indicesToUpdate = new Set<number>();\n\n this._rangeSelector.applyValueToEachInRange((idx) => {\n const item = flatSuggestions[idx];\n if (item.selected !== selectionState) {\n indicesToUpdate.add(idx);\n // Track what will change based on OLD state before the update\n if (item.selected) {\n // Item is currently selected, will be deselected\n toRemove.add(item.value);\n } else {\n // Item is currently not selected, will be selected\n toAdd.push({ ...item, selected: selectionState });\n }\n }\n });\n\n // Update flat suggestions immutably\n this._flatSuggestions.update((items) =>\n items.map((item, idx) => (indicesToUpdate.has(idx) ? { ...item, selected: selectionState } : item))\n );\n\n // Update selected suggestions\n this._selectedSuggestions.update((selected) => [...selected.filter((s) => !toRemove.has(s.value)), ...toAdd]);\n\n this._propagateChange();\n\n const tokenizer = this._tokenizer();\n if (tokenizer !== undefined) {\n tokenizer.onResize();\n tokenizer.tokenizerInnerEl.nativeElement.scrollLeft = tokenizer.tokenizerInnerEl.nativeElement.scrollWidth;\n }\n }\n\n /** @hidden */\n private _propagateChange(emitInMobile?: boolean): void {\n if (!this.mobile() || emitInMobile) {\n this._mapAndUpdateModel();\n }\n }\n\n /** @hidden */\n private async _setUpMobileMode(): Promise<void> {\n const injector = Injector.create({\n providers: [{ provide: MULTI_COMBOBOX_COMPONENT, useValue: this }],\n parent: this._injector\n });\n\n this._dynamicComponentService.createDynamicComponent(\n { listTemplate: this.listTemplate(), controlTemplate: this.mobileControlTemplate() },\n MobileMultiComboboxComponent,\n {\n containerRef: this._viewContainerRef\n },\n { injector }\n );\n }\n\n /**\n * @hidden\n * Method that picks other value moved from current one by offset, called only when Multi Combobox is closed.\n */\n private _chooseOtherItem(offset: number): void {\n const selectedSuggestions = this._selectedSuggestions();\n const flatSuggestions = this._flatSuggestions();\n if (selectedSuggestions?.length === flatSuggestions.length) {\n this._setInputText('');\n return;\n }\n\n const fullFlatSuggestions = this._fullFlatSuggestions();\n const activeValue = getSelectItemByInputValue<T>(fullFlatSuggestions, this.inputText());\n const index = flatSuggestions.findIndex((value) => value === activeValue);\n const position = !this.inputText() && offset === -1 ? flatSuggestions.length - 1 : index + offset;\n const item = flatSuggestions[position];\n\n if (item) {\n this._setInputTextFromOptionItem(item);\n }\n\n const selectedIndex = selectedSuggestions.findIndex((value) => value.label === item?.label);\n if (selectedIndex !== -1) {\n this._chooseOtherItem(offset);\n }\n }\n\n /** @hidden */\n private _initWindowResize(): void {\n this._getOptionsListWidth();\n\n if (!this.autoResize()) {\n return;\n }\n\n resizeObservable(this._inputGroup()?.nativeElement)\n .pipe(debounceTime(30), takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._getOptionsListWidth());\n }\n\n /** @hidden */\n private _getOptionsListWidth(): void {\n const body = document.body;\n const rect = this._inputGroup()?.nativeElement.getBoundingClientRect();\n const scrollBarWidth = body.offsetWidth - body.clientWidth;\n this.maxWidth = this.autoResize() ? window.innerWidth - scrollBarWidth - rect.left : this.minWidth;\n this._cd.detectChanges();\n }\n\n /**\n * @hidden\n * Assign custom templates\n */\n private _assignCustomTemplates(): void {\n this.customTemplates().forEach((template) => {\n switch (template.name()) {\n case 'optionItemTemplate':\n this.optionItemTemplate = template.templateRef;\n break;\n case 'groupItemTemplate':\n this.groupItemTemplate = template.templateRef;\n break;\n case 'secondaryItemTemplate':\n this.secondaryItemTemplate = template.templateRef;\n break;\n case 'selectedItemTemplate':\n this.selectedItemTemplate = template.templateRef;\n break;\n }\n });\n }\n}\n","<div class=\"fd-multi-combobox\">\n @if (mobile()) {\n <ng-template [ngTemplateOutlet]=\"controlTemplate\"></ng-template>\n } @else {\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list fd-multi-combobox__list-container\"\n (isOpenChange)=\"_popoverOpenChangeHandle($event)\"\n [isOpen]=\"isOpen\"\n [triggers]=\"[]\"\n [disabled]=\"_cva.disabled\"\n [maxWidth]=\"_popoverMaxWidth\"\n [fillControlMode]=\"fillControlMode()\"\n >\n <fd-popover-control>\n <ng-template [ngTemplateOutlet]=\"controlTemplate\"></ng-template>\n </fd-popover-control>\n <fd-popover-body [style.width.%]=\"!autoResize() && 100\">\n <ng-template [ngTemplateOutlet]=\"listTemplate\"></ng-template>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n }\n</div>\n<ng-template #controlTemplate>\n <fd-form-input-message-group>\n <fd-input-group\n #inputGroup\n [id]=\"_cva.id + '-input-group-container'\"\n [state]=\"_cva.state\"\n [buttonFocusable]=\"buttonFocusable()\"\n [button]=\"!_cva.readonly\"\n [glyph]=\"!_cva.readonly ? 'navigation-down-arrow' : ' '\"\n [isControl]=\"true\"\n [disabled]=\"_cva.disabled || _cva.readonly\"\n [isExpanded]=\"!mobile() && isOpen && _suggestions().length > 0\"\n [attr.aria-disabled]=\"_cva.disabled || _cva.readonly\"\n [attr.aria-readonly]=\"_cva.readonly\"\n [glyphAriaLabel]=\"_cva.ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)()\"\n [iconTitle]=\"addonIconTitle() || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)()\"\n (addOnButtonClicked)=\"_addOnClicked($event)\"\n (click)=\"mobile() && !isOpen && _onPrimaryButtonClick(false)\"\n (keydown)=\"_navigateByTokens($event)\"\n >\n <fd-tokenizer\n [tokenizerFocusable]=\"false\"\n [compactCollapse]=\"true\"\n [showOverflowPopover]=\"false\"\n #tokenizer\n class=\"fd-multi-combobox-tokenizer-custom\"\n (moreClickedEvent)=\"_moreClicked()\"\n fdMultiAnnouncer\n [multiAnnouncerOptions]=\"_suggestions()\"\n >\n @for (token of _selectedSuggestions(); track token.id) {\n <fd-token [readOnly]=\"_cva.disabled\" (onCloseClick)=\"_removeToken(token, $event)\">\n {{ token.label }}\n </fd-token>\n }\n <input\n #searchInputElement\n fdkAutoComplete\n (onComplete)=\"_onCompleteTerm($event)\"\n [options]=\"_suggestions()\"\n [inputText]=\"_inputText()\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [ariaLabel]=\"('coreMultiComboBox.multiComboBoxAriaLabel' | fdTranslate)()\"\n [attr.aria-labelledby]=\"_cva.ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete() && !mobile() ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete() && !mobile() ? _cva.id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete() && !mobile()\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"_cva.id\"\n [name]=\"_cva.name\"\n (keydown)=\"_onInputKeydownHandler($event)\"\n [disabled]=\"_cva.disabled\"\n [ngModel]=\"_inputText()\"\n (ngModelChange)=\"_setInputText($event); _searchTermChanged()\"\n [attr.placeholder]=\"_selectedSuggestions().length ? null : _cva.placeholder\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"!mobile() && _onBlur($event); tokenizer._hideTokens()\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"_cva.readonly\"\n [attr.aria-readonly]=\"_cva.readonly\"\n [attr.aria-required]=\"_cva.required\"\n [displayFn]=\"_displayFn\"\n class=\"fd-tokenizer__input fd-input-group__input\"\n />\n </fd-tokenizer>\n </fd-input-group>\n @if (mobile() && isOpen ? false : !!_cva.stateMessage) {\n <fd-form-message [type]=\"_cva.state\" [innerHtml]=\"_cva.stateMessage\"></fd-form-message>\n }\n </fd-form-input-message-group>\n</ng-template>\n<ng-template #mobileControlTemplate>\n <fd-input-group\n [id]=\"_cva.id + '-input-group-container'\"\n class=\"fd-multi-combobox-input-group-custom\"\n [state]=\"_cva.state\"\n [buttonFocusable]=\"false\"\n [isControl]=\"true\"\n [disabled]=\"_cva.disabled || _cva.readonly\"\n [isExpanded]=\"!mobile() && isOpen && _suggestions().length > 0\"\n [attr.aria-disabled]=\"_cva.disabled || _cva.readonly\"\n [attr.aria-readonly]=\"_cva.readonly\"\n [glyphAriaLabel]=\"_cva.ariaLabel\"\n >\n <input\n fdkAutoComplete\n (onComplete)=\"_onCompleteTerm($event)\"\n [options]=\"_suggestions()\"\n [inputText]=\"_inputText()\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [ariaLabel]=\"('coreMultiComboBox.multiComboBoxAriaLabel' | fdTranslate)()\"\n [attr.aria-labelledby]=\"_cva.ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete() && !mobile() ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete() && !mobile() ? _cva.id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete() && !mobile()\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"_cva.id\"\n [name]=\"_cva.name\"\n (keydown)=\"_onInputKeydownHandler($event)\"\n [disabled]=\"_cva.disabled\"\n [ngModel]=\"_inputText()\"\n (ngModelChange)=\"_setInputText($event); _searchTermChanged()\"\n [placeholder]=\"_cva.placeholder\"\n (focus)=\"_cva.onTouched()\"\n (blur)=\"!mobile() && _onBlur($event)\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"_cva.readonly\"\n [attr.aria-readonly]=\"_cva.readonly\"\n [displayFn]=\"_displayFn\"\n />\n </fd-input-group>\n</ng-template>\n<ng-template #listTemplate>\n <ul\n fd-list\n [byline]=\"byline()\"\n [selection]=\"byline()\"\n (focusEscapeList)=\"_handleListFocusEscape($event)\"\n class=\"fd-multi-combobox__list fd-list--multi-input\"\n [id]=\"_cva.id + '-result'\"\n role=\"listbox\"\n [style.max-height]=\"!mobile() && maxHeight()\"\n [style.min-width.px]=\"!mobile() && minWidth\"\n [style.max-width.px]=\"autoResize() && maxWidth\"\n [attr.aria-labelledby]=\"_cva.id + '-search'\"\n aria-multiselectable=\"true\"\n [tabindex]=\"0\"\n (keydown.tab)=\"close()\"\n (keydown.shift.tab)=\"close()\"\n (keydown.escape)=\"close()\"\n >\n @if (!!_cva.stateMessage) {\n <fd-form-message [type]=\"_cva.state\" [innerHtml]=\"_cva.stateMessage\"></fd-form-message>\n }\n @if (showSelectAll()) {\n <fd-multi-combobox-select-all-toggler\n [selectAllHandler]=\"_handleSelectAllItems\"\n [valueChanges]=\"selectionChange$\"\n [selectedItems]=\"_selectedSuggestions()\"\n [flatItems]=\"_flatSuggestions()\"\n ></fd-multi-combobox-select-all-toggler>\n }\n <ng-content></ng-content>\n @if (isGroup()) {\n @for (group of _suggestions(); track group.label; let groupIndex = $index) {\n @if (!groupItemTemplate) {\n <li\n fd-list-item\n fd-list-group-header\n ariaRole=\"group\"\n [attr.aria-roledescription]=\"('coreMultiComboBox.listGroupHeader' | fdTranslate)()\"\n [attr.aria-owns]=\"_getGroupItemIds(groupIndex)\"\n [attr.aria-label]=\"group.label\"\n >\n <span fd-list-title>{{ group.label }}</span>\n </li>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"groupItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { label: group.label } }\"\n ></ng-template>\n }\n @for (optionItem of group.children; track optionItem.id; let i = $index) {\n <li\n fd-list-item\n #item=\"fdListItem\"\n role=\"option\"\n (click)=\"!mobile() && _onOptionClicked($event, i)\"\n (keydown)=\"_onItemKeyDownHandler($event)\"\n [selected]=\"!!optionItem.selected\"\n [attr.id-with-group-index]=\"item.id + '-group-' + groupIndex\"\n [attr.aria-setsize]=\"group.children?.length\"\n [attr.aria-posinset]=\"i + 1\"\n >\n <fd-checkbox\n role=\"presentation\"\n (click)=\"_onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"_toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-template\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-template>\n </li>\n }\n }\n } @else {\n @for (optionItem of _suggestions(); track optionItem.id; let i = $index) {\n <li\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile() && _onOptionClicked($event, i)\"\n (keydown)=\"_onItemKeyDownHandler($event)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n role=\"presentation\"\n (click)=\"_onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"_toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-template\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-template>\n </li>\n }\n }\n </ul>\n</ng-template>\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #listItem>\n @if (optionItem.selected && !!selectedItemTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-template>\n }\n @if (!(optionItem.selected && selectedItemTemplate)) {\n <ng-template\n [ngTemplateOutlet]=\"optionItemSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: index }\"\n ></ng-template>\n <ng-template\n [ngTemplateOutlet]=\"secondaryTextSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem }\"\n ></ng-template>\n }\n</ng-template>\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #optionItemSource>\n @if (!optionItemTemplate) {\n <span\n fd-list-title\n [attr.title]=\"optionItem.label\"\n [innerHTML]=\"optionItem.label | highlight: _inputText()\"\n fdTruncatedTitle\n ></span>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"optionItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-template>\n }\n</ng-template>\n<ng-template let-optionItem=\"optionItem\" #secondaryTextSource>\n @if (showSecondaryText()) {\n @if (!secondaryItemTemplate) {\n <span\n [style.text-align]=\"secondaryTextAlignment()\"\n fd-list-secondary\n [attr.title]=\"optionItem.secondaryText\"\n [innerHTML]=\"optionItem.secondaryText | highlight: _inputText()\"\n ></span>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"secondaryItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value }\"\n ></ng-template>\n }\n }\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { MultiAnnouncerDirective } from './multi-announcer/multi-announcer.directive';\nimport { MultiComboboxComponent } from './multi-combobox.component';\nimport { SelectAllTogglerComponent } from './select-all-toggler/select-all-toggler.component';\n\n/**\n * @deprecated\n * Use direct imports of components and directives.\n */\n@NgModule({\n imports: [MultiComboboxComponent, SelectAllTogglerComponent, MultiAnnouncerDirective],\n exports: [MultiComboboxComponent, SelectAllTogglerComponent, MultiAnnouncerDirective]\n})\nexport class MultiComboboxModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fundamental-ngx/core",
|
|
3
|
-
"version": "0.62.0-rc.
|
|
3
|
+
"version": "0.62.0-rc.53",
|
|
4
4
|
"schematics": "./schematics/collection.json",
|
|
5
5
|
"ng-update": {
|
|
6
6
|
"migrations": "./schematics/migrations.json"
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
"@angular/forms": "^21.0.0",
|
|
24
24
|
"@angular/platform-browser": "^21.0.0",
|
|
25
25
|
"@angular/router": "^21.0.0",
|
|
26
|
-
"@fundamental-ngx/cdk": "0.62.0-rc.
|
|
27
|
-
"@fundamental-ngx/i18n": "0.62.0-rc.
|
|
26
|
+
"@fundamental-ngx/cdk": "0.62.0-rc.53",
|
|
27
|
+
"@fundamental-ngx/i18n": "0.62.0-rc.53",
|
|
28
28
|
"@sap-theming/theming-base-content": "^11.32.0",
|
|
29
29
|
"fundamental-styles": "0.41.0",
|
|
30
30
|
"rxjs": "^7.8.0"
|
|
@@ -303,7 +303,8 @@ declare abstract class BaseMultiCombobox<T = any> {
|
|
|
303
303
|
protected readonly _rangeSelector: RangeSelector;
|
|
304
304
|
/**
|
|
305
305
|
* Flag indicating whether the data source has changed.
|
|
306
|
-
*
|
|
306
|
+
* Guard flag: true while waiting for a new data source's first real data emission.
|
|
307
|
+
* Prevents the provider's initial empty emission from being treated as "no results."
|
|
307
308
|
* @hidden
|
|
308
309
|
*/
|
|
309
310
|
private _dataSourceChanged;
|
|
@@ -396,6 +397,22 @@ declare abstract class BaseMultiCombobox<T = any> {
|
|
|
396
397
|
protected _convertDataSourceSuggestions(data: T[]): void;
|
|
397
398
|
/** @hidden */
|
|
398
399
|
protected _processingEmptyData(): void;
|
|
400
|
+
/**
|
|
401
|
+
* @hidden
|
|
402
|
+
* Configures the data source provider with matching settings.
|
|
403
|
+
*/
|
|
404
|
+
private _configureDataSourceProvider;
|
|
405
|
+
/**
|
|
406
|
+
* @hidden
|
|
407
|
+
* Triggers the initial data fetch on the current data source provider.
|
|
408
|
+
*/
|
|
409
|
+
private _fetchInitialData;
|
|
410
|
+
/**
|
|
411
|
+
* @hidden
|
|
412
|
+
* Subscribes to dataRequested/dataReceived events from the current data source provider.
|
|
413
|
+
* Unsubscribes from previous provider's events first.
|
|
414
|
+
*/
|
|
415
|
+
private _subscribeToDsEvents;
|
|
399
416
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseMultiCombobox<any>, never>;
|
|
400
417
|
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseMultiCombobox<any>, never, never, {}, {}, never, never, true, never>;
|
|
401
418
|
}
|