react-editable-json-tree
Version:
React Editable Json Tree
311 lines (262 loc) • 10.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _reactHotkeys = require('react-hotkeys');
var _objectTypes = require('../utils/objectTypes');
var _inputUsageTypes = require('../types/inputUsageTypes');
var _inputUsageTypes2 = _interopRequireDefault(_inputUsageTypes);
var _parse = require('../utils/parse');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* ************************************* */
/* ******** VARIABLES ******** */
/* ************************************* */
// Prop types
/*
* Author: Alexandre Havrileck (Oxyno-zeta)
* Date: 13/11/16
* Licence: See Readme
*/
/* ************************************* */
/* ******** IMPORTS ******** */
/* ************************************* */
var propTypes = {
name: _propTypes2.default.string.isRequired,
value: _propTypes2.default.any.isRequired,
originalValue: _propTypes2.default.any,
keyPath: _propTypes2.default.array,
deep: _propTypes2.default.number,
handleRemove: _propTypes2.default.func,
handleUpdateValue: _propTypes2.default.func,
readOnly: _propTypes2.default.func.isRequired,
dataType: _propTypes2.default.string,
getStyle: _propTypes2.default.func.isRequired,
editButtonElement: _propTypes2.default.element,
cancelButtonElement: _propTypes2.default.element,
textareaElementGenerator: _propTypes2.default.func.isRequired,
minusMenuElement: _propTypes2.default.element,
logger: _propTypes2.default.object.isRequired,
onSubmitValueParser: _propTypes2.default.func.isRequired
};
// Default props
var defaultProps = {
keyPath: [],
deep: 0,
handleUpdateValue: function handleUpdateValue() {},
editButtonElement: _react2.default.createElement(
'button',
null,
'e'
),
cancelButtonElement: _react2.default.createElement(
'button',
null,
'c'
),
minusMenuElement: _react2.default.createElement(
'span',
null,
' - '
)
};
/* ************************************* */
/* ******** COMPONENT ******** */
/* ************************************* */
var JsonFunctionValue = function (_Component) {
(0, _inherits3.default)(JsonFunctionValue, _Component);
function JsonFunctionValue(props) {
(0, _classCallCheck3.default)(this, JsonFunctionValue);
var _this = (0, _possibleConstructorReturn3.default)(this, (JsonFunctionValue.__proto__ || (0, _getPrototypeOf2.default)(JsonFunctionValue)).call(this, props));
var keyPath = [].concat((0, _toConsumableArray3.default)(props.keyPath), [props.name]);
_this.state = {
value: props.value,
name: props.name,
keyPath: keyPath,
deep: props.deep,
editEnabled: false,
inputRef: null
};
// Bind
_this.handleEditMode = _this.handleEditMode.bind(_this);
_this.refInput = _this.refInput.bind(_this);
_this.handleCancelEdit = _this.handleCancelEdit.bind(_this);
_this.handleEdit = _this.handleEdit.bind(_this);
return _this;
}
(0, _createClass3.default)(JsonFunctionValue, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
this.setState({
value: nextProps.value
});
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate() {
var _state = this.state,
editEnabled = _state.editEnabled,
inputRef = _state.inputRef,
name = _state.name,
value = _state.value,
keyPath = _state.keyPath,
deep = _state.deep;
var _props = this.props,
readOnly = _props.readOnly,
dataType = _props.dataType;
var readOnlyResult = readOnly(name, value, keyPath, deep, dataType);
if (editEnabled && !readOnlyResult && typeof inputRef.focus === 'function') {
inputRef.focus();
}
}
}, {
key: 'handleEdit',
value: function handleEdit() {
var _this2 = this;
var _props2 = this.props,
handleUpdateValue = _props2.handleUpdateValue,
originalValue = _props2.originalValue,
logger = _props2.logger,
onSubmitValueParser = _props2.onSubmitValueParser,
keyPath = _props2.keyPath;
var _state2 = this.state,
inputRef = _state2.inputRef,
name = _state2.name,
deep = _state2.deep;
var newValue = onSubmitValueParser(true, keyPath, deep, name, inputRef.value);
var result = {
value: newValue,
key: name
};
// Run update
handleUpdateValue(result).then(function () {
// Cancel edit mode if necessary
if (!(0, _objectTypes.isComponentWillChange)(originalValue, newValue)) {
_this2.handleCancelEdit();
}
}).catch(logger.error);
}
}, {
key: 'handleEditMode',
value: function handleEditMode() {
this.setState({
editEnabled: true
});
}
}, {
key: 'refInput',
value: function refInput(node) {
this.state.inputRef = node;
}
}, {
key: 'handleCancelEdit',
value: function handleCancelEdit() {
this.setState({
editEnabled: false
});
}
}, {
key: 'render',
value: function render() {
var _state3 = this.state,
name = _state3.name,
value = _state3.value,
editEnabled = _state3.editEnabled,
keyPath = _state3.keyPath,
deep = _state3.deep;
var _props3 = this.props,
handleRemove = _props3.handleRemove,
originalValue = _props3.originalValue,
readOnly = _props3.readOnly,
dataType = _props3.dataType,
getStyle = _props3.getStyle,
editButtonElement = _props3.editButtonElement,
cancelButtonElement = _props3.cancelButtonElement,
textareaElementGenerator = _props3.textareaElementGenerator,
minusMenuElement = _props3.minusMenuElement,
comeFromKeyPath = _props3.keyPath;
var style = getStyle(name, originalValue, keyPath, deep, dataType);
var result = null;
var minusElement = null;
var resultOnlyResult = readOnly(name, originalValue, keyPath, deep, dataType);
if (editEnabled && !resultOnlyResult) {
var textareaElement = textareaElementGenerator(_inputUsageTypes2.default.VALUE, comeFromKeyPath, deep, name, originalValue, dataType);
var editButtonElementLayout = _react2.default.cloneElement(editButtonElement, {
onClick: this.handleEdit
});
var cancelButtonElementLayout = _react2.default.cloneElement(cancelButtonElement, {
onClick: this.handleCancelEdit
});
var textareaElementLayout = _react2.default.cloneElement(textareaElement, {
ref: this.refInput,
defaultValue: (0, _parse.functionToString)(originalValue)
});
result = _react2.default.createElement(
'span',
{ className: 'rejt-edit-form', style: style.editForm },
textareaElementLayout,
' ',
cancelButtonElementLayout,
editButtonElementLayout
);
minusElement = null;
} else {
/* eslint-disable jsx-a11y/no-static-element-interactions */
result = _react2.default.createElement(
'span',
{
className: 'rejt-value', style: style.value, onClick: resultOnlyResult ? null : this.handleEditMode
},
value
);
/* eslint-enable */
var minusMenuLayout = _react2.default.cloneElement(minusMenuElement, {
onClick: handleRemove,
className: 'rejt-minus-menu',
style: style.minus
});
minusElement = resultOnlyResult ? null : minusMenuLayout;
}
var handlers = {
esc: this.handleCancelEdit,
enter: this.handleEdit
};
return _react2.default.createElement(
_reactHotkeys.HotKeys,
{ component: 'li', className: 'rejt-function-value-node', style: style.li, handlers: handlers },
_react2.default.createElement(
'span',
{ className: 'rejt-name', style: style.name },
name,
' : '
),
result,
minusElement
);
}
}]);
return JsonFunctionValue;
}(_react.Component);
// Add prop types
JsonFunctionValue.propTypes = propTypes;
// Add default props
JsonFunctionValue.defaultProps = defaultProps;
/* ************************************* */
/* ******** EXPORTS ******** */
/* ************************************* */
exports.default = JsonFunctionValue;