Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | 1x 132x 132x 132x 157x 157x 511x 574x 190x 161x 9x 9x 42x 9x 40x 14x 26x 2x 1x 1x 1x 1x 40x 152x | /**
* Copyright (c) Siemens 2016 - 2025
* SPDX-License-Identifier: MIT
*/
import { computed, Directive, InputSignal, Signal, signal } from '@angular/core';
import { SelectItem, SelectOption } from '../si-select.types';
import { SiSelectOptionsStrategy } from './si-select-options-strategy';
/**
* Input options strategy base class, for eagerly fetched options.
*/
@Directive()
export abstract class SiSelectOptionsStrategyBase<T> implements SiSelectOptionsStrategy<T> {
/**
* Function to compare two values on equality which is used to match/filter options.
*/
abstract optionsEqual: InputSignal<(a: T, b: T) => boolean>;
/**
* Rows that should be shown.
*
* @defaultValue []
*/
readonly rows = signal<SelectItem<T>[]>([]);
/**
* All group and option items in the dropdown.
*
* @defaultValue []
*/
abstract readonly allRows: Signal<(SelectItem<T> | SelectOption<T>)[]>;
private readonly value = signal<T[]>([]);
readonly selectedRows = computed(() => {
const values = this.value();
return this.allRows()
.map(row => (row.type === 'group' ? row.options : row))
.flat()
.filter(option => values.some(value => this.optionsEqual()(value, option.value)));
});
onValueChange(value: T[]): void {
this.value.set(value);
}
onFilter(filterValue?: string): void {
if (filterValue) {
const filterValueLC = filterValue.toLowerCase();
const checkRow: (row: SelectOption<T>) => boolean = (row: SelectOption<T>) =>
(row.typeaheadLabel ?? row.label)!.toLowerCase().includes(filterValueLC!);
this.rows.set(
this.allRows().reduce((rows, row) => {
if (row.type === 'option' && checkRow(row)) {
rows.push(row);
} else if (row.type === 'group') {
if (row.label!.toLowerCase().includes(filterValueLC!)) {
rows.push(row);
} else {
const options = row.options.filter(checkRow);
if (options.length) {
rows.push({ ...row, options });
}
}
}
return rows;
}, [] as SelectItem<T>[])
);
} else {
this.rows.set(this.allRows());
}
}
}
|