From f345dafb4679e54754d86aa93ab81de9297daa61 Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Thu, 18 Jun 2026 23:53:44 +0530 Subject: [PATCH] payee display fixes --- react-openapi/src/context/useResource.tsx | 39 +++++++++++++++-------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/react-openapi/src/context/useResource.tsx b/react-openapi/src/context/useResource.tsx index d689b86..eea21a5 100644 --- a/react-openapi/src/context/useResource.tsx +++ b/react-openapi/src/context/useResource.tsx @@ -266,16 +266,7 @@ function buildFilterComponent(field: FieldConfig, resourceName: string): React.F ); } - if ( - !field.fk && - !field.enumValues && - field.type !== "boolean" && - field.type !== "integer" && - field.type !== "number" && - field.format !== "date" && - field.format !== "date-time" && - !field.refSchema - ) { + function buildAutocompleteFilter(getDisplayValue: (row: any) => string) { const StringAutocompleteFilter: React.FC = ({ value, onChange, data, labelOverride }) => { const { resources, config } = useAppContext(); const filterMode = config.resourceConfig?.[resourceName]?.filterOptions?.mode ?? "server"; @@ -284,7 +275,12 @@ function buildFilterComponent(field: FieldConfig, resourceName: string): React.F useEffect(() => { if (filterMode === "client" && data) { - setOptions(extractDataOptions(data, field.name)); + const vals = new Set(); + for (const row of data) { + const v = getDisplayValue(row); + if (v && v !== "") vals.add(v); + } + setOptions([...vals].sort()); fetched.current = true; } else if (filterMode === "server" && !fetched.current) { const cacheKey = resourceName + ":" + field.name; @@ -302,11 +298,11 @@ function buildFilterComponent(field: FieldConfig, resourceName: string): React.F const res = await api.get(selfRes.path, { params }); let items: any[]; if (selfRes.pagination) { - items = res.data.items ?? []; + items = Array.isArray(res.data) ? res.data : (res.data.items ?? []); } else { items = Array.isArray(res.data) ? res.data : []; } - const values = [...new Set(items.map((r: any) => String(r[field.name] ?? "")).filter(Boolean))].sort(); + const values = [...new Set(items.map((r: any) => getDisplayValue(r)).filter(Boolean))].sort(); _stringOptionsCache.set(cacheKey, values); setOptions(values); fetched.current = true; @@ -338,6 +334,23 @@ function buildFilterComponent(field: FieldConfig, resourceName: string): React.F return StringAutocompleteFilter; } + const isSimpleField = + !field.fk && !field.enumValues && + field.type !== "boolean" && field.type !== "integer" && field.type !== "number" && + field.format !== "date" && field.format !== "date-time"; + + if (isSimpleField && !field.refSchema) { + return buildAutocompleteFilter((row) => String(row[field.name] ?? "")); + } + + if (field.refSchema && field.inlineDisplayFormat) { + return buildAutocompleteFilter((row) => { + const val = row[field.name]; + if (val == null || typeof val !== "object") return ""; + return field.inlineDisplayFormat!.replace(/\{(\w+)\}/g, (_, key) => String(val[key] ?? "")); + }); + } + return ({ value, onChange, labelOverride }) => (