Skip to content

Commit 5519dab

Browse files
committed
feat: add default JSON view styles and integrate into JsonBlock and InteractiveJsonViewer components
1 parent b4205dc commit 5519dab

File tree

3 files changed

+49
-22
lines changed

3 files changed

+49
-22
lines changed

src/modules/JsonBlock.tsx

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,56 @@
1+
import JsonView from '@uiw/react-json-view';
12
import CopyButton from '@/components/CopyButton';
3+
import { defaultJsonViewStyle } from '@/utils/jsonViewStyles';
24

35
type JsonBlockProps = {
46
children: string | object;
7+
className?: string;
8+
collapsed?: number;
9+
enableClipboard?: boolean;
510
};
611

7-
const JsonBlock = ({ children }: JsonBlockProps) => {
8-
let display: string;
12+
const JsonBlock = ({
13+
children,
14+
className,
15+
collapsed = 1,
16+
enableClipboard = true,
17+
}: JsonBlockProps) => {
18+
let jsonData: object;
919
let rawToCopy: string;
1020

1121
try {
1222
if (typeof children === 'object') {
23+
jsonData = children;
1324
rawToCopy = JSON.stringify(children);
14-
display = JSON.stringify(children, null, 2);
1525
} else {
26+
jsonData = JSON.parse(children);
1627
rawToCopy = children;
17-
display = JSON.stringify(JSON.parse(children), null, 2);
1828
}
1929
} catch {
20-
display = String(children);
21-
rawToCopy = String(children);
30+
// If parsing fails, display as plain text
31+
return (
32+
<div className={`flex min-w-0 items-start gap-1 ${className}`}>
33+
<code className="min-w-0 overflow-x-auto text-sm whitespace-pre">
34+
{String(children)}
35+
</code>
36+
{enableClipboard && <CopyButton textToCopy={String(children)} />}
37+
</div>
38+
);
2239
}
2340

2441
return (
25-
<div className="flex min-w-0 items-start gap-1">
26-
<code className="min-w-0 overflow-x-auto text-sm whitespace-pre">
27-
{display}
28-
</code>
29-
<CopyButton textToCopy={rawToCopy} />
42+
<div className={`flex min-w-0 items-start gap-1 ${className}`}>
43+
<div className="min-w-0 flex-1 overflow-x-auto">
44+
<JsonView
45+
value={jsonData}
46+
displayDataTypes={false}
47+
displayObjectSize={false}
48+
enableClipboard={false}
49+
collapsed={collapsed}
50+
style={defaultJsonViewStyle}
51+
/>
52+
</div>
53+
{enableClipboard && <CopyButton textToCopy={rawToCopy} />}
3054
</div>
3155
);
3256
};

src/modules/datasets/dataset/schema/InteractiveJsonViewer.tsx

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { DatasetSchemaQuery } from '@/graphql/dataprotector/graphql';
22
import JsonView from '@uiw/react-json-view';
3+
import { defaultJsonViewStyle } from '@/utils/jsonViewStyles';
34

45
interface JsonViewerProps {
56
schemaPaths?: Array<{ path?: string | null; type?: string | null }>;
@@ -62,17 +63,7 @@ export function InteractiveJsonViewer({
6263
displayObjectSize={false}
6364
enableClipboard={false}
6465
collapsed={2}
65-
style={
66-
{
67-
color: 'white',
68-
'--w-rjv-quotes-string-color': '#ffc480', // Override string color to light gray
69-
'--w-rjv-curlybraces-color': '#728cff', // Override curly braces color to light gray
70-
'--w-rjv-quotes-color': '#728cff', // Override quotes color to light gray
71-
'--w-rjv-key-string': 'white', // Override key color to light gray
72-
'--w-rjv-type-string-color': '#ffc480',
73-
'--w-rjv-indent-width': '24px', // Increase indentation for nested keys
74-
} as React.CSSProperties
75-
}
66+
style={defaultJsonViewStyle}
7667
/>
7768
</div>
7869
);

src/utils/jsonViewStyles.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { CSSProperties } from 'react';
2+
3+
export const defaultJsonViewStyle: CSSProperties = {
4+
color: 'var(--color-foreground)',
5+
'--w-rjv-key-string': 'var(--color-foreground)',
6+
'--w-rjv-line-color': 'var(--color-foreground)',
7+
'--w-rjv-quotes-string-color': 'var(--color-primary)',
8+
'--w-rjv-type-string-color': 'var(--color-primary)',
9+
'--w-rjv-curlybraces-color': '#728cff',
10+
'--w-rjv-quotes-color': '#728cff',
11+
'--w-rjv-indent-width': '20px',
12+
} as CSSProperties;

0 commit comments

Comments
 (0)