diff --git a/README.md b/README.md index 4b4e44e..69649e2 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,35 @@ some description... ## 使用方法 ```js +const columns = [ + { title: '用户名', dataIndex: 'a', key: 'a', width: 100 }, + { id: '123', title: '性别', dataIndex: 'b', key: 'b', width: 100 }, + { title: '年龄', dataIndex: 'c', key: 'c', width: 200 }, + { + title: '操作', dataIndex: '', key: 'd', render() { + return 一些操作; + }, + }, +]; + +const data = [ + { a: '令狐冲', b: '男', c: 41, key: '1' }, + { a: '杨过', b: '男', c: 67, key: '2' }, + { a: '郭靖', b: '男', c: 25, key: '3' }, +]; + +class Demo extends Component { + render () { + return ( +
标题: 这是一个标题
} + footer={currentData =>
表尾: 我是小尾巴
} + /> + ) + } +} ``` diff --git a/build/Column.js b/build/Column.js new file mode 100644 index 0000000..1511968 --- /dev/null +++ b/build/Column.js @@ -0,0 +1,43 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require('react'); + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(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) : _defaults(subClass, superClass); } + +var propTypes = { + className: _react.PropTypes.string, + colSpan: _react.PropTypes.number, + title: _react.PropTypes.node, + dataIndex: _react.PropTypes.string, + width: _react.PropTypes.oneOfType([_react.PropTypes.number, _react.PropTypes.string]), + fixed: _react.PropTypes.oneOf([true, 'left', 'right']), + render: _react.PropTypes.func, + onCellClick: _react.PropTypes.func +}; + +var Column = function (_Component) { + _inherits(Column, _Component); + + function Column() { + _classCallCheck(this, Column); + + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); + } + + return Column; +}(_react.Component); + +Column.propTypes = propTypes; + +exports["default"] = Column; +module.exports = exports['default']; \ No newline at end of file diff --git a/build/ColumnGroup.js b/build/ColumnGroup.js new file mode 100644 index 0000000..5db83cd --- /dev/null +++ b/build/ColumnGroup.js @@ -0,0 +1,33 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require('react'); + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(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) : _defaults(subClass, superClass); } + +var ColumnGroup = function (_Component) { + _inherits(ColumnGroup, _Component); + + function ColumnGroup() { + _classCallCheck(this, ColumnGroup); + + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); + } + + return ColumnGroup; +}(_react.Component); + +ColumnGroup.propTypes = { + title: _react.PropTypes.node +}; +exports["default"] = ColumnGroup; +module.exports = exports['default']; \ No newline at end of file diff --git a/build/ColumnManager.js b/build/ColumnManager.js new file mode 100644 index 0000000..6cb366f --- /dev/null +++ b/build/ColumnManager.js @@ -0,0 +1,213 @@ +'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 _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _Column = require('./Column'); + +var _Column2 = _interopRequireDefault(_Column); + +var _ColumnGroup = require('./ColumnGroup'); + +var _ColumnGroup2 = _interopRequireDefault(_ColumnGroup); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +//行控制管理 + +var ColumnManager = function () { + function ColumnManager(columns, elements) { + _classCallCheck(this, ColumnManager); + + this._cached = {}; + + this.columns = columns || this.normalize(elements); + } + + ColumnManager.prototype.isAnyColumnsFixed = function isAnyColumnsFixed() { + var _this = this; + + return this._cache('isAnyColumnsFixed', function () { + return _this.columns.some(function (column) { + return !!column.fixed; + }); + }); + }; + + ColumnManager.prototype.isAnyColumnsLeftFixed = function isAnyColumnsLeftFixed() { + var _this2 = this; + + return this._cache('isAnyColumnsLeftFixed', function () { + return _this2.columns.some(function (column) { + return column.fixed === 'left' || column.fixed === true; + }); + }); + }; + + ColumnManager.prototype.isAnyColumnsRightFixed = function isAnyColumnsRightFixed() { + var _this3 = this; + + return this._cache('isAnyColumnsRightFixed', function () { + return _this3.columns.some(function (column) { + return column.fixed === 'right'; + }); + }); + }; + + ColumnManager.prototype.leftColumns = function leftColumns() { + var _this4 = this; + + return this._cache('leftColumns', function () { + return _this4.groupedColumns().filter(function (column) { + return column.fixed === 'left' || column.fixed === true; + }); + }); + }; + + ColumnManager.prototype.rightColumns = function rightColumns() { + var _this5 = this; + + return this._cache('rightColumns', function () { + return _this5.groupedColumns().filter(function (column) { + return column.fixed === 'right'; + }); + }); + }; + + ColumnManager.prototype.leafColumns = function leafColumns() { + var _this6 = this; + + return this._cache('leafColumns', function () { + return _this6._leafColumns(_this6.columns); + }); + }; + + ColumnManager.prototype.leftLeafColumns = function leftLeafColumns() { + var _this7 = this; + + return this._cache('leftLeafColumns', function () { + return _this7._leafColumns(_this7.leftColumns()); + }); + }; + + ColumnManager.prototype.rightLeafColumns = function rightLeafColumns() { + var _this8 = this; + + return this._cache('rightLeafColumns', function () { + return _this8._leafColumns(_this8.rightColumns()); + }); + }; + + // add appropriate rowspan and colspan to column + + + ColumnManager.prototype.groupedColumns = function groupedColumns() { + var _this9 = this; + + return this._cache('groupedColumns', function () { + var _groupColumns = function _groupColumns(columns) { + var currentRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var parentColumn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var rows = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; + + // track how many rows we got + rows[currentRow] = rows[currentRow] || []; + var grouped = []; + var setRowSpan = function setRowSpan(column) { + var rowSpan = rows.length - currentRow; + if (column && !column.children && // parent columns are supposed to be one row + rowSpan > 1 && (!column.rowSpan || column.rowSpan < rowSpan)) { + column.rowSpan = rowSpan; + } + }; + columns.forEach(function (column, index) { + var newColumn = _extends({}, column); + rows[currentRow].push(newColumn); + parentColumn.colSpan = parentColumn.colSpan || 0; + if (newColumn.children && newColumn.children.length > 0) { + newColumn.children = _groupColumns(newColumn.children, currentRow + 1, newColumn, rows); + parentColumn.colSpan = parentColumn.colSpan + newColumn.colSpan; + } else { + parentColumn.colSpan++; + } + // update rowspan to all same row columns + for (var i = 0; i < rows[currentRow].length - 1; ++i) { + setRowSpan(rows[currentRow][i]); + } + // last column, update rowspan immediately + if (index + 1 === columns.length) { + setRowSpan(newColumn); + } + grouped.push(newColumn); + }); + return grouped; + }; + return _groupColumns(_this9.columns); + }); + }; + + ColumnManager.prototype.normalize = function normalize(elements) { + var _this10 = this; + + var columns = []; + _react2["default"].Children.forEach(elements, function (element) { + if (!_this10.isColumnElement(element)) return; + var column = _extends({}, element.props); + if (element.key) { + column.key = element.key; + } + if (element.type === _ColumnGroup2["default"]) { + column.children = _this10.normalize(column.children); + } + columns.push(column); + }); + return columns; + }; + + ColumnManager.prototype.isColumnElement = function isColumnElement(element) { + return element && (element.type === _Column2["default"] || element.type === _ColumnGroup2["default"]); + }; + + ColumnManager.prototype.reset = function reset(columns, elements) { + this.columns = columns || this.normalize(elements); + this._cached = {}; + }; + + ColumnManager.prototype._cache = function _cache(name, fn) { + if (name in this._cached) { + return this._cached[name]; + } + this._cached[name] = fn(); + return this._cached[name]; + }; + + ColumnManager.prototype._leafColumns = function _leafColumns(columns) { + var _this11 = this; + + var leafColumns = []; + columns.forEach(function (column) { + if (!column.children) { + leafColumns.push(column); + } else { + leafColumns.push.apply(leafColumns, _toConsumableArray(_this11._leafColumns(column.children))); + } + }); + return leafColumns; + }; + + return ColumnManager; +}(); + +exports["default"] = ColumnManager; +module.exports = exports['default']; \ No newline at end of file diff --git a/build/ExpandIcon.js b/build/ExpandIcon.js new file mode 100644 index 0000000..c069e95 --- /dev/null +++ b/build/ExpandIcon.js @@ -0,0 +1,78 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _shallowequal = require('shallowequal'); + +var _shallowequal2 = _interopRequireDefault(_shallowequal); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(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) : _defaults(subClass, superClass); } + +var propTypes = { + record: _react.PropTypes.object, + clsPrefix: _react.PropTypes.string, + expandable: _react.PropTypes.any, + expanded: _react.PropTypes.bool, + needIndentSpaced: _react.PropTypes.bool, + onExpand: _react.PropTypes.func +}; + +var ExpandIcon = function (_Component) { + _inherits(ExpandIcon, _Component); + + function ExpandIcon(props) { + _classCallCheck(this, ExpandIcon); + + return _possibleConstructorReturn(this, _Component.call(this, props)); + } + + ExpandIcon.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) { + return !(0, _shallowequal2["default"])(nextProps, this.props); + }; + + ExpandIcon.prototype.render = function render() { + var _props = this.props, + expandable = _props.expandable, + clsPrefix = _props.clsPrefix, + onExpand = _props.onExpand, + needIndentSpaced = _props.needIndentSpaced, + expanded = _props.expanded, + record = _props.record; + + if (expandable) { + var expandClassName = expanded ? 'expanded' : 'collapsed'; + return _react2["default"].createElement('span', { + className: clsPrefix + '-expand-icon ' + clsPrefix + '-' + expandClassName, + onClick: function onClick(e) { + return onExpand(!expanded, record, e); + } + }); + } else if (needIndentSpaced) { + return _react2["default"].createElement('span', { className: clsPrefix + '-expand-icon ' + clsPrefix + '-spaced' }); + } + return null; + }; + + return ExpandIcon; +}(_react.Component); + +; + +ExpandIcon.propTypes = propTypes; + +exports["default"] = ExpandIcon; +module.exports = exports['default']; \ No newline at end of file diff --git a/build/Table.js b/build/Table.js new file mode 100644 index 0000000..90da50b --- /dev/null +++ b/build/Table.js @@ -0,0 +1,842 @@ +'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 _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _TableRow = require('./TableRow'); + +var _TableRow2 = _interopRequireDefault(_TableRow); + +var _TableHeader = require('./TableHeader'); + +var _TableHeader2 = _interopRequireDefault(_TableHeader); + +var _utils = require('./utils'); + +var _shallowequal = require('shallowequal'); + +var _shallowequal2 = _interopRequireDefault(_shallowequal); + +var _addEventListener = require('rc-util/lib/Dom/addEventListener'); + +var _addEventListener2 = _interopRequireDefault(_addEventListener); + +var _ColumnManager = require('./ColumnManager'); + +var _ColumnManager2 = _interopRequireDefault(_ColumnManager); + +var _createStore = require('./createStore'); + +var _createStore2 = _interopRequireDefault(_createStore); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +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) : _defaults(subClass, superClass); } + +var propTypes = { + data: _react.PropTypes.array, + expandIconAsCell: _react.PropTypes.bool, + defaultExpandAllRows: _react.PropTypes.bool, + expandedRowKeys: _react.PropTypes.array, + defaultExpandedRowKeys: _react.PropTypes.array, + useFixedHeader: _react.PropTypes.bool, + columns: _react.PropTypes.array, + clsPrefix: _react.PropTypes.string, + bodyStyle: _react.PropTypes.object, + style: _react.PropTypes.object, + //特殊的渲染规则的key值 + rowKey: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.func]), + rowClassName: _react.PropTypes.func, + expandedRowClassName: _react.PropTypes.func, + childrenColumnName: _react.PropTypes.string, + onExpand: _react.PropTypes.func, + onExpandedRowsChange: _react.PropTypes.func, + indentSize: _react.PropTypes.number, + onRowClick: _react.PropTypes.func, + onRowDoubleClick: _react.PropTypes.func, + expandIconColumnIndex: _react.PropTypes.number, + //是否显示表头 + showHeader: _react.PropTypes.bool, + title: _react.PropTypes.func, + footer: _react.PropTypes.func, + emptyText: _react.PropTypes.func, + scroll: _react.PropTypes.object, + rowRef: _react.PropTypes.func, + getBodyWrapper: _react.PropTypes.func, + children: _react.PropTypes.node +}; + +var defaultProps = { + data: [], + useFixedHeader: false, + expandIconAsCell: false, + defaultExpandAllRows: false, + defaultExpandedRowKeys: [], + rowKey: 'key', + rowClassName: function rowClassName() { + return ''; + }, + expandedRowClassName: function expandedRowClassName() { + return ''; + }, + onExpand: function onExpand() {}, + onExpandedRowsChange: function onExpandedRowsChange() {}, + onRowClick: function onRowClick() {}, + onRowDoubleClick: function onRowDoubleClick() {}, + + clsPrefix: 'u-table', + bodyStyle: {}, + style: {}, + childrenColumnName: 'children', + indentSize: 15, + expandIconColumnIndex: 0, + showHeader: true, + scroll: {}, + rowRef: function rowRef() { + return null; + }, + getBodyWrapper: function getBodyWrapper(body) { + return body; + }, + emptyText: function emptyText() { + return 'No Data'; + } +}; + +var Table = function (_Component) { + _inherits(Table, _Component); + + function Table(props) { + _classCallCheck(this, Table); + + var _this = _possibleConstructorReturn(this, _Component.call(this, props)); + + var expandedRowKeys = []; + var rows = [].concat(_toConsumableArray(props.data)); + _this.columnManager = new _ColumnManager2["default"](props.columns, props.children); + _this.store = (0, _createStore2["default"])({ currentHoverKey: null }); + + if (props.defaultExpandAllRows) { + for (var i = 0; i < rows.length; i++) { + var row = rows[i]; + expandedRowKeys.push(_this.getRowKey(row, i)); + rows = rows.concat(row[props.childrenColumnName] || []); + } + } else { + expandedRowKeys = props.expandedRowKeys || props.defaultExpandedRowKeys; + } + _this.state = { + expandedRowKeys: expandedRowKeys, + data: props.data, + currentHoverKey: null, + scrollPosition: 'left', + fixedColumnsHeadRowsHeight: [], + fixedColumnsBodyRowsHeight: [] + }; + + _this.onExpandedRowsChange = _this.onExpandedRowsChange.bind(_this); + _this.onExpanded = _this.onExpanded.bind(_this); + _this.onRowDestroy = _this.onRowDestroy.bind(_this); + _this.getRowKey = _this.getRowKey.bind(_this); + _this.getExpandedRows = _this.getExpandedRows.bind(_this); + _this.getHeader = _this.getHeader.bind(_this); + _this.getHeaderRows = _this.getHeaderRows.bind(_this); + _this.getExpandedRow = _this.getExpandedRow.bind(_this); + _this.getRowsByData = _this.getRowsByData.bind(_this); + _this.getRows = _this.getRows.bind(_this); + _this.getColGroup = _this.getColGroup.bind(_this); + _this.getLeftFixedTable = _this.getLeftFixedTable.bind(_this); + _this.getRightFixedTable = _this.getRightFixedTable.bind(_this); + _this.getTable = _this.getTable.bind(_this); + _this.getTitle = _this.getTitle.bind(_this); + _this.getFooter = _this.getFooter.bind(_this); + _this.getEmptyText = _this.getEmptyText.bind(_this); + _this.getHeaderRowStyle = _this.getHeaderRowStyle.bind(_this); + _this.syncFixedTableRowHeight = _this.syncFixedTableRowHeight.bind(_this); + _this.resetScrollY = _this.resetScrollY.bind(_this); + _this.findExpandedRow = _this.findExpandedRow.bind(_this); + _this.isRowExpanded = _this.isRowExpanded.bind(_this); + _this.detectScrollTarget = _this.detectScrollTarget.bind(_this); + _this.handleBodyScroll = _this.handleBodyScroll.bind(_this); + _this.handleRowHover = _this.handleRowHover.bind(_this); + + return _this; + } + + Table.prototype.componentDidMount = function componentDidMount() { + this.resetScrollY(); + if (this.columnManager.isAnyColumnsFixed()) { + this.syncFixedTableRowHeight(); + this.resizeEvent = (0, _addEventListener2["default"])(window, 'resize', (0, _utils.debounce)(this.syncFixedTableRowHeight, 150)); + } + }; + + Table.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { + if ('data' in nextProps) { + this.setState({ + data: nextProps.data + }); + if (!nextProps.data || nextProps.data.length === 0) { + this.resetScrollY(); + } + } + if ('expandedRowKeys' in nextProps) { + this.setState({ + expandedRowKeys: nextProps.expandedRowKeys + }); + } + if (nextProps.columns && nextProps.columns !== this.props.columns) { + this.columnManager.reset(nextProps.columns); + } else if (nextProps.children !== this.props.children) { + this.columnManager.reset(null, nextProps.children); + } + }; + + Table.prototype.componentDidUpdate = function componentDidUpdate() { + this.syncFixedTableRowHeight(); + }; + + Table.prototype.componentWillUnmount = function componentWillUnmount() { + if (this.resizeEvent) { + this.resizeEvent.remove(); + } + }; + + Table.prototype.onExpandedRowsChange = function onExpandedRowsChange(expandedRowKeys) { + if (!this.props.expandedRowKeys) { + this.setState({ expandedRowKeys: expandedRowKeys }); + } + this.props.onExpandedRowsChange(expandedRowKeys); + }; + + Table.prototype.onExpanded = function onExpanded(expanded, record, e, index) { + if (e) { + e.preventDefault(); + e.stopPropagation(); + } + var info = this.findExpandedRow(record); + if (typeof info !== 'undefined' && !expanded) { + this.onRowDestroy(record, index); + } else if (!info && expanded) { + var expandedRows = this.getExpandedRows().concat(); + expandedRows.push(this.getRowKey(record, index)); + this.onExpandedRowsChange(expandedRows); + } + this.props.onExpand(expanded, record); + }; + + Table.prototype.onRowDestroy = function onRowDestroy(record, rowIndex) { + var expandedRows = this.getExpandedRows().concat(); + var rowKey = this.getRowKey(record, rowIndex); + var index = -1; + expandedRows.forEach(function (r, i) { + if (r === rowKey) { + index = i; + } + }); + if (index !== -1) { + expandedRows.splice(index, 1); + } + this.onExpandedRowsChange(expandedRows); + }; + + Table.prototype.getRowKey = function getRowKey(record, index) { + var rowKey = this.props.rowKey; + var key = typeof rowKey === 'function' ? rowKey(record, index) : record[rowKey]; + (0, _utils.warningOnce)(key !== undefined, 'Each record in table should have a unique `key` prop,' + 'or set `rowKey` to an unique primary key.'); + return key; + }; + + Table.prototype.getExpandedRows = function getExpandedRows() { + return this.props.expandedRowKeys || this.state.expandedRowKeys; + }; + + Table.prototype.getHeader = function getHeader(columns, fixed) { + var _props = this.props, + showHeader = _props.showHeader, + expandIconAsCell = _props.expandIconAsCell, + clsPrefix = _props.clsPrefix; + + var rows = this.getHeaderRows(columns); + + if (expandIconAsCell && fixed !== 'right') { + rows[0].unshift({ + key: 'rc-table-expandIconAsCell', + className: clsPrefix + '-expand-icon-th', + title: '', + rowSpan: rows.length + }); + } + + var trStyle = fixed ? this.getHeaderRowStyle(columns, rows) : null; + + return showHeader ? _react2["default"].createElement(_TableHeader2["default"], { + clsPrefix: clsPrefix, + rows: rows, + rowStyle: trStyle + }) : null; + }; + + Table.prototype.getHeaderRows = function getHeaderRows(columns) { + var _this2 = this; + + var currentRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var rows = arguments[2]; + + rows = rows || []; + rows[currentRow] = rows[currentRow] || []; + + columns.forEach(function (column) { + if (column.rowSpan && rows.length < column.rowSpan) { + while (rows.length < column.rowSpan) { + rows.push([]); + } + } + var cell = { + key: column.key, + className: column.className || '', + children: column.title + }; + if (column.children) { + _this2.getHeaderRows(column.children, currentRow + 1, rows); + } + if ('colSpan' in column) { + cell.colSpan = column.colSpan; + } + if ('rowSpan' in column) { + cell.rowSpan = column.rowSpan; + } + if (cell.colSpan !== 0) { + rows[currentRow].push(cell); + } + }); + return rows.filter(function (row) { + return row.length > 0; + }); + }; + + Table.prototype.getExpandedRow = function getExpandedRow(key, content, visible, className, fixed) { + var _props2 = this.props, + clsPrefix = _props2.clsPrefix, + expandIconAsCell = _props2.expandIconAsCell; + + var colCount = void 0; + if (fixed === 'left') { + colCount = this.columnManager.leftLeafColumns().length; + } else if (fixed === 'right') { + colCount = this.columnManager.rightLeafColumns().length; + } else { + colCount = this.columnManager.leafColumns().length; + } + var columns = [{ + key: 'extra-row', + render: function render() { + return { + props: { + colSpan: colCount + }, + children: fixed !== 'right' ? content : ' ' + }; + } + }]; + if (expandIconAsCell && fixed !== 'right') { + columns.unshift({ + key: 'expand-icon-placeholder', + render: function render() { + return null; + } + }); + } + return _react2["default"].createElement(_TableRow2["default"], { + columns: columns, + visible: visible, + className: className, + key: key + '-extra-row', + clsPrefix: clsPrefix + '-expanded-row', + indent: 1, + expandable: false, + store: this.store + }); + }; + + Table.prototype.getRowsByData = function getRowsByData(data, visible, indent, columns, fixed) { + var props = this.props; + var childrenColumnName = props.childrenColumnName; + var expandedRowRender = props.expandedRowRender; + var expandRowByClick = props.expandRowByClick; + var fixedColumnsBodyRowsHeight = this.state.fixedColumnsBodyRowsHeight; + + var rst = []; + var rowClassName = props.rowClassName; + var rowRef = props.rowRef; + var expandedRowClassName = props.expandedRowClassName; + var needIndentSpaced = props.data.some(function (record) { + return record[childrenColumnName]; + }); + var onRowClick = props.onRowClick; + var onRowDoubleClick = props.onRowDoubleClick; + + var expandIconAsCell = fixed !== 'right' ? props.expandIconAsCell : false; + var expandIconColumnIndex = fixed !== 'right' ? props.expandIconColumnIndex : -1; + + for (var i = 0; i < data.length; i++) { + var record = data[i]; + var key = this.getRowKey(record, i); + var childrenColumn = record[childrenColumnName]; + var isRowExpanded = this.isRowExpanded(record, i); + var expandedRowContent = void 0; + if (expandedRowRender && isRowExpanded) { + expandedRowContent = expandedRowRender(record, i, indent); + } + var className = rowClassName(record, i, indent); + + var onHoverProps = {}; + if (this.columnManager.isAnyColumnsFixed()) { + onHoverProps.onHover = this.handleRowHover; + } + + var height = fixed && fixedColumnsBodyRowsHeight[i] ? fixedColumnsBodyRowsHeight[i] : null; + + var leafColumns = void 0; + if (fixed === 'left') { + leafColumns = this.columnManager.leftLeafColumns(); + } else if (fixed === 'right') { + leafColumns = this.columnManager.rightLeafColumns(); + } else { + leafColumns = this.columnManager.leafColumns(); + } + + rst.push(_react2["default"].createElement(_TableRow2["default"], _extends({ + indent: indent, + indentSize: props.indentSize, + needIndentSpaced: needIndentSpaced, + className: className, + record: record, + expandIconAsCell: expandIconAsCell, + onDestroy: this.onRowDestroy, + index: i, + visible: visible, + expandRowByClick: expandRowByClick, + onExpand: this.onExpanded, + expandable: childrenColumn || expandedRowRender, + expanded: isRowExpanded, + clsPrefix: props.clsPrefix + '-row', + childrenColumnName: childrenColumnName, + columns: leafColumns, + expandIconColumnIndex: expandIconColumnIndex, + onRowClick: onRowClick, + onRowDoubleClick: onRowDoubleClick, + height: height + }, onHoverProps, { + key: key, + hoverKey: key, + ref: rowRef(record, i, indent), + store: this.store + }))); + + var subVisible = visible && isRowExpanded; + + if (expandedRowContent && isRowExpanded) { + rst.push(this.getExpandedRow(key, expandedRowContent, subVisible, expandedRowClassName(record, i, indent), fixed)); + } + if (childrenColumn) { + rst = rst.concat(this.getRowsByData(childrenColumn, subVisible, indent + 1, columns, fixed)); + } + } + return rst; + }; + + Table.prototype.getRows = function getRows(columns, fixed) { + return this.getRowsByData(this.state.data, true, 0, columns, fixed); + }; + + Table.prototype.getColGroup = function getColGroup(columns, fixed) { + var cols = []; + if (this.props.expandIconAsCell && fixed !== 'right') { + cols.push(_react2["default"].createElement('col', { + className: this.props.clsPrefix + '-expand-icon-col', + key: 'rc-table-expand-icon-col' + })); + } + var leafColumns = void 0; + if (fixed === 'left') { + leafColumns = this.columnManager.leftLeafColumns(); + } else if (fixed === 'right') { + leafColumns = this.columnManager.rightLeafColumns(); + } else { + leafColumns = this.columnManager.leafColumns(); + } + cols = cols.concat(leafColumns.map(function (c) { + return _react2["default"].createElement('col', { key: c.key, style: { width: c.width, minWidth: c.width } }); + })); + return _react2["default"].createElement( + 'colgroup', + null, + cols + ); + }; + + Table.prototype.getLeftFixedTable = function getLeftFixedTable() { + return this.getTable({ + columns: this.columnManager.leftColumns(), + fixed: 'left' + }); + }; + + Table.prototype.getRightFixedTable = function getRightFixedTable() { + return this.getTable({ + columns: this.columnManager.rightColumns(), + fixed: 'right' + }); + }; + + Table.prototype.getTable = function getTable() { + var _this3 = this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var columns = options.columns, + fixed = options.fixed; + var _props3 = this.props, + clsPrefix = _props3.clsPrefix, + _props3$scroll = _props3.scroll, + scroll = _props3$scroll === undefined ? {} : _props3$scroll, + getBodyWrapper = _props3.getBodyWrapper; + var useFixedHeader = this.props.useFixedHeader; + + var bodyStyle = _extends({}, this.props.bodyStyle); + var headStyle = {}; + + var tableClassName = ''; + if (scroll.x || fixed) { + tableClassName = clsPrefix + '-fixed'; + bodyStyle.overflowX = bodyStyle.overflowX || 'auto'; + } + + if (scroll.y) { + // maxHeight will make fixed-Table scrolling not working + // so we only set maxHeight to body-Table here + if (fixed) { + bodyStyle.height = bodyStyle.height || scroll.y; + } else { + bodyStyle.maxHeight = bodyStyle.maxHeight || scroll.y; + } + bodyStyle.overflowY = bodyStyle.overflowY || 'scroll'; + useFixedHeader = true; + + // Add negative margin bottom for scroll bar overflow bug + var scrollbarWidth = (0, _utils.measureScrollbar)(); + if (scrollbarWidth > 0) { + (fixed ? bodyStyle : headStyle).marginBottom = '-' + scrollbarWidth + 'px'; + (fixed ? bodyStyle : headStyle).paddingBottom = '0px'; + } + } + + var renderTable = function renderTable() { + var hasHead = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var hasBody = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + var tableStyle = {}; + if (!fixed && scroll.x) { + // not set width, then use content fixed width + if (scroll.x === true) { + tableStyle.tableLayout = 'fixed'; + } else { + tableStyle.width = scroll.x; + } + } + var tableBody = hasBody ? getBodyWrapper(_react2["default"].createElement( + 'tbody', + { className: clsPrefix + '-tbody' }, + _this3.getRows(columns, fixed) + )) : null; + return _react2["default"].createElement( + 'table', + { className: tableClassName, style: tableStyle }, + _this3.getColGroup(columns, fixed), + hasHead ? _this3.getHeader(columns, fixed) : null, + tableBody + ); + }; + + var headTable = void 0; + + if (useFixedHeader) { + headTable = _react2["default"].createElement( + 'div', + { + className: clsPrefix + '-header', + ref: fixed ? null : 'headTable', + style: headStyle, + onMouseOver: this.detectScrollTarget, + onTouchStart: this.detectScrollTarget, + onScroll: this.handleBodyScroll + }, + renderTable(true, false) + ); + } + + var BodyTable = _react2["default"].createElement( + 'div', + { + className: clsPrefix + '-body', + style: bodyStyle, + ref: 'bodyTable', + onMouseOver: this.detectScrollTarget, + onTouchStart: this.detectScrollTarget, + onScroll: this.handleBodyScroll + }, + renderTable(!useFixedHeader) + ); + + if (fixed && columns.length) { + var refName = void 0; + if (columns[0].fixed === 'left' || columns[0].fixed === true) { + refName = 'fixedColumnsBodyLeft'; + } else if (columns[0].fixed === 'right') { + refName = 'fixedColumnsBodyRight'; + } + delete bodyStyle.overflowX; + delete bodyStyle.overflowY; + BodyTable = _react2["default"].createElement( + 'div', + { + className: clsPrefix + '-body-outer', + style: _extends({}, bodyStyle) + }, + _react2["default"].createElement( + 'div', + { + className: clsPrefix + '-body-inner', + ref: refName, + onMouseOver: this.detectScrollTarget, + onTouchStart: this.detectScrollTarget, + onScroll: this.handleBodyScroll + }, + renderTable(!useFixedHeader) + ) + ); + } + + return _react2["default"].createElement( + 'span', + null, + headTable, + BodyTable + ); + }; + + Table.prototype.getTitle = function getTitle() { + var _props4 = this.props, + title = _props4.title, + clsPrefix = _props4.clsPrefix; + + return title ? _react2["default"].createElement( + 'div', + { className: clsPrefix + '-title' }, + title(this.state.data) + ) : null; + }; + + Table.prototype.getFooter = function getFooter() { + var _props5 = this.props, + footer = _props5.footer, + clsPrefix = _props5.clsPrefix; + + return footer ? _react2["default"].createElement( + 'div', + { className: clsPrefix + '-footer' }, + footer(this.state.data) + ) : null; + }; + + Table.prototype.getEmptyText = function getEmptyText() { + var _props6 = this.props, + emptyText = _props6.emptyText, + clsPrefix = _props6.clsPrefix, + data = _props6.data; + + return !data.length ? _react2["default"].createElement( + 'div', + { className: clsPrefix + '-placeholder' }, + emptyText() + ) : null; + }; + + Table.prototype.getHeaderRowStyle = function getHeaderRowStyle(columns, rows) { + var fixedColumnsHeadRowsHeight = this.state.fixedColumnsHeadRowsHeight; + + var headerHeight = fixedColumnsHeadRowsHeight[0]; + if (headerHeight && columns) { + if (headerHeight === 'auto') { + return { height: 'auto' }; + } + return { height: headerHeight / rows.length }; + } + return null; + }; + + Table.prototype.syncFixedTableRowHeight = function syncFixedTableRowHeight() { + var clsPrefix = this.props.clsPrefix; + + var headRows = this.refs.headTable ? this.refs.headTable.querySelectorAll('thead') : this.refs.bodyTable.querySelectorAll('thead'); + var bodyRows = this.refs.bodyTable.querySelectorAll('.' + clsPrefix + '-row') || []; + var fixedColumnsHeadRowsHeight = [].map.call(headRows, function (row) { + return row.getBoundingClientRect().height || 'auto'; + }); + var fixedColumnsBodyRowsHeight = [].map.call(bodyRows, function (row) { + return row.getBoundingClientRect().height || 'auto'; + }); + if ((0, _shallowequal2["default"])(this.state.fixedColumnsHeadRowsHeight, fixedColumnsHeadRowsHeight) && (0, _shallowequal2["default"])(this.state.fixedColumnsBodyRowsHeight, fixedColumnsBodyRowsHeight)) { + return; + } + this.setState({ + fixedColumnsHeadRowsHeight: fixedColumnsHeadRowsHeight, + fixedColumnsBodyRowsHeight: fixedColumnsBodyRowsHeight + }); + }; + + Table.prototype.resetScrollY = function resetScrollY() { + if (this.refs.headTable) { + this.refs.headTable.scrollLeft = 0; + } + if (this.refs.bodyTable) { + this.refs.bodyTable.scrollLeft = 0; + } + }; + + Table.prototype.findExpandedRow = function findExpandedRow(record, index) { + var _this4 = this; + + var rows = this.getExpandedRows().filter(function (i) { + return i === _this4.getRowKey(record, index); + }); + return rows[0]; + }; + + Table.prototype.isRowExpanded = function isRowExpanded(record, index) { + return typeof this.findExpandedRow(record, index) !== 'undefined'; + }; + + Table.prototype.detectScrollTarget = function detectScrollTarget(e) { + if (this.scrollTarget !== e.currentTarget) { + this.scrollTarget = e.currentTarget; + } + }; + + Table.prototype.handleBodyScroll = function handleBodyScroll(e) { + // Prevent scrollTop setter trigger onScroll event + // http://stackoverflow.com/q/1386696 + if (e.target !== this.scrollTarget) { + return; + } + var _props$scroll = this.props.scroll, + scroll = _props$scroll === undefined ? {} : _props$scroll; + var _refs = this.refs, + headTable = _refs.headTable, + bodyTable = _refs.bodyTable, + fixedColumnsBodyLeft = _refs.fixedColumnsBodyLeft, + fixedColumnsBodyRight = _refs.fixedColumnsBodyRight; + + if (scroll.x && e.target.scrollLeft !== this.lastScrollLeft) { + if (e.target === bodyTable && headTable) { + headTable.scrollLeft = e.target.scrollLeft; + } else if (e.target === headTable && bodyTable) { + bodyTable.scrollLeft = e.target.scrollLeft; + } + if (e.target.scrollLeft === 0) { + this.setState({ scrollPosition: 'left' }); + } else if (e.target.scrollLeft + 1 >= e.target.children[0].getBoundingClientRect().width - e.target.getBoundingClientRect().width) { + this.setState({ scrollPosition: 'right' }); + } else if (this.state.scrollPosition !== 'middle') { + this.setState({ scrollPosition: 'middle' }); + } + } + if (scroll.y) { + if (fixedColumnsBodyLeft && e.target !== fixedColumnsBodyLeft) { + fixedColumnsBodyLeft.scrollTop = e.target.scrollTop; + } + if (fixedColumnsBodyRight && e.target !== fixedColumnsBodyRight) { + fixedColumnsBodyRight.scrollTop = e.target.scrollTop; + } + if (bodyTable && e.target !== bodyTable) { + bodyTable.scrollTop = e.target.scrollTop; + } + } + // Remember last scrollLeft for scroll direction detecting. + this.lastScrollLeft = e.target.scrollLeft; + }; + + Table.prototype.handleRowHover = function handleRowHover(isHover, key) { + this.store.setState({ + currentHoverKey: isHover ? key : null + }); + }; + + Table.prototype.render = function render() { + var props = this.props; + var clsPrefix = props.clsPrefix; + + var className = props.clsPrefix; + if (props.className) { + className += ' ' + props.className; + } + if (props.useFixedHeader || props.scroll && props.scroll.y) { + className += ' ' + clsPrefix + '-fixed-header'; + } + className += ' ' + clsPrefix + '-scroll-position-' + this.state.scrollPosition; + + var isTableScroll = this.columnManager.isAnyColumnsFixed() || props.scroll.x || props.scroll.y; + + return _react2["default"].createElement( + 'div', + { className: className, style: props.style }, + this.getTitle(), + _react2["default"].createElement( + 'div', + { className: clsPrefix + '-content' }, + this.columnManager.isAnyColumnsLeftFixed() && _react2["default"].createElement( + 'div', + { className: clsPrefix + '-fixed-left' }, + this.getLeftFixedTable() + ), + _react2["default"].createElement( + 'div', + { className: isTableScroll ? clsPrefix + '-scroll' : '' }, + this.getTable({ columns: this.columnManager.groupedColumns() }), + this.getEmptyText(), + this.getFooter() + ), + this.columnManager.isAnyColumnsRightFixed() && _react2["default"].createElement( + 'div', + { className: clsPrefix + '-fixed-right' }, + this.getRightFixedTable() + ) + ) + ); + }; + + return Table; +}(_react.Component); + +; + +Table.propTypes = propTypes; +Table.defaultProps = defaultProps; + +exports["default"] = Table; +module.exports = exports['default']; \ No newline at end of file diff --git a/build/TableCell.js b/build/TableCell.js new file mode 100644 index 0000000..e146272 --- /dev/null +++ b/build/TableCell.js @@ -0,0 +1,126 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _objectPath = require('object-path'); + +var _objectPath2 = _interopRequireDefault(_objectPath); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(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) : _defaults(subClass, superClass); } + +var propTypes = { + record: _react.PropTypes.object, + clsPrefix: _react.PropTypes.string, + index: _react.PropTypes.number, + indent: _react.PropTypes.number, + indentSize: _react.PropTypes.number, + column: _react.PropTypes.object, + expandIcon: _react.PropTypes.node +}; + +var TableCell = function (_Component) { + _inherits(TableCell, _Component); + + function TableCell(props) { + _classCallCheck(this, TableCell); + + var _this = _possibleConstructorReturn(this, _Component.call(this, props)); + + _this.isInvalidRenderCellText = _this.isInvalidRenderCellText.bind(_this); + _this.handleClick = _this.handleClick.bind(_this); + return _this; + } + + TableCell.prototype.isInvalidRenderCellText = function isInvalidRenderCellText(text) { + return text && !_react2["default"].isValidElement(text) && Object.prototype.toString.call(text) === '[object Object]'; + }; + + TableCell.prototype.handleClick = function handleClick(e) { + var _props = this.props, + record = _props.record, + onCellClick = _props.column.onCellClick; + + if (onCellClick) { + onCellClick(record, e); + } + }; + + TableCell.prototype.render = function render() { + var _props2 = this.props, + record = _props2.record, + indentSize = _props2.indentSize, + clsPrefix = _props2.clsPrefix, + indent = _props2.indent, + index = _props2.index, + expandIcon = _props2.expandIcon, + column = _props2.column; + var dataIndex = column.dataIndex, + render = column.render, + _column$className = column.className, + className = _column$className === undefined ? '' : _column$className; + + + var text = _objectPath2["default"].get(record, dataIndex); + var tdProps = void 0; + var colSpan = void 0; + var rowSpan = void 0; + + if (render) { + text = render(text, record, index); + if (this.isInvalidRenderCellText(text)) { + tdProps = text.props || {}; + rowSpan = tdProps.rowSpan; + colSpan = tdProps.colSpan; + text = text.children; + } + } + + if (this.isInvalidRenderCellText(text)) { + text = null; + } + + var indentText = expandIcon ? _react2["default"].createElement('span', { + style: { paddingLeft: indentSize * indent + 'px' }, + className: clsPrefix + '-indent indent-level-' + indent + }) : null; + + if (rowSpan === 0 || colSpan === 0) { + return null; + } + return _react2["default"].createElement( + 'td', + { + colSpan: colSpan, + rowSpan: rowSpan, + className: className, + onClick: this.handleClick + }, + indentText, + expandIcon, + text + ); + }; + + return TableCell; +}(_react.Component); + +; + +TableCell.propTypes = propTypes; + +exports["default"] = TableCell; +module.exports = exports['default']; \ No newline at end of file diff --git a/build/TableHeader.js b/build/TableHeader.js new file mode 100644 index 0000000..313ef27 --- /dev/null +++ b/build/TableHeader.js @@ -0,0 +1,75 @@ +'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 _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _shallowequal = require('shallowequal'); + +var _shallowequal2 = _interopRequireDefault(_shallowequal); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(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) : _defaults(subClass, superClass); } + +var propTypes = { + clsPrefix: _react.PropTypes.string, + rowStyle: _react.PropTypes.object, + rows: _react.PropTypes.array +}; + +var TableHeader = function (_Component) { + _inherits(TableHeader, _Component); + + function TableHeader(props) { + _classCallCheck(this, TableHeader); + + return _possibleConstructorReturn(this, _Component.call(this, props)); + } + + TableHeader.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) { + return !(0, _shallowequal2["default"])(nextProps, this.props); + }; + + TableHeader.prototype.render = function render() { + var _props = this.props, + clsPrefix = _props.clsPrefix, + rowStyle = _props.rowStyle, + rows = _props.rows; + + return _react2["default"].createElement( + 'thead', + { className: clsPrefix + '-thead' }, + rows.map(function (row, index) { + return _react2["default"].createElement( + 'tr', + { key: index, style: rowStyle }, + row.map(function (cellProps, i) { + return _react2["default"].createElement('th', _extends({}, cellProps, { key: i })); + }) + ); + }) + ); + }; + + return TableHeader; +}(_react.Component); + +; + +TableHeader.propTypes = propTypes; + +exports["default"] = TableHeader; +module.exports = exports['default']; \ No newline at end of file diff --git a/build/TableRow.js b/build/TableRow.js new file mode 100644 index 0000000..5fbc13c --- /dev/null +++ b/build/TableRow.js @@ -0,0 +1,238 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _TableCell = require('./TableCell'); + +var _TableCell2 = _interopRequireDefault(_TableCell); + +var _ExpandIcon = require('./ExpandIcon'); + +var _ExpandIcon2 = _interopRequireDefault(_ExpandIcon); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(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) : _defaults(subClass, superClass); } + +var propTypes = { + onDestroy: _react.PropTypes.func, + onRowClick: _react.PropTypes.func, + onRowDoubleClick: _react.PropTypes.func, + record: _react.PropTypes.object, + clsPrefix: _react.PropTypes.string, + expandIconColumnIndex: _react.PropTypes.number, + onHover: _react.PropTypes.func, + columns: _react.PropTypes.array, + height: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.number]), + visible: _react.PropTypes.bool, + index: _react.PropTypes.number, + hoverKey: _react.PropTypes.any, + expanded: _react.PropTypes.bool, + expandable: _react.PropTypes.any, + onExpand: _react.PropTypes.func, + needIndentSpaced: _react.PropTypes.bool, + className: _react.PropTypes.string, + indent: _react.PropTypes.number, + indentSize: _react.PropTypes.number, + expandIconAsCell: _react.PropTypes.bool, + expandRowByClick: _react.PropTypes.bool, + store: _react.PropTypes.object.isRequired +}; + +var defaultProps = { + onRowClick: function onRowClick() {}, + onRowDoubleClick: function onRowDoubleClick() {}, + onDestroy: function onDestroy() {}, + + expandIconColumnIndex: 0, + expandRowByClick: false, + onHover: function onHover() {} +}; + +var TableRow = function (_Component) { + _inherits(TableRow, _Component); + + function TableRow(props) { + _classCallCheck(this, TableRow); + + var _this = _possibleConstructorReturn(this, _Component.call(this, props)); + + _this.state = { + hovered: false + }; + _this.onRowClick = _this.onRowClick.bind(_this); + _this.onRowDoubleClick = _this.onRowDoubleClick.bind(_this); + _this.onMouseEnter = _this.onMouseEnter.bind(_this); + _this.onMouseLeave = _this.onMouseLeave.bind(_this); + + return _this; + } + + TableRow.prototype.componentDidMount = function componentDidMount() { + var _this2 = this; + + var _props = this.props, + store = _props.store, + hoverKey = _props.hoverKey; + + this.unsubscribe = store.subscribe(function () { + if (store.getState().currentHoverKey === hoverKey) { + _this2.setState({ hovered: true }); + } else if (_this2.state.hovered === true) { + _this2.setState({ hovered: false }); + } + }); + }; + + TableRow.prototype.componentWillUnmount = function componentWillUnmount() { + var _props2 = this.props, + record = _props2.record, + onDestroy = _props2.onDestroy, + index = _props2.index; + + onDestroy(record, index); + if (this.unsubscribe) { + this.unsubscribe(); + } + }; + + TableRow.prototype.onRowClick = function onRowClick(event) { + var _props3 = this.props, + record = _props3.record, + index = _props3.index, + onRowClick = _props3.onRowClick, + expandable = _props3.expandable, + expandRowByClick = _props3.expandRowByClick, + expanded = _props3.expanded, + onExpand = _props3.onExpand; + + if (expandable && expandRowByClick) { + onExpand(!expanded, record, index); + } + onRowClick(record, index, event); + }; + + TableRow.prototype.onRowDoubleClick = function onRowDoubleClick(event) { + var _props4 = this.props, + record = _props4.record, + index = _props4.index, + onRowDoubleClick = _props4.onRowDoubleClick; + + onRowDoubleClick(record, index, event); + }; + + TableRow.prototype.onMouseEnter = function onMouseEnter() { + var _props5 = this.props, + onHover = _props5.onHover, + hoverKey = _props5.hoverKey; + + onHover(true, hoverKey); + }; + + TableRow.prototype.onMouseLeave = function onMouseLeave() { + var _props6 = this.props, + onHover = _props6.onHover, + hoverKey = _props6.hoverKey; + + onHover(false, hoverKey); + }; + + TableRow.prototype.render = function render() { + var _props7 = this.props, + clsPrefix = _props7.clsPrefix, + columns = _props7.columns, + record = _props7.record, + height = _props7.height, + visible = _props7.visible, + index = _props7.index, + expandIconColumnIndex = _props7.expandIconColumnIndex, + expandIconAsCell = _props7.expandIconAsCell, + expanded = _props7.expanded, + expandRowByClick = _props7.expandRowByClick, + expandable = _props7.expandable, + onExpand = _props7.onExpand, + needIndentSpaced = _props7.needIndentSpaced, + indent = _props7.indent, + indentSize = _props7.indentSize; + var className = this.props.className; + + + if (this.state.hovered) { + className += ' ' + clsPrefix + '-hover'; + } + + var cells = []; + + var expandIcon = _react2["default"].createElement(_ExpandIcon2["default"], { + expandable: expandable, + clsPrefix: clsPrefix, + onExpand: onExpand, + needIndentSpaced: needIndentSpaced, + expanded: expanded, + record: record + }); + + for (var i = 0; i < columns.length; i++) { + if (expandIconAsCell && i === 0) { + cells.push(_react2["default"].createElement( + 'td', + { + className: clsPrefix + '-expand-icon-cell', + key: 'rc-table-expand-icon-cell' + }, + expandIcon + )); + } + var isColumnHaveExpandIcon = expandIconAsCell || expandRowByClick ? false : i === expandIconColumnIndex; + cells.push(_react2["default"].createElement(_TableCell2["default"], { + clsPrefix: clsPrefix, + record: record, + indentSize: indentSize, + indent: indent, + index: index, + column: columns[i], + key: columns[i].key, + expandIcon: isColumnHaveExpandIcon ? expandIcon : null + })); + } + var style = { height: height }; + if (!visible) { + style.display = 'none'; + } + + return _react2["default"].createElement( + 'tr', + { + onClick: this.onRowClick, + onDoubleClick: this.onRowDoubleClick, + onMouseEnter: this.onMouseEnter, + onMouseLeave: this.onMouseLeave, + className: clsPrefix + ' ' + className + ' ' + clsPrefix + '-level-' + indent, + style: style + }, + cells + ); + }; + + return TableRow; +}(_react.Component); + +; + +TableRow.propTypes = propTypes; +TableRow.defaultProps = defaultProps; + +exports["default"] = TableRow; +module.exports = exports['default']; \ No newline at end of file diff --git a/build/createStore.js b/build/createStore.js new file mode 100644 index 0000000..82bd623 --- /dev/null +++ b/build/createStore.js @@ -0,0 +1,40 @@ +"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; }; + +exports["default"] = createStore; +function createStore(initialState) { + var state = initialState; + var listeners = []; + + function setState(partial) { + state = _extends({}, state, partial); + for (var i = 0; i < listeners.length; i++) { + listeners[i](); + } + } + + function getState() { + return state; + } + + function subscribe(listener) { + listeners.push(listener); + + return function unsubscribe() { + var index = listeners.indexOf(listener); + listeners.splice(index, 1); + }; + } + + return { + setState: setState, + getState: getState, + subscribe: subscribe + }; +} +module.exports = exports["default"]; \ No newline at end of file diff --git a/build/index.css b/build/index.css new file mode 100644 index 0000000..f5b6290 --- /dev/null +++ b/build/index.css @@ -0,0 +1,182 @@ +/* FormGroup */ +/* Navlayout */ +.u-table { + font-size: 12px; + color: #666; + transition: opacity 0.3s ease; + position: relative; + line-height: 1.5; + overflow: hidden; } + .u-table table { + width: 100%; + border-collapse: collapse; + text-align: left; } + .u-table th { + background: #f7f7f7; + font-weight: bold; + transition: background .3s ease; } + .u-table td { + border-bottom: 1px solid #e9e9e9; } + .u-table tr { + transition: all .3s ease; } + .u-table tr:hover { + background: rgb(227,242,253); } + .u-table tr.tr-row-hover { + background: rgb(227,242,253); } + .u-table th, .u-table td { + padding: 16px 8px; } + .u-table-scroll { + overflow: auto; } + .u-table-header { + overflow: hidden; + background: #f7f7f7; } + .u-table-fixed-header .u-table-body { + background: #fff; + position: relative; } + .u-table-fixed-header .u-table-body-inner { + height: 100%; + overflow: scroll; } + .u-table-fixed-header .u-table-scroll .u-table-header { + overflow-x: scroll; + padding-bottom: 20px; + margin-bottom: -20px; + overflow-y: scroll; + box-sizing: border-box; } + .u-table-title { + padding: 16px 8px; + border-top: 1px solid #e9e9e9; } + .u-table-content { + position: relative; } + .u-table-footer { + padding: 16px 8px; + border-bottom: 1px solid #e9e9e9; } + .u-table-placeholder { + padding: 16px 8px; + background: #fff; + border-bottom: 1px solid #e9e9e9; + text-align: center; + position: relative; } + .u-table-expand-icon-col { + width: 10px; } + .u-table-row-expand-icon, .u-table-expanded-row-expand-icon { + cursor: pointer; + display: inline-block; + width: 16px; + height: 16px; + text-align: center; + line-height: 16px; + border: 1px solid #e9e9e9; + user-select: none; + background: #fff; } + .u-table-row-spaced, .u-table-expanded-row-spaced { + visibility: hidden; } + .u-table-row-spaced:after, .u-table-expanded-row-spaced:after { + content: '.'; } + .u-table-row-expanded:after, .u-table-expanded-row-expanded:after { + content: '-'; } + .u-table-row-collapsed:after, .u-table-expanded-row-collapsed:after { + content: '+'; } + .u-table tr.u-table-expanded-row { + background: #f7f7f7; } + .u-table tr.u-table-expanded-row:hover { + background: #f7f7f7; } + .u-table-column-hidden { + display: none; } + .u-table-prev-columns-page, .u-table-next-columns-page { + cursor: pointer; + color: #666; + z-index: 1; } + .u-table-prev-columns-page:hover, .u-table-next-columns-page:hover { + color: #2db7f5; } + .u-table-prev-columns-page-disabled, .u-table-next-columns-page-disabled { + cursor: not-allowed; + color: #999; } + .u-table-prev-columns-page-disabled:hover, .u-table-next-columns-page-disabled:hover { + color: #999; } + .u-table-prev-columns-page { + margin-right: 8px; } + .u-table-prev-columns-page:before { + content: '<'; } + .u-table-next-columns-page { + float: right; } + .u-table-next-columns-page:before { + content: '>'; } + .u-table-fixed-left, .u-table-fixed-right { + position: absolute; + top: 0; + overflow: hidden; + z-index: 1; } + .u-table-fixed-left table, .u-table-fixed-right table { + width: auto; + background: #fff; } + .u-table-fixed-left { + left: 0; + box-shadow: 4px 0 4px rgba(100, 100, 100, 0.1); } + .u-table-fixed-left .u-table-fixed-left-body-inner { + margin-right: -20px; + padding-right: 20px; } + .u-table-fixed-left-fixed-header .u-table-fixed-left .u-table-fixed-left-body-inner { + padding-right: 0; } + .u-table-fixed-right { + right: 0; + box-shadow: -4px 0 4px rgba(100, 100, 100, 0.1); } + .u-table-fixed-right-expanded-row { + color: transparent; + pointer-events: none; } + .u-table .u-table-scroll-position-left .u-table-fixed-left { + box-shadow: none; } + .u-table .u-table-scroll-position-right .u-table-fixed-right { + box-shadow: none; } + +.u-table.bordered table { + border-collapse: collapse; } + +.u-table.bordered th, .u-table.bordered td { + border: 1px solid #e9e9e9; } + +.move-enter, .move-appear { + opacity: 0; + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-duration: 2.5s; + animation-fill-mode: both; + animation-play-state: paused; } + +.move-leave { + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-duration: .5s; + animation-fill-mode: both; + animation-play-state: paused; } + +.move-enter.move-enter-active, .move-appear.move-enter-active { + animation-name: moveLeftIn; + animation-play-state: running; } + +.move-leave.move-leave-active { + animation-name: moveRightOut; + animation-play-state: running; } + +@keyframes moveLeftIn { + 0% { + transform-origin: 0 0; + transform: translateX(30px); + opacity: 0; + background: rgb(238,238,238); } + 20% { + transform-origin: 0 0; + transform: translateX(0); + opacity: 1; } + 80% { + background: rgb(238,238,238); } + 100% { + background: transparent; + opacity: 1; } } + +@keyframes moveRightOut { + 0% { + transform-origin: 0 0; + transform: translateX(0); + opacity: 1; } + 100% { + transform-origin: 0 0; + transform: translateX(-30px); + opacity: 0; } } diff --git a/build/index.js b/build/index.js new file mode 100644 index 0000000..3b67c4f --- /dev/null +++ b/build/index.js @@ -0,0 +1,10 @@ +'use strict'; + +var Table = require('./Table'); +var Column = require('./Column'); +var ColumnGroup = require('./ColumnGroup'); + +Table.Column = Column; +Table.ColumnGroup = ColumnGroup; + +module.exports = Table; \ No newline at end of file diff --git a/build/utils.js b/build/utils.js new file mode 100644 index 0000000..2db55dd --- /dev/null +++ b/build/utils.js @@ -0,0 +1,77 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.measureScrollbar = measureScrollbar; +exports.debounce = debounce; +exports.warningOnce = warningOnce; + +var _warning = require('warning'); + +var _warning2 = _interopRequireDefault(_warning); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var scrollbarWidth = void 0; + +// Measure scrollbar width for padding body during modal show/hide +var scrollbarMeasure = { + position: 'absolute', + top: '-9999px', + width: '50px', + height: '50px', + overflow: 'scroll' +}; + +function measureScrollbar() { + if (typeof document === 'undefined' || typeof window === 'undefined') { + return 0; + } + if (scrollbarWidth) { + return scrollbarWidth; + } + var scrollDiv = document.createElement('div'); + for (var scrollProp in scrollbarMeasure) { + if (scrollbarMeasure.hasOwnProperty(scrollProp)) { + scrollDiv.style[scrollProp] = scrollbarMeasure[scrollProp]; + } + } + document.body.appendChild(scrollDiv); + var width = scrollDiv.offsetWidth - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + scrollbarWidth = width; + return scrollbarWidth; +} + +function debounce(func, wait, immediate) { + var timeout = void 0; + return function debounceFunc() { + var context = this; + var args = arguments; + // https://fb.me/react-event-pooling + if (args[0] && args[0].persist) { + args[0].persist(); + } + var later = function later() { + timeout = null; + if (!immediate) { + func.apply(context, args); + } + }; + var callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + func.apply(context, args); + } + }; +} + +var warned = {}; +function warningOnce(condition, format, args) { + if (!warned[format]) { + (0, _warning2["default"])(condition, format, args); + warned[format] = true; + } +} \ No newline at end of file diff --git a/demo/TableDemo.scss b/demo/TableDemo.scss index a4afa05..0f71c50 100644 --- a/demo/TableDemo.scss +++ b/demo/TableDemo.scss @@ -4,8 +4,6 @@ @import "../node_modules/bee-button/src/Button.scss"; @import "../node_modules/bee-transition/src/Transition.scss"; @import "../src/index.scss"; -@import "../node_modules/bee-dropdown/src/Dropdown.scss"; -@import "../node_modules/bee-menus/src/Menus.scss"; @import "../node_modules/bee-popconfirm/src/Popconfirm.scss"; @import "../node_modules/bee-form-control/src/FormControl.scss"; diff --git a/demo/demolist/Demo1.js b/demo/demolist/Demo1.js index 95af22a..5413d59 100644 --- a/demo/demolist/Demo1.js +++ b/demo/demolist/Demo1.js @@ -28,8 +28,8 @@ class Demo1 extends Component {
标题: {currentData.length} 个元素
} - footer={currentData =>
表尾: {currentData.length} 个元素
} + title={currentData =>
标题: 这是一个标题
} + footer={currentData =>
表尾: 我是小尾巴
} /> ) } diff --git a/demo/demolist/Demo2.js b/demo/demolist/Demo2.js index 28e2312..07c2633 100644 --- a/demo/demolist/Demo2.js +++ b/demo/demolist/Demo2.js @@ -1,7 +1,7 @@ /** * -* @title 这是标题 -* @description 这是描述 +* @title 增删改表格 +* @description 这是带有增删改功能的表格 * */ @@ -24,7 +24,7 @@ class EditableCell extends React.Component { this.setState({ editable: true }); } handleKeydown = (event) => { - console.log(event); + console.log(event.keyCode); if(event.keyCode == 13){ this.check(); } diff --git a/demo/index-demo-base.js b/demo/index-demo-base.js index 2e80a6c..06a1a0b 100644 --- a/demo/index-demo-base.js +++ b/demo/index-demo-base.js @@ -6,8 +6,6 @@ import React, { Component } from 'react'; import ReactDOM from 'react-dom'; import Table from '../src'; import Animate from 'bee-animate'; -import Menu, { Item, Divider } from 'bee-menus'; -import DropDown from 'bee-dropdown'; import Icon from "bee-icon"; import Input from 'bee-form-control'; import Popconfirm from 'bee-popconfirm'; diff --git a/demo/index.js b/demo/index.js index 6839f03..475d746 100644 --- a/demo/index.js +++ b/demo/index.js @@ -6,8 +6,6 @@ import React, { Component } from 'react'; import ReactDOM from 'react-dom'; import Table from '../src'; import Animate from 'bee-animate'; -import Menu, { Item, Divider } from 'bee-menus'; -import DropDown from 'bee-dropdown'; import Icon from "bee-icon"; import Input from 'bee-form-control'; import Popconfirm from 'bee-popconfirm'; @@ -47,16 +45,16 @@ class Demo1 extends Component {
标题: {currentData.length} 个元素
} - footer={currentData =>
表尾: {currentData.length} 个元素
} + title={currentData =>
标题: 这是一个标题
} + footer={currentData =>
表尾: 我是小尾巴
} /> ) } } /** * -* @title 这是标题 -* @description 这是描述 +* @title 增删改表格 +* @description 这是带有增删改功能的表格 * */ @@ -79,7 +77,7 @@ class EditableCell extends React.Component { this.setState({ editable: true }); } handleKeydown = (event) => { - console.log(event); + console.log(event.keyCode); if(event.keyCode == 13){ this.check(); } @@ -223,7 +221,7 @@ class Demo2 extends React.Component { ); } } -var DemoArray = [{"example":,"title":" 简单表格","code":"/**\r\n*\r\n* @title 简单表格\r\n* @description\r\n*\r\n*/\r\n\r\nconst columns = [\r\n { title: '用户名', dataIndex: 'a', key: 'a', width: 100 },\r\n { id: '123', title: '性别', dataIndex: 'b', key: 'b', width: 100 },\r\n { title: '年龄', dataIndex: 'c', key: 'c', width: 200 },\r\n {\r\n title: '操作', dataIndex: '', key: 'd', render() {\r\n return 一些操作;\r\n },\r\n },\r\n];\r\n\r\nconst data = [\r\n { a: '令狐冲', b: '男', c: 41, key: '1' },\r\n { a: '杨过', b: '男', c: 67, key: '2' },\r\n { a: '郭靖', b: '男', c: 25, key: '3' },\r\n];\r\n\r\nclass Demo1 extends Component {\r\n render () {\r\n return (\r\n
标题: {currentData.length} 个元素
}\r\n footer={currentData =>
表尾: {currentData.length} 个元素
}\r\n />\r\n )\r\n }\r\n}\r\n","desc":""},{"example":,"title":" 这是标题","code":"/**\r\n*\r\n* @title 这是标题\r\n* @description 这是描述\r\n*\r\n*/\r\n\r\nclass EditableCell extends React.Component {\r\n state = {\r\n value: this.props.value,\r\n editable: false,\r\n }\r\n handleChange = (e) => {\r\n const value = e.target.value;\r\n this.setState({ value });\r\n }\r\n check = () => {\r\n this.setState({ editable: false });\r\n if (this.props.onChange) {\r\n this.props.onChange(this.state.value);\r\n }\r\n }\r\n edit = () => {\r\n this.setState({ editable: true });\r\n }\r\n handleKeydown = (event) => {\r\n console.log(event);\r\n if(event.keyCode == 13){\r\n this.check();\r\n }\r\n\r\n }\r\n render() {\r\n const { value, editable } = this.state;\r\n return (
\r\n {\r\n editable ?\r\n
\r\n \r\n \r\n
\r\n :\r\n
\r\n {value || ' '}\r\n \r\n
\r\n }\r\n
);\r\n }\r\n}\r\n\r\nclass Demo2 extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.columns = [{\r\n title: '姓名',\r\n dataIndex: 'name',\r\n key:'name',\r\n width: '30%',\r\n render: (text, record, index) => (\r\n \r\n ),\r\n }, {\r\n title: '年龄',\r\n dataIndex: 'age',\r\n key:'age',\r\n }, {\r\n title: '你懂的',\r\n dataIndex: 'address',\r\n key:'address',\r\n }, {\r\n title: '操作',\r\n dataIndex: 'operation',\r\n key: 'operation',\r\n render: (text, record, index) => {\r\n return (\r\n this.state.dataSource.length > 1 ?\r\n (\r\n \r\n \r\n \r\n ) : null\r\n );\r\n },\r\n }];\r\n\r\n this.state = {\r\n dataSource: [{\r\n key: '0',\r\n name: '沉鱼',\r\n age: '18',\r\n address: '96, 77, 89',\r\n }, {\r\n key: '1',\r\n name: '落雁',\r\n age: '16',\r\n address: '90, 70, 80',\r\n }, {\r\n key: '2',\r\n name: '闭月',\r\n age: '17',\r\n address: '80, 60, 80',\r\n }, {\r\n key: '3',\r\n name: '羞花',\r\n age: '20',\r\n address: '120, 60, 90',\r\n }],\r\n count: 4,\r\n };\r\n }\r\n onCellChange = (index, key) => {\r\n return (value) => {\r\n const dataSource = [...this.state.dataSource];\r\n dataSource[index][key] = value;\r\n this.setState({ dataSource });\r\n };\r\n }\r\n onDelete = (index) => {\r\n return () => {\r\n const dataSource = [...this.state.dataSource];\r\n dataSource.splice(index, 1);\r\n this.setState({ dataSource });\r\n };\r\n }\r\n handleAdd = () => {\r\n const { count, dataSource } = this.state;\r\n const newData = {\r\n key: count,\r\n name: `凤姐 ${count}`,\r\n age: 32,\r\n address: `100 100 100`,\r\n };\r\n this.setState({\r\n dataSource: [...dataSource, newData],\r\n count: count + 1,\r\n });\r\n }\r\n\r\n getBodyWrapper = (body) => {\r\n return (\r\n \r\n {body.props.children}\r\n \r\n );\r\n }\r\n render() {\r\n const { dataSource } = this.state;\r\n const columns = this.columns;\r\n return (
\r\n \r\n
\r\n );\r\n }\r\n}\r\n","desc":" 这是描述"}] +var DemoArray = [{"example":,"title":" 简单表格","code":"/**\n*\n* @title 简单表格\n* @description\n*\n*/\n\nconst columns = [\n { title: '用户名', dataIndex: 'a', key: 'a', width: 100 },\n { id: '123', title: '性别', dataIndex: 'b', key: 'b', width: 100 },\n { title: '年龄', dataIndex: 'c', key: 'c', width: 200 },\n {\n title: '操作', dataIndex: '', key: 'd', render() {\n return 一些操作;\n },\n },\n];\n\nconst data = [\n { a: '令狐冲', b: '男', c: 41, key: '1' },\n { a: '杨过', b: '男', c: 67, key: '2' },\n { a: '郭靖', b: '男', c: 25, key: '3' },\n];\n\nclass Demo1 extends Component {\n render () {\n return (\n
标题: 这是一个标题
}\n footer={currentData =>
表尾: 我是小尾巴
}\n />\n )\n }\n}\n","desc":""},{"example":,"title":" 增删改表格","code":"/**\n*\n* @title 增删改表格\n* @description 这是带有增删改功能的表格\n*\n*/\n\nclass EditableCell extends React.Component {\n state = {\n value: this.props.value,\n editable: false,\n }\n handleChange = (e) => {\n const value = e.target.value;\n this.setState({ value });\n }\n check = () => {\n this.setState({ editable: false });\n if (this.props.onChange) {\n this.props.onChange(this.state.value);\n }\n }\n edit = () => {\n this.setState({ editable: true });\n }\n handleKeydown = (event) => {\n console.log(event.keyCode);\n if(event.keyCode == 13){\n this.check();\n }\n\n }\n render() {\n const { value, editable } = this.state;\n return (
\n {\n editable ?\n
\n \n \n
\n :\n
\n {value || ' '}\n \n
\n }\n
);\n }\n}\n\nclass Demo2 extends React.Component {\n constructor(props) {\n super(props);\n this.columns = [{\n title: '姓名',\n dataIndex: 'name',\n key:'name',\n width: '30%',\n render: (text, record, index) => (\n \n ),\n }, {\n title: '年龄',\n dataIndex: 'age',\n key:'age',\n }, {\n title: '你懂的',\n dataIndex: 'address',\n key:'address',\n }, {\n title: '操作',\n dataIndex: 'operation',\n key: 'operation',\n render: (text, record, index) => {\n return (\n this.state.dataSource.length > 1 ?\n (\n \n \n \n ) : null\n );\n },\n }];\n\n this.state = {\n dataSource: [{\n key: '0',\n name: '沉鱼',\n age: '18',\n address: '96, 77, 89',\n }, {\n key: '1',\n name: '落雁',\n age: '16',\n address: '90, 70, 80',\n }, {\n key: '2',\n name: '闭月',\n age: '17',\n address: '80, 60, 80',\n }, {\n key: '3',\n name: '羞花',\n age: '20',\n address: '120, 60, 90',\n }],\n count: 4,\n };\n }\n onCellChange = (index, key) => {\n return (value) => {\n const dataSource = [...this.state.dataSource];\n dataSource[index][key] = value;\n this.setState({ dataSource });\n };\n }\n onDelete = (index) => {\n return () => {\n const dataSource = [...this.state.dataSource];\n dataSource.splice(index, 1);\n this.setState({ dataSource });\n };\n }\n handleAdd = () => {\n const { count, dataSource } = this.state;\n const newData = {\n key: count,\n name: `凤姐 ${count}`,\n age: 32,\n address: `100 100 100`,\n };\n this.setState({\n dataSource: [...dataSource, newData],\n count: count + 1,\n });\n }\n\n getBodyWrapper = (body) => {\n return (\n \n {body.props.children}\n \n );\n }\n render() {\n const { dataSource } = this.state;\n const columns = this.columns;\n return (
\n \n
\n );\n }\n}\n","desc":" 这是带有增删改功能的表格"}] class Demo extends Component { diff --git a/package.json b/package.json index dc8d991..47024e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bee-table", - "version": "0.0.1", + "version": "0.1.1", "description": "Table ui component for react", "keywords": [ "react", @@ -47,7 +47,7 @@ "bee-icon": "0.0.5", "bee-layout": "latest", "bee-panel": "latest", - "bee-popconfirm": "^0.2.1", + "bee-popconfirm": "^0.2.2", "chai": "^3.5.0", "console-polyfill": "~0.2.1", "enzyme": "^2.4.1", diff --git a/src/index.scss b/src/index.scss index 2a49ea9..5f79da1 100644 --- a/src/index.scss +++ b/src/index.scss @@ -1,3 +1,6 @@ +@import "../node_modules/tinper-bee-core/scss/minxin-variables"; +@import "../node_modules/tinper-bee-core/scss/minxin-mixins"; + $text-color : #666; $font-size-base : 12px;