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:
@@ -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":
|
||||
|
||||
Reference in New Issue
Block a user