UNPKG

coreui

Version:

Platform Core UI

354 lines (292 loc) 11.7 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 _react = require('react'); var _react2 = _interopRequireDefault(_react); var _Button = require('../Button'); var _Button2 = _interopRequireDefault(_Button); var _NumberPickerInput = require('../NumberPickerInput'); var _NumberPickerInput2 = _interopRequireDefault(_NumberPickerInput); var _Shared = require('../../Shared'); var _Shared2 = _interopRequireDefault(_Shared); var _TextInput = require('../TextInput'); var _TextInput2 = _interopRequireDefault(_TextInput); var _TableHandlers = require('./TableHandlers'); var _TableHandlers2 = _interopRequireDefault(_TableHandlers); var _TableHelpers = require('./TableHelpers'); var _TableHelpers2 = _interopRequireDefault(_TableHelpers); var _compose = require('recompose/compose'); var _compose2 = _interopRequireDefault(_compose); var _dedupe = require('classnames/dedupe'); var _dedupe2 = _interopRequireDefault(_dedupe); var _mapProps = require('recompose/mapProps'); var _mapProps2 = _interopRequireDefault(_mapProps); var _withHandlers = require('recompose/withHandlers'); var _withHandlers2 = _interopRequireDefault(_withHandlers); var _withState = require('recompose/withState'); var _withState2 = _interopRequireDefault(_withState); var _ramda = require('ramda'); 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; } var systemStyles = {}; var maybeRenderPager = function maybeRenderPager(baseTableProps) { var maxPageIndex = baseTableProps.maxPageIndex, onPageChange = baseTableProps.onPageChange, onNextPageClick = baseTableProps.onNextPageClick, onPrevPageClick = baseTableProps.onPrevPageClick, pageIndex = baseTableProps.pageIndex, prevPageIndex = baseTableProps.prevPageIndex, pagination = baseTableProps.pagination; var effectivePageIndex = (0, _ramda.is)(Number, pageIndex) ? pageIndex : prevPageIndex; var pageNumber = (0, _ramda.inc)(effectivePageIndex); var nextDisabled = effectivePageIndex === maxPageIndex; var prevDisabled = effectivePageIndex === 0; return pagination && _react2.default.createElement( 'div', { style: { display: 'flex', justifyContent: 'space-between' } }, _react2.default.createElement( _Button2.default, { className: (0, _dedupe2.default)('btn-link', { disabled: prevDisabled }), onClick: onPrevPageClick, style: { color: prevDisabled ? '#ccc' : '#2975e9' } }, _react2.default.createElement( 'div', { style: { display: 'flex', alignItems: 'middle' } }, _react2.default.createElement('span', { className: 'icon icon-chevron-left' }), _react2.default.createElement( 'span', { title: 'Previous' }, 'Previous' ) ) ), _react2.default.createElement(_NumberPickerInput2.default, { max: (0, _ramda.inc)(maxPageIndex), min: 1, onChange: onPageChange, style: { maxWidth: 100 }, value: (0, _ramda.is)(Number, pageIndex) ? pageNumber : pageIndex }), _react2.default.createElement( _Button2.default, { className: (0, _dedupe2.default)('btn-link', { disabled: nextDisabled }), onClick: onNextPageClick, style: { color: nextDisabled ? '#ccc' : '#2975e9' } }, _react2.default.createElement( 'div', { style: { display: 'flex', alignItems: 'middle' } }, _react2.default.createElement( 'span', { title: 'Next' }, 'Next' ), _react2.default.createElement('span', { className: 'icon icon-chevron-right' }) ) ) ); }; var maybeRenderSearch = function maybeRenderSearch(baseTableProps) { var onSearchChange = baseTableProps.onSearchChange, searchable = baseTableProps.searchable, searchPlaceholder = baseTableProps.searchPlaceholder, searchValue = baseTableProps.searchValue; return searchable && _react2.default.createElement( 'div', { className: 'form-group' }, _react2.default.createElement( 'div', { className: 'search' }, _react2.default.createElement(_TextInput2.default, { className: 'search-input', onChange: onSearchChange, placeholder: searchPlaceholder, style: { maxWidth: 300 }, type: 'search', value: searchValue }) ) ); }; var maybeRenderSortIcons = function maybeRenderSortIcons(baseTableProps, _ref) { var id = _ref.id, isSortable = _ref.isSortable; var sortAscending = baseTableProps.sortAscending, sortField = baseTableProps.sortField; var isSorted = sortField === id; var className = isSortable && (0, _dedupe2.default)('icon', { 'icon-chevron-down': isSorted && !sortAscending, 'icon-chevron-up': isSorted && sortAscending, 'icon-chevrons-vertical': !isSorted }); return isSortable && _react2.default.createElement('span', { className: className }); }; var renderHeaderCell = function renderHeaderCell(baseTableProps, c, i) { var onHeaderClick = baseTableProps.onHeaderClick; var isSortable = c.isSortable; return _react2.default.createElement( 'th', { key: i, onClick: function onClick() { return isSortable && onHeaderClick(c); }, style: { cursor: isSortable ? 'pointer' : 'normal' } }, _react2.default.createElement( 'div', { style: { display: 'flex', justifyContent: 'space-between' } }, c.displayName, maybeRenderSortIcons(baseTableProps, c) ) ); }; var renderCell = function renderCell(data, _ref2) { var component = _ref2.component, id = _ref2.id; var Component = component; var cellData = data[id]; return _react2.default.createElement( 'td', { key: id }, Component ? _react2.default.createElement(Component, { data: cellData }) : cellData ); }; var renderRow = function renderRow(baseTableProps, data, i) { var columns = baseTableProps.columns, onRowClick = baseTableProps.onRowClick, selectedRows = baseTableProps.selectedRows, selection = baseTableProps.selection, valueField = baseTableProps.valueField; var rowId = valueField && data[valueField]; return _react2.default.createElement( 'tr', { className: (0, _dedupe2.default)({ 'table-active': valueField && selectedRows.has(rowId) }), key: valueField ? rowId : i, onClick: function onClick() { return selection && valueField && onRowClick(data); } }, columns.map((0, _ramda.partial)(renderCell, [data])) ); }; var TableBase = function TableBase(props) { var className = props.className, columns = props.columns, data = props.data, style = props.style; return _react2.default.createElement( 'div', null, maybeRenderSearch(props), _react2.default.createElement( 'table', { className: className, style: style }, _react2.default.createElement( 'thead', null, _react2.default.createElement( 'tr', null, columns.map((0, _ramda.partial)(renderHeaderCell, [props])) ) ), _react2.default.createElement( 'tbody', null, data.length ? data.map((0, _ramda.partial)(renderRow, [props])) : _react2.default.createElement( 'tr', null, _react2.default.createElement( 'td', { colSpan: columns.length }, 'No rows to display' ) ) ) ), maybeRenderPager(props) ); }; TableBase.propTypes = { className: _react.PropTypes.string, columns: _react.PropTypes.array, data: _react.PropTypes.array.isRequired, maxPageIndex: _react.PropTypes.number, onHeaderClick: _react.PropTypes.func, onNextPageClick: _react.PropTypes.func, onPageChange: _react.PropTypes.func, onPrevPageClick: _react.PropTypes.func, onRowClick: _react.PropTypes.func, onSearchChange: _react.PropTypes.func, pageIndex: _react.PropTypes.number, pageSize: _react.PropTypes.number, prevPageIndex: _react.PropTypes.number, searchable: _react.PropTypes.oneOfType([_react.PropTypes.bool, _react.PropTypes.instanceOf(Set)]), searchPlaceholder: _react.PropTypes.string, searchValue: _react.PropTypes.string, selectedRows: _react.PropTypes.instanceOf(Set), selection: _react.PropTypes.bool, selectMultiple: _react.PropTypes.bool, sortable: _react.PropTypes.oneOfType([_react.PropTypes.bool, _react.PropTypes.instanceOf(Set)]), sortAscending: _react.PropTypes.bool, sortField: _react.PropTypes.string, style: _react.PropTypes.object, valueField: _react.PropTypes.string }; var TableContainer = (0, _compose2.default)((0, _withState2.default)('pageIndex', 'setPageIndex', 0), (0, _withState2.default)('prevPageIndex', 'setPrevPageIndex', 0), (0, _withState2.default)('searchValue', 'setSearchValue', ''), (0, _withState2.default)('selectedRows', 'setSelectedRows', function (props) { return new Set(props.selectedRows); }), (0, _withState2.default)('sortAscending', 'setSortAscending', function (props) { return props.sortAscending; }), (0, _withState2.default)('sortField', 'setSortField', function (props) { return props.sortField; }), (0, _mapProps2.default)(function (_ref3) { var className = _ref3.className, sheet = _ref3.sheet, style = _ref3.style, theme = _ref3.theme, rest = _objectWithoutProperties(_ref3, ['className', 'sheet', 'style', 'theme']); return _extends({ className: (0, _dedupe2.default)(sheet.classes.table, theme.classes.table, className), style: (0, _ramda.merge)(theme.styles.table, style) }, rest); }), (0, _mapProps2.default)((0, _ramda.partial)(_TableHelpers2.default.normalizedProps, [_TableHelpers2.default])), (0, _withHandlers2.default)((0, _TableHandlers2.default)(_TableHelpers2.default)))(TableBase); var StyledTable = _Shared2.default.injectSheet(systemStyles)(TableContainer); var Table = function Table(props) { return _react2.default.createElement( StyledTable, props, props.children ); }; Table.defaultProps = _TableHelpers2.default.tableDefaultProps(); Table.displayName = 'Table'; Table.propTypes = { children: _react.PropTypes.node, className: _react.PropTypes.string, columns: _react.PropTypes.array, data: _react.PropTypes.array.isRequired, onClick: _react.PropTypes.func, onSort: _react.PropTypes.func, pageSize: _react.PropTypes.number, pagination: _react.PropTypes.bool, searchable: _react.PropTypes.oneOfType([_react.PropTypes.bool, _react.PropTypes.array]), searchPlaceholder: _react.PropTypes.string, selectedRows: _react.PropTypes.instanceOf(Set), selection: _react.PropTypes.bool, selectMultiple: _react.PropTypes.bool, sortable: _react.PropTypes.oneOfType([_react.PropTypes.bool, _react.PropTypes.array]), sortAscending: _react.PropTypes.bool, sortField: _react.PropTypes.string, style: _react.PropTypes.object, theme: _react.PropTypes.oneOfType([_react.PropTypes.bool, _react.PropTypes.object]), valueField: _react.PropTypes.string }; _Shared2.default.registerComponent('Table', Table); exports.default = Table;