UNPKG

sematable

Version:

Client side sorting, pagination, and text filter for redux/react based apps

322 lines (277 loc) 11.9 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactRedux = require('react-redux'); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _SelectRow = require('./SelectRow'); var _SelectRow2 = _interopRequireDefault(_SelectRow); var _actions = require('./actions'); var _selectors = require('./selectors'); var _selectors2 = _interopRequireDefault(_selectors); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var propTypes = { selectable: _propTypes2.default.bool, selectEnabled: _propTypes2.default.func, row: _propTypes2.default.object.isRequired, headers: _propTypes2.default.object, columns: _propTypes2.default.array.isRequired, CheckboxComponent: _propTypes2.default.func, editable: _propTypes2.default.bool, onChange: _propTypes2.default.func, onClick: _propTypes2.default.func, deleteTableRow: _propTypes2.default.func, primaryKey: _propTypes2.default.string, onEditingChange: _propTypes2.default.func, isTableEditing: _propTypes2.default.bool, isRowEmpty: _propTypes2.default.func }; var mapDispatchToProps = function mapDispatchToProps(dispatch, _ref) { var tableName = _ref.tableName; return { onEditingChange: function onEditingChange(editing) { return dispatch((0, _actions.editingChange)(tableName, editing)); } }; }; var mapStateToProps = function mapStateToProps(state, props) { var tableName = props.tableName; var selectors = (0, _selectors2.default)(tableName); var isTableEditing = selectors.isTableEditing(state); return { isTableEditing: isTableEditing }; }; var resolveProps = function resolveProps(row, componentProps, tableProps) { if (!componentProps) { return {}; } else if (_lodash2.default.isFunction(componentProps)) { return componentProps(row, tableProps); } else if (_lodash2.default.isObject(componentProps)) { return componentProps; } throw new Error('componentProps should be object or function!'); }; var TableRow = function (_Component) { _inherits(TableRow, _Component); function TableRow(props) { _classCallCheck(this, TableRow); var _this = _possibleConstructorReturn(this, (TableRow.__proto__ || Object.getPrototypeOf(TableRow)).call(this, props)); _this.state = _extends({ value: '' }, _this.setInitialState()); return _this; } _createClass(TableRow, [{ key: 'onCellChange', value: function onCellChange(key, value) { this.setState(function (prevState) { return { editingRow: _extends({}, prevState.editingRow, _defineProperty({}, key, value)) }; }); } }, { key: 'onCancelEdit', value: function onCancelEdit() { var _state = this.state, editingRowId = _state.editingRowId, value = _state.value; var _props = this.props, deleteTableRow = _props.deleteTableRow, onEditingChange = _props.onEditingChange; if (value === '') { deleteTableRow(editingRowId); } this.setState({ editingRowId: null }); onEditingChange(false); } }, { key: 'setInitialState', value: function setInitialState() { var editingRow = null; var editingRowId = null; var _props2 = this.props, onEditingChange = _props2.onEditingChange, editable = _props2.editable, row = _props2.row, primaryKey = _props2.primaryKey, isRowEmpty = _props2.isRowEmpty; if (isRowEmpty && isRowEmpty(row) && editable) { editingRow = row; editingRowId = row[primaryKey]; onEditingChange(true); } return { editingRow: editingRow, editingRowId: editingRowId }; } }, { key: 'saveCell', value: function saveCell(row) { this.props.onChange(row); this.setState({ editingRowId: null }); this.props.onEditingChange(false); } }, { key: 'editRow', value: function editRow(cellValue, rowId, row) { this.props.onEditingChange(true); this.setState({ editingRowId: rowId, editingRow: row, value: cellValue }); } }, { key: 'renderCellContent', value: function renderCellContent(col, row, otherProps, editable) { var _this2 = this; var isTableEditing = this.props.isTableEditing; if (row.id === this.state.editingRowId && col.EditComponent) { return _react2.default.createElement(col.EditComponent, _extends({ value: this.state.editingRow[col.key], editingRow: this.state.editingRow, onChange: function onChange(e) { return _this2.onCellChange(col.key, e.target ? e.target.value : e); } }, resolveProps(row, col.editComponentProps, otherProps))); } else if (col.Component) { return _react2.default.createElement( col.Component, _extends({ row: row, key: col.key, className: (0, _classnames2.default)({ editable: editable }), onClick: function onClick() { return editable && !isTableEditing && _this2.editRow(_lodash2.default.get(row, col.key), row.id, row); } }, resolveProps(row, col.componentProps, otherProps)), _lodash2.default.get(row, col.key) ); } return _react2.default.createElement( 'div', { className: (0, _classnames2.default)({ editable: editable }), onClick: function onClick() { return editable && !isTableEditing && _this2.editRow(_lodash2.default.get(row, col.key), row.id, row); } }, _lodash2.default.get(row, col.key) ); } }, { key: 'render', value: function render() { var _this3 = this; var _props3 = this.props, row = _props3.row, selectable = _props3.selectable, selectEnabled = _props3.selectEnabled, headers = _props3.headers, columns = _props3.columns, editable = _props3.editable, CheckboxComponent = _props3.CheckboxComponent, onClick = _props3.onClick, primaryKey = _props3.primaryKey, isTableEditing = _props3.isTableEditing, otherProps = _objectWithoutProperties(_props3, ['row', 'selectable', 'selectEnabled', 'headers', 'columns', 'editable', 'CheckboxComponent', 'onClick', 'primaryKey', 'isTableEditing']); var select = headers && headers.select; var visibleColumns = columns.filter(function (c) { return !c.hidden; }); var className = ''; if (selectable && !select) { throw new Error('`headers` must be provided with `headers.select` when `selectable` is true'); } if (selectable && select.isSelected(row)) { className = 'table-info'; } var _state2 = this.state, editingRow = _state2.editingRow, editingRowId = _state2.editingRowId; var isRowEmpty = this.props.isRowEmpty; var isEditingClass = editingRowId ? 'editing' : null; var isSaveDisabled = isRowEmpty && isRowEmpty(editingRow); return _react2.default.createElement( _react2.default.Fragment, null, _react2.default.createElement( 'tr', { className: className, onClick: onClick ? function () { onClick(row); } : editable && !isTableEditing && function () { return _this3.editRow(row[primaryKey], row.id, row); } }, selectable && _react2.default.createElement( 'td', { key: 'select', style: { width: '1%', whiteSpace: 'nowrap' } }, _react2.default.createElement(_SelectRow2.default, _extends({ row: row, isEnabled: selectEnabled, CheckboxComponent: CheckboxComponent }, select)) ), visibleColumns.map(function (col) { return _react2.default.createElement( 'td', { key: col.key, className: (0, _classnames2.default)(col.className, { isEditingClass: isEditingClass }) }, _this3.renderCellContent(col, row, otherProps, editable && col.EditComponent) ); }) ), this.state.editingRowId && _react2.default.createElement( 'tr', null, _react2.default.createElement( 'td', { key: 'edit', colSpan: visibleColumns.length, className: 'isEditingClass' }, _react2.default.createElement( 'button', { className: 'btn btn-primary', onClick: function onClick() { return _this3.saveCell(_this3.state.editingRow); }, disabled: isSaveDisabled }, 'Save' ), _react2.default.createElement( 'button', { className: 'btn btn-secondary', onClick: function onClick() { return _this3.onCancelEdit(); } }, 'Cancel' ) ) ) ); } }]); return TableRow; }(_react.Component); TableRow.propTypes = propTypes; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(TableRow);