fix(settings): display objects as JSON instead of [object Object] (#21458)

Co-authored-by: Zheyuan <zlin252@emory.edu>
Co-authored-by: Jacob Richman <jacob314@gmail.com>
This commit is contained in:
Zheyuan Lin
2026-03-09 13:32:13 -04:00
committed by GitHub
parent 759575faa8
commit 95074a1a84
2 changed files with 57 additions and 1 deletions

View File

@@ -734,6 +734,55 @@ describe('SettingsUtils', () => {
);
expect(result).toBe('false');
});
it('should display objects as JSON strings, not "[object Object]"', () => {
vi.mocked(getSettingsSchema).mockReturnValue({
experimental: {
type: 'object',
label: 'Experimental',
category: 'Experimental',
requiresRestart: true,
default: {},
description: 'Experimental settings',
showInDialog: false,
properties: {
gemmaModelRouter: {
type: 'object',
label: 'Gemma Model Router',
category: 'Experimental',
requiresRestart: true,
default: {},
description: 'Gemma model router settings',
showInDialog: true,
},
},
},
} as unknown as SettingsSchemaType);
// Test with empty object (default)
const emptySettings = makeMockSettings({});
const emptyResult = getDisplayValue(
'experimental.gemmaModelRouter',
emptySettings,
emptySettings,
);
expect(emptyResult).toBe('{}');
expect(emptyResult).not.toBe('[object Object]');
// Test with object containing values
const settings = makeMockSettings({
experimental: {
gemmaModelRouter: { enabled: true, host: 'localhost' },
},
});
const result = getDisplayValue(
'experimental.gemmaModelRouter',
settings,
settings,
);
expect(result).toBe('{"enabled":true,"host":"localhost"}*');
expect(result).not.toContain('[object Object]');
});
});
describe('getDisplayValue with units', () => {

View File

@@ -284,7 +284,14 @@ export function getDisplayValue(
let valueString = String(value);
if (definition?.type === 'enum' && definition.options) {
// Handle object types by stringifying them
if (
definition?.type === 'object' &&
value !== null &&
typeof value === 'object'
) {
valueString = JSON.stringify(value);
} else if (definition?.type === 'enum' && definition.options) {
const option = definition.options?.find((option) => option.value === value);
valueString = option?.label ?? `${value}`;
}