You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: ROADMAP.md
+28Lines changed: 28 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1059,6 +1059,34 @@ The `FlowDesigner` is a canvas-based flow editor that bridges the gap between th
1059
1059
1060
1060
**Tests:** Added 3 new tests: 1 in `DashboardRenderer.widgetData.test.tsx` verifying metric widgets with I18nLabel trend labels render correctly, and 2 in `MetricCard.test.tsx` verifying I18nLabel resolution for title and description. All 159 dashboard tests pass.
1061
1061
1062
+
### Field Type Display Issues — Lookup, User, Select, Status Renderers (February 2026)
1063
+
1064
+
**Root Cause:** Multiple renderer defects caused incorrect field value display across views:
1065
+
1066
+
1.**`LookupCellRenderer`** — Destructured only `value`, ignoring the `field` prop. When the API returned a raw primitive ID (e.g. `customer: 2`), the renderer fell through to `String(value)` and showed `"2"` instead of the related record's name. No attempt was made to resolve IDs via `field.options`.
1067
+
1068
+
2.**`UserCellRenderer`** — Did not guard against primitive values (number/string user IDs). Accessing `.name` / `.username` on a number returned `undefined`, silently falling through to `"User"` as the generic label.
1069
+
1070
+
3.**`getCellRenderer` standardMap** — `lookup` and `master_detail` were mapped to `SelectCellRenderer` instead of `LookupCellRenderer` in the fallback map. Although the fieldRegistry pre-registration shadowed this bug, it was semantically incorrect.
1071
+
1072
+
4.**`status`, `user`, `owner` types** — Not pre-registered in `fieldRegistry`. All went through the `standardMap` path, making their association with renderers implicit and invisible.
1073
+
1074
+
**Fix:**
1075
+
-`LookupCellRenderer`: now accepts the `field` prop and resolves primitive IDs against `field.options` (matching by `String(opt.value) === String(val)` for type-safe comparison). Arrays of primitive IDs are resolved via the same logic. Null/empty-string guard updated from `!value` to `value == null || value === ''` to handle `0` correctly.
1076
+
-`UserCellRenderer`: primitive values (typeof !== 'object') return a plain `<span>` with the string representation. Array items that are not objects are also handled gracefully.
1077
+
-`getCellRenderer` standardMap: `lookup` and `master_detail` now correctly reference `LookupCellRenderer`.
1078
+
-`fieldRegistry` now explicitly registers `status` → `SelectCellRenderer`, `user` → `UserCellRenderer`, and `owner` → `UserCellRenderer` alongside the existing `lookup`/`master_detail`/`select` registrations.
1079
+
1080
+
**Tests:** Added 36 new tests in `cell-renderers.test.tsx`:
1081
+
-`getCellRenderer` registry assertions for `lookup`, `master_detail`, `status`, `user`, `owner` types
1082
+
-`TextCellRenderer`: null, undefined, empty string, numeric zero (0 renders "0" not "-"), boolean false
1083
+
-`LookupCellRenderer`: null, empty-string, primitive ID (number), primitive ID (string), unresolved primitive, object with name/label/_id, array of objects, array of primitive IDs resolved via options
1084
+
-`UserCellRenderer`: null, primitive number ID, primitive string ID, object with name, object with username, array of user objects
1085
+
1086
+
5.**`TextCellRenderer`** — Used `value || '-'` which incorrectly rendered `'-'` for numeric `0` (falsy zero). Updated to `(value != null && value !== '') ? String(value) : '-'` for consistent null-only suppression.
0 commit comments