Skip to content

Commit b2f8d37

Browse files
committed
layer drag and drop reordering
1 parent e00ec8c commit b2f8d37

File tree

5 files changed

+154
-24
lines changed

5 files changed

+154
-24
lines changed

package-lock.json

Lines changed: 80 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"jsonlint-lines-primitives": "^1.6.0",
3030
"mapbox-gl": "^0.44.2",
3131
"mapbox-gl-inspect": "^1.3.1",
32+
"react-beautiful-dnd": "^7.1.3",
3233
"react-redux": "^5.0.7",
3334
"react-router": "^4.2.0",
3435
"react-router-dom": "^4.2.2",

src/model/Mlayer.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,19 @@ export default {
7878

7979
},
8080

81+
reorder:function(sourceIndex,destIndex){
82+
return new Promise((resolve,reject)=>{
83+
Store.dispatch({
84+
type:'LAYER_REORDER',
85+
sourceIndex:sourceIndex,
86+
destIndex:destIndex
87+
});
88+
89+
Mstyle.save();
90+
return resolve();
91+
});
92+
},
93+
8194
removeIn:function(layerId,key){
8295
return new Promise((resolve,reject)=>{
8396
if (!layerId) return reject('no layerId');

src/reducer/Rstyle.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,20 @@ export default function(state = iState, action){
3838
const style = state.setIn(['rec','layers'],layers);
3939
return setUpdated(style);
4040
}
41+
case 'LAYER_REORDER':{
42+
43+
// action.sourceIndex
44+
45+
// action.destindex
46+
47+
const layer = state.getIn(['rec','layers',action.sourceIndex]);
48+
// remove source index
49+
50+
const layers = state.getIn(['rec','layers']).splice(action.sourceIndex,1).splice(action.destIndex,0,layer);
51+
//console.log('layers:',layers);
52+
const style = state.setIn(['rec','layers'],layers);
53+
return setUpdated(style);
54+
}
4155
case 'LAYER_SET':{
4256
const ind = state.getIn(['rec','layers']).findIndex((layer)=>{
4357
return layer.get('id') === action.layerId;

src/view/Vlayer/index.jsx

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import PropTypes from 'prop-types';
22
import React from 'react';
33
import {NavLink, Link, Route, Switch} from 'react-router-dom';
4+
import {DragDropContext, Droppable, Draggable} from 'react-beautiful-dnd';
45

56
import LayerIcon from '../../utility/LayerIcon';
67

@@ -47,6 +48,11 @@ export default class Vlayers extends React.Component {
4748
},
4849
searchChange:(field)=>{
4950
this.setState({search:field.value});
51+
},
52+
onDragEnd:(result)=>{
53+
console.log('draggable res:',result.source.index,result.destination.index);
54+
55+
Mlayer.reorder(result.source.index,result.destination.index);
5056
}
5157
};
5258
for (let i in this.handle){
@@ -115,30 +121,46 @@ export default class Vlayers extends React.Component {
115121
}
116122

117123
<div className="bg-light">
118-
{layers !== undefined && layers.map((layer,i)=>{
119-
//console.log('layer:',layer);
120-
121-
if (this.state.search && layer.get('id').toLowerCase().indexOf(this.state.search.toLowerCase()) === -1) return;
122-
123-
let className = 'px-2 py-1 d-block link-list list-border-right position-relative p-list';
124-
if (error.hasIn(['layers',i])) className += ' error';
125-
126-
return <NavLink to={`${match.url}/${layer.get('id')}`}
127-
className={className} key={layer.get('id')}>
128-
129-
<div className="list-left mr-2 inline-block">
130-
<i className="material-icons md-18 md-shadow" style={{color:LayerIcon.getColor(layer)}}>{LayerIcon.getIcon(layer)}</i>
131-
</div>
132-
{layer.get('id')}
133-
<div onClick={()=>{this.handle.visibility(layer.get('id'))}} className="list-right ml-2">
134-
{layer.getIn(['layout','visibility']) === 'none' ?
135-
<i className="material-icons md-18 md-muted">visibility_off</i>
136-
:
137-
<i className="material-icons md-18">visibility</i>
138-
}
139-
</div>
140-
</NavLink>
141-
})}
124+
<DragDropContext onDragEnd={this.handle.onDragEnd}>
125+
<Droppable droppableId="droppable">
126+
{(provided, snapshot) => (
127+
<div ref={provided.innerRef}>
128+
{layers !== undefined && layers.map((layer,i)=>{
129+
//console.log('layer:',layer);
130+
131+
if (this.state.search && layer.get('id').toLowerCase().indexOf(this.state.search.toLowerCase()) === -1) return;
132+
133+
let className = 'px-2 py-1 d-block link-list list-border-right position-relative p-list';
134+
if (error.hasIn(['layers',i])) className += ' error';
135+
136+
return <Draggable key={layer.get('id')} draggableId={layer.get('id')} index={i}>
137+
{(provided, snapshot) => (
138+
<div ref={provided.innerRef}
139+
{...provided.draggableProps}
140+
{...provided.dragHandleProps}>
141+
<NavLink to={`${match.url}/${layer.get('id')}`}
142+
className={className} key={layer.get('id')}>
143+
144+
<div className="list-left mr-2 inline-block">
145+
<i className="material-icons md-18 md-shadow" style={{color:LayerIcon.getColor(layer)}}>{LayerIcon.getIcon(layer)}</i>
146+
</div>
147+
{layer.get('id')}
148+
<div onClick={()=>{this.handle.visibility(layer.get('id'))}} className="list-right ml-2">
149+
{layer.getIn(['layout','visibility']) === 'none' ?
150+
<i className="material-icons md-18 md-muted">visibility_off</i>
151+
:
152+
<i className="material-icons md-18">visibility</i>
153+
}
154+
</div>
155+
</NavLink>
156+
</div>
157+
)}
158+
</Draggable>
159+
})}
160+
</div>
161+
)}
162+
</Droppable>
163+
</DragDropContext>
142164
</div>
143165
</div>
144166
</div>

0 commit comments

Comments
 (0)