UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

514 lines (453 loc) 75.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.TableSection = exports.Container = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _reactVirtualized = require("react-virtualized"); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _classnames3 = _interopRequireDefault(require("classnames")); var _reselect = require("reselect"); var _lodash = _interopRequireDefault(require("lodash.get")); var _lodash2 = _interopRequireDefault(require("lodash.debounce")); var _optionDropdown = _interopRequireDefault(require("./option-dropdown")); var _grid = _interopRequireDefault(require("./grid")); var _button = _interopRequireDefault(require("./button")); var _icons = require("../icons"); var _dataUtils = require("../../../utils/data-utils"); var _cellSize = require("./cell-size"); var _defaultSettings = require("../../../constants/default-settings"); var _fieldToken = _interopRequireDefault(require("../field-token")); var _fieldToAlignRight, _templateObject; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var defaultHeaderRowHeight = 55; var defaultRowHeight = 32; var overscanColumnCount = 10; var overscanRowCount = 10; var fieldToAlignRight = (_fieldToAlignRight = {}, (0, _defineProperty2["default"])(_fieldToAlignRight, _defaultSettings.ALL_FIELD_TYPES.integer, true), (0, _defineProperty2["default"])(_fieldToAlignRight, _defaultSettings.ALL_FIELD_TYPES.real, true), _fieldToAlignRight); var Container = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n font-size: 11px;\n flex-grow: 1;\n color: ", ";\n width: 100%;\n\n .ReactVirtualized__Grid:focus,\n .ReactVirtualized__Grid:active {\n outline: 0;\n }\n\n .cell {\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n *:focus {\n outline: 0;\n }\n\n .results-table-wrapper {\n position: relative;\n min-height: 100%;\n max-height: 100%;\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n overflow: hidden;\n border-top: none;\n\n .scroll-in-ui-thread::after {\n content: '';\n height: 100%;\n left: 0;\n position: absolute;\n pointer-events: none;\n top: 0;\n width: 100%;\n }\n\n .grid-row {\n position: relative;\n display: flex;\n flex-direction: row;\n }\n .grid-column {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n }\n .pinned-grid-container {\n flex: 0 0 75px;\n z-index: 10;\n position: absolute;\n left: 0;\n top: 0;\n border-right: 2px solid ", ";\n }\n\n .header-grid {\n overflow: hidden !important;\n }\n\n .even-row {\n background-color: ", ";\n }\n .odd-row {\n background-color: ", ";\n }\n .cell,\n .header-cell {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n text-align: center;\n overflow: hidden;\n\n .n-sort-idx {\n font-size: 9px;\n }\n }\n .cell {\n border-bottom: 1px solid ", ";\n border-right: 1px solid ", ";\n white-space: nowrap;\n overflow: auto;\n padding: 0 ", "px;\n font-size: ", "px;\n\n .result-link {\n text-decoration: none;\n }\n }\n .cell.end-cell,\n .header-cell.end-cell {\n border-right: none;\n padding-right: ", "px;\n }\n .cell.first-cell,\n .header-cell.first-cell {\n padding-left: ", "px;\n }\n .cell.bottom-cell {\n border-bottom: none;\n }\n .cell.align-right {\n align-items: flex-end;\n }\n .header-cell {\n border-bottom: 1px solid ", ";\n border-top: 1px solid ", ";\n padding-top: ", "px;\n padding-right: 0;\n padding-bottom: ", "px;\n padding-left: ", "px;\n align-items: center;\n justify-content: space-between;\n display: flex;\n flex-direction: row;\n background-color: ", ";\n\n &:hover {\n .more {\n color: ", ";\n }\n }\n .n-sort-idx {\n font-size: 9px;\n }\n .details {\n font-weight: 500;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n height: 100%;\n overflow: hidden;\n flex-grow: 1;\n\n .col-name {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n\n .col-name__left {\n display: flex;\n align-items: center;\n overflow: hidden;\n svg {\n margin-left: 6px;\n }\n }\n .col-name__name {\n overflow: hidden;\n white-space: nowrap;\n }\n }\n }\n\n .more {\n color: transparent;\n margin-left: 5px;\n }\n }\n }\n\n :focus {\n outline: none;\n }\n"])), function (props) { return props.theme.dataTableTextColor; }, function (props) { return props.theme.pinnedGridBorderColor; }, function (props) { return props.theme.evenRowBackground; }, function (props) { return props.theme.oddRowBackground; }, function (props) { return props.theme.cellBorderColor; }, function (props) { return props.theme.cellBorderColor; }, function (props) { return props.theme.cellPaddingSide; }, function (props) { return props.theme.cellFontSize; }, function (props) { return props.theme.cellPaddingSide + props.theme.edgeCellPaddingSide; }, function (props) { return props.theme.cellPaddingSide + props.theme.edgeCellPaddingSide; }, function (props) { return props.theme.headerCellBorderColor; }, function (props) { return props.theme.headerCellBorderColor; }, function (props) { return props.theme.headerPaddingTop; }, function (props) { return props.theme.headerPaddingBottom; }, function (props) { return props.theme.cellPaddingSide; }, function (props) { return props.theme.headerCellBackground; }, function (props) { return props.theme.headerCellIconColor; }); exports.Container = Container; var defaultColumnWidth = 200; var columnWidthFunction = function columnWidthFunction(columns, cellSizeCache, ghost) { return function (_ref) { var index = _ref.index; return (columns[index] || {}).ghost ? ghost : cellSizeCache[columns[index]] || defaultColumnWidth; }; }; /* * This is an accessor method used to generalize getting a cell from a data row */ var getRowCell = function getRowCell(_ref2) { var dataContainer = _ref2.dataContainer, columns = _ref2.columns, column = _ref2.column, colMeta = _ref2.colMeta, rowIndex = _ref2.rowIndex, sortOrder = _ref2.sortOrder; var rowIdx = sortOrder && sortOrder.length ? (0, _lodash["default"])(sortOrder, rowIndex) : rowIndex; var type = colMeta[column].type; var value = dataContainer.valueAt(rowIdx, columns.indexOf(column)); if (value === undefined) value = 'Err'; return (0, _dataUtils.parseFieldValue)(value, type); }; var TableSection = function TableSection(_ref3) { var classList = _ref3.classList, isPinned = _ref3.isPinned, columns = _ref3.columns, headerGridProps = _ref3.headerGridProps, fixedWidth = _ref3.fixedWidth, _ref3$fixedHeight = _ref3.fixedHeight, fixedHeight = _ref3$fixedHeight === void 0 ? undefined : _ref3$fixedHeight, onScroll = _ref3.onScroll, scrollTop = _ref3.scrollTop, dataGridProps = _ref3.dataGridProps, columnWidth = _ref3.columnWidth, setGridRef = _ref3.setGridRef, headerCellRender = _ref3.headerCellRender, dataCellRender = _ref3.dataCellRender, _ref3$scrollLeft = _ref3.scrollLeft, scrollLeft = _ref3$scrollLeft === void 0 ? undefined : _ref3$scrollLeft; return /*#__PURE__*/_react["default"].createElement(_reactVirtualized.AutoSizer, null, function (_ref4) { var width = _ref4.width, height = _ref4.height; var gridDimension = { columnCount: columns.length, columnWidth: columnWidth, width: fixedWidth || width }; var dataGridHeight = fixedHeight || height; return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames3["default"])('scroll-in-ui-thread', classList.header) }, /*#__PURE__*/_react["default"].createElement(_grid["default"], (0, _extends2["default"])({ cellRenderer: headerCellRender }, headerGridProps, gridDimension, { scrollLeft: scrollLeft }))), /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames3["default"])('scroll-in-ui-thread', classList.rows), style: { top: headerGridProps.height } }, /*#__PURE__*/_react["default"].createElement(_grid["default"], (0, _extends2["default"])({ cellRenderer: dataCellRender }, dataGridProps, gridDimension, { className: isPinned ? 'pinned-grid' : 'body-grid', height: dataGridHeight - headerGridProps.height, onScroll: onScroll, scrollTop: scrollTop, setGridRef: setGridRef })))); }); }; exports.TableSection = TableSection; DataTableFactory.deps = [_fieldToken["default"]]; function DataTableFactory(FieldToken) { var DataTable = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(DataTable, _Component); var _super = _createSuper(DataTable); function DataTable() { var _this; (0, _classCallCheck2["default"])(this, DataTable); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", { cellSizeCache: {}, moreOptionsColumn: null }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "root", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "columns", function (props) { return props.columns; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "pinnedColumns", function (props) { return props.pinnedColumns; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "unpinnedColumns", (0, _reselect.createSelector)(_this.columns, _this.pinnedColumns, function (columns, pinnedColumns) { return !Array.isArray(pinnedColumns) ? columns : columns.filter(function (c) { return !pinnedColumns.includes(c); }); })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "toggleMoreOptions", function (moreOptionsColumn) { return _this.setState({ moreOptionsColumn: _this.state.moreOptionsColumn === moreOptionsColumn ? null : moreOptionsColumn }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getCellSizeCache", function () { var _this$props = _this.props, propsCache = _this$props.cellSizeCache, fixedWidth = _this$props.fixedWidth, pinnedColumns = _this$props.pinnedColumns; var unpinnedColumns = _this.unpinnedColumns(_this.props); var width = fixedWidth ? fixedWidth : _this.root.current ? _this.root.current.clientWidth : 0; // pin column border is 2 pixel vs 1 pixel var adjustWidth = pinnedColumns.length ? width - 1 : width; var _adjustCellsToContain = (0, _cellSize.adjustCellsToContainer)(adjustWidth, propsCache, pinnedColumns, unpinnedColumns), cellSizeCache = _adjustCellsToContain.cellSizeCache, ghost = _adjustCellsToContain.ghost; return { cellSizeCache: cellSizeCache, ghost: ghost }; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "doScaleCellsToWidth", function () { _this.setState(_this.getCellSizeCache()); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "scaleCellsToWidth", (0, _lodash2["default"])(_this.doScaleCellsToWidth, 300)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "renderHeaderCell", function (columns, isPinned, props, toggleMoreOptions, moreOptionsColumn, TokenComponent) { // eslint-disable-next-line react/display-name return function (cellInfo) { var _classnames; var columnIndex = cellInfo.columnIndex, key = cellInfo.key, style = cellInfo.style; var colMeta = props.colMeta, sortColumn = props.sortColumn, _sortTableColumn = props.sortTableColumn, _pinTableColumn = props.pinTableColumn, _copyTableColumn = props.copyTableColumn; var column = columns[columnIndex]; var isGhost = column.ghost; var isSorted = sortColumn[column]; var firstCell = columnIndex === 0; return /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames3["default"])('header-cell', (_classnames = {}, (0, _defineProperty2["default"])(_classnames, "column-".concat(columnIndex), true), (0, _defineProperty2["default"])(_classnames, 'pinned-header-cell', isPinned), (0, _defineProperty2["default"])(_classnames, 'first-cell', firstCell), _classnames)), key: key, style: style, onClick: function onClick(e) { e.shiftKey ? _sortTableColumn(column) : null; }, onDoubleClick: function onDoubleClick() { return _sortTableColumn(column); }, title: column }, isGhost ? /*#__PURE__*/_react["default"].createElement("div", null) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("section", { className: "details" }, /*#__PURE__*/_react["default"].createElement("div", { className: "col-name" }, /*#__PURE__*/_react["default"].createElement("div", { className: "col-name__left" }, /*#__PURE__*/_react["default"].createElement("div", { className: "col-name__name" }, colMeta[column].name), /*#__PURE__*/_react["default"].createElement(_button["default"], { className: "col-name__sort", onClick: function onClick() { return _sortTableColumn(column); } }, isSorted ? isSorted === _defaultSettings.SORT_ORDER.ASCENDING ? /*#__PURE__*/_react["default"].createElement(_icons.ArrowUp, { height: "14px" }) : /*#__PURE__*/_react["default"].createElement(_icons.ArrowDown, { height: "14px" }) : null)), /*#__PURE__*/_react["default"].createElement(_button["default"], { className: "more", onClick: function onClick() { return toggleMoreOptions(column); } }, /*#__PURE__*/_react["default"].createElement(_icons.VertThreeDots, { height: "14px" }))), /*#__PURE__*/_react["default"].createElement(FieldToken, { type: colMeta[column].type })), /*#__PURE__*/_react["default"].createElement("section", { className: "options" }, /*#__PURE__*/_react["default"].createElement(_optionDropdown["default"], { isOpened: moreOptionsColumn === column, type: colMeta[column].type, column: column, toggleMoreOptions: toggleMoreOptions, sortTableColumn: function sortTableColumn(mode) { return _sortTableColumn(column, mode); }, sortMode: sortColumn && sortColumn[column], pinTableColumn: function pinTableColumn() { return _pinTableColumn(column); }, copyTableColumn: function copyTableColumn() { return _copyTableColumn(column); }, isSorted: isSorted, isPinned: isPinned })))); }; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "renderDataCell", function (columns, isPinned, props) { return function (cellInfo) { var _classnames2; var columnIndex = cellInfo.columnIndex, key = cellInfo.key, style = cellInfo.style, rowIndex = cellInfo.rowIndex; var dataContainer = props.dataContainer, colMeta = props.colMeta; var column = columns[columnIndex]; var isGhost = column.ghost; var rowCell = isGhost ? '' : getRowCell(_objectSpread(_objectSpread({}, props), {}, { column: column, rowIndex: rowIndex })); var type = isGhost ? null : colMeta[column].type; var lastRowIndex = dataContainer ? dataContainer.numRows() - 1 : 0; var endCell = columnIndex === columns.length - 1; var firstCell = columnIndex === 0; var bottomCell = rowIndex === lastRowIndex; var alignRight = fieldToAlignRight[type]; var cell = /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames3["default"])('cell', (_classnames2 = {}, (0, _defineProperty2["default"])(_classnames2, rowIndex % 2 === 0 ? 'even-row' : 'odd-row', true), (0, _defineProperty2["default"])(_classnames2, "row-".concat(rowIndex), true), (0, _defineProperty2["default"])(_classnames2, 'pinned-cell', isPinned), (0, _defineProperty2["default"])(_classnames2, 'first-cell', firstCell), (0, _defineProperty2["default"])(_classnames2, 'end-cell', endCell), (0, _defineProperty2["default"])(_classnames2, 'bottom-cell', bottomCell), (0, _defineProperty2["default"])(_classnames2, 'align-right', alignRight), _classnames2)), key: key, style: style, title: isGhost ? undefined : rowCell }, "".concat(rowCell).concat(endCell ? '\n' : '\t')); return cell; }; }); return _this; } (0, _createClass2["default"])(DataTable, [{ key: "componentDidMount", value: function componentDidMount() { window.addEventListener('resize', this.scaleCellsToWidth); this.scaleCellsToWidth(); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { if (this.props.cellSizeCache !== prevProps.cellSizeCache || this.props.pinnedColumns !== prevProps.pinnedColumns) { this.scaleCellsToWidth(); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { window.removeEventListener('resize', this.scaleCellsToWidth); // fix Warning: Can't perform a React state update on an unmounted component this.setState = function () { return; }; } }, { key: "render", value: function render() { var _this2 = this; var _this$props2 = this.props, dataContainer = _this$props2.dataContainer, pinnedColumns = _this$props2.pinnedColumns, _this$props2$theme = _this$props2.theme, theme = _this$props2$theme === void 0 ? {} : _this$props2$theme, fixedWidth = _this$props2.fixedWidth, fixedHeight = _this$props2.fixedHeight; var unpinnedColumns = this.unpinnedColumns(this.props); var _this$state = this.state, cellSizeCache = _this$state.cellSizeCache, moreOptionsColumn = _this$state.moreOptionsColumn, ghost = _this$state.ghost; var unpinnedColumnsGhost = ghost ? [].concat((0, _toConsumableArray2["default"])(unpinnedColumns), [{ ghost: true }]) : unpinnedColumns; var pinnedColumnsWidth = pinnedColumns.reduce(function (acc, val) { return acc + (0, _lodash["default"])(cellSizeCache, val, 0); }, 0); var hasPinnedColumns = Boolean(pinnedColumns.length); var _theme$headerRowHeigh = theme.headerRowHeight, headerRowHeight = _theme$headerRowHeigh === void 0 ? defaultHeaderRowHeight : _theme$headerRowHeigh, _theme$rowHeight = theme.rowHeight, rowHeight = _theme$rowHeight === void 0 ? defaultRowHeight : _theme$rowHeight; var headerGridProps = { cellSizeCache: cellSizeCache, className: 'header-grid', height: headerRowHeight, rowCount: 1, rowHeight: headerRowHeight }; var dataGridProps = { cellSizeCache: cellSizeCache, overscanColumnCount: overscanColumnCount, overscanRowCount: overscanRowCount, rowCount: dataContainer ? dataContainer.numRows() : 0, rowHeight: rowHeight }; return /*#__PURE__*/_react["default"].createElement(Container, { className: "data-table-container", ref: this.root }, Object.keys(cellSizeCache).length && /*#__PURE__*/_react["default"].createElement(_reactVirtualized.ScrollSync, null, function (_ref5) { var _onScroll = _ref5.onScroll, scrollLeft = _ref5.scrollLeft, scrollTop = _ref5.scrollTop; return /*#__PURE__*/_react["default"].createElement("div", { className: "results-table-wrapper" }, hasPinnedColumns && /*#__PURE__*/_react["default"].createElement("div", { key: "pinned-columns", className: "pinned-columns grid-row" }, /*#__PURE__*/_react["default"].createElement(TableSection, { classList: { header: 'pinned-columns--header pinned-grid-container', rows: 'pinned-columns--rows pinned-grid-container' }, isPinned: true, columns: pinnedColumns, headerGridProps: headerGridProps, fixedWidth: pinnedColumnsWidth, onScroll: function onScroll(args) { return _onScroll(_objectSpread(_objectSpread({}, args), {}, { scrollLeft: scrollLeft })); }, scrollTop: scrollTop, dataGridProps: dataGridProps, setGridRef: function setGridRef(pinnedGrid) { return _this2.pinnedGrid = pinnedGrid; }, columnWidth: columnWidthFunction(pinnedColumns, cellSizeCache), headerCellRender: _this2.renderHeaderCell(pinnedColumns, true, _this2.props, _this2.toggleMoreOptions, moreOptionsColumn), dataCellRender: _this2.renderDataCell(pinnedColumns, true, _this2.props) })), /*#__PURE__*/_react["default"].createElement("div", { key: "unpinned-columns", style: { marginLeft: "".concat(hasPinnedColumns ? "".concat(pinnedColumnsWidth, "px") : '0') }, className: "unpinned-columns grid-column" }, /*#__PURE__*/_react["default"].createElement(TableSection, { classList: { header: 'unpinned-columns--header unpinned-grid-container', rows: 'unpinned-columns--rows unpinned-grid-container' }, isPinned: false, columns: unpinnedColumnsGhost, headerGridProps: headerGridProps, fixedWidth: fixedWidth, fixedHeight: fixedHeight, onScroll: _onScroll, scrollTop: scrollTop, scrollLeft: scrollLeft, dataGridProps: dataGridProps, setGridRef: function setGridRef(unpinnedGrid) { return _this2.unpinnedGrid = unpinnedGrid; }, columnWidth: columnWidthFunction(unpinnedColumnsGhost, cellSizeCache, ghost), headerCellRender: _this2.renderHeaderCell(unpinnedColumnsGhost, false, _this2.props, _this2.toggleMoreOptions, moreOptionsColumn), dataCellRender: _this2.renderDataCell(unpinnedColumnsGhost, false, _this2.props) }))); })); } }]); return DataTable; }(_react.Component); (0, _defineProperty2["default"])(DataTable, "defaultProps", { dataContainer: null, pinnedColumns: [], colMeta: {}, cellSizeCache: {}, sortColumn: {}, fixedWidth: null, fixedHeight: null, theme: {} }); return (0, _styledComponents.withTheme)(DataTable); } var _default = DataTableFactory; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9kYXRhLXRhYmxlL2luZGV4LmpzIl0sIm5hbWVzIjpbImRlZmF1bHRIZWFkZXJSb3dIZWlnaHQiLCJkZWZhdWx0Um93SGVpZ2h0Iiwib3ZlcnNjYW5Db2x1bW5Db3VudCIsIm92ZXJzY2FuUm93Q291bnQiLCJmaWVsZFRvQWxpZ25SaWdodCIsIkFMTF9GSUVMRF9UWVBFUyIsImludGVnZXIiLCJyZWFsIiwiQ29udGFpbmVyIiwic3R5bGVkIiwiZGl2IiwicHJvcHMiLCJ0aGVtZSIsImRhdGFUYWJsZVRleHRDb2xvciIsInBpbm5lZEdyaWRCb3JkZXJDb2xvciIsImV2ZW5Sb3dCYWNrZ3JvdW5kIiwib2RkUm93QmFja2dyb3VuZCIsImNlbGxCb3JkZXJDb2xvciIsImNlbGxQYWRkaW5nU2lkZSIsImNlbGxGb250U2l6ZSIsImVkZ2VDZWxsUGFkZGluZ1NpZGUiLCJoZWFkZXJDZWxsQm9yZGVyQ29sb3IiLCJoZWFkZXJQYWRkaW5nVG9wIiwiaGVhZGVyUGFkZGluZ0JvdHRvbSIsImhlYWRlckNlbGxCYWNrZ3JvdW5kIiwiaGVhZGVyQ2VsbEljb25Db2xvciIsImRlZmF1bHRDb2x1bW5XaWR0aCIsImNvbHVtbldpZHRoRnVuY3Rpb24iLCJjb2x1bW5zIiwiY2VsbFNpemVDYWNoZSIsImdob3N0IiwiaW5kZXgiLCJnZXRSb3dDZWxsIiwiZGF0YUNvbnRhaW5lciIsImNvbHVtbiIsImNvbE1ldGEiLCJyb3dJbmRleCIsInNvcnRPcmRlciIsInJvd0lkeCIsImxlbmd0aCIsInR5cGUiLCJ2YWx1ZSIsInZhbHVlQXQiLCJpbmRleE9mIiwidW5kZWZpbmVkIiwiVGFibGVTZWN0aW9uIiwiY2xhc3NMaXN0IiwiaXNQaW5uZWQiLCJoZWFkZXJHcmlkUHJvcHMiLCJmaXhlZFdpZHRoIiwiZml4ZWRIZWlnaHQiLCJvblNjcm9sbCIsInNjcm9sbFRvcCIsImRhdGFHcmlkUHJvcHMiLCJjb2x1bW5XaWR0aCIsInNldEdyaWRSZWYiLCJoZWFkZXJDZWxsUmVuZGVyIiwiZGF0YUNlbGxSZW5kZXIiLCJzY3JvbGxMZWZ0Iiwid2lkdGgiLCJoZWlnaHQiLCJncmlkRGltZW5zaW9uIiwiY29sdW1uQ291bnQiLCJkYXRhR3JpZEhlaWdodCIsImhlYWRlciIsInJvd3MiLCJ0b3AiLCJEYXRhVGFibGVGYWN0b3J5IiwiZGVwcyIsIkZpZWxkVG9rZW5GYWN0b3J5IiwiRmllbGRUb2tlbiIsIkRhdGFUYWJsZSIsIm1vcmVPcHRpb25zQ29sdW1uIiwicGlubmVkQ29sdW1ucyIsIkFycmF5IiwiaXNBcnJheSIsImZpbHRlciIsImMiLCJpbmNsdWRlcyIsInNldFN0YXRlIiwic3RhdGUiLCJwcm9wc0NhY2hlIiwidW5waW5uZWRDb2x1bW5zIiwicm9vdCIsImN1cnJlbnQiLCJjbGllbnRXaWR0aCIsImFkanVzdFdpZHRoIiwiZ2V0Q2VsbFNpemVDYWNoZSIsImRvU2NhbGVDZWxsc1RvV2lkdGgiLCJ0b2dnbGVNb3JlT3B0aW9ucyIsIlRva2VuQ29tcG9uZW50IiwiY2VsbEluZm8iLCJjb2x1bW5JbmRleCIsImtleSIsInN0eWxlIiwic29ydENvbHVtbiIsInNvcnRUYWJsZUNvbHVtbiIsInBpblRhYmxlQ29sdW1uIiwiY29weVRhYmxlQ29sdW1uIiwiaXNHaG9zdCIsImlzU29ydGVkIiwiZmlyc3RDZWxsIiwiZSIsInNoaWZ0S2V5IiwibmFtZSIsIlNPUlRfT1JERVIiLCJBU0NFTkRJTkciLCJtb2RlIiwicm93Q2VsbCIsImxhc3RSb3dJbmRleCIsIm51bVJvd3MiLCJlbmRDZWxsIiwiYm90dG9tQ2VsbCIsImFsaWduUmlnaHQiLCJjZWxsIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsInNjYWxlQ2VsbHNUb1dpZHRoIiwicHJldlByb3BzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInVucGlubmVkQ29sdW1uc0dob3N0IiwicGlubmVkQ29sdW1uc1dpZHRoIiwicmVkdWNlIiwiYWNjIiwidmFsIiwiaGFzUGlubmVkQ29sdW1ucyIsIkJvb2xlYW4iLCJoZWFkZXJSb3dIZWlnaHQiLCJyb3dIZWlnaHQiLCJjbGFzc05hbWUiLCJyb3dDb3VudCIsIk9iamVjdCIsImtleXMiLCJhcmdzIiwicGlubmVkR3JpZCIsInJlbmRlckhlYWRlckNlbGwiLCJyZW5kZXJEYXRhQ2VsbCIsIm1hcmdpbkxlZnQiLCJ1bnBpbm5lZEdyaWQiLCJDb21wb25lbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLHNCQUFzQixHQUFHLEVBQS9CO0FBQ0EsSUFBTUMsZ0JBQWdCLEdBQUcsRUFBekI7QUFDQSxJQUFNQyxtQkFBbUIsR0FBRyxFQUE1QjtBQUNBLElBQU1DLGdCQUFnQixHQUFHLEVBQXpCO0FBQ0EsSUFBTUMsaUJBQWlCLGtGQUNwQkMsaUNBQWdCQyxPQURJLEVBQ00sSUFETix3REFFcEJELGlDQUFnQkUsSUFGSSxFQUVHLElBRkgsc0JBQXZCOztBQUtPLElBQU1DLFNBQVMsR0FBR0MsNkJBQU9DLEdBQVYsbytHQUlYLFVBQUFDLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsa0JBQWhCO0FBQUEsQ0FKTSxFQTBEVSxVQUFBRixLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlFLHFCQUFoQjtBQUFBLENBMURmLEVBa0VJLFVBQUFILEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUcsaUJBQWhCO0FBQUEsQ0FsRVQsRUFxRUksVUFBQUosS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZSSxnQkFBaEI7QUFBQSxDQXJFVCxFQXVGVyxVQUFBTCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlLLGVBQWhCO0FBQUEsQ0F2RmhC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bi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgY3JlYXRlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1Njcm9sbFN5bmMsIEF1dG9TaXplcn0gZnJvbSAncmVhY3QtdmlydHVhbGl6ZWQnO1xuaW1wb3J0IHN0eWxlZCwge3dpdGhUaGVtZX0gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5pbX