UNPKG

2.54 kBJavaScriptView Raw
1import React, { Component } from 'react';
2import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
3import { getClass } from './util';
4import classnames from 'classnames';
5import isEqual from 'lodash.isequal';
6
7
8const reorder = (list, startIndex, endIndex) => {
9 const result = Array.from(list);
10 const [removed] = result.splice(startIndex, 1);
11 result.splice(endIndex, 0, removed);
12
13 return result;
14};
15
16class Vertical extends Component {
17 constructor(props) {
18 super(props);
19 this.state = {
20 items: this.props.list||[],
21 };
22 }
23 componentWillReceiveProps(nextProps){
24 if(!isEqual(this.state.items,nextProps.list)){
25 this.setState({
26 items:nextProps.list
27 })
28 }
29 }
30
31 onDragEnd = result => {
32 if (!result.destination) {
33 return;
34 }
35 const items = reorder(
36 this.state.items,
37 result.source.index,
38 result.destination.index
39 );
40
41 this.setState({
42 items,
43 });
44 this.props.onStop(result,items);
45 }
46
47 onDragStart = result =>{
48 this.props.onStart(result,this.state.items);
49 }
50
51
52 render() {
53 const { onStart,onDrag,onStop,onDragUpdate,dropClass,dropOverClass,
54 dragClass,dragingClass,showKey,type } = this.props;
55
56 return (
57 <DragDropContext onDragEnd={this.onDragEnd} onDragStart={this.onDragStart} onDragUpdate={onDragUpdate}>
58 <Droppable droppableId="droppable" direction={type}>
59 {(provided, snapshot) => (
60 <div
61 ref={provided.innerRef}
62 className={classnames({
63 ...getClass(this.props,snapshot.isDraggingOver).drop
64 })}
65 >
66 {this.state.items.map((item, index) => (
67 <Draggable key={index} draggableId={`${index}`} index={index}>
68 {(provided, snapshot) => (
69 <div
70 ref={provided.innerRef}
71 {...provided.draggableProps}
72 {...provided.dragHandleProps}
73 className={classnames({
74 ...getClass(this.props,snapshot.isDragging).drag
75 })}
76 style={{...provided.draggableProps.style}}
77 >
78 {showKey?item[showKey]:item}
79 </div>
80 )}
81 </Draggable>
82 ))}
83 {provided.placeholder}
84 </div>
85 )}
86 </Droppable>
87 </DragDropContext>
88 );
89 }
90}
91
92export default Vertical;
\No newline at end of file