import type { Component } from 'vue' import type { FormFieldType } from '../types/form-builder' import BaseInput from '../components/BaseInput.vue' import SecretInput from '../components/SecretInput.vue' import BaseTextarea from '../components/BaseTextarea.vue' import BaseSelect from '../components/BaseSelect.vue' import MultiSelect from '../components/MultiSelect.vue' import BaseCheckbox from '../components/BaseCheckbox.vue' import BaseToggle from '../components/BaseToggle.vue' import BaseRadioGroup from '../components/BaseRadioGroup.vue' import BaseSlider from '../components/BaseSlider.vue' import TagsInput from '../components/TagsInput.vue' import NumberInput from '../components/NumberInput.vue' import DatePicker from '../components/DatePicker.vue' import TimePicker from '../components/TimePicker.vue' import DateTimePicker from '../components/DateTimePicker.vue' import FileUploader from '../components/FileUploader.vue' import GeneratedPathInput from '../components/GeneratedPathInput.vue' import FormulaInput from '../components/FormulaInput.vue' import SequenceInput from '../components/SequenceInput.vue' import MoleculeInput from '../components/MoleculeInput.vue' import ConcentrationInput from '../components/ConcentrationInput.vue' import UnitInput from '../components/UnitInput.vue' export interface RegistryEntry { component: Component /** Default props applied to the component. */ defaults: Record /** Whether the component uses v-model (false for event-only components like FileUploader). */ vModel: boolean } const registry: Record = { text: { component: BaseInput, defaults: { type: 'text' }, vModel: true }, email: { component: BaseInput, defaults: { type: 'email' }, vModel: true }, password: { component: BaseInput, defaults: { type: 'password' }, vModel: true }, secret: { component: SecretInput, defaults: {}, vModel: true }, tel: { component: BaseInput, defaults: { type: 'tel' }, vModel: true }, url: { component: BaseInput, defaults: { type: 'url' }, vModel: true }, search: { component: BaseInput, defaults: { type: 'search' }, vModel: true }, number: { component: NumberInput, defaults: {}, vModel: true }, textarea: { component: BaseTextarea, defaults: {}, vModel: true }, select: { component: BaseSelect, defaults: {}, vModel: true }, multiselect: { component: MultiSelect, defaults: {}, vModel: true }, checkbox: { component: BaseCheckbox, defaults: {}, vModel: true }, toggle: { component: BaseToggle, defaults: {}, vModel: true }, radio: { component: BaseRadioGroup, defaults: {}, vModel: true }, slider: { component: BaseSlider, defaults: {}, vModel: true }, tags: { component: TagsInput, defaults: {}, vModel: true }, date: { component: DatePicker, defaults: {}, vModel: true }, time: { component: TimePicker, defaults: {}, vModel: true }, datetime: { component: DateTimePicker, defaults: {}, vModel: true }, file: { component: FileUploader, defaults: {}, vModel: false }, path: { component: GeneratedPathInput, defaults: {}, vModel: true }, formula: { component: FormulaInput, defaults: {}, vModel: true }, sequence: { component: SequenceInput, defaults: {}, vModel: true }, molecule: { component: MoleculeInput, defaults: {}, vModel: true }, concentration: { component: ConcentrationInput, defaults: {}, vModel: true }, unit: { component: UnitInput, defaults: {}, vModel: true }, } /** Return the registry entry for a given field type. Throws if the type is unregistered. */ export function getFieldRegistryEntry(type: FormFieldType): RegistryEntry { return registry[type] } /** Get the default empty value for a given field type. */ export function getTypeDefault(type: FormFieldType): unknown { switch (type) { case 'checkbox': case 'toggle': return false case 'number': case 'slider': return undefined case 'multiselect': case 'tags': return [] case 'secret': // A secret field has no empty string state: `null` means "not stored". return null default: return '' } }