weaver_trunk_cli/pc4mobx/prj/components/comp/weaDragula/index.js

98 lines
3.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import dragula from 'react-dragula';
import isFunction from 'lodash/isFunction';
import findIndex from 'lodash/findIndex';
class WeaPrjDragula extends React.Component {
constructor(props) {
super(props);
this.drake = null;
}
componentDidMount() {
this.initDragula();
}
componentWillUnmount() {
this.drake && this.drake.destroy();
}
render() {
return this.props.children;
}
initDragula = () => {
let {container,canDrag, onDrop, getKeyFromDom, getKeyFromData} = this.props;
if (typeof(container) == "string") {
container = jQuery(container, ReactDOM.findDOMNode(this))[0];
} else if (isFunction(container)) {
container = container();
}
this.drake = dragula([container], {
isContainer: function (el) {
return false;
},
moves: (el, source, handle, sibling) => {
return isFunction(canDrag) ? canDrag(handle, el, source, sibling) : canDrag;
},
mirrorContainer: container
});
this.drake.on("drop",(el, target, source, sibling) => {
let {datas} = this.props;
if (Array.isArray(datas) && isFunction(getKeyFromDom) && isFunction(getKeyFromData) && isFunction(onDrop)) {
let dataKey = getKeyFromDom(el), downKey = sibling ? getKeyFromDom(sibling) : -1;
if (downKey == dataKey) {
downKey = -1;
}
let dataIdx = findIndex(datas, (data) => getKeyFromData(data) == dataKey);
let downIdx = downKey == -1 ? datas.length : findIndex(datas, (data) => getKeyFromData(data) == downKey);
downIdx = downIdx > dataIdx ? downIdx - 1 : downIdx;
let data = datas.splice(dataIdx, 1)[0];
datas.splice(downIdx, 0, data);
/*
// 遍历并返回新的数据
let curData = null;
datas = datas.map((data, index) => {
if (this.getRowKey(data) == key) {
dataIdx = index;
curData = data;
}
if (downKey !== -1 && downKey == this.getRowKey(data)) {
downIdx = dataIdx >= 0 ? index - 1 : index;
}
if (dataIdx == -1 && downIdx == -1) {
// 当前与放置的index都没找到说明未到影响区
return data;
} else if (dataIdx >=0 && downIdx == -1) {
// 找到当前的但没有找到放置位置,需要将下方数据上移一位
return index == datas.length - 1 ? datas[dataIdx] : datas[index + 1];
} else if (dataIdx == -1 && downIdx >=0) {
// 找到放置位置但没有找到当前的,需要将上方数据下移一位
return downIdx == index ? null : datas[index - 1];
} else {
// 都找到之后,如果相等,则做下特殊处理,如果不等,说明已过影响区
return index == downIdx ? curData : index == dataIdx ? datas[index - 1] : data;
}
});
// 处理放置位置的数据。
datas[downIdx] = curData;*/
onDrop(datas, dataIdx, downIdx);
} else {
isFunction(onDrop) && onDrop(el, sibling, target, source);
}
});
}
}
WeaPrjDragula.propTypes = {
container: React.PropTypes.any,//可拖拽区域
canDrag: React.PropTypes.any,//是否可拖拽,可以传方法,方法的传参为当前点击的节点。
onDrop: React.PropTypes.func,//拖拽结束时触发的方法第1个参数是拖拽的DOM节点第二个参数是所放下的位置下方的DOM节点。
datas: React.PropTypes.array,//数组
getKeyFromData: React.PropTypes.func,//从数组中获得key的方法。
getKeyFromDom: React.PropTypes.func,//从Dom中获得key的方法
};
export default WeaPrjDragula;