Skip to content

Commit fa10c9e

Browse files
authored
feat: backport support for props.displayDataTypes (#63)
1 parent 8c626cf commit fa10c9e

File tree

7 files changed

+38
-5
lines changed

7 files changed

+38
-5
lines changed

examples/basic/pages/index.tsx

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import {
22
AppBar,
3-
FormControl,
3+
FormControl, FormControlLabel,
44
InputLabel,
55
MenuItem,
6-
Select,
6+
Select, Switch,
77
TextField, Toolbar, Typography
88
} from '@mui/material'
99
import {
@@ -91,6 +91,7 @@ const IndexPage: React.FC = () => {
9191
const [themeKey, setThemeKey] = useState<string>('light')
9292
const [theme, setTheme] = useState<JsonViewerTheme>('light')
9393
const [src, setSrc] = useState(() => example)
94+
const [displayDataTypes, setDisplayDataTypes] = useState(true)
9495
useEffect(() => {
9596
const loop = () => {
9697
setSrc(src => ({
@@ -126,6 +127,13 @@ const IndexPage: React.FC = () => {
126127
</Toolbar>
127128
</AppBar>
128129
<Toolbar/>
130+
<FormControlLabel
131+
control={<Switch
132+
value={displayDataTypes}
133+
onChange={event => setDisplayDataTypes(event.target.checked)}
134+
/>}
135+
label='DisplayDataTypes'
136+
/>
129137
<TextField
130138
label='indentWidth'
131139
value={indent}
@@ -177,6 +185,7 @@ const IndexPage: React.FC = () => {
177185
value={src}
178186
indentWidth={indent}
179187
theme={theme}
188+
displayDataTypes={displayDataTypes}
180189
groupArraysAfterLength={groupArraysAfterLength}
181190
keyRenderer={KeyRenderer}
182191
valueTypes={[

src/components/DataKeyPair.tsx

+8-2
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,14 @@ export const DataKeyPair: React.FC<DataKeyPairProps> = (props) => {
239239
)
240240
}
241241
{
242-
(nestedIndex === undefined && isRoot && rootName !== false) && (
243-
<DataBox sx={{ mx: 0.5 }}>:</DataBox>
242+
(
243+
isRoot
244+
? (rootName !== false
245+
? <DataBox sx={{ mx: 0.5 }}>:</DataBox>
246+
: null)
247+
: nestedIndex === undefined && (
248+
<DataBox sx={{ mx: 0.5 }}>:</DataBox>
249+
)
244250
)
245251
}
246252
{PreComponent && <PreComponent {...downstreamProps} />}

src/components/DataTypes/createEasyType.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export function createEasyType<Value> (
1919
const displayTypeLabel = config.displayTypeLabel ?? true
2020
const Render = React.memo(renderValue)
2121
const EasyType: React.FC<DataItemProps<Value>> = (props) => {
22+
const storeDisplayDataTypes = useJsonViewerStore(store => store.displayDataTypes)
2223
const color = useJsonViewerStore(
2324
store => store.colorspace[config.colorKey])
2425
return (
@@ -27,7 +28,7 @@ export function createEasyType<Value> (
2728
color
2829
}}
2930
>
30-
{displayTypeLabel && <DataTypeLabel dataType={type}/>}
31+
{(displayTypeLabel && storeDisplayDataTypes) && <DataTypeLabel dataType={type}/>}
3132
<DataBox className={`${type}-value`}>
3233
<Render value={props.value}/>
3334
</DataBox>

src/index.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const JsonViewerInner: React.FC<JsonViewerProps> = (props) => {
5151
useSetIfNotUndefinedEffect('maxDisplayLength', props.maxDisplayLength)
5252
useSetIfNotUndefinedEffect('enableClipboard', props.enableClipboard)
5353
useSetIfNotUndefinedEffect('rootName', props.rootName)
54+
useSetIfNotUndefinedEffect('displayDataTypes', props.displayDataTypes)
5455
useEffect(() => {
5556
if (props.theme === 'light') {
5657
api.setState({

src/stores/JsonViewerStore.ts

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export type JsonViewerState<T = unknown> = {
2424
quotesOnKeys: boolean
2525
colorspace: Colorspace
2626
editable: boolean | (<U>(path: Path, currentValue: U) => boolean)
27+
displayDataTypes: boolean
2728
rootName: false | string
2829
value: T
2930
onChange: JsonViewerOnChange
@@ -54,6 +55,7 @@ export const createJsonViewerStore = <T = unknown>(props: JsonViewerProps<T>) =>
5455
defaultInspectDepth: props.defaultInspectDepth ?? 5,
5556
objectSortKeys: props.objectSortKeys ?? false,
5657
quotesOnKeys: props.quotesOnKeys ?? true,
58+
displayDataTypes: props.displayDataTypes ?? true,
5759
// internal state
5860
inspectCache: {},
5961
hoverPath: null,

src/type.ts

+7
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,13 @@ export type JsonViewerProps<T = unknown> = {
127127
*/
128128
quotesOnKeys?: boolean
129129

130+
/**
131+
* Whether display data type labels
132+
*
133+
* @default true
134+
*/
135+
displayDataTypes?: boolean
136+
130137
className?: string
131138
style?: React.CSSProperties
132139
/**

tests/index.test.tsx

+7
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,13 @@ describe('render <JsonViewer/> with props', () => {
157157
.toEqual(undefined)
158158
})
159159

160+
it('render with displayDataTypes', async () => {
161+
const selection = [true, false]
162+
selection.forEach(displayDataTypes => {
163+
render(<JsonViewer value={undefined} displayDataTypes={displayDataTypes}/>)
164+
})
165+
})
166+
160167
it('render with dataTypes', async () => {
161168
render(<JsonViewer value={undefined} valueTypes={[]}/>)
162169
render(<JsonViewer value={undefined} valueTypes={[

0 commit comments

Comments
 (0)