@@ -3,21 +3,13 @@ import PropTypes from 'prop-types'
33import { bindActionCreators } from 'redux'
44import { connect } from 'react-redux'
55import isEqual from 'lodash/isEqual'
6- import { Droppable } from 'react-beautiful -dnd'
6+ import { Container , Draggable } from 'react-smooth -dnd'
77import uuidv1 from 'uuid/v1'
88
99import Loader from './Loader'
1010import Card from './Card'
1111import NewCard from './NewCard'
12- import {
13- AddCardLink ,
14- LaneFooter ,
15- LaneHeader ,
16- RightContent ,
17- ScrollableLane ,
18- Section ,
19- Title
20- } from '../styles/Base'
12+ import { AddCardLink , LaneFooter , LaneHeader , RightContent , ScrollableLane , Section , Title } from '../styles/Base'
2113
2214import * as laneActions from '../actions/LaneActions'
2315import { CollapseBtn , ExpandBtn } from '../styles/Elements'
@@ -88,6 +80,7 @@ class Lane extends Component {
8880 const { onCardClick} = this . props
8981 onCardClick && onCardClick ( card . id , card . metadata , card . laneId )
9082 e . stopPropagation ( )
83+ e . preventDefault ( )
9184 }
9285
9386 showEditableCard = ( ) => {
@@ -129,33 +122,71 @@ class Lane extends Component {
129122 }
130123 }
131124
125+ onDragStart = ( index , payload ) => {
126+ const { handleDragStart} = this . props
127+ handleDragStart && handleDragStart ( payload . id , payload . laneId )
128+ }
129+
130+ onDragEnd = ( laneId , result ) => {
131+ const { handleDragEnd} = this . props
132+ const { addedIndex, payload} = result
133+ if ( addedIndex != null ) {
134+ this . props . actions . moveCardAcrossLanes ( {
135+ fromLaneId : payload . laneId ,
136+ toLaneId : laneId ,
137+ cardId : payload . id ,
138+ index : addedIndex
139+ } )
140+ handleDragEnd && handleDragEnd ( payload . id , payload . laneId , laneId , addedIndex )
141+ }
142+ }
143+
132144 renderDragContainer = isDraggingOver => {
133- const { laneSortFunction, editable, hideCardDeleteIcon, tagStyle, cardStyle, draggable, cards} = this . props
145+ const {
146+ laneSortFunction,
147+ editable,
148+ hideCardDeleteIcon,
149+ tagStyle,
150+ cardStyle,
151+ draggable,
152+ droppable,
153+ cards,
154+ id
155+ } = this . props
134156 const { addCardMode, collapsed} = this . state
135157
136158 const showableCards = collapsed ? [ ] : cards
137159
138- const cardList = this . sortCards ( showableCards , laneSortFunction ) . map ( ( card , idx ) => (
139- < Card
140- key = { card . id }
141- index = { idx }
142- customCardLayout = { this . props . customCardLayout }
143- customCard = { this . props . children }
144- tagStyle = { tagStyle }
145- cardStyle = { cardStyle }
146- removeCard = { this . removeCard }
147- onClick = { e => this . handleCardClick ( e , card ) }
148- onDelete = { this . props . onCardDelete }
149- draggable = { draggable }
150- editable = { editable }
151- hideCardDeleteIcon = { hideCardDeleteIcon }
152- { ...card }
153- />
154- ) )
160+ const cardList = this . sortCards ( showableCards , laneSortFunction ) . map ( ( card , idx ) => {
161+ const cardToRender = (
162+ < Card
163+ key = { card . id }
164+ index = { idx }
165+ customCardLayout = { this . props . customCardLayout }
166+ customCard = { this . props . children }
167+ tagStyle = { tagStyle }
168+ cardStyle = { cardStyle }
169+ removeCard = { this . removeCard }
170+ onClick = { e => this . handleCardClick ( e , card ) }
171+ onDelete = { this . props . onCardDelete }
172+ editable = { editable }
173+ hideCardDeleteIcon = { hideCardDeleteIcon }
174+ { ...card }
175+ />
176+ )
177+ return draggable ? < Draggable key = { card . id } > { cardToRender } </ Draggable > : < span > { cardToRender } </ span >
178+ } )
155179
156180 return (
157181 < ScrollableLane innerRef = { this . laneDidMount } isDraggingOver = { isDraggingOver } >
158- < span > { cardList } </ span >
182+ < Container
183+ groupName = "TrelloLane"
184+ onDragStart = { this . onDragStart }
185+ onDrop = { e => this . onDragEnd ( id , e ) }
186+ shouldAcceptDrop = { ( ) => droppable }
187+ getChildPayload = { index => this . props . getCardDetails ( id , index ) } >
188+ { cardList }
189+ </ Container >
159190 { editable && ! addCardMode && this . renderAddCardLink ( ) }
160191 { addCardMode && this . renderNewCard ( ) }
161192 </ ScrollableLane >
@@ -171,9 +202,7 @@ class Lane extends Component {
171202 const { title, label, titleStyle, labelStyle} = this . props
172203 return (
173204 < LaneHeader onDoubleClick = { this . toggleLaneCollapsed } >
174- < Title style = { titleStyle } >
175- { title }
176- </ Title >
205+ < Title style = { titleStyle } > { title } </ Title >
177206 { label && (
178207 < RightContent >
179208 < span style = { labelStyle } > { label } </ span >
@@ -188,9 +217,7 @@ class Lane extends Component {
188217 const { collapsibleLanes, cards} = this . props
189218 const { collapsed} = this . state
190219 if ( collapsibleLanes && cards . length > 0 ) {
191- return < LaneFooter onClick = { this . toggleLaneCollapsed } >
192- { collapsed ? < ExpandBtn /> : < CollapseBtn /> }
193- </ LaneFooter >
220+ return < LaneFooter onClick = { this . toggleLaneCollapsed } > { collapsed ? < ExpandBtn /> : < CollapseBtn /> } </ LaneFooter >
194221 }
195222 }
196223
@@ -200,33 +227,14 @@ class Lane extends Component {
200227
201228 render ( ) {
202229 const { loading} = this . state
203- const { id, onLaneClick, index, droppable, ...otherProps } = this . props
204- const isDropDisabled = ! droppable
230+ const { id, onLaneClick, ...otherProps } = this . props
205231 return (
206- < Droppable
207- droppableId = { id }
208- type = "card"
209- index = { index }
210- isDropDisabled = { isDropDisabled }
211- ignoreContainerClipping = { false } >
212- { ( dropProvided , dropSnapshot ) => {
213- const isDraggingOver = dropSnapshot . isDraggingOver
214- return (
215- < Section
216- { ...otherProps }
217- key = { id }
218- onClick = { ( ) => onLaneClick && onLaneClick ( id ) }
219- innerRef = { dropProvided . innerRef }
220- isDraggingOver = { isDraggingOver }
221- { ...dropProvided . draggableProps } >
222- { this . renderHeader ( ) }
223- { this . renderDragContainer ( isDraggingOver ) }
224- { loading && < Loader /> }
225- { this . renderFooter ( ) }
226- </ Section >
227- )
228- } }
229- </ Droppable >
232+ < Section { ...otherProps } key = { id } onClick = { ( ) => onLaneClick && onLaneClick ( id ) } draggable = { false } >
233+ { this . renderHeader ( ) }
234+ { this . renderDragContainer ( false ) }
235+ { loading && < Loader /> }
236+ { this . renderFooter ( ) }
237+ </ Section >
230238 )
231239 }
232240}
0 commit comments