UNPKG

cpui-components

Version:

1,162 lines (1,041 loc) 49.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.DataTable = undefined; 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 _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _Paginator = require('../Paginator/Paginator'); var _TableHeader = require('./TableHeader'); var _TableBody = require('./TableBody'); var _TableFooter = require('./TableFooter'); var _ScrollableView = require('./ScrollableView'); var _ObjectUtils = require('../utils/ObjectUtils'); var _ObjectUtils2 = _interopRequireDefault(_ObjectUtils); var _DomHandler = require('../utils/DomHandler'); var _DomHandler2 = _interopRequireDefault(_DomHandler); 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"); } } 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 DataTable = exports.DataTable = function (_Component) { _inherits(DataTable, _Component); function DataTable(props) { _classCallCheck(this, DataTable); var _this = _possibleConstructorReturn(this, (DataTable.__proto__ || Object.getPrototypeOf(DataTable)).call(this, props)); _this.state = { first: props.first, rows: props.rows, sortField: props.sortField, sortOrder: props.sortOrder, multiSortMeta: props.multiSortMeta, filters: props.filters }; _this.onPageChange = _this.onPageChange.bind(_this); _this.onSort = _this.onSort.bind(_this); _this.onFilter = _this.onFilter.bind(_this); _this.onColumnResizeStart = _this.onColumnResizeStart.bind(_this); _this.onHeaderCheckboxClick = _this.onHeaderCheckboxClick.bind(_this); _this.onColumnDragStart = _this.onColumnDragStart.bind(_this); _this.onColumnDragOver = _this.onColumnDragOver.bind(_this); _this.onColumnDragLeave = _this.onColumnDragLeave.bind(_this); _this.onColumnDrop = _this.onColumnDrop.bind(_this); _this.onVirtualScroll = _this.onVirtualScroll.bind(_this); return _this; } _createClass(DataTable, [{ key: 'onPageChange', value: function onPageChange(event) { this.setState({ first: event.first, rows: event.rows }); if (this.props.lazy) { this.props.onLazyLoad({ first: event.first, rows: event.rows, sortField: this.state.sortField, sortOrder: this.state.sortOrder, multiSortMeta: this.state.multiSortMeta, filters: this.state.filters }); } if (this.props.onPage) { this.props.onPage(event); } } }, { key: 'createPaginator', value: function createPaginator(totalRecords, data) { return _react2.default.createElement(_Paginator.Paginator, { first: this.state.first, rows: this.state.rows, pageLinkSize: this.props.pageLinkSize, onPageChange: this.onPageChange, template: this.props.paginatorTemplate, totalRecords: totalRecords, rowsPerPageOptions: this.props.rowsPerPageOptions }); } }, { key: 'onSort', value: function onSort(event) { var sortField = event.sortField; var sortOrder = this.state.sortField === event.sortField ? this.state.sortOrder * -1 : 1; var multiSortMeta = void 0; if (this.props.sortMode === 'multiple') { var metaKey = event.originalEvent.metaKey || event.originalEvent.ctrlKey; multiSortMeta = this.state.multiSortMeta; if (!multiSortMeta || !metaKey) { multiSortMeta = []; } this.addSortMeta({ field: sortField, order: sortOrder }, multiSortMeta); } this.setState({ sortField: sortField, sortOrder: sortOrder, first: 0, multiSortMeta: multiSortMeta }); if (this.props.lazy) { this.props.onLazyLoad({ first: 0, rows: this.state.rows, sortField: sortField, sortOrder: sortOrder, multiSortMeta: multiSortMeta, filters: this.state.filters }); } if (this.props.onSort) { this.props.onSort({ sortField: sortField, sortOrder: sortOrder, multiSortMeta: multiSortMeta }); } } }, { key: 'addSortMeta', value: function addSortMeta(meta, multiSortMeta) { var index = -1; for (var i = 0; i < multiSortMeta.length; i++) { if (multiSortMeta[i].field === meta.field) { index = i; break; } } if (index >= 0) multiSortMeta[index] = meta;else multiSortMeta.push(meta); } }, { key: 'sortSingle', value: function sortSingle(data) { var _this2 = this; var value = [].concat(_toConsumableArray(data)); value.sort(function (data1, data2) { var value1 = _ObjectUtils2.default.resolveFieldData(data1, _this2.state.sortField); var value2 = _ObjectUtils2.default.resolveFieldData(data2, _this2.state.sortField); var result = null; if (value1 == null && value2 != null) result = -1;else if (value1 != null && value2 == null) result = 1;else if (value1 == null && value2 == null) result = 0;else if (typeof value1 === 'string' && typeof value2 === 'string') result = value1.localeCompare(value2);else result = value1 < value2 ? -1 : value1 > value2 ? 1 : 0; return _this2.state.sortOrder * result; }); return value; } }, { key: 'sortMultiple', value: function sortMultiple(data) { var _this3 = this; var value = [].concat(_toConsumableArray(data)); value.sort(function (data1, data2) { return _this3.multisortField(data1, data2, _this3.state.multiSortMeta, 0); }); return value; } }, { key: 'multisortField', value: function multisortField(data1, data2, multiSortMeta, index) { var value1 = _ObjectUtils2.default.resolveFieldData(data1, this.state.multiSortMeta[index].field); var value2 = _ObjectUtils2.default.resolveFieldData(data2, this.state.multiSortMeta[index].field); var result = null; if (typeof value1 === 'string' || value1 instanceof String) { if (value1.localeCompare && value1 !== value2) { return this.state.multiSortMeta[index].order * value1.localeCompare(value2); } } else { result = value1 < value2 ? -1 : 1; } if (value1 === value2) { return this.state.multiSortMeta.length - 1 > index ? this.multisortField(data1, data2, this.state.multiSortMeta, index + 1) : 0; } return this.state.multiSortMeta[index].order * result; } }, { key: 'onFilter', value: function onFilter(event) { var filterMetadata = this.state.filters || {}; if (!this.isFilterBlank(event.value)) filterMetadata[event.field] = { value: event.value, matchMode: event.matchMode };else if (filterMetadata[event.field]) delete filterMetadata[event.field]; this.setState({ first: 0, filters: filterMetadata }); if (this.props.lazy) { this.props.onLazyLoad({ first: 0, rows: this.state.rows, sortField: this.state.sortField, sortOrder: this.state.sortOrder, multiSortMeta: this.state.multiSortMeta, filters: filterMetadata }); } if (this.props.onFilter) { this.props.onFilter({ filters: filterMetadata }); } } }, { key: 'isFilterBlank', value: function isFilterBlank(filter) { if (filter !== null && filter !== undefined) { if (typeof filter === 'string' && filter.trim().length === 0 || filter instanceof Array && filter.length === 0) return true;else return false; } return true; } }, { key: 'shouldComponentUpdate', value: function shouldComponentUpdate(nextProps, nextState) { if (this.props.lazy && nextProps.value === this.props.value) return false;else return true; } }, { key: 'componentDidMount', value: function componentDidMount() { if (this.props.lazy && this.props.onLazyLoad) { this.props.onLazyLoad({ first: this.props.first, rows: this.props.rows, sortField: this.props.sortField, sortOrder: this.props.sortOrder, multiSortMeta: this.props.multiSortField, filters: this.props.filters }); } } }, { key: 'componentDidUpdate', value: function componentDidUpdate(prevProps, prevState) { if (this.props.resizableColumns) { this.fixColumnWidths(); } } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { if (nextProps.first !== null) { this.setState({ first: nextProps.first }); } if (nextProps.rows !== null) { this.setState({ rows: nextProps.rows }); } if (nextProps.sortField) { this.setState({ sortField: nextProps.sortField }); } if (nextProps.sortOrder) { this.setState({ sortOrder: nextProps.sortOrder }); } if (nextProps.multiSortMeta) { this.setState({ multiSortMeta: nextProps.multiSortMeta }); } if (nextProps.filters) { this.setState({ filters: nextProps.filters }); } if (nextProps.globalFilter !== this.props.globalFilter) { this.setState({ first: 0 }); } var total = nextProps.totalRecords != null ? nextProps.totalRecords : nextProps.value.length; if (total != null && nextProps.rows !== null && total > 0 && this.state.first >= total) { this.setState(function (prevState) { return { first: prevState.first - nextProps.rows }; }); } } }, { key: 'fixColumnWidths', value: function fixColumnWidths() { var columns = _DomHandler2.default.find(this.container, 'th.ui-resizable-column'); columns.forEach(function (col) { col.style.width = col.offsetWidth + 'px'; }); } }, { key: 'hasFooter', value: function hasFooter() { if (this.props.children) { if (this.props.footerColumnGroup) { return true; } else { if (this.props.children instanceof Array) { for (var i = 0; i < this.props.children.length; i++) { if (this.props.children[i].props.footer) { return true; } } } else { return this.props.children.props.footer; } } } else { return false; } } }, { key: 'onColumnResizeStart', value: function onColumnResizeStart(event) { this.fixColumnWidths(); var containerLeft = _DomHandler2.default.getOffset(this.container).left; this.resizeColumn = event.columnEl; this.columnResizing = true; this.lastResizerHelperX = event.originalEvent.pageX - containerLeft + this.container.scrollLeft; this.bindColumnResizeEvents(); } }, { key: 'onColumnResize', value: function onColumnResize(event) { var containerLeft = _DomHandler2.default.getOffset(this.container).left; _DomHandler2.default.addClass(this.container, 'ui-unselectable-text'); this.resizerHelper.style.height = this.container.offsetHeight + 'px'; this.resizerHelper.style.top = 0 + 'px'; this.resizerHelper.style.left = event.pageX - containerLeft + this.container.scrollLeft + 'px'; this.resizerHelper.style.display = 'block'; } }, { key: 'onColumnResizeEnd', value: function onColumnResizeEnd(event) { var delta = this.resizerHelper.offsetLeft - this.lastResizerHelperX; var columnWidth = this.resizeColumn.offsetWidth; var newColumnWidth = columnWidth + delta; var minWidth = this.resizeColumn.style.minWidth || 15; if (columnWidth + delta > parseInt(minWidth, 10)) { if (this.props.columnResizeMode === 'fit') { var nextColumn = this.resizeColumn.nextElementSibling; var nextColumnWidth = nextColumn.offsetWidth - delta; if (newColumnWidth > 15 && nextColumnWidth > 15) { this.resizeColumn.style.width = newColumnWidth + 'px'; if (nextColumn) { nextColumn.style.width = nextColumnWidth + 'px'; } if (this.props.scrollable) { var colGroup = _DomHandler2.default.findSingle(this.container, 'colgroup.ui-datatable-scrollable-colgroup'); var resizeColumnIndex = _DomHandler2.default.index(this.resizeColumn); colGroup.children[resizeColumnIndex].style.width = newColumnWidth + 'px'; if (nextColumn) { colGroup.children[resizeColumnIndex + 1].style.width = nextColumnWidth + 'px'; } } } } else if (this.props.columnResizeMode === 'expand') { var table = _DomHandler2.default.findSingle(this.container, 'tbody.ui-datatable-data').parentElement; table.style.width = table.offsetWidth + delta + 'px'; this.resizeColumn.style.width = newColumnWidth + 'px'; var containerWidth = table.style.width; if (this.props.scrollable) { _DomHandler2.default.findSingle(this.container, '.ui-datatable-scrollable-header-box').children[0].style.width = containerWidth; var _colGroup = _DomHandler2.default.findSingle(this.container, 'colgroup.ui-datatable-scrollable-colgroup'); var _resizeColumnIndex = _DomHandler2.default.index(this.resizeColumn); _colGroup.children[_resizeColumnIndex].style.width = newColumnWidth + 'px'; } else { this.container.style.width = containerWidth; } } if (this.props.onColumnResizeEnd) { this.props.onColumnResizeEnd({ element: this.resizeColumn, delta: delta }); } } this.resizerHelper.style.display = 'none'; this.resizeColumn = null; _DomHandler2.default.removeClass(this.container, 'ui-unselectable-text'); this.unbindColumnResizeEvents(); } }, { key: 'bindColumnResizeEvents', value: function bindColumnResizeEvents() { var _this4 = this; this.documentColumnResizeListener = document.addEventListener('mousemove', function (event) { if (_this4.columnResizing) { _this4.onColumnResize(event); } }); this.documentColumnResizeEndListener = document.addEventListener('mouseup', function (event) { if (_this4.columnResizing) { _this4.columnResizing = false; _this4.onColumnResizeEnd(event); } }); } }, { key: 'unbindColumnResizeEvents', value: function unbindColumnResizeEvents() { document.removeEventListener('document', this.documentColumnResizeListener); document.removeEventListener('document', this.documentColumnResizeEndListener); } }, { key: 'findParentHeader', value: function findParentHeader(element) { if (element.nodeName === 'TH') { return element; } else { var parent = element.parentElement; while (parent.nodeName !== 'TH') { parent = parent.parentElement; if (!parent) break; } return parent; } } }, { key: 'onColumnDragStart', value: function onColumnDragStart(event) { if (this.columnResizing) { event.preventDefault(); return; } this.iconWidth = _DomHandler2.default.getHiddenElementOuterWidth(this.reorderIndicatorUp); this.iconHeight = _DomHandler2.default.getHiddenElementOuterHeight(this.reorderIndicatorUp); this.draggedColumn = this.findParentHeader(event.target); event.dataTransfer.setData('text', 'b'); // Firefox requires this to make dragging possible } }, { key: 'onColumnDragOver', value: function onColumnDragOver(event) { var dropHeader = this.findParentHeader(event.target); if (this.props.reorderableColumns && this.draggedColumn && dropHeader) { event.preventDefault(); var containerOffset = _DomHandler2.default.getOffset(this.container); var dropHeaderOffset = _DomHandler2.default.getOffset(dropHeader); if (this.draggedColumn !== dropHeader) { var targetLeft = dropHeaderOffset.left - containerOffset.left; //let targetTop = containerOffset.top - dropHeaderOffset.top; var columnCenter = dropHeaderOffset.left + dropHeader.offsetWidth / 2; this.reorderIndicatorUp.style.top = dropHeaderOffset.top - containerOffset.top - (this.iconHeight - 1) + 'px'; this.reorderIndicatorDown.style.top = dropHeaderOffset.top - containerOffset.top + dropHeader.offsetHeight + 'px'; if (event.pageX > columnCenter) { this.reorderIndicatorUp.style.left = targetLeft + dropHeader.offsetWidth - Math.ceil(this.iconWidth / 2) + 'px'; this.reorderIndicatorDown.style.left = targetLeft + dropHeader.offsetWidth - Math.ceil(this.iconWidth / 2) + 'px'; this.dropPosition = 1; } else { this.reorderIndicatorUp.style.left = targetLeft - Math.ceil(this.iconWidth / 2) + 'px'; this.reorderIndicatorDown.style.left = targetLeft - Math.ceil(this.iconWidth / 2) + 'px'; this.dropPosition = -1; } this.reorderIndicatorUp.style.display = 'block'; this.reorderIndicatorDown.style.display = 'block'; } else { event.dataTransfer.dropEffect = 'none'; } } } }, { key: 'onColumnDragLeave', value: function onColumnDragLeave(event) { if (this.props.reorderableColumns && this.draggedColumn) { event.preventDefault(); this.reorderIndicatorUp.style.display = 'none'; this.reorderIndicatorDown.style.display = 'none'; } } }, { key: 'onColumnDrop', value: function onColumnDrop(event) { event.preventDefault(); if (this.draggedColumn) { var dragIndex = _DomHandler2.default.index(this.draggedColumn); var dropIndex = _DomHandler2.default.index(this.findParentHeader(event.target)); var allowDrop = dragIndex !== dropIndex; if (allowDrop && (dropIndex - dragIndex === 1 && this.dropPosition === -1 || dragIndex - dropIndex === 1 && this.dropPosition === 1)) { allowDrop = false; } if (allowDrop) { var columns = this.state.columnOrder ? this.getColumns() : _react2.default.Children.toArray(this.props.children); _ObjectUtils2.default.reorderArray(columns, dragIndex, dropIndex); var columnOrder = []; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = columns[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var column = _step.value; columnOrder.push(column.props.columnKey || column.props.field); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } this.setState({ columnOrder: columnOrder }); if (this.props.onColReorder) { this.props.onColReorder({ dragIndex: dragIndex, dropIndex: dropIndex, columns: this.columns }); } } this.reorderIndicatorUp.style.display = 'none'; this.reorderIndicatorDown.style.display = 'none'; this.draggedColumn.draggable = false; this.draggedColumn = null; this.dropPosition = null; } } }, { key: 'onVirtualScroll', value: function onVirtualScroll(event) { var _this5 = this; if (this.virtualScrollTimer) { clearTimeout(this.virtualScrollTimer); } this.virtualScrollTimer = setTimeout(function () { var first = (event.page - 1) * _this5.props.rows; _this5.setState({ first: first }); if (_this5.props.lazy) { _this5.props.onLazyLoad({ first: first, rows: _this5.state.rows, sortField: _this5.state.sortField, sortOrder: _this5.state.sortOrder, multiSortMeta: _this5.state.multiSortMeta, filters: _this5.state.filters }); } }, this.props.virtualScrollDelay); } }, { key: 'exportCSV', value: function exportCSV() { var _this6 = this; var data = this.props.value; var csv = '\uFEFF'; var columns = _react2.default.Children.toArray(this.props.children); //headers for (var i = 0; i < columns.length; i++) { if (columns[i].props.field) { csv += '"' + (columns[i].props.header || columns[i].props.field) + '"'; if (i < columns.length - 1) { csv += this.props.csvSeparator; } } } //body data.forEach(function (record, i) { csv += '\n'; for (var _i = 0; _i < columns.length; _i++) { if (columns[_i].props.field) { csv += '"' + _ObjectUtils2.default.resolveFieldData(record, columns[_i].props.field) + '"'; if (_i < columns.length - 1) { csv += _this6.props.csvSeparator; } } } }); var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); if (window.navigator.msSaveOrOpenBlob) { navigator.msSaveOrOpenBlob(blob, this.exportFilename + '.csv'); } else { var link = document.createElement("a"); link.style.display = 'none'; document.body.appendChild(link); if (link.download !== undefined) { link.setAttribute('href', URL.createObjectURL(blob)); link.setAttribute('download', this.props.exportFilename + '.csv'); link.click(); } else { csv = 'data:text/csv;charset=utf-8,' + csv; window.open(encodeURI(csv)); } document.body.removeChild(link); } } }, { key: 'onHeaderCheckboxClick', value: function onHeaderCheckboxClick(event) { var selection = void 0; if (!event.checked) selection = [].concat(_toConsumableArray(this.props.value));else selection = []; this.props.onSelectionChange({ originalEvent: event, data: selection }); } }, { key: 'filter', value: function filter(value) { var filteredValue = []; var columns = _react2.default.Children.toArray(this.props.children); for (var i = 0; i < value.length; i++) { var localMatch = true; var globalMatch = false; for (var j = 0; j < columns.length; j++) { var col = columns[j]; var filterMeta = this.state.filters ? this.state.filters[col.props.field] : null; //local if (filterMeta) { var filterValue = filterMeta.value; var filterField = col.props.field; var filterMatchMode = col.props.filterMatchMode; var dataFieldValue = _ObjectUtils2.default.resolveFieldData(value[i], filterField); var filterConstraint = _ObjectUtils2.default.filterConstraints[filterMatchMode]; if (!filterConstraint(dataFieldValue, filterValue)) { localMatch = false; } if (!localMatch) { break; } } //global if (this.props.globalFilter && !globalMatch) { globalMatch = _ObjectUtils2.default.filterConstraints['contains'](_ObjectUtils2.default.resolveFieldData(value[i], col.props.field), this.props.globalFilter); } } var matches = localMatch; if (this.props.globalFilter) { matches = localMatch && globalMatch; } if (matches) { filteredValue.push(value[i]); } } if (filteredValue.length === value.length) { filteredValue = value; } return filteredValue; } }, { key: 'processData', value: function processData() { var data = this.props.value; if (!this.props.lazy) { if (data && data.length) { if (this.state.sortField || this.state.multiSortMeta) { if (this.props.sortMode === 'single') data = this.sortSingle(data);else if (this.props.sortMode === 'multiple') data = this.sortMultiple(data); } if (this.state.filters || this.props.globalFilter) { data = this.filter(data); } } } return data; } }, { key: 'isAllSelected', value: function isAllSelected() { return this.props.selection && this.props.value && this.props.selection.length === this.props.value.length; } }, { key: 'getFrozenColumns', value: function getFrozenColumns(columns) { var frozenColumns = null; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = columns[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var col = _step2.value; if (col.props.frozen) { frozenColumns = frozenColumns || []; frozenColumns.push(col); } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } return frozenColumns; } }, { key: 'getScrollableColumns', value: function getScrollableColumns(columns) { var scrollableColumns = null; var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = columns[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var col = _step3.value; if (!col.props.frozen) { scrollableColumns = scrollableColumns || []; scrollableColumns.push(col); } } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } return scrollableColumns; } }, { key: 'createTableHeader', value: function createTableHeader(columns, columnGroup) { return _react2.default.createElement( _TableHeader.TableHeader, { onSort: this.onSort, sortField: this.state.sortField, sortOrder: this.state.sortOrder, multiSortMeta: this.state.multiSortMeta, columnGroup: columnGroup, resizableColumns: this.props.resizableColumns, onColumnResizeStart: this.onColumnResizeStart, onFilter: this.onFilter, onHeaderCheckboxClick: this.onHeaderCheckboxClick, headerCheckboxSelected: this.isAllSelected(), reorderableColumns: this.props.reorderableColumns, onColumnDragStart: this.onColumnDragStart, onColumnDragOver: this.onColumnDragOver, onColumnDragLeave: this.onColumnDragLeave, onColumnDrop: this.onColumnDrop }, columns ); } }, { key: 'createTableBody', value: function createTableBody(value, columns) { return _react2.default.createElement( _TableBody.TableBody, { value: value, first: this.state.first, rows: this.state.rows, lazy: this.props.lazy, dataKey: this.props.dataKey, compareSelectionBy: this.props.compareSelectionBy, selectionMode: this.props.selectionMode, selection: this.props.selection, metaKeySelection: this.props.metaKeySelection, onSelectionChange: this.props.onSelectionChange, onRowClick: this.props.onRowClick, onRowSelect: this.props.onRowSelect, onRowUnselect: this.props.onRowUnselect, expandedRows: this.props.expandedRows, onRowToggle: this.props.onRowToggle, rowExpansionTemplate: this.props.rowExpansionTemplate, onRowExpand: this.props.onRowExpand, responsive: this.props.responsive, emptyMessage: this.props.emptyMessage, contextMenu: this.props.contextMenu, onContextMenuSelect: this.props.onContextMenuSelect, virtualScroll: this.props.virtualScroll, groupField: this.props.groupField, rowGroupMode: this.props.rowGroupMode, rowGroupHeaderTemplate: this.props.rowGroupHeaderTemplate, rowGroupFooterTemplate: this.props.rowGroupFooterTemplate, sortField: this.state.sortField, rowClassName: this.props.rowClassName }, columns ); } }, { key: 'createTableFooter', value: function createTableFooter(columns, columnGroup) { if (this.hasFooter()) return _react2.default.createElement( _TableFooter.TableFooter, { columnGroup: columnGroup }, columns );else return null; } }, { key: 'createScrollableView', value: function createScrollableView(value, columns, frozen, headerColumnGroup, footerColumnGroup, totalRecords) { return _react2.default.createElement(_ScrollableView.ScrollableView, { columns: columns, header: this.createTableHeader(columns, headerColumnGroup), body: this.createTableBody(value, columns), frozenBody: this.props.frozenValue ? this.createTableBody(this.props.frozenValue, columns) : null, footer: this.createTableFooter(columns, footerColumnGroup), scrollHeight: this.props.scrollHeight, frozen: frozen, frozenWidth: this.props.frozenWidth, unfrozenWidth: this.props.unfrozenWidth, virtualScroll: this.props.virtualScroll, rows: this.props.rows, totalRecords: totalRecords, onVirtualScroll: this.onVirtualScroll }); } }, { key: 'getColumns', value: function getColumns() { var columns = _react2.default.Children.toArray(this.props.children); if (this.props.reorderableColumns && this.state.columnOrder) { var orderedColumns = []; var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { for (var _iterator4 = this.state.columnOrder[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { var columnKey = _step4.value; orderedColumns.push(this.findColumnByKey(columns, columnKey)); } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } return orderedColumns; } else { return columns; } } }, { key: 'findColumnByKey', value: function findColumnByKey(columns, key) { if (columns && columns.length) { for (var i = 0; i < columns.length; i++) { var child = columns[i]; if (child.props.columnKey === key || child.props.field === key) { return child; } } } return null; } }, { key: 'getTotalRecords', value: function getTotalRecords(data) { return this.props.lazy ? this.props.totalRecords : data ? data.length : 0; } }, { key: 'renderLoader', value: function renderLoader() { var iconClassName = (0, _classnames2.default)('fa fa-spin fa-2x', this.props.loadingIcon); return _react2.default.createElement( 'div', { className: 'ui-datatable-loader' }, _react2.default.createElement('div', { className: 'ui-datatable-loader-overlay ui-widget-overlay' }), _react2.default.createElement( 'div', { className: 'ui-datatable-loader-content' }, _react2.default.createElement('i', { className: iconClassName }) ) ); } }, { key: 'render', value: function render() { var _this7 = this; var value = this.processData(); var columns = this.getColumns(); var totalRecords = this.getTotalRecords(value); var className = (0, _classnames2.default)('ui-datatable ui-widget', { 'ui-datatable-reflow': this.props.responsive, 'ui-datatable-resizable': this.props.resizableColumns, 'ui-datatable-scrollable': this.props.scrollable, 'ui-datatable-virtual-scrollable': this.props.virtualScroll }, this.props.className); var paginator = this.props.paginator && this.createPaginator(totalRecords); var headerFacet = this.props.header && _react2.default.createElement( 'div', { className: 'ui-datatable-header ui-widget-header' }, this.props.header ); var footerFacet = this.props.footer && _react2.default.createElement( 'div', { className: 'ui-datatable-footer ui-widget-header' }, this.props.footer ); var resizeHelper = this.props.resizableColumns && _react2.default.createElement('div', { ref: function ref(el) { _this7.resizerHelper = el; }, className: 'ui-column-resizer-helper ui-state-highlight', style: { display: 'none' } }); var tableContent = null; var resizeIndicatorUp = this.props.reorderableColumns && _react2.default.createElement('span', { ref: function ref(el) { _this7.reorderIndicatorUp = el; }, className: 'fa fa-arrow-down ui-datatable-reorder-indicator-up', style: { position: 'absolute', display: 'none' } }); var resizeIndicatorDown = this.props.reorderableColumns && _react2.default.createElement('span', { ref: function ref(el) { _this7.reorderIndicatorDown = el; }, className: 'fa fa-arrow-up ui-datatable-reorder-indicator-down', style: { position: 'absolute', display: 'none' } }); var loader = void 0; if (this.props.loading) { loader = this.renderLoader(); } if (this.props.scrollable) { var frozenColumns = this.getFrozenColumns(columns); var scrollableColumns = frozenColumns ? this.getScrollableColumns(columns) : columns; var frozenView = void 0, scrollableView = void 0; if (frozenColumns) { frozenView = this.createScrollableView(value, frozenColumns, true, this.props.frozenHeaderColumnGroup, this.props.frozenFooterColumnGroup, totalRecords); } scrollableView = this.createScrollableView(value, scrollableColumns, false, this.props.headerColumnGroup, this.props.footerColumnGroup, totalRecords); tableContent = _react2.default.createElement( 'div', { className: 'ui-datatable-scrollable-wrapper' }, frozenView, scrollableView ); } else { var tableHeader = this.createTableHeader(columns, this.props.headerColumnGroup); var tableBody = this.createTableBody(value, columns); var tableFooter = this.createTableFooter(columns, this.props.footerColumnGroup); tableContent = _react2.default.createElement( 'div', { className: 'ui-datatable-tablewrapper' }, _react2.default.createElement( 'table', { style: this.props.tableStyle, className: this.props.tableClassName, ref: function ref(el) { _this7.table = el; } }, tableHeader, tableFooter, tableBody ) ); } return _react2.default.createElement( 'div', { id: this.props.id, className: className, style: this.props.style, ref: function ref(el) { _this7.container = el; } }, loader, headerFacet, tableContent, paginator, footerFacet, resizeHelper, resizeIndicatorUp, resizeIndicatorDown ); } }]); return DataTable; }(_react.Component); DataTable.defaultProps = { id: null, value: null, header: null, footer: null, style: null, className: null, tableStyle: null, tableClassName: null, paginator: false, paginatorTemplate: 'PrevPageLink PageLinks NextPageLink', pageLinkSize: 8, first: null, rows: null, totalRecords: null, rowsPerPageOptions: null, lazy: false, sortField: null, sortOrder: null, multiSortMeta: null, sortMode: 'single', emptyMessage: "No records found", selectionMode: null, selection: null, onSelectionChange: null, compareSelectionBy: 'deepEquals', dataKey: null, metaKeySelection: true, headerColumnGroup: null, footerColumnGroup: null, frozenHeaderColumnGroup: null, frozenFooterColumnGroup: null, rowExpansionTemplate: null, expandedRows: null, onRowToggle: null, responsive: false, resizableColumns: false, columnResizeMode: 'fit', reorderableColumns: false, filters: null, globalFilter: null, scrollable: false, scrollHeight: null, virtualScroll: false, virtualScrollDelay: 500, frozenWidth: null, unfrozenWidth: null, frozenValue: null, csvSeparator: ',', exportFilename: 'download', contextMenu: null, rowGroupMode: null, rowClassName: null, rowGroupHeaderTemplate: null, rowGroupFooterTemplate: null, loading: false, loadingIcon: 'fa-circle-o-notch', onColumnResizeEnd: null, onSort: null, onPage: null, onFilter: null, onLazyLoad: null, onRowClick: null, onRowSelect: null, onRowUnselect: null, onRowExpand: null, onRowCollapse: null, onContextMenuSelect: null, onColReorder: null }; DataTable.propTypes = { id: _propTypes2.default.string, value: _propTypes2.default.array, header: _propTypes2.default.any, footer: _propTypes2.default.any, style: _propTypes2.default.object, className: _propTypes2.default.string, tableStyle: _propTypes2.default.any, tableClassName: _propTypes2.default.string, paginator: _propTypes2.default.bool, paginatorTemplate: _propTypes2.default.string, pageLinkSize: _propTypes2.default.number, first: _propTypes2.default.number, rows: _propTypes2.default.number, totalRecords: _propTypes2.default.number, rowsPerPageOptions: _propTypes2.default.array, lazy: _propTypes2.default.bool, sortField: _propTypes2.default.string, sortOrder: _propTypes2.default.number, multiSortMeta: _propTypes2.default.array, sortMode: _propTypes2.default.string, emptyMessage: _propTypes2.default.string, selectionMode: _propTypes2.default.string, selection: _propTypes2.default.any, onSelectionChange: _propTypes2.default.func, compareSelectionBy: _propTypes2.default.string, dataKey: _propTypes2.default.string, metaKeySelection: _propTypes2.default.bool, headerColumnGroup: _propTypes2.default.element, footerColumnGroup: _propTypes2.default.element, frozenHeaderColumnGroup: _propTypes2.default.element, frozenFooterColumnGroup: _propTypes2.default.element, rowExpansionTemplate: _propTypes2.default.func, expandedRows: _propTypes2.default.array, onRowToggle: _propTypes2.default.func, responsive: _propTypes2.default.bool, resizableColumns: _propTypes2.default.bool, columnResizeMode: _propTypes2.default.string, reorderableColumns: _propTypes2.default.bool, filters: _propTypes2.default.object, globalFilter: _propTypes2.default.any, scrollable: _propTypes2.default.bool, scrollHeight: _propTypes2.default.string, virtualScroll: _propTypes2.default.bool, virtualScrollDelay: _propTypes2.default.number, frozenWidth: _propTypes2.default.string, unfrozenWidth: _propTypes2.default.string, frozenValue: _propTypes2.default.array, csvSeparator: _propTypes2.default.string, exportFilename: _propTypes2.default.string, contextMenu: _propTypes2.default.any, rowGroupMode: _propTypes2.default.string, rowClassName: _propTypes2.default.func, rowGroupHeaderTemplate: _propTypes2.default.func, rowGroupFooterTemplate: _propTypes2.default.func, loading: _propTypes2.default.bool, loadingIcons: _propTypes2.default.string, onColumnResizeEnd: _propTypes2.default.func, onSort: _propTypes2.default.func, onPage: _propTypes2.default.func, onFilter: _propTypes2.default.func, onLazyLoad: _propTypes2.default.func, onRowClick: _propTypes2.default.func, onRowSelect: _propTypes2.default.func, onRowUnselect: _propTypes2.default.func, onRowExpand: _propTypes2.default.func, onRowCollapse: _propTypes2.default.func, onContextMenuSelect: _propTypes2.default.func, onColReorder: _propTypes2.default.func };