flexacore-ui-dev
Version:
Universal UI Framework for CDN, React, Angular, Vue, Svelte with TypeScript support
87 lines (76 loc) • 2.07 kB
text/typescript
import { Component, Input, Output, EventEmitter, forwardRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
export interface SelectOption {
value: string | number;
label: string;
disabled?: boolean;
}
({
selector: 'fc-select',
template: `
<select
[ngClass]="classes"
[value]="value"
[disabled]="disabled"
(change)="handleChange($event)"
(blur)="onBlur()"
(focus)="onFocus()"
>
<option value="" *ngIf="placeholder">{{ placeholder }}</option>
<option
*ngFor="let option of options"
[value]="option.value"
[disabled]="option.disabled"
>
{{ option.label }}
</option>
</select>
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => FCSelectComponent),
multi: true
}
]
})
export class FCSelectComponent implements ControlValueAccessor {
() options: SelectOption[] = [];
() placeholder: string = '';
() disabled: boolean = false;
() size: 'sm' | 'md' | 'lg' = 'md';
() valueChange = new EventEmitter<string | number>();
value: string | number = '';
private onChange = (value: string | number) => {};
private onTouched = () => {};
get classes() {
return [
'fc-select',
`fc-select-${this.size}`
];
}
handleChange(event: Event) {
const target = event.target as HTMLSelectElement;
this.value = target.value;
this.onChange(this.value);
this.valueChange.emit(this.value);
}
onBlur() {
this.onTouched();
}
onFocus() {
// Focus event handling if needed
}
writeValue(value: string | number): void {
this.value = value || '';
}
registerOnChange(fn: any): void {
this.onChange = fn;
}
registerOnTouched(fn: any): void {
this.onTouched = fn;
}
setDisabledState(isDisabled: boolean): void {
this.disabled = isDisabled;
}
}