import { NgTemplateOutlet } from "@angular/common"; import { booleanAttribute, ChangeDetectionStrategy, Component, contentChild, effect, input, model, signal, TemplateRef, ViewEncapsulation, } from "@angular/core"; import type { SharedDataBase } from "../../core/shared-data/sd-shared-data.provider"; import { SdItemOfTemplate, type SdItemOfTemplateContext, } from "../../core/template/sd-item-of-template"; import { SdModalSelectButton, type SdSelectModal, type SdSelectModalInfo, } from "../../controls/button/sd-modal-select-button"; import type { SelectModeValue } from "../../controls/select/sd-select"; @Component({ selector: "sd-shared-data-select-button", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [SdModalSelectButton, NgTemplateOutlet], template: ` @for (item of _selectedItems(); track item; let index = $index) { @if (index !== 0) { } } `, }) export class SdSharedDataSelectButton< TItem extends SharedDataBase, TMode extends keyof SelectModeValue, TModal extends SdSelectModal, > { value = model[TMode]>(); items = input([]); modal = input.required>(); selectMode = input("single" as TMode); disabled = input(false, { transform: booleanAttribute }); required = input(false, { transform: booleanAttribute }); inset = input(false, { transform: booleanAttribute }); size = input<"sm" | "lg">(); itemTplRef = contentChild.required>>( SdItemOfTemplate, { read: TemplateRef }, ); protected readonly _selectedItems = signal([]); constructor() { effect(() => { const v = this.value(); const items = this.items(); const mode = this.selectMode(); if (mode === "multi" && Array.isArray(v) && v.filterExists().length > 0) { const keys = v.filterExists() as (string | number)[]; this._selectedItems.set(items.filter((it) => keys.includes(it.__valueKey))); } else if (mode === "single" && !Array.isArray(v) && v != null) { this._selectedItems.set(items.filter((it) => it.__valueKey === v)); } else { this._selectedItems.set([]); } }); } }