primereact
Version:
[](https://gitter.im/primefaces/primereact?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
636 lines (557 loc) • 26.5 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TreeTable = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _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 _TreeTableHeader = require('./TreeTableHeader');
var _TreeTableFooter = require('./TreeTableFooter');
var _UITreeRow = require('./UITreeRow');
var _ObjectUtils = require('../utils/ObjectUtils');
var _ObjectUtils2 = _interopRequireDefault(_ObjectUtils);
var _Column = require('../column/Column');
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 TreeTable = exports.TreeTable = function (_Component) {
_inherits(TreeTable, _Component);
function TreeTable(props) {
_classCallCheck(this, TreeTable);
var _this = _possibleConstructorReturn(this, (TreeTable.__proto__ || Object.getPrototypeOf(TreeTable)).call(this, props));
_this.value = [].concat(_toConsumableArray(_this.props.value));
_this.state = {
sortField: props.sortField,
sortOrder: props.sortOrder,
multiSortMeta: props.multiSortMeta
};
_this.onSort = _this.onSort.bind(_this);
return _this;
}
_createClass(TreeTable, [{
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;
this.columnSortable = event.sortable;
this.columnSortFunction = event.sortFunction;
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,
multiSortMeta: multiSortMeta
});
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(value) {
var _this2 = this;
if (this.columnSortable && this.columnSortable === 'custom' && this.columnSortFunction) {
value = this.columnSortFunction({
field: this.state.sortField,
order: this.state.sortOrder
});
} else {
value.sort(function (data1, data2) {
var value1 = _ObjectUtils2.default.resolveFieldData(data1.data, _this2.state.sortField);
var value2 = _ObjectUtils2.default.resolveFieldData(data2.data, _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, undefined, { numeric: true });else result = value1 < value2 ? -1 : value1 > value2 ? 1 : 0;
return _this2.state.sortOrder * result;
});
}
for (var i = 0; i < value.length; i++) {
var child = value[i].children;
if (child) {
this.sortSingle(child);
}
}
return value;
}
}, {
key: 'sortMultiple',
value: function sortMultiple(value) {
var _this3 = this;
value.sort(function (data1, data2) {
return _this3.multisortField(data1, data2, _this3.state.multiSortMeta, 0);
});
for (var i = 0; i < value.length; i++) {
var child = value[i].children;
if (child) {
this.sortMultiple(child);
}
}
return value;
}
}, {
key: 'multisortField',
value: function multisortField(data1, data2, multiSortMeta, index) {
var value1 = _ObjectUtils2.default.resolveFieldData(data1.data, this.state.multiSortMeta[index].field);
var value2 = _ObjectUtils2.default.resolveFieldData(data2.data, 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, undefined, { numeric: true });
}
} 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: 'onRowClick',
value: function onRowClick(event, node) {
var eventTarget = event.target;
if (eventTarget.className && eventTarget.className.indexOf('ui-treetable-toggler') === 0) {
return;
} else if (this.props.selectionMode) {
if (node.selectable === false) {
return;
}
var metaSelection = this.rowTouched ? false : this.props.metaKeySelection;
var index = this.findIndexInSelection(node);
var selected = index >= 0;
if (this.isCheckboxSelectionMode()) {
if (selected) {
this.propagateSelectionDown(node, false);
if (node.parent) {
this.propagateSelectionUp(node.parent, false);
}
this.props.selectionChange({
originalEvent: event,
selection: this.selection
});
if (this.props.onNodeUnselect) {
this.props.onNodeUnselect({
originalEvent: event,
node: node
});
}
} else {
this.propagateSelectionDown(node, true);
if (node.parent) {
this.propagateSelectionUp(node.parent, true);
}
this.props.selectionChange({
originalEvent: event,
selection: this.selection
});
if (this.props.onNodeSelect) {
this.props.onNodeSelect({
originalEvent: event,
node: node
});
}
}
} else {
if (metaSelection) {
var metaKey = event.metaKey || event.ctrlKey;
if (selected && metaKey) {
if (this.isSingleSelectionMode()) {
this.selection = null;
this.props.selectionChange({
originalEvent: event,
selection: null
});
} else {
this.selection = this.selection.filter(function (val, i) {
return i !== index;
});
this.props.selectionChange({
originalEvent: event,
selection: this.selection
});
}
if (this.props.onNodeUnselect) {
this.props.onNodeUnselect({
originalEvent: event,
node: node
});
}
} else {
if (this.isSingleSelectionMode()) {
this.selection = node;
this.props.selectionChange({
originalEvent: event,
selection: node
});
} else if (this.isMultipleSelectionMode()) {
this.selection = !metaKey ? [] : this.selection || [];
this.selection = [].concat(_toConsumableArray(this.selection), [node]);
this.props.selectionChange({
originalEvent: event,
selection: this.selection
});
}
if (this.props.onNodeSelect) {
this.props.onNodeSelect({
originalEvent: event,
node: node
});
}
}
} else {
if (this.isSingleSelectionMode()) {
if (selected) {
this.selection = null;
if (this.props.onNodeUnselect) {
this.props.onNodeUnselect({
originalEvent: event,
node: node
});
}
} else {
this.selection = node;
if (this.props.onNodeSelect) {
this.props.onNodeSelect({
originalEvent: event,
node: node
});
}
}
} else {
if (selected) {
this.selection = this.selection.filter(function (val, i) {
return i !== index;
});
if (this.props.onNodeUnselect) {
this.props.onNodeUnselect({
originalEvent: event,
node: node
});
}
} else {
this.selection = [].concat(_toConsumableArray(this.selection || []), [node]);
if (this.props.onNodeSelect) {
this.props.onNodeSelect({
originalEvent: event,
node: node
});
}
}
}
this.props.selectionChange({
originalEvent: event,
selection: this.selection
});
}
}
}
this.rowTouched = false;
}
}, {
key: 'onRowTouchEnd',
value: function onRowTouchEnd() {
this.rowTouched = true;
}
}, {
key: 'findIndexInSelection',
value: function findIndexInSelection(node) {
var index = -1;
if (this.props.selectionMode && this.selection) {
if (this.isSingleSelectionMode()) {
index = _ObjectUtils2.default.equals(this.selection, node) ? 0 : -1;
} else {
for (var i = 0; i < this.selection.length; i++) {
if (_ObjectUtils2.default.equals(this.selection[i], node)) {
index = i;
break;
}
}
}
}
return index;
}
}, {
key: 'propagateSelectionUp',
value: function propagateSelectionUp(node, select) {
if (node.children && node.children.length) {
var selectedCount = 0;
var childPartialSelected = false;
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = node.children[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var child = _step.value;
if (this.isSelected(child)) {
selectedCount++;
} else if (child.partialSelected) {
childPartialSelected = true;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
if (select && selectedCount === node.children.length) {
this.selection = [].concat(_toConsumableArray(this.selection || []), [node]);
node.partialSelected = false;
} else {
if (!select) {
var index = this.findIndexInSelection(node);
if (index >= 0) {
this.selection = this.selection.filter(function (val, i) {
return i !== index;
});
}
}
if ((childPartialSelected || selectedCount > 0) && selectedCount !== node.children.length) node.partialSelected = true;else node.partialSelected = false;
}
}
var parent = node.parent;
if (parent) {
this.propagateSelectionUp(parent, select);
}
}
}, {
key: 'propagateSelectionDown',
value: function propagateSelectionDown(node, select) {
var index = this.findIndexInSelection(node);
if (select && index === -1) {
this.selection = [].concat(_toConsumableArray(this.selection || []), [node]);
} else if (!select && index > -1) {
this.selection = this.selection.filter(function (val, i) {
return i !== index;
});
}
node.partialSelected = false;
if (node.children && node.children.length) {
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = node.children[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var child = _step2.value;
this.propagateSelectionDown(child, select);
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
}
}
}, {
key: 'isSelected',
value: function isSelected(node) {
return this.findIndexInSelection(node) !== -1;
}
}, {
key: 'isSingleSelectionMode',
value: function isSingleSelectionMode() {
return this.props.selectionMode && this.props.selectionMode === 'single';
}
}, {
key: 'isMultipleSelectionMode',
value: function isMultipleSelectionMode() {
return this.props.selectionMode && this.props.selectionMode === 'multiple';
}
}, {
key: 'isCheckboxSelectionMode',
value: function isCheckboxSelectionMode() {
return this.props.selectionMode && this.props.selectionMode === 'checkbox';
}
}, {
key: 'hasFooter',
value: function hasFooter() {
if (this.columns) {
for (var i = 0; i < this.columns.length; i++) {
if (this.columns[i].footer) {
return true;
}
}
}
return false;
}
}, {
key: 'processData',
value: function processData() {
var data = this.value;
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);
}
}
return data;
}
}, {
key: 'createTreeTableHeader',
value: function createTreeTableHeader() {
return _react2.default.createElement(_TreeTableHeader.TreeTableHeader, { columns: this.columns, onSort: this.onSort, sortField: this.state.sortField, sortOrder: this.state.sortOrder, multiSortMeta: this.state.multiSortMeta });
}
}, {
key: 'createTreeTableFooter',
value: function createTreeTableFooter() {
if (this.hasFooter()) {
return _react2.default.createElement(_TreeTableFooter.TreeTableFooter, { columns: this.columns });
} else {
return null;
}
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps, prevState, snapshot) {
var state = {};
if (this.props.sortOrder !== prevProps.sortOrder && this.props.sortOrder !== prevState.sortOrder) {
state = { sortOrder: this.props.sortOrder };
}
if (this.props.sortField !== prevProps.sortField && this.props.sortField !== prevState.sortField) {
state = _extends({}, state, { sortField: this.props.sortField });
}
if (this.props.multiSortMeta !== prevProps.multiSortMeta && this.props.multiSortMeta !== prevState.multiSortMeta) {
state = _extends({}, state, { multiSortMeta: this.props.multiSortMeta });
}
if (Object.keys(state).length > 0) this.setState(state);
}
}, {
key: 'render',
value: function render() {
var _this4 = this;
if (this.props.value && !_ObjectUtils2.default.equalsByValue(this.props.value, this.value)) {
this.value = [].concat(_toConsumableArray(this.props.value));
}
var value = this.processData();
this.columns = _react2.default.Children.map(this.props.children, function (element, i) {
if (element && element.type === _Column.Column) return element;
});
var treeTableClass = (0, _classnames2.default)('ui-treetable ui-widget', this.props.className);
var headerFacet = this.props.header && _react2.default.createElement(
'div',
{ className: 'ui-treetable-header ui-widget-header' },
this.props.header
),
footerFacet = this.props.footer && _react2.default.createElement(
'div',
{ className: 'ui-treetable-footer ui-widget-header' },
this.props.footer
);
var thead = this.createTreeTableHeader(),
tfoot = this.createTreeTableFooter(),
tbody = value && value.map(function (node, index) {
return _react2.default.createElement(_UITreeRow.UITreeRow, { key: 'row_' + index, node: node, index: index, level: 0, labelExpand: _this4.props.labelExpand, labelCollapse: _this4.props.labelCollapse, treeTable: _this4, parentNode: value });
});
return _react2.default.createElement(
'div',
{ id: this.props.id, className: treeTableClass, style: this.props.style },
headerFacet,
_react2.default.createElement(
'div',
{ className: 'ui-treetable-tablewrapper' },
_react2.default.createElement(
'table',
{ className: 'ui-widget-content' },
thead,
tfoot,
tbody
)
),
footerFacet
);
}
}]);
return TreeTable;
}(_react.Component);
TreeTable.defaultProps = {
id: null,
value: null,
labelExpand: "Expand",
labelCollapse: "Collapse",
selectionMode: null,
selection: null,
selectionChange: null,
style: null,
className: null,
metaKeySelection: true,
header: '',
footer: '',
sortField: null,
sortOrder: 1,
multiSortMeta: null,
sortMode: 'single',
onSort: null,
onNodeSelect: null,
onNodeUnselect: null,
onNodeExpand: null,
onNodeCollapse: null
};
TreeTable.propsTypes = {
id: _propTypes2.default.string,
value: _propTypes2.default.any,
labelExpand: _propTypes2.default.string,
labelCollapse: _propTypes2.default.string,
selectionMode: _propTypes2.default.string,
selection: _propTypes2.default.any,
selectionChange: _propTypes2.default.func.isRequired,
style: _propTypes2.default.object,
className: _propTypes2.default.string,
metaKeySelection: _propTypes2.default.bool,
header: _propTypes2.default.string,
footer: _propTypes2.default.string,
sortField: _propTypes2.default.string,
sortOrder: _propTypes2.default.number,
multiSortMeta: _propTypes2.default.array,
sortMode: _propTypes2.default.string,
onSort: _propTypes2.default.func,
onNodeSelect: _propTypes2.default.func,
onNodeUnselect: _propTypes2.default.func,
onNodeExpand: _propTypes2.default.func,
onNodeCollapse: _propTypes2.default.func
};