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 78 79 80 81 82 83 84 85 86 | 1x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 9x 18x 9x | /**
* Copyright (c) Siemens 2016 - 2025
* SPDX-License-Identifier: MIT
*/
import { ConfigurableFocusTrap, ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';
import {
Directive,
ElementRef,
HostBinding,
HostListener,
inject,
input,
OnDestroy,
OnInit,
output,
TemplateRef
} from '@angular/core';
import {
SI_SELECT_OPTIONS_STRATEGY,
SiSelectOptionsStrategy
} from '../options/si-select-options-strategy';
import { SiSelectSelectionStrategy } from '../selection/si-select-selection-strategy';
import { SelectGroup, SelectOption } from '../si-select.types';
@Directive({
host: {
class: 'dropdown-menu position-static w-100 py-4 d-flex flex-column'
}
})
export abstract class SiSelectListBase<T> implements OnInit, OnDestroy {
readonly baseId = input.required<string>();
readonly optionTemplate = input<
TemplateRef<{
$implicit: SelectOption<T>;
}>
>();
readonly groupTemplate = input<
TemplateRef<{
$implicit: SelectGroup<T>;
}>
>();
/** @defaultValue null */
readonly labelledby = input<string | null>(null);
readonly actionsTemplate = input<TemplateRef<any>>();
readonly closeOverlay = output<void>();
protected readonly selectionStrategy =
inject<SiSelectSelectionStrategy<T>>(SiSelectSelectionStrategy);
protected readonly selectOptions = inject<SiSelectOptionsStrategy<T>>(SI_SELECT_OPTIONS_STRATEGY);
protected readonly focusTrapFactory = inject(ConfigurableFocusTrapFactory);
protected readonly elementRef = inject(ElementRef);
protected rows = this.selectOptions.rows;
protected focusTrap!: ConfigurableFocusTrap;
@HostBinding('class.si-multi-select')
protected multiSelect = this.selectionStrategy.allowMultiple;
ngOnInit(): void {
this.focusTrap = this.focusTrapFactory.create(this.elementRef.nativeElement);
}
ngOnDestroy(): void {
this.focusTrap.destroy();
}
@HostListener('keydown.tab')
protected keydownTab(): void {
// Ignore tab key if actions are displayed.
Iif (!this.actionsTemplate()) {
this.closeOverlayAlways();
}
}
protected closeOverlayAlways(): void {
this.closeOverlay.emit();
}
protected closeOverlayIfSingle(): void {
if (!this.selectionStrategy.allowMultiple) {
this.closeOverlayAlways();
}
}
}
|