复杂表头拖拽

This commit is contained in:
“jonyshi” 2019-11-12 16:18:09 +08:00
parent 42181fed93
commit 7e822f3c5b
3 changed files with 57 additions and 18 deletions

View File

@ -124,6 +124,10 @@ class Table extends Component {
} else { } else {
expandedRowKeys = props.expandedRowKeys || props.defaultExpandedRowKeys; expandedRowKeys = props.expandedRowKeys || props.defaultExpandedRowKeys;
} }
this.columnsChildrenList = [];//复杂表头、所有叶子节点
this.getColumnsChildrenList(props.columns);//复杂表头、所有叶子节点
this.state = { this.state = {
expandedRowKeys, expandedRowKeys,
data: props.data, data: props.data,
@ -164,7 +168,7 @@ class Table extends Component {
this.tableUid = null; this.tableUid = null;
this.contentTable = null; this.contentTable = null;
this.leftColumnsLength //左侧固定列的长度 this.leftColumnsLength //左侧固定列的长度
this.centerColumnsLength //非固定列的长度 this.centerColumnsLength //非固定列的长度
} }
componentWillMount() { componentWillMount() {
this.centerColumnsLength = this.columnManager.centerColumns().length this.centerColumnsLength = this.columnManager.centerColumns().length
@ -418,6 +422,13 @@ class Table extends Component {
return this.props.expandedRowKeys || this.state.expandedRowKeys; return this.props.expandedRowKeys || this.state.expandedRowKeys;
} }
//todo 后续改进
getColumnsChildrenList = (columns)=>{
columns.forEach(da=>{
da.children?this.getColumnsChildrenList(da.children):this.columnsChildrenList.push(da);
})
}
getHeader(columns, fixed, leftFixedWidth, rightFixedWidth) { getHeader(columns, fixed, leftFixedWidth, rightFixedWidth) {
const { filterDelay, onFilterChange, onFilterClear, filterable, showHeader, expandIconAsCell, clsPrefix, onDragStart, onDragEnter, onDragOver, onDrop,onDragEnd, draggable, const { filterDelay, onFilterChange, onFilterClear, filterable, showHeader, expandIconAsCell, clsPrefix, onDragStart, onDragEnter, onDragOver, onDrop,onDragEnd, draggable,
onMouseDown, onMouseMove, onMouseUp, dragborder, onThMouseMove, dragborderKey, minColumnWidth, headerHeight,afterDragColWidth,headerScroll ,bordered,onDropBorder,onDraggingBorder} = this.props; onMouseDown, onMouseMove, onMouseUp, dragborder, onThMouseMove, dragborderKey, minColumnWidth, headerHeight,afterDragColWidth,headerScroll ,bordered,onDropBorder,onDraggingBorder} = this.props;
@ -430,11 +441,10 @@ class Table extends Component {
rowSpan: rows.length, rowSpan: rows.length,
}); });
} }
const trStyle = headerHeight&&!fixed ? { height: headerHeight } : (fixed ? this.getHeaderRowStyle(columns, rows) : null); const trStyle = headerHeight&&!fixed ? { height: headerHeight } : (fixed ? this.getHeaderRowStyle(columns, rows) : null);
let drop = draggable ? { onDragStart, onDragOver, onDrop,onDragEnd, onDragEnter, draggable } : {}; let drop = draggable ? { onDragStart, onDragOver, onDrop,onDragEnd, onDragEnter, draggable } : {};
let dragBorder = dragborder ? { onMouseDown, onMouseMove, onMouseUp, dragborder, onThMouseMove, dragborderKey,onDropBorder,onDraggingBorder } : {}; let dragBorder = dragborder ? { onMouseDown, onMouseMove, onMouseUp, dragborder, onThMouseMove, dragborderKey,onDropBorder,onDraggingBorder } : {};
let contentWidthDiff = 0; let contentWidthDiff = 0;
//非固定表格,宽度不够时自动扩充 //非固定表格,宽度不够时自动扩充
if (!fixed) { if (!fixed) {
contentWidthDiff = this.state.contentWidthDiff contentWidthDiff = this.state.contentWidthDiff
@ -443,6 +453,7 @@ class Table extends Component {
<TableHeader <TableHeader
{...drop} {...drop}
{...dragBorder} {...dragBorder}
columnsChildrenList={this.columnsChildrenList}
locale={this.props.locale} locale={this.props.locale}
minColumnWidth={minColumnWidth} minColumnWidth={minColumnWidth}
contentWidthDiff={contentWidthDiff} contentWidthDiff={contentWidthDiff}

View File

@ -87,7 +87,7 @@ $icon-color:#505F79;
border-bottom: 1px solid $table-th-bottom-border; border-bottom: 1px solid $table-th-bottom-border;
} }
tr>th:last-child{ tr>th:last-child{
border-right: none; // border-right: none;
} }
} }
tr { tr {
@ -590,10 +590,13 @@ $icon-color:#505F79;
.online{ .online{
height: 100%; height: 100%;
width: 1px; width: 4px;
background:transparent;//兼容火狐浏览器如果table设置border // background:transparent;//兼容火狐浏览器如果table设置border
margin: 0 auto; margin: 0 auto;
} }
.online:hover{
background:#000000;
}
.online-hover{ .online-hover{
background:#000000; background:#000000;
} }

View File

@ -60,7 +60,10 @@ class TableHeader extends Component {
if(this.props.dragborder){ if(this.props.dragborder){
this.removeDragBorderEvent(); this.removeDragBorderEvent();
} }
this.eventListen([{key:'mousedown',fun:this.onTrMouseDown}],'remove',this.table.tr[0]); this.doEventList(this.table.tr,(tr)=>{
this.eventListen([{key:'mousedown',fun:this.onTrMouseDown}],'remove',tr);
})
// this.eventListen([{key:'mousedown',fun:this.onTrMouseDown}],'remove',this.table.tr[0]);
this.eventListen([{key:'mouseup',fun:this.bodyonLineMouseUp}],'remove',document.body); this.eventListen([{key:'mouseup',fun:this.bodyonLineMouseUp}],'remove',document.body);
} }
@ -124,12 +127,22 @@ class TableHeader extends Component {
this.dragAbleEventInit();//交换列 this.dragAbleEventInit();//交换列
} }
if(this.table && this.table.tr){ if(this.table && this.table.tr){
this.eventListen([{key:'mousedown',fun:this.onTrMouseDown}],'',this.table.tr[0]);//body mouseup // this.eventListen([{key:'mousedown',fun:this.onTrMouseDown}],'',this.table.tr[0]);//body mouseup
this.doEventList(this.table.tr,(tr)=>{
this.eventListen([{key:'mousedown',fun:this.onTrMouseDown}],'',tr);//body mouseup
})
} }
this.eventListen([{key:'mouseup',fun:this.bodyonLineMouseUp}],'',document.body);//body mouseup this.eventListen([{key:'mouseup',fun:this.bodyonLineMouseUp}],'',document.body);//body mouseup
} }
} }
doEventList(trs,action){
for (let index = 0; index < trs.length; index++) {
action(trs[index]);
}
}
/** /**
* 拖拽列宽事件的监听 * 拖拽列宽事件的监听
*/ */
@ -140,7 +153,10 @@ class TableHeader extends Component {
{key:'mousemove', fun:this.onTrMouseMove}, {key:'mousemove', fun:this.onTrMouseMove},
// {key:'mousemove', fun:debounce(50,this.onTrMouseMove)},//函数节流后体验很差 // {key:'mousemove', fun:debounce(50,this.onTrMouseMove)},//函数节流后体验很差
]; ];
this.eventListen(events,'',this.table.tr[0]);//表示把事件添加到th元素上 this.doEventList(this.table.tr,(tr)=>{
this.eventListen(events,'',tr);//表示把事件添加到th元素上
})
// this.eventListen(events,'',this.table.tr[0]);//表示把事件添加到th元素上
} }
/** /**
@ -151,7 +167,10 @@ class TableHeader extends Component {
{key:'mouseup', fun:this.onTrMouseUp}, {key:'mouseup', fun:this.onTrMouseUp},
{key:'mousemove', fun:this.onTrMouseMove}, {key:'mousemove', fun:this.onTrMouseMove},
]; ];
this.eventListen(events,'remove',this.table.tr[0]); // this.eventListen(events,'remove',this.table.tr[0]);
this.doEventList(this.table.tr,(tr)=>{
this.eventListen(events,'remove',this.table.tr);
})
} }
eventListen(events,type,eventSource){ eventListen(events,type,eventSource){
@ -197,7 +216,7 @@ class TableHeader extends Component {
Event.stopPropagation(e); Event.stopPropagation(e);
let event = Event.getEvent(e) , let event = Event.getEvent(e) ,
targetEvent = Event.getTarget(event); targetEvent = Event.getTarget(event);
const { clsPrefix, contentTable,lastShowIndex } = this.props; const { clsPrefix, contentTable,lastShowIndex,columnsChildrenList } = this.props;
// let currentElement = this.getOnLineObject(targetEvent); // let currentElement = this.getOnLineObject(targetEvent);
let currentElement = this.getTargetToType(targetEvent); let currentElement = this.getTargetToType(targetEvent);
if(!currentElement)return; if(!currentElement)return;
@ -207,18 +226,23 @@ class TableHeader extends Component {
if(!this.props.dragborder)return; if(!this.props.dragborder)return;
targetEvent.setAttribute('draggable',false);//添加交换列效果 targetEvent.setAttribute('draggable',false);//添加交换列效果
let currentIndex = parseInt(currentElement.getAttribute("data-line-index")); let currentIndex = parseInt(currentElement.getAttribute("data-line-index"));
let defaultWidth = currentElement.getAttribute("data-th-width"); let defaultWidth = currentElement.getAttribute("data-th-width");
let currentObj = this.table.cols[currentIndex];
this.drag.option = "border";//拖拽操作 this.drag.option = "border";//拖拽操作
if(columnsChildrenList){
let columnKey = currentElement.getAttribute("data-line-key");
if(columnKey){
currentIndex = columnsChildrenList.findIndex(da=>da.key.toLowerCase() === columnKey.toLowerCase());
}
}
console.log("currentIndex :",currentIndex);
let currentObj = this.table.cols[currentIndex];
this.drag.currIndex = currentIndex; this.drag.currIndex = currentIndex;
this.drag.oldLeft = event.x; this.drag.oldLeft = event.x;
this.drag.oldWidth = parseInt((currentObj).style.width); this.drag.oldWidth = parseInt((currentObj).style.width);
this.drag.minWidth = currentObj.style.minWidth != ""?parseInt(currentObj.style.minWidth):defaultWidth; this.drag.minWidth = currentObj.style.minWidth != ""?parseInt(currentObj.style.minWidth):defaultWidth;
this.drag.tableWidth = parseInt(this.table.table.style.width ?this.table.table.style.width:this.table.table.scrollWidth); this.drag.tableWidth = parseInt(this.table.table.style.width ?this.table.table.style.width:this.table.table.scrollWidth);
// console.log(" ----- ",this.drag);
if(!this.tableOldWidth){ if(!this.tableOldWidth){
this.tableOldWidth = this.drag.tableWidth;//this.getTableWidth(); this.tableOldWidth = this.drag.tableWidth;//this.getTableWidth();
// console.log(" this.tableOldWidth--- ",this.tableOldWidth);
} }
if(!this.lastColumWidth){ if(!this.lastColumWidth){
this.lastColumWidth = parseInt(this.table.cols[lastShowIndex].style.width); this.lastColumWidth = parseInt(this.table.cols[lastShowIndex].style.width);
@ -727,10 +751,10 @@ class TableHeader extends Component {
render() { render() {
const { clsPrefix, rowStyle,draggable, const { clsPrefix, rowStyle,draggable,
dragborder, rows,filterable,fixed,lastShowIndex, dragborder, rows,filterable,fixed,lastShowIndex,columnsChildrenList
} = this.props; } = this.props;
let attr = dragborder ? { id: `u-table-drag-thead-${this.theadKey}` } : {}; let attr = dragborder ? { id: `u-table-drag-thead-${this.theadKey}` } : {};
let lastObj = columnsChildrenList[columnsChildrenList.length-1];
return ( return (
<thead className={`${clsPrefix}-thead`} {...attr} data-theader-fixed='scroll' ref={_thead=>this._thead = _thead} > <thead className={`${clsPrefix}-thead`} {...attr} data-theader-fixed='scroll' ref={_thead=>this._thead = _thead} >
{rows.map((row, index) => { {rows.map((row, index) => {
@ -794,7 +818,8 @@ class TableHeader extends Component {
{da.required ? <span className='required'>*</span>:''} {da.required ? <span className='required'>*</span>:''}
{da.children} {da.children}
{ {
dragborder && columIndex != _rowLeng? <div ref={el => (this.gap = el)} data-line-key={da.key} // && columIndex != _rowLeng
dragborder && da.key != lastObj.key ? <div ref={el => (this.gap = el)} data-line-key={da.key}
data-line-index={columIndex} data-th-width={da.width} data-line-index={columIndex} data-th-width={da.width}
data-type="online" className = {`${clsPrefix}-thead-th-drag-gap`}> data-type="online" className = {`${clsPrefix}-thead-th-drag-gap`}>
<div className='online' /></div>:"" <div className='online' /></div>:""