Skip to content

Commit 98181bb

Browse files
authored
feat: support displayObjectSize (#102)
Fixes: #101
1 parent 95fb1f5 commit 98181bb

File tree

6 files changed

+59
-21
lines changed

6 files changed

+59
-21
lines changed

docs/pages/full/index.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ const IndexPage: React.FC = () => {
110110
const [theme, setTheme] = useState<JsonViewerTheme>('light')
111111
const [src, setSrc] = useState(() => example)
112112
const [displayDataTypes, setDisplayDataTypes] = useState(true)
113+
const [displayObjectSize, setDisplayObjectSize] = useState(true)
113114
const [editable, setEditable] = useState(true)
114115
useEffect(() => {
115116
const loop = () => {
@@ -152,6 +153,13 @@ const IndexPage: React.FC = () => {
152153
/>}
153154
label='DisplayDataTypes'
154155
/>
156+
<FormControlLabel
157+
control={<Switch
158+
checked={displayObjectSize}
159+
onChange={event => setDisplayObjectSize(event.target.checked)}
160+
/>}
161+
label='DisplayObjectSize'
162+
/>
155163
<TextField
156164
label='indentWidth'
157165
value={indent}
@@ -205,6 +213,7 @@ const IndexPage: React.FC = () => {
205213
indentWidth={indent}
206214
theme={theme}
207215
displayDataTypes={displayDataTypes}
216+
displayObjectSize={displayObjectSize}
208217
groupArraysAfterLength={groupArraysAfterLength}
209218
keyRenderer={KeyRenderer}
210219
valueTypes={[

src/components/DataTypes/Object.tsx

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export const PreObjectType: React.FC<DataItemProps<object>> = (props) => {
4040
() => props.inspect ? inspectMetadata(props.value) : '',
4141
[props.inspect, props.value]
4242
)
43+
const displayObjectSize = useJsonViewerStore(store => store.displayObjectSize)
4344
const isTrap = useIsCycleReference(props.path, props.value)
4445
return (
4546
<Box
@@ -49,16 +50,21 @@ export const PreObjectType: React.FC<DataItemProps<object>> = (props) => {
4950
}}
5051
>
5152
{isArray ? arrayLb : objectLb}
52-
<Box
53-
component='span'
54-
sx={{
55-
pl: 0.5,
56-
fontStyle: 'italic',
57-
color: metadataColor
58-
}}
59-
>
60-
{sizeOfValue}
61-
</Box>
53+
{displayObjectSize
54+
? (
55+
<Box
56+
component='span'
57+
sx={{
58+
pl: 0.5,
59+
fontStyle: 'italic',
60+
color: metadataColor
61+
}}
62+
>
63+
{sizeOfValue}
64+
</Box>
65+
)
66+
: null}
67+
6268
{isTrap && !props.inspect
6369
? (
6470
<>
@@ -78,23 +84,29 @@ export const PreObjectType: React.FC<DataItemProps<object>> = (props) => {
7884
export const PostObjectType: React.FC<DataItemProps<object>> = (props) => {
7985
const metadataColor = useJsonViewerStore(store => store.colorspace.base04)
8086
const isArray = useMemo(() => Array.isArray(props.value), [props.value])
87+
const displayObjectSize = useJsonViewerStore(store => store.displayObjectSize)
8188
const sizeOfValue = useMemo(
8289
() => !props.inspect ? inspectMetadata(props.value) : '',
8390
[props.inspect, props.value]
8491
)
8592
return (
8693
<Box component='span' className='data-object-end'>
8794
{isArray ? arrayRb : objectRb}
88-
<Box
89-
component='span'
90-
sx={{
91-
pl: 0.5,
92-
fontStyle: 'italic',
93-
color: metadataColor
94-
}}
95-
>
96-
{sizeOfValue}
97-
</Box>
95+
{displayObjectSize
96+
? (
97+
<Box
98+
component='span'
99+
sx={{
100+
pl: 0.5,
101+
fontStyle: 'italic',
102+
color: metadataColor
103+
}}
104+
>
105+
{sizeOfValue}
106+
</Box>
107+
)
108+
: null
109+
}
98110
</Box>
99111
)
100112
}

src/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ const JsonViewerInner: React.FC<JsonViewerProps> = (props) => {
5555
useSetIfNotUndefinedEffect('enableClipboard', props.enableClipboard)
5656
useSetIfNotUndefinedEffect('rootName', props.rootName)
5757
useSetIfNotUndefinedEffect('displayDataTypes', props.displayDataTypes)
58+
useSetIfNotUndefinedEffect('displayObjectSize', props.displayObjectSize)
5859
useEffect(() => {
5960
if (props.theme === 'light') {
6061
api.setState({

src/stores/JsonViewerStore.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export type JsonViewerState<T = unknown> = {
2929
value: T
3030
onChange: JsonViewerOnChange
3131
keyRenderer: JsonViewerKeyRenderer
32+
displayObjectSize: boolean
3233
}
3334

3435
export type JsonViewerActions = {
@@ -63,7 +64,8 @@ export const createJsonViewerStore = <T = unknown> (props: JsonViewerProps<T>) =
6364
inspectCache: {},
6465
hoverPath: null,
6566
colorspace: lightColorspace,
66-
value: props.value
67+
value: props.value,
68+
displayObjectSize: props.displayObjectSize ?? true
6769
},
6870
(set, get) => ({
6971
getInspectCache: (path, nestedIndex) => {

src/type.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,11 @@ export type JsonViewerProps<T = unknown> = {
141141
* @default 'light'
142142
*/
143143
theme?: JsonViewerTheme
144+
145+
/**
146+
* Whether display the size of array and object
147+
*
148+
* @default true
149+
*/
150+
displayObjectSize?: boolean
144151
}

tests/index.test.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,13 @@ describe('render <JsonViewer/> with props', () => {
229229
})
230230
})
231231

232+
it('render with displayObjectSize', async () => {
233+
const selection = [true, false]
234+
selection.forEach(displayObjectSize => {
235+
render(<JsonViewer value={['string1', 'string2']} displayObjectSize={displayObjectSize}/>)
236+
})
237+
})
238+
232239
it('render with dataTypes', async () => {
233240
render(<JsonViewer value={undefined} valueTypes={[]}/>)
234241
render(<JsonViewer value={undefined} valueTypes={[

0 commit comments

Comments
 (0)