@dgit/react-data-grid-addons
Version:
A set of addons for react-data-grid
99 lines (88 loc) • 2.31 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import { DragSource, DropTarget } from 'react-dnd';
import { _constants, HeaderCell } from 'react-data-grid';
const { DragItemTypes } = _constants;
class DraggableHeaderCell extends React.Component {
render() {
const {
connectDragSource,
connectDropTarget,
isDragging,
isOver,
canDrop
} = this.props;
let opacity = 1;
if (isDragging) {
opacity = 0.2;
}
// set drag source and drop target on header cell
// width: 0 - otherwise drag clone was wrongly positioned
return connectDragSource(
connectDropTarget(
<div
style={{ width: 0, cursor: 'move', opacity }}
className={isOver && canDrop ? 'rdg-can-drop' : ''}
>
<HeaderCell {...this.props} />
</div>
)
);
}
}
// drop source
function collect(connect, monitor) {
return {
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging()
};
}
const headerCellSource = {
beginDrag(props) {
return {
// source column
key: props.column.key
};
},
endDrag(props, monitor) {
// check if drop was made in droppable zone
if (monitor.didDrop()) {
const source = monitor.getDropResult().source;
const target = monitor.getDropResult().target;
return props.onHeaderDrop(source, target);
}
}
};
// drop target
const target = {
drop(props, monitor) {
let source = monitor.getItem().key;
let targetKey = props.column.key;
return {
source: source,
target: targetKey
};
}
};
function targetCollect(connect, monitor) {
return {
connectDropTarget: connect.dropTarget(),
isOver: monitor.isOver(),
canDrop: monitor.canDrop(),
draggedHeader: monitor.getItem()
};
}
DraggableHeaderCell.propTypes = {
connectDragSource: PropTypes.func.isRequired,
connectDropTarget: PropTypes.func.isRequired,
isDragging: PropTypes.bool.isRequired,
isOver: PropTypes.bool,
canDrop: PropTypes.bool
};
DraggableHeaderCell = DropTarget(DragItemTypes.Column, target, targetCollect)(
DraggableHeaderCell
);
DraggableHeaderCell = DragSource(DragItemTypes.Column, headerCellSource, collect)(
DraggableHeaderCell
);
export default DraggableHeaderCell;