diff --git a/demo/demolist/Demo22.js b/demo/demolist/Demo22.js index 7b8daa6..f005b72 100644 --- a/demo/demolist/Demo22.js +++ b/demo/demolist/Demo22.js @@ -4,9 +4,8 @@ * @description 点击列的表头,进行左右拖拽 */ import React, { Component } from 'react'; -import Table from '../../src'; +import Table from '../../src'; import dragColumn from '../../src/lib/dragColumn'; -import sum from '../../src/lib/sum'; import Icon from "bee-icon"; const columns22 = [ @@ -43,7 +42,7 @@ const data22 = [ { a: "郭靖", b: "男", c: 25,d:'大侠', key: "3" } ]; -const DragColumnTable = dragColumn(sum(Table)); +const DragColumnTable = dragColumn(Table); const defaultProps22 = { prefixCls: "bee-table" @@ -55,7 +54,6 @@ class Demo22 extends Component { } render() { - return ; } } diff --git a/src/Table.js b/src/Table.js index ccfc06d..a702a67 100644 --- a/src/Table.js +++ b/src/Table.js @@ -40,6 +40,8 @@ const propTypes = { rowRef: PropTypes.func, getBodyWrapper: PropTypes.func, children: PropTypes.node, + + draggable: PropTypes.bool, }; const defaultProps = { @@ -218,7 +220,7 @@ class Table extends Component{ } getHeader(columns, fixed) { - const { showHeader, expandIconAsCell, clsPrefix } = this.props; + const { showHeader, expandIconAsCell, clsPrefix ,onDragStart,onDragOver,onDrop,draggable} = this.props; const rows = this.getHeaderRows(columns); if (expandIconAsCell && fixed !== 'right') { @@ -231,9 +233,10 @@ class Table extends Component{ } const trStyle = fixed ? this.getHeaderRowStyle(columns, rows) : null; - + let drop = draggable?{onDragStart,onDragOver,onDrop,draggable}:{}; return showHeader ? ( { - console.log(); - } - - ondragenter=()=>{ - - } - - ondragover=()=>{ - - } - - + render() { - const { clsPrefix, rowStyle, rows } = this.props; + const { clsPrefix, rowStyle ,onDragStart,onDragOver,onDrop,draggable,rows} = this.props; return ( { rows.map((row, index) => ( - {row.map((cellProps, i) => ())} + {row.map((da, i) => { + return draggable?({this.props.onDragStart(event,da)}} onDragOver={this.props.onDragOver} onDrop={(event)=>{this.props.onDrop(event,da)}} draggable={draggable} + {...da} key={i} />):(); + })} )) } diff --git a/src/lib/dragColumn.js b/src/lib/dragColumn.js index 25192d9..23d4efb 100644 --- a/src/lib/dragColumn.js +++ b/src/lib/dragColumn.js @@ -3,111 +3,77 @@ import Icon from "bee-icon"; import Checkbox from "bee-checkbox"; import ReactDOM from 'react-dom'; import Popover from 'bee-popover'; -import Dnd from 'bee-dnd'; +import {sortBy} from './util'; + /** - * 参数: 过滤表头 + * 参数: 列拖拽 * @param {*} Table */ +export default function dragColumn(Table) { -export default function filterColumn(Table) { - - return class filterColumn extends Component { + return class dragColumn extends Component { constructor(props) { super(props); const {columns} = props; - let _column = []; - Object.assign(_column,columns); - _column.forEach(da => { - da.checked = true; - da.disable = true; - }); - this.state = { - columns:_column, - showModal:false, - width:props.width?props.width:150, - screenX:0, - screenY:0 - }; + this.setColumOrderByIndex(columns); } - getShowModal=(event)=>{ - let {showModal} = this.state; - if(showModal){ - this.setState({ - showModal:false - }) + componentWillReceiveProps(nextProps){ + if(nextProps.columns != this.props.columns){ + this.setColumOrderByIndex(); } } - checkedColumItemClick = (da)=>{ + setColumOrderByIndex = (columns)=>{ + let _column = []; + Object.assign(_column,columns); + _column.forEach((da,i) => { + da.dragIndex = i; + }); + this.state = { + columns:_column + }; + } + + + onDragStart=(event,data)=>{ + event.dataTransfer.setData("Text",data.key); + } + + onDragOver=(event)=>{ + event.preventDefault(); + } + + onDrop=(event,data)=>{ let {columns} = this.state; - da.checked = da.checked?false:true; - da.disable = da.checked?true:false; - this.setState({ - ...this.state - }) - } - - openCloumList = (ev)=>{ - let oEvent=ev||event; - this.setState({ - screenX:oEvent.clientX, - screenY:oEvent.clientY, - showModal:true - }); - } + const id = event.dataTransfer.getData("Text"); + let objIndex = columns.findIndex((_da,i)=>_da.key == id); + let targetIndex = columns.findIndex((_da,i)=>_da.key == data.key); - getCloumItem=()=>{ - const {columns} = this.state; - return columns.map((da,i)=> (
{this.checkedColumItemClick(da)}}> - - {da.title} -
)) - } - - clear=()=>{ - const {columns} = this.state; - // let _chek = columns[0].checked?false:true; - columns.forEach(da => { - da.checked = true; - da.disable = true; + columns.forEach((da,i)=>{ + if(da.key == id){//obj + da.dragIndex = targetIndex + } + if(da.key == data.key){//targetObj + da.dragIndex = objIndex + } }); + let _columns = sortBy(columns,(da)=>da.dragIndex); + console.log("_columns--",_columns); this.setState({ - ...this.state + columns:_columns }) } render() { const {data} = this.props; - const {columns,showModal,width,screenX,screenY} = this.state; - let _columns = []; - columns.forEach((da)=>{ - if(da.disable){ - _columns.push(da); - } - }); + const {columns} = this.state; - let content = ( -
- 清除设置 -
- { - this.getCloumItem() - } -
-
); - - return
- - -
-
- ; + return (
) } }; } \ No newline at end of file diff --git a/src/lib/util.js b/src/lib/util.js index e69de29..5f784e1 100644 --- a/src/lib/util.js +++ b/src/lib/util.js @@ -0,0 +1,37 @@ +/* +* 快速排序,按某个属性,或按“获取排序依据的函数”,来排序. +* @method soryBy +* @static +* @param {array} arr 待处理数组 +* @param {string|function} prop 排序依据属性,获取 +* @param {boolean} desc 降序 +* @return {array} 返回排序后的新数组 +*/ + +export function sortBy(arr, prop, desc) { + let props=[], + ret=[], + i=0, + len=arr.length; + if(typeof prop=='string') { + for(; i