diff --git a/react-openapi/components/GenericForm.tsx b/react-openapi/components/GenericForm.tsx index b2bf82c..d2317d1 100644 --- a/react-openapi/components/GenericForm.tsx +++ b/react-openapi/components/GenericForm.tsx @@ -80,9 +80,9 @@ export default function GenericForm({ const queryResult = queries[index]; const dataArray = queryResult?.data && Array.isArray(queryResult.data) ? queryResult.data : (queryResult?.data?.data ?? []); console.log('Relation query result for', relName, 'raw:', queryResult?.data); - map[relName] = dataArray; - }); - console.log('Final relationDataMap:', map); + console.log('Relation data for', relName, ':', dataArray.slice(0, 1)); + map[relName] = dataArray; + }); return map; }, [allRelations, queries]); diff --git a/react-openapi/components/fields/RelationField.tsx b/react-openapi/components/fields/RelationField.tsx index 8233216..3a7c2a6 100644 --- a/react-openapi/components/fields/RelationField.tsx +++ b/react-openapi/components/fields/RelationField.tsx @@ -3,14 +3,17 @@ import { getFieldOptions } from '../../utils/options'; import { FieldComponentProps } from '../../types/overrides'; export default function RelationField({ field, value, onChange, disabled, relationDataMap = {} }: FieldComponentProps) { + console.log('RelationField render', field.label, 'enumOption:', field.enumOption, 'value prop:', value); const relationName = field.relation ?? (field as any).refers; - if (!relationName || !relationDataMap[relationName]) { +if (!relationName || !relationDataMap[relationName]) { throw new Error(`Relation data for "${relationName}" is missing – cannot render options for field "${field.label}"`); - } +} + const relationData = relationDataMap[relationName]; const isArrayRelation = field.type === 'array'; const options = getFieldOptions(field, relationData); + console.log('Options for', field.label, 'keys:', options.map(o=>o.key)); if (options.length === 0) { throw new Error(`No selectable options available for field "${field.label}" (relation "${relationName}")`); } @@ -19,12 +22,18 @@ export default function RelationField({ field, value, onChange, disabled, relati const normalizedValue = (() => { if (isArrayRelation && Array.isArray(value)) { - return value.map((v: any) => (v != null && typeof v === 'object' ? String(v[keyField] ?? '') : String(v))); + return value.map((v: any) => { + if (v != null && typeof v === 'object') { + return String(v[keyField] ?? ''); + } + return String(v); + }); } if (value != null && typeof value === 'object') { return String(value[keyField] ?? ''); } - return value ?? (isArrayRelation ? [] : ""); + // Primitive (number/string) – coerce to string for Select compatibility + return value != null ? String(value) : (isArrayRelation ? [] : ""); })(); return ( @@ -38,10 +47,13 @@ export default function RelationField({ field, value, onChange, disabled, relati onChange={(e) => onChange(e.target.value)} disabled={disabled} renderValue={(selected: any) => { + console.log('Select renderValue for', field.label, 'selected:', selected); if (isArrayRelation) { return (selected as string[]).map(k => options.find(o => o.key === k)?.value ?? k).join(', '); } - return options.find(o => o.key === selected)?.value ?? selected; + const display = options.find(o => o.key === selected)?.value ?? selected; + console.log('Display value for', field.label, ':', display); + return display; }} > {options.map((opt) => ( diff --git a/react-openapi/utils/options.ts b/react-openapi/utils/options.ts index 8ecc839..afed905 100644 --- a/react-openapi/utils/options.ts +++ b/react-openapi/utils/options.ts @@ -8,6 +8,7 @@ export function resolveTemplate(template: string, item: any): string { } export function getFieldOptions(field: ResourceField, relationData?: any[]): SelectOption[] { + console.log('getFieldOptions called for field', field.label, 'type', field.type, 'enumOption', field.enumOption); if (field.type === 'enum') { return (field.options ?? []).map(opt => ({ key: opt, @@ -28,11 +29,12 @@ export function getFieldOptions(field: ResourceField, relationData?: any[]): Sel `Define referenceOptions.enumOption in the configuration for resource "${field.relation}".` ); } - - return data.map(item => ({ - key: String(item[enumOption.key]), + const result = data.map(item => ({ + key: String(item[enumOption.key] ?? item.id ?? item._id), value: resolveTemplate(enumOption.value, item), })); + console.log('Option map for', field.relation, 'first entry:', data[0], 'result key:', result[0]?.key); + return result; } return []; diff --git a/src/openapi-config.ts b/src/openapi-config.ts index 0df5570..109e835 100644 --- a/src/openapi-config.ts +++ b/src/openapi-config.ts @@ -76,7 +76,7 @@ export const configuration: Record = { accounts: { referenceOptions: { enumOption: { - key: 'id', + key: '_id', value: '{name} - XX{number}', }, autoComplete: true, @@ -86,7 +86,7 @@ export const configuration: Record = { tags: { referenceOptions: { enumOption: { - key: 'id', + key: '_id', value: '{icon} {name}', }, autoComplete: true,