Prefill file fields with their file_name joined from CiviCRM

CiviCRM APIv4 file custom fields return a bare file id by default; an
extra '.file_name' join is required to get the human-readable filename.
Both the form prefill walk (lib/prefill.ts) and the report walk
(app/api/report/route.ts) now request '<civiField>.file_name' for every
file-type field alongside the primary value, and wrap the prefill into
a { id, file_name } object so downstream UI has both. Falls back to
file_name undefined when the join returns null (eg orphaned id).

The form's FilePriorIndicator already accepts the object shape, so it
now shows the filename inline. The report's FormattedValue gets a
matching case: renders the file_name string if present, falls back to
'Attachment #<id>' when only the id came through.
This commit is contained in:
Joel Brock
2026-05-19 15:51:35 -07:00
parent a8ed6073a9
commit 9209d6dc02
3 changed files with 50 additions and 5 deletions
+11 -1
View File
@@ -459,8 +459,18 @@ function FormattedValue({
const labels = parts.map((p) => opts?.find((o) => o.value === p)?.label ?? p);
return <>{labels.join(", ")}</>;
}
case "file":
case "file": {
// Prefill / history wraps file values into { id, file_name } so the
// UI can show a human-readable name. Fall back to whatever scalar
// came through if the shape is different.
if (typeof value === "object" && value !== null) {
const o = value as Record<string, unknown>;
const fname = o.file_name ?? o.name ?? o.label ?? o.filename;
if (typeof fname === "string" && fname.length > 0) return <>{fname}</>;
if (typeof o.id !== "undefined") return <>Attachment #{String(o.id)}</>;
}
return <>{String(value)}</>;
}
case "textarea":
case "text":
case "email":