import { Component, input, output, forwardRef } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms'; import { CommonModule } from '@angular/common'; @Component({ selector: 'app-select', standalone: true, imports: [CommonModule, ReactiveFormsModule], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AppSelectComponent), multi: true } ], template: `
@if (label()) { } @if (error()) { {{ error() }} }
`, styles: [` .form-group { display: flex; flex-direction: column; margin-bottom: var(--space-4); } label { font-size: 0.875rem; font-weight: 500; margin-bottom: var(--space-2); color: var(--color-text); } .form-control { padding: 0.5rem 0.75rem; border: 1px solid var(--color-border); border-radius: var(--radius-md); font-size: 1rem; width: 100%; background: var(--color-bg-card); color: var(--color-text); &:focus { outline: none; border-color: var(--color-brand); } } .error-text { color: var(--color-danger-500); font-size: 0.75rem; margin-top: var(--space-1); } `] }) export class AppSelectComponent implements ControlValueAccessor { label = input(''); id = input('select-' + Math.random().toString(36).substr(2, 9)); options = input<{label: string, value: any}[]>([]); error = input(null); value: any = ''; disabled = false; onChange: any = () => {}; onTouched: any = () => {}; writeValue(obj: any): void { this.value = obj; } registerOnChange(fn: any): void { this.onChange = fn; } registerOnTouched(fn: any): void { this.onTouched = fn; } setDisabledState(isDisabled: boolean): void { this.disabled = isDisabled; } onSelect(event: Event) { const val = (event.target as HTMLSelectElement).value; this.value = val; this.onChange(val); } }