diff --git a/src/js/components/DataTypes/Object.js b/src/js/components/DataTypes/Object.js
index c14a3ff5..474459ea 100644
--- a/src/js/components/DataTypes/Object.js
+++ b/src/js/components/DataTypes/Object.js
@@ -1,6 +1,7 @@
import React from 'react';
import {polyfill} from 'react-lifecycles-compat';
import { toType } from './../../helpers/util';
+import dispatcher from './../../helpers/dispatcher';
//data type components
import { JsonObject } from './DataTypes';
@@ -15,6 +16,7 @@ import AttributeStore from './../../stores/ObjectAttributes';
//icons
import { CollapsedIcon, ExpandedIcon } from './../ToggleIcons';
+import { Edit } from './../icons';
//theme
import Theme from './../../themes/getStyle';
@@ -130,6 +132,32 @@ class RjvObject extends React.PureComponent {
return ;
}
+ getEditIcon = () => {
+ const { theme, name, namespace, src, rjvId } = this.props;
+ return (
+
+ {
+ e.stopPropagation();
+ dispatcher.dispatch({
+ name: 'UPDATE_VARIABLE_KEY_REQUEST',
+ rjvId: rjvId,
+ data: {
+ name,
+ namespace: namespace.splice(0, namespace.length -1),
+ existing_value: src,
+ _removed: false,
+ key_name: name
+ }
+ });
+ }}
+ />
+
+ );
+ }
+
getBraceStart(object_type, expanded) {
const { src, theme, iconStyle, parent_type } = this.props;
@@ -154,6 +182,7 @@ class RjvObject extends React.PureComponent {
}}
{...Theme(theme, 'brace-row')}
>
+ {this.getEditIcon()}
+ ) : null;
+ }
+
+ isValid = (input) => {
+ const {rjvId} = this.props;
+ const request = ObjectAttributes.get(
+ rjvId, 'action', 'edit-key-request'
+ );
+ return (
+ input != ''
+ );
+ }
+
+ submit = (input) => {
+ const { rjvId } = this.props;
+ let request = ObjectAttributes.get(
+ rjvId, 'action', 'edit-key-request'
+ );
+ request.key_name = input;
+ request.new_value = request.existing_value;
+ request.variable_key_updated = true;
+ dispatcher.dispatch({
+ name: 'VARIABLE_KEY_UPDATED',
+ rjvId: rjvId,
+ data: request
+ });
+ }
+}
diff --git a/src/js/components/ObjectKeyModal/ObjectKeyModal.js b/src/js/components/ObjectKeyModal/ObjectKeyModal.js
index 81f261ff..f698ce03 100644
--- a/src/js/components/ObjectKeyModal/ObjectKeyModal.js
+++ b/src/js/components/ObjectKeyModal/ObjectKeyModal.js
@@ -12,10 +12,14 @@ export default class extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
- input: props.input ? props.input : ''
+ input: ''
};
}
+ componentDidMount() {
+ this.setState({ input: this.props.input });
+ }
+
render() {
const {theme, rjvId, isValid} = this.props;
const {input} = this.state;
diff --git a/src/js/components/VariableEditor.js b/src/js/components/VariableEditor.js
index 60497bac..405f9302 100644
--- a/src/js/components/VariableEditor.js
+++ b/src/js/components/VariableEditor.js
@@ -66,6 +66,9 @@ class VariableEditor extends React.PureComponent {
class="variable-row"
key={variable.name}
>
+ {isNaN(Number(variable.name)) && onEdit !== false && editMode == false
+ ? this.getEditKeyIcon()
+ : null}
{type == 'array' ? (
+
{
+ const { variable: { name, value }, theme, namespace, rjvId } = this.props;
+ return (
+
+ {
+ e.stopPropagation();
+ dispatcher.dispatch({
+ name: 'UPDATE_VARIABLE_KEY_REQUEST',
+ rjvId: rjvId,
+ data: {
+ name,
+ namespace: namespace,
+ existing_value: value,
+ variable_removed: false,
+ key_name: name
+ }
+ });
+ }}
+ />
+
+ );
+ }
+
prepopInput = variable => {
if (this.props.onEdit !== false) {
const stringifiedValue = stringifyVariable(variable.value);
diff --git a/src/js/index.js b/src/js/index.js
index 64773a3a..23ff2cce 100644
--- a/src/js/index.js
+++ b/src/js/index.js
@@ -2,6 +2,7 @@ import React from 'react';
import {polyfill} from 'react-lifecycles-compat';
import JsonViewer from './components/JsonViewer';
import AddKeyRequest from './components/ObjectKeyModal/AddKeyRequest';
+import EditKeyRequest from './components/ObjectKeyModal/EditKeyRequest';
import ValidationFailure from './components/ValidationFailure';
import {toType, isTheme} from './helpers/util';
import ObjectAttributes from './stores/ObjectAttributes';
@@ -139,7 +140,8 @@ class ReactJsonView extends React.PureComponent {
return {
'reset': this.resetState,
'variable-update': this.updateSrc,
- 'add-key-request': this.addKeyRequest
+ 'add-key-request': this.addKeyRequest,
+ 'edit-key-request': this.editKeyRequest
};
}
//make sure props are passed in as expected
@@ -182,6 +184,7 @@ class ReactJsonView extends React.PureComponent {
validationFailure,
validationMessage,
addKeyRequest,
+ editKeyRequest,
theme,
src,
name
@@ -211,6 +214,11 @@ class ReactJsonView extends React.PureComponent {
theme={theme}
rjvId={this.rjvId}
defaultValue={defaultValue} />
+
);
}
@@ -230,17 +238,20 @@ class ReactJsonView extends React.PureComponent {
const on_edit_payload = {
existing_src: src,
- new_value: new_value,
- updated_src: updated_src,
- name: name,
- namespace: namespace,
- existing_value: existing_value,
+ new_value,
+ updated_src,
+ name,
+ namespace,
+ existing_value,
};
switch (type) {
case 'variable-added':
result = onAdd(on_edit_payload);
break;
+ case 'variable-update-key':
+ result = onEdit(on_edit_payload);
+ break;
case 'variable-edited':
result = onEdit(on_edit_payload);
break;
@@ -267,10 +278,17 @@ class ReactJsonView extends React.PureComponent {
});
}
+ editKeyRequest = () => {
+ this.setState({
+ editKeyRequest: true
+ });
+ }
+
resetState = () => {
this.setState({
validationFailure: false,
- addKeyRequest: false
+ addKeyRequest: false,
+ editKeyRequest: false
});
}
}
diff --git a/src/js/stores/ObjectAttributes.js b/src/js/stores/ObjectAttributes.js
index 14987e8b..7a3dbb70 100644
--- a/src/js/stores/ObjectAttributes.js
+++ b/src/js/stores/ObjectAttributes.js
@@ -63,16 +63,27 @@ class ObjectAttributes extends EventEmitter {
);
this.emit('variable-update-' + rjvId);
break;
+ case 'VARIABLE_KEY_UPDATED':
+ action.data.updated_src = this.updateSrc(
+ rjvId, data
+ );
+ this.set(rjvId, 'action', 'variable-update',{...data, type:'variable-key-added'});
+ this.emit('variable-update-' + rjvId);
+ break;
case 'ADD_VARIABLE_KEY_REQUEST':
this.set(rjvId, 'action', 'new-key-request', data);
this.emit('add-key-request-' + rjvId);
break;
+ case 'UPDATE_VARIABLE_KEY_REQUEST':
+ this.set(rjvId, 'action', 'edit-key-request', data);
+ this.emit('edit-key-request-' + rjvId);
+ break;
}
}
updateSrc = (rjvId, request) => {
let {
- name, namespace, new_value, existing_value, variable_removed
+ name, namespace, new_value, existing_value, variable_key_updated, variable_removed, key_name
} = request;
namespace.shift();
@@ -88,19 +99,26 @@ class ObjectAttributes extends EventEmitter {
walk = walk[idx];
}
-
- if (variable_removed) {
+ if(variable_key_updated) {
if (toType(walk) == 'array') {
walk.splice(name, 1);
} else {
+ walk[key_name] = existing_value;
delete walk[name];
}
+ } else if (variable_removed) {
+ if (toType(walk) == 'array') {
+ walk.splice(name, 1);
+ } else {
+ if(walk) delete walk[name];
+ }
} else {
//update copied variable at specified namespace
if (name !== null) {
walk[name] = new_value;
} else {
- updated_src = new_value;
+ walk[new_value] = existing_value;
+ //updated_src = new_value;
}
}
diff --git a/src/style/scss/global.scss b/src/style/scss/global.scss
index 8f65e092..4667f366 100644
--- a/src/style/scss/global.scss
+++ b/src/style/scss/global.scss
@@ -14,7 +14,7 @@
}
.object-key-val {
- &:hover > span > .object-meta-data {
+ &:hover > span > .object-meta-data, &:hover > span > span {
& > .copy-to-clipboard-container {
display: inline-block;
}
@@ -24,6 +24,9 @@
& > .click-to-remove {
display: inline-block;
}
+ & > .click-to-edit {
+ display: inline-block;
+ }
}
}
diff --git a/test/tests/js/components/ObjectKeyModal/EditKeyRequest-test.js b/test/tests/js/components/ObjectKeyModal/EditKeyRequest-test.js
new file mode 100644
index 00000000..9d36351b
--- /dev/null
+++ b/test/tests/js/components/ObjectKeyModal/EditKeyRequest-test.js
@@ -0,0 +1,38 @@
+import React from "react"
+import { shallow, render, mount } from "enzyme"
+import { expect } from "chai"
+
+import EditKeyRequest from "./../../../../../src/js/components/ObjectKeyModal/EditKeyRequest"
+import ObjectAttributes from "./../../../../../src/js/stores/ObjectAttributes"
+
+describe("", function() {
+ const rjvId = 1
+
+ it("EditKeyRequest should not render input when inactive", function() {
+ ObjectAttributes.set(rjvId, "action", "new-key-request", {
+ existing_value: { test: true },
+ namespace: [],
+ new_value: { test: null }
+ })
+ ObjectAttributes.set(rjvId, "global", "src", { test: true })
+ const wrapper = mount(
+
+ )
+
+ expect(wrapper.find(".key-modal-input").length).to.equal(0)
+ })
+
+ it("EditKeyRequest should render input when active", function() {
+ ObjectAttributes.set(rjvId, "action", "new-key-request", {
+ existing_value: { test: true },
+ namespace: [],
+ new_value: { test: null }
+ })
+ ObjectAttributes.set(rjvId, "global", "src", { test: true })
+ const wrapper = mount(
+
+ )
+
+ expect(wrapper.find(".key-modal-input").length).to.equal(1)
+ })
+})