Summary
User relational fields — most notably the system fields user_created and user_updated, but also any many-to-one relation pointing at directus_users — render as [object Object] (or as a bare UUID) instead of a human-readable user name.
Current Behavior
When a user field is loaded as a nested object (e.g. { id, first_name, last_name, email }) and no matching display template resolves for it, the cell falls through to the raw-value fallback, which stringifies the object:
String({ first_name: 'Jane', last_name: 'Doe', email: '…' }) // → "[object Object]"
As a result the column shows [object Object]. When only the id is loaded, the bare UUID is shown instead of a name. This is especially visible on the built-in user_created / user_updated columns, which users frequently add to tables.
Expected Behavior
User fields should render a friendly, readable label using a clear fallback chain:
- Full name —
first_name + last_name when available
- Email — the user's email if no name is set
- ID — the user id/UUID as a last resort
- Never
[object Object].
Empty / null values should render the standard empty placeholder (—).
Nice-to-have: optionally show the user's avatar next to the name, matching the native Directus user display.
Acceptance Criteria
Technical Notes
- Rendering happens in
src/components/EditableCellRelational.vue. The [object Object] originates from the final fallbacks that call String(value) (the raw-value spans) once no display has resolved for the field.
- A dedicated branch for user fields — detected via
field.display === 'user' and/or a relation to directus_users — that formats the value as name → email → id before reaching the raw-value fallback would resolve this cleanly.
- For optional avatar support, the avatar reference must be included in the requested fields when building the query (see
src/utils/adjustFieldsForDisplays.ts).
Summary
User relational fields — most notably the system fields
user_createdanduser_updated, but also any many-to-one relation pointing atdirectus_users— render as[object Object](or as a bare UUID) instead of a human-readable user name.Current Behavior
When a user field is loaded as a nested object (e.g.
{ id, first_name, last_name, email }) and no matching display template resolves for it, the cell falls through to the raw-value fallback, which stringifies the object:As a result the column shows
[object Object]. When only the id is loaded, the bare UUID is shown instead of a name. This is especially visible on the built-inuser_created/user_updatedcolumns, which users frequently add to tables.Expected Behavior
User fields should render a friendly, readable label using a clear fallback chain:
first_name + last_namewhen available[object Object].Empty / null values should render the standard empty placeholder (
—).Acceptance Criteria
user_created/user_updatedcolumns show the user's name (or email/id fallback), never[object Object].directus_usersbehaves the same way.—), not[object Object].Technical Notes
src/components/EditableCellRelational.vue. The[object Object]originates from the final fallbacks that callString(value)(theraw-valuespans) once no display has resolved for the field.field.display === 'user'and/or a relation todirectus_users— that formats the value as name → email → id before reaching the raw-value fallback would resolve this cleanly.src/utils/adjustFieldsForDisplays.ts).