UNPKG

react-inline-edit

Version:

A React component that allows inline/in-place edits.

192 lines (149 loc) 5.15 kB
'use strict'; var _extends = require('babel-runtime/helpers/extends')['default']; var _inherits = require('babel-runtime/helpers/inherits')['default']; var _get = require('babel-runtime/helpers/get')['default']; var _createClass = require('babel-runtime/helpers/create-class')['default']; var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default']; var _objectWithoutProperties = require('babel-runtime/helpers/object-without-properties')['default']; var _Object$defineProperty = require('babel-runtime/core-js/object/define-property')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; _Object$defineProperty(exports, '__esModule', { value: true }); /** * A component that allows inline/in-place edits. * * @Author: Vasanth Krishnamoorthy * * Thanks to @andreypopp and @jackmoore for jQuery autosize and react-textarea autosize */ var _React$Component = require('react'); var _React$Component2 = _interopRequireDefault(_React$Component); var _render = require('react-dom'); var _calcNodeHeight = require('./utils/calcNodeHeight'); var _calcNodeHeight2 = _interopRequireDefault(_calcNodeHeight); var InlineEdit = (function (_Component) { function InlineEdit(props) { var _this = this; _classCallCheck(this, InlineEdit); _get(Object.getPrototypeOf(InlineEdit.prototype), 'constructor', this).call(this, props); this._onChange = function (e) { _this._resizeIfNeeded(); var onChange = _this.props.onChange; onChange(e); }; this._onFocus = function (e) { _this.setState({ isFocus: true }); var onFocus = _this.props.onFocus; onFocus(e); }; this._onBlur = function (e) { _this.setState({ isFocus: false }); var onBlur = _this.props.onBlur; onBlur(e); }; this._resizeIfNeeded = function () { var cacheNodeStyling = _this.props.cacheNodeStyling; _this.setState(_calcNodeHeight2['default'](_this._DOMNode, cacheNodeStyling, _this.props.rows || _this.props.minRows, _this.props.maxRows)); }; this.state = { isHover: false, isFocus: false, height: null, maxHeight: Infinity }; this._DOMNode = null; } _inherits(InlineEdit, _Component); _createClass(InlineEdit, [{ key: 'render', value: function render() { var _this2 = this; var _props = this.props; var onChange = _props.onChange; var onFocus = _props.onFocus; var onBlur = _props.onBlur; var backgroundColor = _props.backgroundColor; var props = _objectWithoutProperties(_props, ['onChange', 'onFocus', 'onBlur', 'backgroundColor']); props = _extends({}, props); var defaultStyle = { backgroundColor: 'transparent', boxSizing: 'border-box', borderStyle: this.state.isHover ? 'dotted' : 'none', outline: 'none', resize: 'none' }; props.style = _extends({}, defaultStyle, { height: this.state.height }, props.style); var maxHeight = Math.max(props.style.maxHeight ? props.style.maxHeight : Infinity, this.state.maxHeight); if (maxHeight < this.state.height) { props.style.overflow = 'hidden'; } return _React$Component2['default'].createElement('textarea', _extends({}, props, { onChange: this._onChange, onFocus: this._onFocus, onBlur: this._onBlur, onMouseEnter: function () { return _this2.setState({ isHover: true }); }, onMouseLeave: function () { return _this2.setState({ isHover: false }); }, ref: function (node) { _this2._DOMNode = node; } })); } }, { key: 'componentDidMount', /** * Lifecycle Hooks */ value: function componentDidMount() { this._resizeIfNeeded(); window.addEventListener('resize', this._resizeIfNeeded); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps() { this._resizeIfNeeded(); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { window.removeEventListener('resize', this._resizeIfNeeded); } }]); return InlineEdit; })(_React$Component.Component); exports['default'] = InlineEdit; /** * PropType definitions */ InlineEdit.propTypes = { value: _React$Component2['default'].PropTypes.string, onChange: _React$Component2['default'].PropTypes.func, onBlur: _React$Component2['default'].PropTypes.func, onFocus: _React$Component2['default'].PropTypes.func, cacheNodeStyling: _React$Component2['default'].PropTypes.bool, rows: _React$Component2['default'].PropTypes.number, minRows: _React$Component2['default'].PropTypes.number, maxRows: _React$Component2['default'].PropTypes.number }; /** * Default Props */ InlineEdit.defaultProps = { onChange: function onChange() {}, onBlur: function onBlur() {}, onFocus: function onFocus() {}, cacheNodeStyling: false }; module.exports = exports['default']; /** * Component Action functions */