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([]);
}
});
}
}