Skip to content

Commit 38b7385

Browse files
committed
fix(json-view): coerce numeric strings to numbers on edit
1 parent cdb7ffb commit 38b7385

1 file changed

Lines changed: 18 additions & 1 deletion

File tree

surfsense_web/components/json-view.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,23 @@ export interface JsonViewProps {
3535
className?: string;
3636
}
3737

38+
/** Recursively coerce string values that are valid JSON numbers back to numbers.
39+
* react-json-view's text input always yields strings; this restores the
40+
* correct type so filters like ``{ "folder_id": 56 }`` survive editing. */
41+
function coerceNumbers(value: unknown): unknown {
42+
if (typeof value === "string") {
43+
const n = Number(value);
44+
return !Number.isNaN(n) && value.trim() !== "" ? n : value;
45+
}
46+
if (Array.isArray(value)) return value.map(coerceNumbers);
47+
if (value && typeof value === "object") {
48+
return Object.fromEntries(
49+
Object.entries(value as Record<string, unknown>).map(([k, v]) => [k, coerceNumbers(v)])
50+
);
51+
}
52+
return value;
53+
}
54+
3855
const DARK_THEME = "monokai" as const;
3956
const LIGHT_THEME = "rjv-default" as const;
4057

@@ -67,7 +84,7 @@ export function JsonView({
6784

6885
const handleChange = useCallback(
6986
(interaction: InteractionProps) => {
70-
onChange?.(interaction.updated_src);
87+
onChange?.(coerceNumbers(interaction.updated_src));
7188
return true;
7289
},
7390
[onChange]

0 commit comments

Comments
 (0)