Skip to content

Commit e73c58e

Browse files
committed
implemented props correctly, improved state management, added undefined, updated tests
1 parent 87f1c5b commit e73c58e

24 files changed

+200
-128
lines changed

example/example.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ ReactDom.render(
4545
<br />
4646

4747
{/*demo array support*/}
48-
<JsonViewer src={getExampleArray()} />
48+
<JsonViewer src={getExampleArray()} theme='solarized' />
4949
</div>,
5050
document.getElementById('app-container')
5151
);
@@ -61,6 +61,7 @@ function getExampleJson1() {
6161
another_sibling: 42,
6262
how_will_array_do: [1, 2, 3, 'test'],
6363
how_will_floats_do: -2.757,
64+
undefined_var: undefined,
6465
parent: {
6566
sibling1: true,
6667
sibling2: false,

src/js/components/DataTypes/DataTypeLabel.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import React from 'react';
2-
import ConfigStore from './../../stores/ConfigStore';
32

43
//theme
54
import Theme from './../../themes/getStyle';
65

76
export default class extends React.Component {
87

98
render() {
10-
const {rjvId, type_name, theme} = this.props;
11-
if (ConfigStore.get(rjvId, 'displayDataTypes', true)) {
9+
const {rjvId, type_name, displayDataTypes, theme} = this.props;
10+
if (displayDataTypes) {
1211
return (
1312
<span class="data-type-label"
1413
{...Theme(theme, 'data-type-label')}>

src/js/components/DataTypes/DataTypes.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ export {default as JsonNan} from './Nan';
55
export {default as JsonNull} from './Null';
66
export {default as JsonInteger} from './Integer';
77
export {default as JsonObject} from './Object';
8-
export {default as JsonString} from './String';
8+
export {default as JsonString} from './String';
9+
export {default as JsonUndefined} from './Undefined';

src/js/components/DataTypes/Nan.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import Theme from './../../themes/getStyle';
66
export default class extends React.Component {
77

88
render() {
9-
const type_name = 'nan';
109
return (
1110
<div {...Theme(this.props.theme, 'nan')}>
1211
NaN

src/js/components/DataTypes/Null.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import Theme from './../../themes/getStyle';
66
export default class extends React.Component {
77

88
render() {
9-
const type_name = 'null';
109
return (
1110
<div {...Theme(this.props.theme, 'null')}>
1211
NULL

src/js/components/DataTypes/Object.js

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React from "react";
33
import {toType} from './../../helpers/util';
44
import {
55
JsonBoolean, JsonFloat, JsonFunction, JsonInteger,
6-
JsonNan, JsonNull, JsonObject, JsonString
6+
JsonNan, JsonNull, JsonObject, JsonString, JsonUndefined
77
} from './DataTypes';
88
import VariableMeta from './../VariableMeta';
99

@@ -29,34 +29,47 @@ class rjvObject extends React.Component {
2929

3030
constructor(props) {
3131
super(props);
32+
this.init(props);
33+
}
3234

33-
this.state.expanded = AttributeStore.get(
34-
this.state.rjvId,
35-
this.state.state_key,
36-
'expanded',
37-
!this.props.collapsed
38-
);
35+
state = {}
36+
37+
init = (props) => {
38+
const state = {
39+
rjvId: props.rjvId,
40+
state_key: props.namespace.join('.'),
41+
namespace: props.namespace,
42+
indentWidth: props.indentWidth,
43+
expanded: props.jsvRoot
44+
? !props.collapsed
45+
: AttributeStore.get(
46+
props.rjvId,
47+
props.namespace,
48+
'expanded',
49+
!props.collapsed
50+
),
51+
object_type: (props.type == 'array' ? 'array' : 'object'),
52+
parent_type: (props.type == 'array' ? 'array' : 'object'),
53+
display_name: (props.name ? props.name : '')
54+
}
55+
56+
this.state = {...this.state, ...state};
3957
}
4058

41-
state = {
42-
rjvId: this.props.rjvId,
43-
state_key: this.props.namespace.join('.'),
44-
namespace: this.props.namespace,
45-
indentWidth: this.props.indentWidth,
46-
expanded: null, //set in constructor
47-
object_type: (this.props.type == 'array' ? 'array' : 'object'),
48-
parent_type: (this.props.type == 'array' ? 'array' : 'object'),
49-
display_name: (this.props.name ? this.props.name : '')
59+
componentWillReceiveProps(nextProps) {
60+
this.init(nextProps);
61+
this.setState(this.state);
5062
}
5163

5264
toggleCollapsed = () => {
5365
this.state.expanded = !this.state.expanded;
5466
AttributeStore.set(
5567
this.state.rjvId,
56-
this.state.state_key,
68+
this.state.namespace,
5769
'expanded',
5870
this.state.expanded
5971
);
72+
6073
this.setState(this.state);
6174
}
6275

@@ -81,9 +94,8 @@ class rjvObject extends React.Component {
8194
getObjectMetaData = (src) => {
8295
const size = Object.keys(src).length;
8396
const {rjvId, theme} = this.props;
84-
const props = {size, rjvId, theme, src};
8597
return (
86-
<VariableMeta {...props}/>
98+
<VariableMeta size={size} {...this.props}/>
8799
);
88100
}
89101

@@ -98,6 +110,7 @@ class rjvObject extends React.Component {
98110
const {
99111
object_type, display_name, expanded
100112
} = this.state;
113+
101114
//expanded/collapsed icon
102115
let expanded_icon, object_padding_left = 0;
103116

@@ -124,7 +137,9 @@ class rjvObject extends React.Component {
124137
)}>
125138
<span>
126139
<span onClick={this.toggleCollapsed} {...Theme(theme, 'brace-row')}>
127-
<span class="icon-container">{expanded_icon}</span>
140+
<div class="icon-container" {...Theme(theme, 'icon-container')}>
141+
{expanded_icon}
142+
</div>
128143
{
129144
parent_type == 'array'
130145
? <span {...Theme(theme, 'array-key')} key={namespace}>
@@ -231,6 +246,8 @@ class rjvObject extends React.Component {
231246
return <JsonNull {...props} />;
232247
case 'nan':
233248
return <JsonNan {...props} />;
249+
case 'undefined':
250+
return <JsonUndefined {...props} />;
234251
default:
235252
//catch-all for types that weren't anticipated
236253
return <div class="object-value" {...props} >
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import React from 'react';
2+
3+
//theme
4+
import Theme from './../../themes/getStyle';
5+
6+
export default class extends React.Component {
7+
8+
render() {
9+
return (
10+
<div {...Theme(this.props.theme, 'undefined')}>
11+
undefined
12+
</div>
13+
);
14+
}
15+
16+
}

src/js/components/VariableMeta.js

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import Clippy from 'react-icons/lib/go/clippy';
66
//https://www.npmjs.com/package/clipboard
77
import Clipboard from 'clipboard';
88
import ReactTooltip from 'react-tooltip';
9-
//app config key-val storage
10-
import ConfigStore from './../stores/ConfigStore';
119

1210
//theme
1311
import Theme from './../themes/getStyle';
@@ -22,13 +20,7 @@ export default class extends React.Component {
2220
state = {
2321
id: null,
2422
clipboard: null,
25-
copy_state: null,
26-
display_clipboard: ConfigStore.get(
27-
this.props.rjvId, 'enableClipboard', true
28-
),
29-
display_size: ConfigStore.get(
30-
this.props.rjvId, 'displayObjectSize', true
31-
),
23+
copy_state: null
3224
}
3325

3426
componentDidMount = () => {
@@ -70,7 +62,7 @@ export default class extends React.Component {
7062
<span
7163
class="copy-to-clipboard-container"
7264
style={{
73-
display: this.state.display_clipboard ? 'inline-block' : 'none'
65+
display: this.props.enableClipboard ? 'inline-block' : 'none'
7466
}}>
7567
<span
7668
style={{
@@ -116,7 +108,7 @@ export default class extends React.Component {
116108
}
117109

118110
getObjectSize = (size) => {
119-
if (this.state.display_size) {
111+
if (this.props.displayObjectSize) {
120112
return (
121113
<span class="object-size"
122114
{...Theme(this.props.theme, 'object-size')}>

src/js/index.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import React from 'react';
22
import JsonViewer from './components/JsonViewer';
33
import {toType} from './helpers/util';
4-
//config key-val store
5-
import ConfigStore from './stores/ConfigStore'
64

75
//global theme
86
import style from './themes/getStyle';
@@ -34,12 +32,11 @@ export default class extends React.Component {
3432

3533
init = (props) => {
3634
for (let i in this.defaults) {
37-
if (this.props[i] !== undefined) {
38-
this.state[i] = this.props[i];
35+
if (props[i] !== undefined) {
36+
this.state[i] = props[i];
3937
} else {
4038
this.state[i] = this.defaults[i];
4139
}
42-
ConfigStore.set(this.rjvId, i, this.state[i]);
4340
}
4441

4542
//make sure `src` prop is valid
@@ -63,7 +60,7 @@ export default class extends React.Component {
6360
}
6461

6562
componentWillReceiveProps(nextProps) {
66-
this.init(this.props);
63+
this.init(nextProps);
6764
this.setState(this.state);
6865
}
6966

src/js/stores/ConfigStore.js

Lines changed: 0 additions & 26 deletions
This file was deleted.

0 commit comments

Comments
 (0)