import HTML5Backend from 'react-dnd-html5-backend';
import React from 'react';
import ReactDOM from 'react-dom';
import Table from '..';
import classnames from 'classnames';
import { DragDropContext, DragSource, DropTarget } from 'react-dnd';
const { SelectionRow } = Table as any;
let dragingIndex = -1;
function MyRow(props) {
const {
isDragging,
isOver,
connectDragSource,
connectDropTarget,
moveRow, // eslint-disable-line
className,
...others
} = props;
const opacity = isDragging ? 0 : 1;
const style = { ...others.style, cursor: 'move' };
const cls = classnames({
[className]: className,
'drop-over-upward': isOver && others.index < dragingIndex,
'drop-over-downward': isOver && others.index > dragingIndex,
});
return (
connectDragSource(connectDropTarget(row))}
/>
);
}
const NewRow = DropTarget(
'row',
{
drop(props: any, monitor) {
const dragIndex = monitor.getItem().index;
const hoverIndex = props.index;
if (dragIndex === hoverIndex) {
return;
}
props.moveRow(dragIndex, hoverIndex);
monitor.getItem().index = hoverIndex;
},
},
(connect, monitor) => ({
connectDropTarget: connect.dropTarget(),
isOver: monitor.isOver(),
}),
)(
DragSource(
'row',
{
beginDrag: (props: any) => {
dragingIndex = props.index;
return {
id: props.record[props.primaryKey],
index: props.rowIndex,
};
},
},
(connect, monitor) => ({
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging(),
}),
)(MyRow),
);
interface IInnerTableProps {
onSort?: any;
excludeProvider?: any;
}
interface IInnerTableState {
dataSource: any;
}
class InnerTable extends React.Component {
constructor(props) {
super(props);
this.state = {
dataSource: [ ...props.dataSource ],
};
}
moveRow = (dragIndex, hoverIndex) => {
const { onSort } = this.props;
const dragRow = this.state.dataSource[dragIndex];
const dataSource = [ ...this.state.dataSource ];
dataSource.splice(dragIndex, 1);
dataSource.splice(hoverIndex, 0, dragRow);
this.setState({
dataSource,
});
onSort && onSort(this.state.dataSource);
};
componentWillReceiveProps(nextProps) {
if (
nextProps.dataSource &&
JSON.stringify(nextProps.dataSource) !==
JSON.stringify(this.state.dataSource)
) {
this.setState({ dataSource: [ ...nextProps.dataSource ] });
}
}
render() {
const { excludeProvider, ...restProps } = this.props; // eslint-disable-line
const tableProps = {
...restProps,
dataSource: this.state.dataSource,
rowProps: (props, index) => ({
index,
moveRow: this.moveRow,
}),
components: {
Row: NewRow,
},
};
return ;
}
}
class SortableTable extends React.Component {
render() {
const ComponentName = DragDropContext(HTML5Backend)(InnerTable);
return ;
}
}
const result = [
{
id: '001',
time: 1951,
title: { name: 'The Old Man and the Sea' },
},
{
id: '002',
time: 1925,
title: { name: 'the great gatsby' },
},
{
id: '003',
time: 1719,
title: { name: 'The adventures of Robinson Crusoe' },
},
];
interface IDemoState {
dataSource: any;
}
class Demo extends React.Component<{}, IDemoState> {
state = {
dataSource: result,
};
onRemove = id => {
const { dataSource } = this.state;
let index = -1;
dataSource.forEach((item, i) => {
if (item.id === id) {
index = i;
}
});
if (index !== -1) {
dataSource.splice(index, 1);
this.setState({
dataSource,
});
}
};
renderOper = (value, index, record) => {
return (
Remove({record.id})
);
};
render() {
return (
);
}
}
ReactDOM.render(, document.getElementById('table-demo-27'));