diff --git a/react-openapi/components/GenericForm.tsx b/react-openapi/components/GenericForm.tsx index b683c33..fea85a2 100644 --- a/react-openapi/components/GenericForm.tsx +++ b/react-openapi/components/GenericForm.tsx @@ -51,7 +51,11 @@ export default function GenericForm({ return Array.from(new Set(relations)); }; - const allRelations = React.useMemo(() => getRelationFields(config.fields), [config.fields]); + const allRelations = React.useMemo(() => { + const rels = getRelationFields(config.fields); + console.log('Form resource', config.name, 'relations discovered:', rels); + return rels; + }, [config.fields]); // 2. Parallel fetch for all related resource lists const queries = useQueries({ @@ -59,10 +63,12 @@ export default function GenericForm({ const relatedRes = appConfig?.resources.find(r => r.name === relName); // eslint-disable-next-line react-hooks/rules-of-hooks const { getListQueryOptions } = useResource(relatedRes!, { fieldComponents }); - return { - ...getListQueryOptions(), - enabled: !!relatedRes, + const queryOpts = { + ...getListQueryOptions(), + enabled: !!relatedRes, }; + console.log('Query for relation', relName, 'resource', relatedRes?.name, 'enabled', !!relatedRes); + return queryOpts; }), }); diff --git a/react-openapi/utils/openapi_loader.ts b/react-openapi/utils/openapi_loader.ts index 03cf6c0..0948bc4 100644 --- a/react-openapi/utils/openapi_loader.ts +++ b/react-openapi/utils/openapi_loader.ts @@ -192,38 +192,38 @@ export async function loadConfigFromOpenApi(baseUrl: string, configuration: Reco } // 2. Generate ResourceConfig for each identified resource - for (const [name, info] of Object.entries(resourcePaths)) { - const listPath = info.listPath || `/${name}`; - const listOp = paths[listPath]?.get; - if (!listOp || !info.schemaObj) continue; + for (const [name, info] of Object.entries(resourcePaths)) { + const listPath = info.listPath || `/${name}`; + const listOp = paths[listPath]?.get; + // Always create a resource entry even if the list operation or schema is missing. + // This enables relation look‑ups for resources that only have overrides (e.g., accounts, tags). + // If we lack a schema we fall back to an empty field map. + const hasList = !!listOp; + const schema = info.schemaObj; + const label = name.charAt(0).toUpperCase() + name.slice(1, -1); + const pluralLabel = name.charAt(0).toUpperCase() + name.slice(1); - const schema = info.schemaObj; - const label = name.charAt(0).toUpperCase() + name.slice(1, -1); - const pluralLabel = name.charAt(0).toUpperCase() + name.slice(1); + const fields = schema ? parseSchemaFields(schema, name, schemaToResourceMap, configuration) : {}; - console.log('before parseSchemaFields configuration...', configuration['accounts']['referenceOptions']) - const fields = parseSchemaFields(schema, name, schemaToResourceMap, configuration); - - const resourceOverride = configuration[name] || {}; - - const fo = resourceOverride.filterOptions || {}; - - resources.push({ - name, - label: schema.title || label, - pluralLabel: pluralLabel, - endpoint: listPath, - primaryKey: "id", - fields, - pagination: resourceOverride.pagination, - hidden: resourceOverride.hidden, - filterOptions: { - mode: fo.mode || "server", - fields: fo.fields, - }, - }); - } + const resourceOverride = configuration[name] || {}; + const fo = resourceOverride.filterOptions || {}; + resources.push({ + name, + label: schema?.title || label, + pluralLabel: pluralLabel, + endpoint: listPath, + primaryKey: "id", + fields, + pagination: resourceOverride.pagination, + hidden: resourceOverride.hidden, + filterOptions: { + mode: fo.mode || "server", + fields: fo.fields, + }, + }); + console.log('Loaded resource:', name, 'endpoint:', listPath, 'fields count:', Object.keys(fields).length); + } // Collect standalone enum schemas (e.g. FetchRequestStatus, AccountType, etc.) const enums: Record = {}; const apiDoc = api as any; diff --git a/react-openapi/utils/options.ts b/react-openapi/utils/options.ts index d9090a6..8ecc839 100644 --- a/react-openapi/utils/options.ts +++ b/react-openapi/utils/options.ts @@ -17,6 +17,7 @@ export function getFieldOptions(field: ResourceField, relationData?: any[]): Sel if (field.relation) { const data = Array.isArray(relationData) ? relationData : []; + console.log('Getting options for relation', field.relation, 'data count:', data.length); if (data.length === 0) { throw new Error(`Relation data for "${field.relation}" is missing or empty – cannot build options for field "${field.label}"`); }