@bigfishtv/cockpit
Version:
264 lines (217 loc) • 10.6 kB
JavaScript
'use strict';
exports.__esModule = true;
exports.default = 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 _class, _temp;
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _fixedDataTable = require('fixed-data-table');
var _deepEqual = require('deep-equal');
var _deepEqual2 = _interopRequireDefault(_deepEqual);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _stringUtils = require('../../utils/stringUtils');
var _tableUtils = require('../../utils/tableUtils');
var _SortTypes = require('../../constants/SortTypes');
var SortTypes = _interopRequireWildcard(_SortTypes);
var _FixedDataTableTextCell = require('./cell/FixedDataTableTextCell');
var _FixedDataTableTextCell2 = _interopRequireDefault(_FixedDataTableTextCell);
var _FixedDataTableHeaderCellSort = require('./cell/FixedDataTableHeaderCellSort');
var _FixedDataTableHeaderCellSort2 = _interopRequireDefault(_FixedDataTableHeaderCellSort);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _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; }
// we define this because react-docgen fails when defaultProp directly references an imported component
var DefaultHeaderCell = function DefaultHeaderCell(props) {
return _react2.default.createElement(_FixedDataTableHeaderCellSort2.default, props);
};
var DefaultCell = function DefaultCell(props) {
return _react2.default.createElement(_FixedDataTableTextCell2.default, props);
};
/**
* Typically wrapped by Table component, simply displays a fixed-data-table with the data provided
*/
var FixedDataTable = (_temp = _class = function (_Component) {
_inherits(FixedDataTable, _Component);
function FixedDataTable(props) {
var _ref;
_classCallCheck(this, FixedDataTable);
var _this = _possibleConstructorReturn(this, _Component.call(this));
_this.onSortChange = function (columnKey, sortDirection) {
var _columnSortDirections;
var _this$props = _this.props,
fields = _this$props.fields,
uncontrolled = _this$props.uncontrolled,
onSortChange = _this$props.onSortChange;
var field = fields.filter(function (field) {
return field.key === columnKey;
})[0];
var sortType = 'sortType' in field ? field.sortType : 'string';
if (!uncontrolled) {
onSortChange(columnKey, sortDirection, sortType);
} else {
var data = [].concat(_this.state.data).sort((0, _tableUtils.sortByObjectKey)(columnKey, sortDirection, sortType));
_this.setState({ data: data });
}
_this.setState({ columnSortDirections: (_columnSortDirections = {}, _columnSortDirections[columnKey] = sortDirection, _columnSortDirections) });
};
_this.handleColumnResize = function (newColumnWidth, columnKey) {
var _extends2;
_this.setState({
columnWidths: _extends({}, _this.state.columnWidths, (_extends2 = {}, _extends2[columnKey] = newColumnWidth, _extends2))
});
};
_this.handleGetRowClassName = function (rowIndex) {
var row = _this.state.data[rowIndex];
var selected = _this.props.selectedIds.indexOf(row.id) >= 0;
return selected ? 'selected' : '';
};
_this.handleRowClick = function (event, rowIndex) {
event.stopPropagation();
_this.props.onSelect(_this.state.data[rowIndex]);
};
_this.handleRowDoubleClick = function (event, rowIndex) {
event.stopPropagation();
_this.props.onSelected(_this.state.data[rowIndex]);
};
var columnWidths = {};
props.fields.map(function (field) {
columnWidths[field.key] = field.width || props.cellWidth;
});
_this.state = {
data: props.data,
columnSortDirections: props.columnKey && props.sortDirection ? (_ref = {}, _ref[props.columnKey] = props.sortDirection, _ref) : {},
columnWidths: columnWidths
};
return _this;
}
FixedDataTable.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
var _this2 = this;
if (!(0, _deepEqual2.default)(this.state.data, nextProps.data)) {
var columnKey = !this.state.data.length ? this.props.defaultSortField : Object.keys(this.state.columnSortDirections)[0];
var sortDirection = !this.state.data.length ? this.props.defaultSortDirection : this.state.columnSortDirections[columnKey];
this.setState({ data: nextProps.data }, function () {
if (_this2.props.uncontrolled) _this2.onSortChange(columnKey, sortDirection);
});
}
};
FixedDataTable.prototype.render = function render() {
var _this3 = this;
var _state = this.state,
data = _state.data,
columnSortDirections = _state.columnSortDirections,
columnWidths = _state.columnWidths;
var _props = this.props,
fields = _props.fields,
selectedIds = _props.selectedIds,
checkboxSelection = _props.checkboxSelection,
tableWidth = _props.tableWidth,
tableHeight = _props.tableHeight,
headerHeight = _props.headerHeight,
rowHeight = _props.rowHeight,
HeaderCell = _props.HeaderCell,
DefaultCell = _props.DefaultCell,
DefaultHeaderCell = _props.DefaultHeaderCell,
props = _objectWithoutProperties(_props, ['fields', 'selectedIds', 'checkboxSelection', 'tableWidth', 'tableHeight', 'headerHeight', 'rowHeight', 'HeaderCell', 'DefaultCell', 'DefaultHeaderCell']);
return _react2.default.createElement(
_fixedDataTable.Table,
_extends({}, props, {
rowsCount: data.length,
headerHeight: headerHeight,
rowHeight: rowHeight,
width: tableWidth,
height: tableHeight,
onColumnResizeEndCallback: this.handleColumnResize,
isColumnResizing: false,
rowClassNameGetter: this.handleGetRowClassName,
onRowClick: checkboxSelection ? function () {} : this.handleRowClick,
onRowDoubleClick: this.handleRowDoubleClick }),
fields.map(function (field, i) {
var BodyCell = field.Cell || DefaultCell;
var HeaderCell = field.HeaderCell || DefaultHeaderCell;
var width = columnWidths[field.key];
var headerTitle = field.value || (0, _stringUtils.titleCase)(field.key);
var sortDir = columnSortDirections[field.key];
var schema = field.schema || {};
return _react2.default.createElement(_fixedDataTable.Column, {
key: i,
columnKey: field.key,
fixed: field.fixed,
isResizable: field.resizable,
minWidth: field.minWidth,
maxWidth: field.maxWidth,
flexGrow: field.flexGrow,
header: _react2.default.createElement(
HeaderCell,
{
data: data,
selectedIds: selectedIds,
onSelectionChange: _this3.props.onSelectionChange,
onSortChange: _this3.onSortChange,
sortDir: sortDir,
className: (0, _classnames2.default)(field.sortable && 'sortable') },
headerTitle
),
cell: _react2.default.createElement(BodyCell, { data: data, schema: schema, onSelect: _this3.props.onSelect, selectedIds: selectedIds }),
width: width
});
})
);
};
return FixedDataTable;
}(_react.Component), _class.propTypes = {
/** Array of objects representing table rows */
data: _propTypes2.default.arrayOf(_propTypes2.default.object),
/** Array of objects representing table columns/schema */
fields: _propTypes2.default.arrayOf(_propTypes2.default.object),
/** Array of selected row ids */
selectedIds: _propTypes2.default.arrayOf(_propTypes2.default.number),
/** Whether or not component should control its own sorting */
uncontrolled: _propTypes2.default.bool,
/** Whether or not to inject a checkbox column to control selection state */
checkboxSelection: _propTypes2.default.bool,
tableWidth: _propTypes2.default.number,
tableHeight: _propTypes2.default.number,
cellWidth: _propTypes2.default.number,
rowHeight: _propTypes2.default.number,
headerHeight: _propTypes2.default.number,
/** column key to sort by, can even be nested e.g. 'collection.title' */
defaultSortField: _propTypes2.default.string,
defaultSortDirections: _propTypes2.default.oneOf([SortTypes.ASC, SortTypes.DESC]),
/** On row select */
onSelect: _propTypes2.default.func,
/** On row double click */
onSelected: _propTypes2.default.func,
/** For updating selectedIds in bulk */
onSelectionChange: _propTypes2.default.func,
/** Component to replace default HeaderCell */
HeaderCell: _propTypes2.default.func,
/** Component to replace default table cell component */
DefaultCell: _propTypes2.default.func
}, _class.defaultProps = {
data: [],
fields: [],
selectedIds: [],
uncontrolled: true,
tableWidth: 600,
tableHeight: 500,
cellWidth: 250,
rowHeight: 50,
headerHeight: 36,
defaultSortField: 'modified',
defaultSortDirection: SortTypes.DESC,
onSelect: function onSelect() {
return console.warn('[FixedDataTable] no onSelect prop provided');
},
onSelected: function onSelected() {
return console.warn('[FixedDataTable] no onSelected prop provided');
},
DefaultHeaderCell: DefaultHeaderCell,
DefaultCell: DefaultCell
}, _temp);
exports.default = FixedDataTable;