This commit is contained in:
2026-06-13 19:54:11 +05:30
parent f2edf7ade7
commit dd7c2246df
3 changed files with 40 additions and 33 deletions

View File

@@ -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;
}),
});

View File

@@ -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 lookups 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<string, string[]> = {};
const apiDoc = api as any;

View File

@@ -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}"`);
}