/** * CustomFieldRenderer — renders custom fields based on field_type. * Supports read-only and editable modes. */ import React from 'react'; import { useTranslation } from 'react-i18next'; import { Input } from '@/components/ui/Input'; import { Select } from '@/components/ui/Select'; import type { CustomFieldDefinition } from '@/api/customFields'; export interface CustomFieldRendererProps { fields: CustomFieldDefinition[]; mode: 'read' | 'edit'; values?: Record; onChange?: (name: string, value: any) => void; } function formatValue(value: any, fieldType: string): string { if (value === null || value === undefined || value === '') return '—'; if (fieldType === 'boolean') return value ? '✓' : '✗'; if (fieldType === 'multiselect' && Array.isArray(value)) return value.join(', '); if (fieldType === 'date' && value) { try { return new Date(value).toLocaleDateString(); } catch { return String(value); } } return String(value); } export function CustomFieldRenderer({ fields, mode, values = {}, onChange }: CustomFieldRendererProps) { const { t } = useTranslation(); if (!fields || fields.length === 0) return null; if (mode === 'read') { return (
{fields.map((field) => { const label = field.label_key ? t(field.label_key) : field.label || field.name; const value = values[field.name] ?? field.value; return (
{label}
{formatValue(value, field.field_type)}
); })}
); } return (
{fields.map((field) => { const label = field.label_key ? t(field.label_key) : field.label || field.name; const value = values[field.name] ?? field.value ?? field.default_value ?? ''; if (field.field_type === 'boolean') { return (
onChange?.(field.name, e.target.checked)} className="h-4 w-4 rounded border-secondary-300" />
); } if (field.field_type === 'select') { return (
{ if (e.target.checked) { onChange?.(field.name, [...selected, opt]); } else { onChange?.(field.name, selected.filter((v) => v !== opt)); } }} className="h-4 w-4 rounded border-secondary-300" /> {opt} ))}
); } // text, number, date return (
{ let val: any = e.target.value; if (field.field_type === 'number' && val !== '') val = Number(val); if (val === '') val = null; onChange?.(field.name, val); }} />
); })} ); }