Skip to content

Commit 9ca772b

Browse files
Copilothotlong
andcommitted
fix: TextCellRenderer null guard (value || '-' swallowed 0); add 6 TextCellRenderer tests
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
1 parent c53d8eb commit 9ca772b

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

ROADMAP.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,12 +1077,15 @@ The `FlowDesigner` is a canvas-based flow editor that bridges the gap between th
10771077
- `getCellRenderer` standardMap: `lookup` and `master_detail` now correctly reference `LookupCellRenderer`.
10781078
- `fieldRegistry` now explicitly registers `status``SelectCellRenderer`, `user``UserCellRenderer`, and `owner``UserCellRenderer` alongside the existing `lookup`/`master_detail`/`select` registrations.
10791079

1080-
**Tests:** Added 30 new tests in `cell-renderers.test.tsx`:
1080+
**Tests:** Added 36 new tests in `cell-renderers.test.tsx`:
10811081
- `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
10821083
- `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
10831084
- `UserCellRenderer`: null, primitive number ID, primitive string ID, object with name, object with username, array of user objects
10841085

1085-
All 307 `@object-ui/fields` tests pass.
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.
1087+
1088+
All 313 `@object-ui/fields` tests pass.
10861089

10871090
---
10881091

packages/fields/src/__tests__/cell-renderers.test.tsx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
SelectCellRenderer,
1414
LookupCellRenderer,
1515
UserCellRenderer,
16+
TextCellRenderer,
1617
DateCellRenderer,
1718
BooleanCellRenderer,
1819
formatDate,
@@ -91,7 +92,42 @@ describe('getCellRenderer', () => {
9192
});
9293

9394
// =========================================================================
94-
// 2. SelectCellRenderer
95+
// 2. TextCellRenderer
96+
// =========================================================================
97+
describe('TextCellRenderer', () => {
98+
it('should render text value', () => {
99+
render(<TextCellRenderer value="hello" field={{ name: 'title', type: 'text' } as any} />);
100+
expect(screen.getByText('hello')).toBeInTheDocument();
101+
});
102+
103+
it('should render dash for null', () => {
104+
render(<TextCellRenderer value={null} field={{ name: 'title', type: 'text' } as any} />);
105+
expect(screen.getByText('-')).toBeInTheDocument();
106+
});
107+
108+
it('should render dash for undefined', () => {
109+
render(<TextCellRenderer value={undefined} field={{ name: 'title', type: 'text' } as any} />);
110+
expect(screen.getByText('-')).toBeInTheDocument();
111+
});
112+
113+
it('should render dash for empty string', () => {
114+
render(<TextCellRenderer value="" field={{ name: 'title', type: 'text' } as any} />);
115+
expect(screen.getByText('-')).toBeInTheDocument();
116+
});
117+
118+
it('should render "0" for numeric zero (not dash)', () => {
119+
render(<TextCellRenderer value={0} field={{ name: 'count', type: 'text' } as any} />);
120+
expect(screen.getByText('0')).toBeInTheDocument();
121+
});
122+
123+
it('should render "false" for boolean false (not dash)', () => {
124+
render(<TextCellRenderer value={false} field={{ name: 'flag', type: 'text' } as any} />);
125+
expect(screen.getByText('false')).toBeInTheDocument();
126+
});
127+
});
128+
129+
// =========================================================================
130+
// 3. SelectCellRenderer
95131
// =========================================================================
96132
describe('SelectCellRenderer', () => {
97133
it('should render badge with explicit color from options', () => {

packages/fields/src/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ export function formatDateTime(value: string | Date): string {
179179
* Text field cell renderer
180180
*/
181181
export function TextCellRenderer({ value }: CellRendererProps): React.ReactElement {
182-
return <span className="truncate">{value || '-'}</span>;
182+
return <span className="truncate">{(value != null && value !== '') ? String(value) : '-'}</span>;
183183
}
184184

185185
/**

0 commit comments

Comments
 (0)