Skip to content

Commit 5f98f90

Browse files
committed
feat: init maxDisplayLength
1 parent 661151a commit 5f98f90

File tree

5 files changed

+40
-8
lines changed

5 files changed

+40
-8
lines changed

examples/basic/pages/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ const IndexPage: React.FC = () => {
129129
indentWidth={indent}
130130
theme={theme}
131131
groupArraysAfterLength={groupArraysAfterLength}
132+
maxDisplayLength={2}
132133
keyRenderer={KeyRenderer}
133134
valueTypes={[
134135
{

src/components/DataTypes/Object.tsx

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { useJsonViewerStore } from '../../stores/JsonViewerStore'
77
import type { DataItemProps } from '../../type'
88
import { DataKeyPair } from '../DataKeyPair'
99
import { CircularArrowsIcon } from '../icons/CircularArrowsIcon'
10+
import { DataBox } from '../mui/DataBox'
1011

1112
const objectLb = '{'
1213
const arrayLb = '['
@@ -82,23 +83,33 @@ export const PostObjectType: React.FC<DataItemProps<object>> = (props) => {
8283

8384
export const ObjectType: React.FC<DataItemProps<object>> = (props) => {
8485
const keyColor = useTextColor()
86+
const maxDisplayLength = useJsonViewerStore(store => store.maxDisplayLength)
8587
const groupArraysAfterLength = useJsonViewerStore(
8688
store => store.groupArraysAfterLength)
8789
const isTrap = useIsCycleReference(props.path, props.value)
8890
const elements = useMemo(() => {
8991
if (!props.inspect) {
9092
return null
9193
}
92-
if (Array.isArray(props.value)) {
93-
if (props.value.length <= groupArraysAfterLength) {
94-
return props.value.map((value, index) => {
94+
const value: unknown[] | object = props.value
95+
if (Array.isArray(value)) {
96+
// unknown[]
97+
if (value.length <= groupArraysAfterLength) {
98+
const elements = value.slice(0, maxDisplayLength).map((value, index) => {
9599
const path = [...props.path, index]
96100
return (
97101
<DataKeyPair key={index} path={path} value={value}/>
98102
)
99103
})
104+
if (value.length > maxDisplayLength) {
105+
const rest = value.length - maxDisplayLength
106+
elements.push(
107+
<DataBox>hidden {rest} items</DataBox>
108+
)
109+
}
110+
return elements
100111
}
101-
const value = props.value.reduce<unknown[][]>((array, value, index) => {
112+
const elements = value.reduce<unknown[][]>((array, value, index) => {
102113
const target = Math.floor(index / groupArraysAfterLength)
103114
if (array[target]) {
104115
array[target].push(value)
@@ -108,21 +119,30 @@ export const ObjectType: React.FC<DataItemProps<object>> = (props) => {
108119
return array
109120
}, [])
110121

111-
return value.map((list, index) => {
122+
return elements.map((list, index) => {
112123
const path = [...props.path]
113124
return (
114125
<DataKeyPair key={index} path={path} value={list} nestedIndex={index}/>
115126
)
116127
})
117128
} else {
118-
return Object.entries(props.value).map(([key, value]) => {
129+
// object
130+
const entries = Object.entries(value)
131+
const elements = entries.slice(0, maxDisplayLength).map(([key, value]) => {
119132
const path = [...props.path, key]
120133
return (
121134
<DataKeyPair key={key} path={path} value={value}/>
122135
)
123136
})
137+
if (entries.length > maxDisplayLength) {
138+
const rest = entries.length - maxDisplayLength
139+
elements.push(
140+
<DataBox>hidden {rest} items</DataBox>
141+
)
142+
}
143+
return elements
124144
}
125-
}, [props.inspect, props.value, props.path, groupArraysAfterLength])
145+
}, [props.inspect, props.value, props.path, groupArraysAfterLength, maxDisplayLength])
126146
return (
127147
<Box
128148
className='data-object'

src/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,15 @@ const JsonViewerInner: React.FC<JsonViewerProps> = (props) => {
5050
setIfNotUndefined('onChange', props.onChange)
5151
setIfNotUndefined('groupArraysAfterLength', props.groupArraysAfterLength)
5252
setIfNotUndefined('keyRenderer', props.keyRenderer)
53+
setIfNotUndefined('maxDisplayLength', props.maxDisplayLength)
5354
}, [
5455
api,
5556
props.defaultInspectDepth,
5657
props.groupArraysAfterLength,
5758
props.keyRenderer,
5859
props.onChange,
5960
props.value,
61+
props.maxDisplayLength,
6062
setIfNotUndefined])
6163

6264
useEffect(() => {

src/stores/JsonViewerStore.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export type JsonViewerState = {
1515
inspectCache: Record<string, boolean>
1616
hoverPath: { path: Path; nestedIndex?: number } | null
1717
groupArraysAfterLength: number
18+
maxDisplayLength: number
1819
defaultInspectDepth: number
1920
colorNamespace: ColorNamespace
2021
expanded: string[]
@@ -38,6 +39,7 @@ export const createJsonViewerStore = () =>
3839
inspectCache: {},
3940
hoverPath: null,
4041
groupArraysAfterLength: 100,
42+
maxDisplayLength: 30,
4143
rootName: 'root',
4244
defaultInspectDepth: 10,
4345
colorNamespace: lightColorNamespace,

src/type.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,16 @@ export type JsonViewerProps<T = unknown> = {
5353
/**
5454
* Inspect depth by default.
5555
* Do not set the number too large, otherwise there will have performance issue
56-
* @default 50
56+
* @default 2
5757
*/
5858
defaultInspectDepth?: number
59+
/**
60+
* Hide item after reach the count, array and object will be both affected.
61+
*
62+
* If`Object.keys(value).length` is big also, this will cause a performance issue.
63+
* @default 30
64+
*/
65+
maxDisplayLength?: number
5966
/**
6067
* When an integer value is assigned, arrays will be displayed in groups by count of the value.
6168
* Groups are displayed with bracket notation and can be expanded and collapsed by clicking on the brackets.

0 commit comments

Comments
 (0)