Skip to content

Commit cef112b

Browse files
committed
stable delete and edit separated, preserving undefined
1 parent 97a01a3 commit cef112b

File tree

5 files changed

+45
-39
lines changed

5 files changed

+45
-39
lines changed

example/example.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ ReactDom.render(
1414
<JsonViewer
1515
src={getExampleJson1()}
1616
collapseStringsAfterLength={12}
17-
onEdit={(edit)=>{console.log(edit)}} />
17+
onEdit={(e)=>{console.log(e)}}
18+
onDelete={(e)=>{console.log(e)}} />
1819

1920
<br />
2021

@@ -23,7 +24,8 @@ ReactDom.render(
2324
src={getExampleJson1()}
2425
theme='railscasts'
2526
collapseStringsAfterLength={15}
26-
onEdit={(e)=>{console.log(e)}} />
27+
onEdit={(e)=>{console.log(e)}}
28+
onDelete={(e)=>{console.log(e)}} />
2729

2830
<br />
2931

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"chai": "^3.5.0",
2323
"clipboard": "^1.6.1",
2424
"coveralls": "^2.13.1",
25+
"deepcopy": "^0.6.3",
2526
"enzyme": "^2.8.2",
2627
"flux": "^3.1.2",
2728
"html-webpack-plugin": "2.28.0",

src/js/components/VariableEditor.js

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class VariableEditor extends React.Component {
3838
render() {
3939
const {
4040
variable, singleIndent, type, theme,
41-
namespace, indentWidth, onEdit
41+
namespace, indentWidth, onEdit, onDelete
4242
} = this.props;
4343
const {hover, editMode} = this.state;
4444

@@ -74,13 +74,8 @@ class VariableEditor extends React.Component {
7474
<div {...Theme(theme, 'variable-value')}>
7575
{this.getValue(variable, this.props, editMode)}
7676
</div>
77-
{onEdit
78-
? <span>
79-
{this.getEditIcon(hover)}
80-
{this.getRemoveIcon(hover)}
81-
</span>
82-
: null
83-
}
77+
{onEdit !== false ? this.getEditIcon(hover) : null}
78+
{onDelete !== false ? this.getRemoveIcon(hover) : null}
8479
</div>
8580
);
8681

@@ -139,7 +134,6 @@ class VariableEditor extends React.Component {
139134
class="click-to-remove-icon"
140135
{...Theme(theme, 'removeVarIcon', hover)}
141136
onClick={() => {
142-
this.state.hover = false;
143137
dispatcher.dispatch({
144138
name: 'VARIABLE_REMOVED',
145139
rjvId: rjvId,
@@ -150,7 +144,6 @@ class VariableEditor extends React.Component {
150144
variable_removed: true
151145
},
152146
});
153-
this.setState(this.state);
154147
}}
155148
/>
156149
</div>
@@ -218,8 +211,8 @@ class VariableEditor extends React.Component {
218211
const new_value = (
219212
isNaN(editValue) || !editValue.trim() ? editValue : parseFloat(editValue)
220213
);
221-
this.state.editMode = false;
222214
this.state.hover = false;
215+
this.state.editMode = false;
223216
dispatcher.dispatch({
224217
name: 'VARIABLE_UPDATED',
225218
rjvId: rjvId,
@@ -231,6 +224,7 @@ class VariableEditor extends React.Component {
231224
variable_removed: false
232225
},
233226
});
227+
this.setState(this.state);
234228
}}
235229
/>
236230
</div>

src/js/components/VariableMeta.js

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ export default class extends React.Component {
135135
if (namespace.length == 1) {return}
136136

137137
return (
138-
<div
138+
<span
139139
class="click-to-remove"
140140
style={{verticalAlign: 'top'}}>
141141
<Remove
@@ -152,15 +152,14 @@ export default class extends React.Component {
152152
variable_removed: true
153153
},
154154
});
155-
this.setState(this.state);
156155
}}
157156
/>
158-
</div>
157+
</span>
159158
);
160159
}
161160

162161
render = () => {
163-
const {theme, onEdit} = this.props;
162+
const {theme, onEdit, onDelete} = this.props;
164163
return (
165164
<div {...Theme(theme, 'object-meta-data')}
166165
class='object-meta-data'
@@ -172,13 +171,8 @@ export default class extends React.Component {
172171
{/* copy to clipboard icon */}
173172
{this.getCopyComponent()}
174173
{/* copy add/remove icons */}
175-
{onEdit !== false
176-
? <span style={{display: 'inline-block'}}>
177-
{this.getAddAttribute()}
178-
{this.getRemoveObject()}
179-
</span>
180-
: null
181-
}
174+
{onEdit !== false ? this.getAddAttribute() : null}
175+
{onDelete !== false ? this.getRemoveObject() : null}
182176
</div>
183177
);
184178
}

src/js/index.js

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import JsonViewer from './components/JsonViewer';
33
import {toType, isTheme} from './helpers/util';
44
import ObjectAttributes from './stores/ObjectAttributes';
55

6+
import deepcopy from 'deepcopy';
7+
68
//global theme
79
import style from './themes/getStyle';
810

@@ -31,7 +33,8 @@ export default class extends React.Component {
3133
enableClipboard: true,
3234
displayObjectSize: true,
3335
displayDataTypes: true,
34-
onEdit: false
36+
onEdit: false,
37+
onDelete: false
3538
}
3639

3740
componentWillMount() {
@@ -117,25 +120,35 @@ export default class extends React.Component {
117120
} = ObjectAttributes.get(
118121
this.rjvId, 'action', 'variable-update'
119122
);
120-
let {src, onEdit} = this.state;
123+
let {onEdit} = this.state;
124+
let src;
121125
namespace.shift();
122126

123-
for (const idx of namespace) {
124-
src = src[idx];
125-
}
126-
if (variable_removed) {
127-
if (toType(src) == 'array') {
128-
src.splice(name, 1);
127+
const getUpdatedSrc = () => {
128+
//deepy copy src
129+
let updated_src = deepcopy(this.state.src);
130+
let walk = updated_src;
131+
for (const idx of namespace) {
132+
walk = walk[idx];
133+
}
134+
if (variable_removed) {
135+
if (toType(walk) == 'array') {
136+
walk.splice(name, 1);
137+
} else {
138+
delete walk[name];
139+
}
129140
} else {
130-
delete src[name];
141+
walk[name] = new_value;
131142
}
132-
} else {
133-
src[name] = new_value;
143+
144+
return updated_src;
134145
}
135-
this.setState(this.state);
146+
147+
src = getUpdatedSrc();
136148

137149
const on_edit_payload = {
138-
updated_src: this.state.src,
150+
existing_src: this.state.src,
151+
updated_src: src,
139152
name: name,
140153
namespace: namespace,
141154
existing_value: existing_value,
@@ -144,7 +157,9 @@ export default class extends React.Component {
144157
on_edit_payload['new_value'] = new_value;
145158
}
146159

147-
onEdit(on_edit_payload);
148-
160+
if (onEdit(on_edit_payload) !== false) {
161+
this.state.src = src;
162+
this.setState(this.state);
163+
}
149164
}
150165
}

0 commit comments

Comments
 (0)