UNPKG

signal-template-forms

Version:

A powerful, type-safe Angular forms library built with signals, providing reactive form management with excellent developer experience and performance.

102 lines (101 loc) 5.43 kB
import { FormFieldType } from '../enums/form-field-type.enum'; import { NumberInputType } from '../enums/number-input-type.enum'; import { type ValidationConfig } from './signal-form.model'; import { type UnitConversionConfig, type UnitParser } from './unit-conversion.model'; /** * this config is extended on every other config type */ export interface BaseFieldConfig<TModel, K extends keyof TModel> { placeholder?: string; hint?: string; validation?: ValidationConfig; /** Enable word count display for text-based inputs */ wordCount?: boolean; } export interface TextFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { prefix?: string; suffix?: string; } export interface NumberFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { prefix?: string; suffix?: string; precision?: number; /** Type of number input for specialized formatting */ inputType?: NumberInputType; /** Custom parser function for number display formatting */ parser?: UnitParser; /** Locale for Intl.NumberFormat (defaults to 'en-US') */ locale?: string; /** Currency code when inputType is CURRENCY (e.g., 'USD', 'EUR') */ currencyCode?: string; /** Number of decimal places for DECIMAL type */ decimalPlaces?: number; /** Unit conversion configuration for UNIT_CONVERSION type */ unitConversions?: UnitConversionConfig; /** Minimum value */ min?: number; /** Maximum value */ max?: number; /** Step increment for number input */ step?: number; } export interface CheckboxFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { } export interface CheckboxGroupFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { layout?: 'inline' | 'stacked'; valueType: 'map' | 'array'; } export interface DateTimeFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { format?: string; formatterFn?: (date: Date) => string; } export interface AutocompleteFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { debounceMs?: number; minChars?: number; } export interface SelectFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { multiselect?: boolean; valueType?: 'number' | 'boolean' | 'string'; } export interface SliderFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { min?: number; max?: number; step?: number; } export interface FileFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { accept?: string[]; maxSizeMb?: number; multiple?: boolean; uploadText?: string; } export interface RatingFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { min?: number; max?: number; allowHalf?: boolean; } export interface TextAreaFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { /** Maximum number of rows for auto-resize */ maxRows?: number; /** Minimum number of rows */ minRows?: number; } export interface PasswordFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { /** Show/hide password toggle */ showToggle?: boolean; } export interface RadioFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { valueType?: 'number' | 'boolean' | 'string'; } export interface MultiSelectFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { } export interface ColorFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { view: 'swatch' | 'pickerWithInput'; } export interface SwitchFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { } export interface ChipListFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { } export interface RepeatableGroupFieldConfig<TModel, K extends keyof TModel> extends BaseFieldConfig<TModel, K> { view?: 'inline' | 'stacked'; } export type ConfigTypeForField<T extends FormFieldType, TModel = any, K extends keyof TModel = keyof TModel> = T extends FormFieldType.TEXT ? TextFieldConfig<TModel, K> : T extends FormFieldType.PASSWORD ? PasswordFieldConfig<TModel, K> : T extends FormFieldType.TEXTAREA ? TextAreaFieldConfig<TModel, K> : T extends FormFieldType.SELECT ? SelectFieldConfig<TModel, K> : T extends FormFieldType.RADIO ? RadioFieldConfig<TModel, K> : T extends FormFieldType.AUTOCOMPLETE ? AutocompleteFieldConfig<TModel, K> : T extends FormFieldType.NUMBER ? NumberFieldConfig<TModel, K> : T extends FormFieldType.CHECKBOX ? CheckboxFieldConfig<TModel, K> : T extends FormFieldType.CHECKBOX_GROUP ? CheckboxGroupFieldConfig<TModel, K> : T extends FormFieldType.DATETIME ? DateTimeFieldConfig<TModel, K> : T extends FormFieldType.COLOR ? ColorFieldConfig<TModel, K> : T extends FormFieldType.SWITCH ? SwitchFieldConfig<TModel, K> : T extends FormFieldType.SLIDER ? SliderFieldConfig<TModel, K> : T extends FormFieldType.FILE ? FileFieldConfig<TModel, K> : T extends FormFieldType.RATING ? RatingFieldConfig<TModel, K> : T extends FormFieldType.MULTISELECT ? MultiSelectFieldConfig<TModel, K> : T extends FormFieldType.CHIPLIST ? ChipListFieldConfig<TModel, K> : T extends FormFieldType.REPEATABLE_GROUP ? RepeatableGroupFieldConfig<TModel, K> : never;