@orfeas126/box-ui-elements
Version:
Box UI Elements
77 lines • 3.77 kB
JavaScript
const _excluded = ["children", "className", "onDragEnd", "rowData", "shouldShowDragHandle", "tableId"];
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
import * as React from 'react';
import noop from 'lodash/noop';
import classNames from 'classnames';
import { Column } from '@box/react-virtualized/dist/es/Table/index';
import { DragDropContext, Droppable } from 'react-beautiful-dnd';
import { bdlGray } from '../../styles/variables';
import IconDrag from '../../icons/general/IconDrag';
import { draggableRowRenderer } from '../virtualized-table-renderers';
import { VIRTUALIZED_TABLE_DEFAULTS } from './constants';
import VirtualizedTable from './VirtualizedTable';
import './DraggableVirtualizedTable.scss';
const {
HEADER_HEIGHT,
ROW_HEIGHT
} = VIRTUALIZED_TABLE_DEFAULTS;
const ICON_SIZE = 24;
const DraggableVirtualizedTable = _ref => {
let {
children,
className,
onDragEnd,
rowData,
shouldShowDragHandle,
tableId
} = _ref,
rest = _objectWithoutProperties(_ref, _excluded);
const tableClassName = classNames('bdl-DraggableVirtualizedTable', className);
const draggableCellRenderer = () => /*#__PURE__*/React.createElement(IconDrag, {
color: bdlGray,
height: ICON_SIZE,
width: ICON_SIZE
});
// Virtualized table's performance optimizations can not be used here since
// all rows need to be rendered in order for drag and drop to work properly.
// From a UX perspective, it also doesn't make sense to have drag and drop on
// very large tables that actually require optimizations, so this component
// always forces the table to be tall enough to fit all rows
const tableHeight = rowData.length * ROW_HEIGHT + HEADER_HEIGHT;
const handleDragEnd = ({
destination,
source
}) => {
const destinationIndex = destination ? destination.index : source.index;
return onDragEnd(source.index, destinationIndex);
};
return /*#__PURE__*/React.createElement(DragDropContext, {
onDragEnd: handleDragEnd
}, /*#__PURE__*/React.createElement(Droppable, {
droppableId: tableId
}, droppableProvided => /*#__PURE__*/React.createElement("div", {
ref: droppableProvided.innerRef
}, /*#__PURE__*/React.createElement(VirtualizedTable, _extends({}, rest, {
className: tableClassName,
rowRenderer: draggableRowRenderer,
height: tableHeight,
rowData: rowData
}), shouldShowDragHandle && /*#__PURE__*/React.createElement(Column, {
cellRenderer: draggableCellRenderer,
className: "bdl-DraggableVirtualizedTable-dragHandleColumn",
dataKey: "dragHandle",
disableSort: true,
flexGrow: 0,
headerClassName: "bdl-DraggableVirtualizedTable-dragHandleColumn",
width: ICON_SIZE
}), children), droppableProvided.placeholder)));
};
DraggableVirtualizedTable.displayName = 'DraggableVirtualizedTable';
DraggableVirtualizedTable.defaultProps = {
onDragEnd: noop,
shouldShowDragHandle: true
};
export default DraggableVirtualizedTable;
//# sourceMappingURL=DraggableVirtualizedTable.js.map