import { Controller, type Path, type UseFormReturn } from "react-hook-form"; import { useTranslation } from "react-i18next"; import type { components } from "../api/schema"; import { useAuthorities, useTerms } from "../api/queries"; import { useConfig } from "../config/config-context"; import { labelText } from "../lib/labels"; import { OptionsCombobox } from "./options-combobox"; import { Checkbox } from "@/components/ui/checkbox"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; type FieldDefinitionView = components["schemas"]["FieldDefinitionView"]; type FieldForm }> = UseFormReturn; function fieldPath }>( key: string, ): Path { return `fields.${key}` as Path; } export function FieldInput }>({ definition, form, }: { definition: FieldDefinitionView; form: FieldForm; }) { const { t, i18n } = useTranslation(); const { default_language } = useConfig(); const lang = i18n.language.startsWith("sv") ? "sv" : "en"; const label = labelText(definition.labels, lang); const name = fieldPath(definition.key); const placeholder = t("form.selectPlaceholder"); switch (definition.data_type) { case "integer": return (
); case "date": return (
); case "boolean": // A checkbox always has a boolean value, so `required` is a no-op here. return (
( field.onChange(checked === true)} /> )} />
); case "localized_text": return (
(`${definition.key}.${default_language}`), { required: definition.required, })} />
); case "term": return ( ); case "authority": return ( ); case "text": default: return (
); } } function TermField }>({ definition, form, label, lang, placeholder, }: { definition: FieldDefinitionView; form: FieldForm; label: string; lang: string; placeholder: string; }) { const { data: terms } = useTerms(definition.vocabulary_id); return (
(definition.key)} rules={{ required: definition.required }} render={({ field }) => ( )} />
); } function AuthorityField }>({ definition, form, label, lang, placeholder, }: { definition: FieldDefinitionView; form: FieldForm; label: string; lang: string; placeholder: string; }) { const { data: authorities } = useAuthorities(definition.authority_kind); return (
(definition.key)} rules={{ required: definition.required }} render={({ field }) => ( )} />
); }