2018-11-07 17:11:25 +08:00
"use strict" ;
2017-01-12 08:53:51 +08:00
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
var _extends = Object . assign || function ( target ) { for ( var i = 1 ; i < arguments . length ; i ++ ) { var source = arguments [ i ] ; for ( var key in source ) { if ( Object . prototype . hasOwnProperty . call ( source , key ) ) { target [ key ] = source [ key ] ; } } } return target ; } ;
2018-11-07 17:11:25 +08:00
var _react = require ( "react" ) ;
2017-01-12 08:53:51 +08:00
var _react2 = _interopRequireDefault ( _react ) ;
2018-12-02 16:53:06 +08:00
var _reactDom = require ( "react-dom" ) ;
var _reactDom2 = _interopRequireDefault ( _reactDom ) ;
2018-11-07 17:11:25 +08:00
var _propTypes = require ( "prop-types" ) ;
2017-06-03 20:34:07 +08:00
var _propTypes2 = _interopRequireDefault ( _propTypes ) ;
2018-11-07 17:11:25 +08:00
var _throttleDebounce = require ( "throttle-debounce" ) ;
2018-09-27 15:24:29 +08:00
2018-11-07 17:11:25 +08:00
var _utils = require ( "./utils" ) ;
2018-05-11 11:30:56 +08:00
2018-11-07 17:11:25 +08:00
var _FilterType = require ( "./FilterType" ) ;
2018-09-27 15:24:29 +08:00
var _FilterType2 = _interopRequireDefault ( _FilterType ) ;
2017-01-12 08:53:51 +08:00
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { "default" : obj } ; }
function _defaults ( obj , defaults ) { var keys = Object . getOwnPropertyNames ( defaults ) ; for ( var i = 0 ; i < keys . length ; i ++ ) { var key = keys [ i ] ; var value = Object . getOwnPropertyDescriptor ( defaults , key ) ; if ( value && value . configurable && obj [ key ] === undefined ) { Object . defineProperty ( obj , key , value ) ; } } return obj ; }
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function _possibleConstructorReturn ( self , call ) { if ( ! self ) { throw new ReferenceError ( "this hasn't been initialised - super() hasn't been called" ) ; } return call && ( typeof call === "object" || typeof call === "function" ) ? call : self ; }
function _inherits ( subClass , superClass ) { if ( typeof superClass !== "function" && superClass !== null ) { throw new TypeError ( "Super expression must either be null or a function, not " + typeof superClass ) ; } subClass . prototype = Object . create ( superClass && superClass . prototype , { constructor : { value : subClass , enumerable : false , writable : true , configurable : true } } ) ; if ( superClass ) Object . setPrototypeOf ? Object . setPrototypeOf ( subClass , superClass ) : _defaults ( subClass , superClass ) ; }
var propTypes = {
2017-06-03 20:34:07 +08:00
clsPrefix : _propTypes2 [ "default" ] . string ,
rowStyle : _propTypes2 [ "default" ] . object ,
rows : _propTypes2 [ "default" ] . array
2017-01-12 08:53:51 +08:00
} ;
2019-04-22 10:24:52 +08:00
function getDiv ( id ) {
var div = document . createElement ( "div" ) ;
2019-04-23 18:47:27 +08:00
div . className = "u-table-drag-hidden-cont" ;
2019-04-22 10:24:52 +08:00
div . id = id ;
return div ;
}
2017-01-12 08:53:51 +08:00
var TableHeader = function ( _Component ) {
_inherits ( TableHeader , _Component ) ;
function TableHeader ( props ) {
_classCallCheck ( this , TableHeader ) ;
2018-05-11 09:29:43 +08:00
var _this = _possibleConstructorReturn ( this , _Component . call ( this , props ) ) ;
2019-04-22 10:24:52 +08:00
_this . getOnLineObject = function ( _element ) {
var type = _element . getAttribute ( 'data-type' ) ,
elementObj = null ;
if ( ! type ) {
var element = _element . parentElement || parentNode ; //兼容写法。
if ( element . getAttribute ( 'data-type' ) ) {
elementObj = element ;
2019-02-26 16:57:47 +08:00
}
2019-04-22 10:24:52 +08:00
} else {
elementObj = _element ;
2019-02-26 16:57:47 +08:00
}
2019-04-22 10:24:52 +08:00
return elementObj ;
2019-02-26 16:57:47 +08:00
} ;
2019-04-19 11:02:20 +08:00
_this . onTrMouseDown = function ( e ) {
_utils . Event . stopPropagation ( e ) ;
2019-04-22 10:24:52 +08:00
var event = _utils . Event . getEvent ( e ) ,
targetEvent = _utils . Event . getTarget ( event ) ;
2018-12-02 16:53:06 +08:00
var _this$props = _this . props ,
clsPrefix = _this$props . clsPrefix ,
2019-04-19 11:02:20 +08:00
contentTable = _this$props . contentTable ;
2019-04-22 10:24:52 +08:00
var currentElement = _this . getOnLineObject ( targetEvent ) ;
if ( ! currentElement ) return ;
var type = currentElement . getAttribute ( 'data-type' ) ;
2019-04-19 11:02:20 +08:00
if ( ! _this . props . dragborder && ! _this . props . draggable ) return ;
if ( type == 'online' && _this . props . dragborder ) {
2019-04-22 10:24:52 +08:00
if ( ! _this . props . dragborder ) return ;
targetEvent . setAttribute ( 'draggable' , false ) ; //添加交换列效果
var currentIndex = parseInt ( currentElement . getAttribute ( "data-line-index" ) ) ;
var defaultWidth = currentElement . getAttribute ( "data-th-width" ) ;
2019-04-19 11:02:20 +08:00
var currentObj = _this . table . cols [ currentIndex ] ;
_this . drag . option = "border" ; //拖拽操作
_this . drag . currIndex = currentIndex ;
_this . drag . oldLeft = event . x ;
_this . drag . oldWidth = parseInt ( currentObj . style . width ) ;
_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 ) ;
2019-04-22 10:24:52 +08:00
} else if ( type != 'online' && _this . props . draggable ) {
2019-04-22 15:39:20 +08:00
if ( ! _this . props . draggable || targetEvent . nodeName . toUpperCase ( ) != "TH" ) return ;
2019-04-22 10:24:52 +08:00
targetEvent . setAttribute ( 'draggable' , true ) ; //添加交换列效果
_this . drag . option = 'dragAble' ;
_this . currentDome = event . target ;
var _currentIndex = parseInt ( currentElement . getAttribute ( "data-line-index" ) ) ;
_this . drag . currIndex = _currentIndex ;
} else {
2019-04-23 16:43:34 +08:00
// console.log("onTrMouseDown dragborder or draggable is all false !");
2019-04-19 11:02:20 +08:00
return ;
}
} ;
_this . onTrMouseMove = function ( e ) {
2019-04-23 18:47:27 +08:00
if ( ! _this . props . dragborder && ! _this . props . draggable ) return ;
2019-04-19 11:02:20 +08:00
var _this$props2 = _this . props ,
clsPrefix = _this$props2 . clsPrefix ,
dragborder = _this$props2 . dragborder ,
contentDomWidth = _this$props2 . contentDomWidth ,
scrollbarWidth = _this$props2 . scrollbarWidth ,
contentTable = _this$props2 . contentTable ,
headerScroll = _this$props2 . headerScroll ;
2018-12-02 16:53:06 +08:00
_utils . Event . stopPropagation ( e ) ;
var event = _utils . Event . getEvent ( e ) ;
2019-04-19 11:02:20 +08:00
if ( _this . props . dragborder && _this . drag . option == "border" ) {
//移动改变宽度
var currentCols = _this . table . cols [ _this . drag . currIndex ] ;
var diff = event . x - _this . drag . oldLeft ;
var newWidth = _this . drag . oldWidth + diff ;
_this . drag . newWidth = newWidth ;
2019-04-22 10:24:52 +08:00
2019-04-19 11:02:20 +08:00
// if(newWidth > this.drag.minWidth){
if ( newWidth > _this . minWidth ) {
currentCols . style . width = newWidth + 'px' ;
//hao 支持固定表头拖拽 修改表体的width
if ( _this . fixedTable . cols ) {
_this . fixedTable . cols [ _this . drag . currIndex ] . style . width = newWidth + "px" ;
}
var newTableWidth = _this . drag . tableWidth + diff + 'px' ;
_this . table . table . style . width = newTableWidth ; //改变table的width
2019-04-23 16:43:34 +08:00
if ( _this . table . innerTableBody ) {
//TODO 后续需要处理此处
_this . table . innerTableBody . style . width = newTableWidth ;
2019-02-26 16:57:47 +08:00
}
2019-04-19 11:02:20 +08:00
var showScroll = contentDomWidth - ( _this . drag . tableWidth + diff ) - scrollbarWidth ;
//表头滚动条处理
if ( headerScroll ) {
if ( showScroll < 0 ) {
//找到固定列表格, 设置表头的marginBottom值为scrollbarWidth;
_this . table . contentTableHeader . style . overflowX = 'scroll' ;
_this . optTableMargin ( _this . table . fixedLeftHeaderTable , scrollbarWidth ) ;
_this . optTableMargin ( _this . table . fixedRighHeadertTable , scrollbarWidth ) ;
// fixedLeftHeaderTable && (fixedLeftHeaderTable.style.marginBottom = scrollbarWidth + "px");
// fixedRighHeadertTable && (fixedRighHeadertTable.style.marginBottom = scrollbarWidth + "px");
//todo inner scroll-x去掉; outer marginbottom 设置成-15px】
} else {
_this . table . contentTableHeader . style . overflowX = 'hidden' ;
_this . optTableMargin ( _this . table . fixedLeftHeaderTable , 0 ) ;
_this . optTableMargin ( _this . table . fixedRighHeadertTable , 0 ) ;
}
2019-02-26 16:57:47 +08:00
} else {
2019-04-19 11:02:20 +08:00
if ( showScroll < 0 ) {
_this . optTableMargin ( _this . table . fixedLeftBodyTable , '-' + scrollbarWidth ) ;
_this . optTableMargin ( _this . table . fixedRightBodyTable , '-' + scrollbarWidth ) ;
_this . optTableScroll ( _this . table . fixedLeftBodyTable , { x : 'scroll' } ) ;
_this . optTableScroll ( _this . table . fixedRightBodyTable , { x : 'scroll' } ) ;
} else {
_this . optTableMargin ( _this . table . fixedLeftBodyTable , 0 ) ;
_this . optTableMargin ( _this . table . fixedRightBodyTable , 0 ) ;
_this . optTableScroll ( _this . table . fixedLeftBodyTable , { x : 'auto' } ) ;
_this . optTableScroll ( _this . table . fixedRightBodyTable , { x : 'auto' } ) ;
}
2018-12-02 16:53:06 +08:00
}
}
2019-04-22 10:24:52 +08:00
} else if ( _this . props . draggable && _this . drag . option == "draggable" ) {
2019-04-23 16:43:34 +08:00
// console.log(" --onTrMouseMove--draggable- ",this.drag.option);
2019-04-22 10:24:52 +08:00
} else {
2019-04-23 16:43:34 +08:00
// console.log("onTrMouseMove dragborder or draggable is all false !");
}
2018-05-11 11:30:56 +08:00
} ;
2019-04-22 10:24:52 +08:00
_this . onTrMouseUp = function ( e ) {
2018-12-02 16:53:06 +08:00
var event = _utils . Event . getEvent ( e ) ;
2019-01-28 10:26:56 +08:00
var width = _this . drag . newWidth ;
2019-04-22 10:24:52 +08:00
_this . mouseClear ( ) ;
2019-03-06 10:42:06 +08:00
_this . props . onDropBorder && _this . props . onDropBorder ( event , width ) ;
2018-09-12 14:14:05 +08:00
} ;
2019-04-22 10:24:52 +08:00
_this . clearThsDr = function ( ) {
var ths = _this . table . ths ;
for ( var index = 0 ; index < ths . length ; index ++ ) {
ths [ index ] . setAttribute ( 'draggable' , false ) ; //去掉交换列效果
}
2018-05-11 11:30:56 +08:00
} ;
2019-04-22 10:24:52 +08:00
_this . bodyonLineMouseUp = function ( events , type ) {
if ( ! _this . drag || ! _this . drag . option ) return ;
_this . mouseClear ( ) ;
2018-05-11 11:30:56 +08:00
} ;
2019-02-26 16:57:47 +08:00
_this . optTableMargin = function ( table , scrollbarWidth ) {
if ( table ) {
table . style . marginBottom = scrollbarWidth + "px" ;
}
} ;
_this . optTableScroll = function ( table ) {
var overflow = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : { } ;
if ( table ) {
var innerTable = table . querySelector ( '.u-table-body-inner' ) ;
if ( innerTable ) {
overflow . x && ( innerTable . style . overflowX = overflow . x ) ;
overflow . y && ( innerTable . style . overflowY = overflow . y ) ;
}
}
2018-12-04 16:25:22 +08:00
} ;
2018-12-02 16:53:06 +08:00
_this . onDragStart = function ( e ) {
if ( ! _this . props . draggable ) return ;
2019-04-22 10:24:52 +08:00
if ( _this . drag && _this . drag . option != 'dragAble' ) {
2018-12-02 16:53:06 +08:00
return ;
2018-11-26 20:42:18 +08:00
}
2019-04-22 10:24:52 +08:00
var event = _utils . Event . getEvent ( e ) ,
target = _utils . Event . getTarget ( event ) ;
var currentIndex = parseInt ( target . getAttribute ( "data-line-index" ) ) ;
var currentKey = target . getAttribute ( 'data-line-key' ) ;
2019-04-23 16:43:34 +08:00
if ( event . dataTransfer . setDragImage ) {
var crt = target . cloneNode ( true ) ;
crt . style . backgroundColor = "#ebecf0" ;
crt . style . width = _this . table . cols [ currentIndex ] . style . width ; //拖动后再交换列的时候,阴影效果可同步
crt . style . height = "40px" ;
// crt.style['line-height'] = "40px";
// document.body.appendChild(crt);
document . getElementById ( _this . _table _none _cont _id ) . appendChild ( crt ) ;
event . dataTransfer . setDragImage ( crt , 0 , 0 ) ;
}
2018-05-11 11:30:56 +08:00
2018-12-02 16:53:06 +08:00
event . dataTransfer . effectAllowed = "move" ;
event . dataTransfer . setData ( "Text" , currentKey ) ;
_this . currentObj = _this . props . rows [ 0 ] [ currentIndex ] ;
2018-05-14 10:01:06 +08:00
} ;
2018-12-02 16:53:06 +08:00
_this . onDragOver = function ( e ) {
2019-04-25 14:19:48 +08:00
var event = _utils . Event . getEvent ( e ) ;
2018-12-02 16:53:06 +08:00
event . preventDefault ( ) ;
2018-05-14 10:01:06 +08:00
} ;
2018-12-02 16:53:06 +08:00
_this . onDrop = function ( e ) {
if ( ! _this . props . draggable ) return ;
2019-04-22 10:24:52 +08:00
if ( _this . drag && _this . drag . option != 'dragAble' ) {
2018-09-12 14:14:05 +08:00
return ;
}
2019-04-22 10:24:52 +08:00
var event = _utils . Event . getEvent ( e ) ,
target = _utils . Event . getTarget ( event ) ;
2018-12-04 16:25:22 +08:00
_this . currentDome . setAttribute ( 'draggable' , false ) ; //添加交换列效果
2018-09-27 15:24:29 +08:00
} ;
2019-04-22 10:24:52 +08:00
_this . onDragEnter = function ( e ) {
var event = _utils . Event . getEvent ( e ) ,
target = _utils . Event . getTarget ( event ) ;
_this . _dragCurrent = target ;
var currentIndex = target . getAttribute ( "data-line-index" ) ;
if ( ! currentIndex || parseInt ( currentIndex ) === _this . drag . currIndex ) return ;
if ( target . nodeName . toUpperCase ( ) === "TH" ) {
2019-04-23 16:43:34 +08:00
// target.style.border = "2px dashed rgba(5,0,0,0.25)";
target . setAttribute ( "style" , "border:2px dashed rgba(5,0,0,0.25)" ) ;
2019-04-22 15:39:20 +08:00
// target.style.backgroundColor = 'rgb(235, 236, 240)';
2019-04-22 10:24:52 +08:00
}
} ;
_this . onDragEnd = function ( e ) {
var event = _utils . Event . getEvent ( e ) ,
target = _utils . Event . getTarget ( event ) ;
2019-04-23 16:43:34 +08:00
_this . _dragCurrent . setAttribute ( "style" , "" ) ;
// this._dragCurrent.style = "";
2019-04-22 10:24:52 +08:00
document . getElementById ( _this . _table _none _cont _id ) . innerHTML = "" ;
2019-04-22 15:39:20 +08:00
var data = _this . getCurrentEventData ( _this . _dragCurrent ) ;
2018-12-03 11:17:39 +08:00
if ( ! data ) return ;
2018-12-02 16:53:06 +08:00
if ( ! _this . currentObj || _this . currentObj . key == data . key ) return ;
if ( ! _this . props . onDrop ) return ;
_this . props . onDrop ( event , { dragSource : _this . currentObj , dragTarg : data } ) ;
2018-09-27 15:24:29 +08:00
} ;
2019-04-22 10:24:52 +08:00
_this . onDragLeave = function ( e ) {
var event = _utils . Event . getEvent ( e ) ,
target = _utils . Event . getTarget ( event ) ;
var currentIndex = target . getAttribute ( "data-line-index" ) ;
if ( ! currentIndex || parseInt ( currentIndex ) === _this . drag . currIndex ) return ;
if ( target . nodeName . toUpperCase ( ) === "TH" ) {
2019-04-23 16:43:34 +08:00
target . setAttribute ( "style" , "" ) ;
2019-04-22 10:24:52 +08:00
// this._dragCurrent.style = "";
}
} ;
2018-11-29 23:29:26 +08:00
_this . handlerFilterChange = function ( key , value , condition ) {
var onFilterChange = _this . props . onFilterChange ;
2018-09-27 15:24:29 +08:00
2018-11-29 23:29:26 +08:00
if ( onFilterChange ) {
onFilterChange ( key , value , condition ) ;
2018-09-27 15:24:29 +08:00
}
} ;
2018-11-29 23:29:26 +08:00
_this . handlerFilterClear = function ( field ) {
var onFilterClear = _this . props . onFilterClear ;
2018-09-27 15:24:29 +08:00
2018-11-29 23:29:26 +08:00
if ( onFilterClear ) {
onFilterClear ( field ) ;
2018-09-27 15:24:29 +08:00
}
} ;
_this . filterRenderType = function ( type , dataIndex , index ) {
2018-12-02 16:53:06 +08:00
var _this$props3 = _this . props ,
clsPrefix = _this$props3 . clsPrefix ,
rows = _this$props3 . rows ,
filterDelay = _this$props3 . filterDelay ,
locale = _this$props3 . locale ;
2018-09-27 15:24:29 +08:00
switch ( type ) {
//文本输入
2018-11-07 17:11:25 +08:00
case "text" :
2018-09-27 15:24:29 +08:00
return _react2 [ "default" ] . createElement ( _FilterType2 [ "default" ] , {
2018-11-29 23:29:26 +08:00
locale : locale //多语
, rendertype : type //渲染类型
, clsPrefix : clsPrefix //css前缀
, className : clsPrefix + " filter-text" ,
dataIndex : dataIndex //字段
, onFilterChange : _this . handlerFilterChange //输入框回调
, onFilterClear : _this . handlerFilterClear //清除回调
, filterDropdown : rows [ 1 ] [ index ] [ "filterdropdown" ] //是否显示下拉条件
, filterDropdownType : rows [ 1 ] [ index ] [ "filterdropdowntype" ] //下拉的条件类型为string,number
2018-12-11 16:54:25 +08:00
, filterDropdownIncludeKeys : rows [ 1 ] [ index ] [ "filterdropdownincludekeys" ] //下拉条件按照指定的keys去显示
2018-11-26 20:42:18 +08:00
} ) ;
//数值输入
case "number" :
return _react2 [ "default" ] . createElement ( _FilterType2 [ "default" ] , {
locale : locale ,
rendertype : type ,
clsPrefix : clsPrefix ,
className : clsPrefix + " filter-text" ,
2018-11-29 23:29:26 +08:00
dataIndex : dataIndex //字段
, onFilterChange : ( 0 , _throttleDebounce . debounce ) ( filterDelay || 300 , _this . handlerFilterChange ) //输入框回调并且函数防抖动
, onFilterClear : _this . handlerFilterClear //清除回调
, filterDropdown : rows [ 1 ] [ index ] [ "filterdropdown" ] ,
2018-11-26 20:42:18 +08:00
filterDropdownType : rows [ 1 ] [ index ] [ "filterdropdowntype" ] //下拉的条件类型为string,number
2018-12-11 16:54:25 +08:00
, filterDropdownIncludeKeys : rows [ 1 ] [ index ] [ "filterdropdownincludekeys" ] //下拉条件按照指定的keys去显示
2018-12-14 10:52:32 +08:00
, filterInputNumberOptions : rows [ 1 ] [ index ] [ "filterinputnumberoptions" ] //设置数值框内的详细属性
2018-09-27 15:24:29 +08:00
} ) ;
//下拉框选择
2018-11-07 17:11:25 +08:00
case "dropdown" :
2018-09-27 15:24:29 +08:00
var selectDataSource = [ ] ;
2018-11-29 23:29:26 +08:00
//处理没有输入数据源的时候,系统自动查找自带的数据筛选后注入
2018-11-07 17:11:25 +08:00
if ( rows . length > 0 && ( rows [ 1 ] [ index ] [ "filterdropdownauto" ] || "auto" ) == "auto" ) {
2018-09-27 15:24:29 +08:00
var hash = { } ;
//处理下拉重复对象组装dropdown
selectDataSource = Array . from ( rows [ 1 ] [ 0 ] . datasource , function ( x ) {
2018-11-07 17:11:25 +08:00
return {
key : x [ dataIndex ] ,
value : x [ dataIndex ]
} ;
2018-09-27 15:24:29 +08:00
} ) ;
selectDataSource = selectDataSource . reduceRight ( function ( item , next ) {
2018-11-07 17:11:25 +08:00
hash [ next . key ] ? "" : hash [ next . key ] = true && item . push ( next ) ;
2018-09-27 15:24:29 +08:00
return item ;
} , [ ] ) ;
2018-10-11 22:53:27 +08:00
} else {
2018-11-29 23:29:26 +08:00
//从外部数据源加载系统数据
2018-11-07 17:11:25 +08:00
selectDataSource = rows [ 1 ] [ index ] [ "filterdropdowndata" ] ;
2018-09-27 15:24:29 +08:00
}
return _react2 [ "default" ] . createElement ( _FilterType2 [ "default" ] , {
2018-11-01 14:35:46 +08:00
locale : locale ,
2018-09-27 15:24:29 +08:00
rendertype : type ,
2018-11-07 17:11:25 +08:00
className : clsPrefix + " filter-dropdown" ,
2018-09-27 15:24:29 +08:00
data : selectDataSource ,
2018-12-15 15:24:15 +08:00
notFoundContent : "Loading" //没有数据显示的默认字
, dataIndex : dataIndex //字段
2018-11-29 23:29:26 +08:00
, onFilterChange : _this . handlerFilterChange //输入框回调
, onFilterClear : _this . handlerFilterClear //清除回调
, filterDropdown : rows [ 1 ] [ index ] [ "filterdropdown" ] ,
2018-11-26 20:42:18 +08:00
onFocus : rows [ 1 ] [ index ] [ "filterdropdownfocus" ] ,
filterDropdownType : rows [ 1 ] [ index ] [ "filterdropdowntype" ] //下拉的条件类型为string,number
2018-12-11 16:54:25 +08:00
, filterDropdownIncludeKeys : rows [ 1 ] [ index ] [ "filterdropdownincludekeys" ] //下拉条件按照指定的keys去显示
2018-09-27 15:24:29 +08:00
} ) ;
//日期
2018-11-07 17:11:25 +08:00
case "date" :
2018-09-27 15:24:29 +08:00
return _react2 [ "default" ] . createElement ( _FilterType2 [ "default" ] , {
2018-11-01 14:35:46 +08:00
locale : locale ,
2018-09-27 15:24:29 +08:00
rendertype : type ,
2018-11-07 17:11:25 +08:00
className : "filter-date" ,
2018-09-27 15:24:29 +08:00
onClick : function onClick ( ) { } ,
2018-11-07 17:11:25 +08:00
format : rows [ 1 ] [ index ] [ "format" ] || "YYYY-MM-DD" ,
2018-11-29 23:29:26 +08:00
dataIndex : dataIndex //字段
, onFilterChange : _this . handlerFilterChange //输入框回调
, onFilterClear : _this . handlerFilterClear //清除回调
, filterDropdown : rows [ 1 ] [ index ] [ "filterdropdown" ] ,
2018-11-26 20:42:18 +08:00
filterDropdownType : rows [ 1 ] [ index ] [ "filterdropdowntype" ] //下拉的条件类型为string,number
2018-12-11 16:54:25 +08:00
, filterDropdownIncludeKeys : rows [ 1 ] [ index ] [ "filterdropdownincludekeys" ] //下拉条件按照指定的keys去显示
2018-09-27 15:24:29 +08:00
} ) ;
2018-11-26 21:12:48 +08:00
//日期范围
case "daterange" :
return _react2 [ "default" ] . createElement ( _FilterType2 [ "default" ] , {
locale : locale ,
rendertype : type ,
className : "filter-date" ,
onClick : function onClick ( ) { } ,
format : rows [ 1 ] [ index ] [ "format" ] || "YYYY-MM-DD" ,
2018-11-29 23:29:26 +08:00
dataIndex : dataIndex //字段
, onFilterChange : _this . handlerFilterChange //输入框回调
, onFilterClear : _this . handlerFilterClear //清除回调
, filterDropdown : rows [ 1 ] [ index ] [ "filterdropdown" ] ,
2018-11-26 21:12:48 +08:00
filterDropdownType : rows [ 1 ] [ index ] [ "filterdropdowntype" ] //下拉的条件类型为string,number
2018-12-11 16:54:25 +08:00
, filterDropdownIncludeKeys : rows [ 1 ] [ index ] [ "filterdropdownincludekeys" ] //下拉条件按照指定的keys去显示
2018-09-27 15:24:29 +08:00
} ) ;
default :
//不匹配类型默认文本输入
2018-11-07 17:11:25 +08:00
return _react2 [ "default" ] . createElement ( "div" , null ) ;
2018-09-27 15:24:29 +08:00
}
2018-05-11 11:30:56 +08:00
} ;
2018-05-11 09:29:43 +08:00
_this . currentObj = null ;
2018-05-14 10:01:06 +08:00
_this . theadKey = new Date ( ) . getTime ( ) ;
2018-05-11 11:30:56 +08:00
_this . drag = {
2018-12-02 16:53:06 +08:00
option : ''
2018-11-07 17:11:25 +08:00
} ;
2018-12-03 11:17:39 +08:00
_this . minWidth = 80 ; //确定最小宽度就是80
2018-12-02 16:53:06 +08:00
_this . table = null ;
2018-12-18 19:32:36 +08:00
_this . _thead = null ; //当前对象
2019-04-25 14:19:48 +08:00
_this . event = false ; //避免多次绑定问题
2018-05-11 09:29:43 +08:00
return _this ;
2017-01-12 08:53:51 +08:00
}
2018-12-02 16:53:06 +08:00
TableHeader . prototype . componentDidUpdate = function componentDidUpdate ( ) {
this . initTable ( ) ;
this . initEvent ( ) ;
} ;
2018-11-16 14:51:40 +08:00
2019-04-22 10:24:52 +08:00
TableHeader . prototype . componentDidMount = function componentDidMount ( ) {
var uid = "_table_uid_" + new Date ( ) . getTime ( ) ;
this . _table _none _cont _id = uid ;
var div = getDiv ( uid ) ;
document . querySelector ( "body" ) . appendChild ( div ) ;
2019-04-19 11:02:20 +08:00
} ;
2019-03-20 12:38:43 +08:00
TableHeader . prototype . componentWillUnmount = function componentWillUnmount ( ) {
2019-03-25 10:45:05 +08:00
if ( ! this . table ) return ;
2019-03-20 17:41:06 +08:00
if ( this . props . draggable ) {
this . removeDragAbleEvent ( ) ;
}
if ( this . props . dragborder ) {
this . removeDragBorderEvent ( ) ;
}
2019-04-23 16:43:34 +08:00
this . eventListen ( [ { key : 'mousedown' , fun : this . onTrMouseDown } ] , 'remove' , this . table . tr [ 0 ] ) ;
2018-12-02 16:53:06 +08:00
} ;
2018-11-16 14:51:40 +08:00
2018-12-02 16:53:06 +08:00
/ * *
* 获取table的属性存放在this . table 中 。 ( 公用方法 )
2018-12-18 19:32:36 +08:00
* @ returns
* @ memberof TableHeader
2018-12-02 16:53:06 +08:00
* /
TableHeader . prototype . initTable = function initTable ( ) {
2019-03-20 12:38:43 +08:00
var contentTable = this . props . contentTable ;
2018-12-02 16:53:06 +08:00
if ( ! this . props . dragborder && ! this . props . draggable ) return ;
2018-12-18 19:32:36 +08:00
var tableDome = this . _thead . parentNode ;
2018-12-02 16:53:06 +08:00
var table = { } ;
if ( tableDome && tableDome . nodeName && tableDome . nodeName . toUpperCase ( ) == "TABLE" ) {
table . table = tableDome ;
table . cols = tableDome . getElementsByTagName ( "col" ) ;
table . ths = tableDome . getElementsByTagName ( "th" ) ;
2019-04-19 11:02:20 +08:00
table . tr = tableDome . getElementsByTagName ( "tr" ) ;
2018-12-02 16:53:06 +08:00
}
2019-03-20 12:38:43 +08:00
table . fixedLeftHeaderTable = contentTable . querySelector ( '.u-table-fixed-left .u-table-header' ) ;
table . fixedRighHeadertTable = contentTable . querySelector ( '.u-table-fixed-right .u-table-header' ) ;
table . contentTableHeader = contentTable . querySelector ( '.u-table-scroll .u-table-header' ) ;
table . fixedLeftBodyTable = contentTable . querySelector ( '.u-table-fixed-left .u-table-body-outer' ) ;
table . fixedRightBodyTable = contentTable . querySelector ( '.u-table-fixed-right .u-table-body-outer' ) ;
table . innerTableBody = contentTable . querySelector ( '.u-table-scroll .u-table-body table' ) ;
2018-12-02 16:53:06 +08:00
this . table = table ;
if ( ! this . props . dragborder ) return ;
if ( document . getElementById ( "u-table-drag-thead-" + this . theadKey ) ) {
this . fixedTable = { } ;
var _fixedParentContext = document . getElementById ( "u-table-drag-thead-" + this . theadKey ) . parentNode ;
var siblingDom = _fixedParentContext . parentNode . nextElementSibling ;
if ( siblingDom ) {
var fixedTable = siblingDom . querySelector ( "table" ) ;
this . fixedTable . table = fixedTable ;
this . fixedTable . cols = fixedTable . getElementsByTagName ( "col" ) ;
// this.fixedTable.ths = fixedTable.tableDome.getElementsByTagName("th");
}
}
} ;
2019-04-19 11:02:20 +08:00
2019-02-26 16:57:47 +08:00
/ * *
2019-04-22 10:24:52 +08:00
* 事件初始化
2019-02-26 16:57:47 +08:00
* /
2018-12-02 16:53:06 +08:00
2019-04-22 10:24:52 +08:00
TableHeader . prototype . initEvent = function initEvent ( ) {
2019-04-25 14:19:48 +08:00
var _props = this . props ,
dragborder = _props . dragborder ,
draggable = _props . draggable ;
if ( ! this . event ) {
//避免多次绑定问题。
this . event = true ;
if ( dragborder ) {
this . dragBorderEventInit ( ) ; //列宽
}
if ( dragborder ) {
this . dragAbleEventInit ( ) ; //交换列
}
if ( this . table && this . table . tr ) {
this . eventListen ( [ { key : 'mousedown' , fun : this . onTrMouseDown } ] , '' , this . table . tr [ 0 ] ) ; //body mouseup
}
this . eventListen ( [ { key : 'mouseup' , fun : this . bodyonLineMouseUp } ] , '' , document . body ) ; //body mouseup
2019-04-23 16:43:34 +08:00
}
2019-04-19 11:02:20 +08:00
} ;
2018-12-18 19:32:36 +08:00
/ * *
2019-04-22 10:24:52 +08:00
* 拖拽列宽事件的监听
2018-12-18 19:32:36 +08:00
* /
2019-04-22 10:24:52 +08:00
TableHeader . prototype . dragBorderEventInit = function dragBorderEventInit ( ) {
2019-04-23 16:43:34 +08:00
if ( ! this . props . dragborder ) return ;
var events = [ { key : 'mouseup' , fun : this . onTrMouseUp } , { key : 'mousemove' , fun : this . onTrMouseMove } ] ;
2019-04-22 10:24:52 +08:00
this . eventListen ( events , '' , this . table . tr [ 0 ] ) ; //表示把事件添加到th元素上
2018-12-02 16:53:06 +08:00
} ;
2018-12-18 19:32:36 +08:00
/ * *
2019-04-22 16:02:32 +08:00
* 删除拖动改变列宽的事件监听
2018-12-18 19:32:36 +08:00
* /
2019-04-22 16:02:32 +08:00
TableHeader . prototype . removeDragBorderEvent = function removeDragBorderEvent ( ) {
2019-04-23 16:43:34 +08:00
var events = [ { key : 'mouseup' , fun : this . onTrMouseUp } , { key : 'mousemove' , fun : this . onTrMouseMove } ] ;
2019-04-22 16:02:32 +08:00
this . eventListen ( events , 'remove' , this . table . tr [ 0 ] ) ;
} ;
2019-04-22 10:24:52 +08:00
TableHeader . prototype . eventListen = function eventListen ( events , type , eventSource ) {
2019-04-23 16:43:34 +08:00
if ( ! this . table ) return ;
2019-04-22 10:24:52 +08:00
var tr = this . table . tr ;
2018-12-18 19:32:36 +08:00
2018-12-02 16:53:06 +08:00
for ( var i = 0 ; i < events . length ; i ++ ) {
var _event = events [ i ] ;
2019-04-22 10:24:52 +08:00
if ( type === "remove" ) {
_utils . EventUtil . removeHandler ( eventSource , _event . key , _event . fun ) ;
2018-12-02 16:53:06 +08:00
} else {
2019-04-22 10:24:52 +08:00
_utils . EventUtil . addHandler ( eventSource , _event . key , _event . fun ) ;
2018-12-02 16:53:06 +08:00
}
2018-11-16 14:51:40 +08:00
}
2018-12-02 16:53:06 +08:00
} ;
2018-12-18 19:32:36 +08:00
/ * *
2019-02-26 16:57:47 +08:00
*
2019-04-22 10:24:52 +08:00
* 根据 data - type 来获取当前拖拽的对象的Object , 如果为null表示拖动的对象并非是online
2018-12-18 19:32:36 +08:00
* @ memberof TableHeader
* /
/ * *
2019-04-22 10:24:52 +08:00
* 调整列宽的down事件
* @ memberof TableHeader
* /
2018-12-18 19:32:36 +08:00
/ * *
2019-04-22 10:24:52 +08:00
* 调整列宽的move事件
2018-12-18 19:32:36 +08:00
* @ memberof TableHeader
* /
2018-12-02 16:53:06 +08:00
2018-12-18 19:32:36 +08:00
/ * *
2019-04-22 10:24:52 +08:00
* 调整列宽的up事件
* @ memberof TableHeader
* /
2018-12-02 16:53:06 +08:00
2019-04-22 10:24:52 +08:00
TableHeader . prototype . mouseClear = function mouseClear ( ) {
2018-12-05 12:39:29 +08:00
if ( ! this . drag || ! this . drag . option ) return ;
var rows = this . props . rows ;
var data = { rows : rows [ 0 ] , cols : this . table . cols , currIndex : this . drag . currIndex } ;
this . props . afterDragColWidth && this . props . afterDragColWidth ( data ) ;
2018-12-02 16:53:06 +08:00
this . drag = {
option : ""
} ;
2019-04-22 10:24:52 +08:00
this . clearThsDr ( ) ;
2018-12-02 16:53:06 +08:00
} ;
/ * *
2019-04-22 10:24:52 +08:00
* 当前对象上绑定全局事件 , 用于拖拽区域以外时的事件处理
* @ param { * } events
* @ param { * } type
* @ memberof TableHeader
* /
2018-12-18 19:32:36 +08:00
/ * *
2019-04-22 10:24:52 +08:00
* 相关 滚动条联动操作
*
2018-12-18 19:32:36 +08:00
* @ memberof TableHeader
* /
2019-04-22 10:24:52 +08:00
//---拖拽交换列代码----start-----
2018-12-18 19:32:36 +08:00
/ * *
* 添加换列的事件监听
2018-12-02 16:53:06 +08:00
* /
2019-04-22 10:24:52 +08:00
TableHeader . prototype . dragAbleEventInit = function dragAbleEventInit ( ) {
if ( ! this . props . draggable ) return ;
2018-12-02 16:53:06 +08:00
var events = [ { key : 'dragstart' , fun : this . onDragStart } , //用户开始拖动元素时触发
{ key : 'dragover' , fun : this . onDragOver } , //当某被拖动的对象在另一对象容器范围内拖动时触发此事件
2019-04-22 10:24:52 +08:00
{ key : 'drop' , fun : this . onDrop } , //在一个拖动过程中,释放鼠标键时触发此事件
2018-12-18 19:32:36 +08:00
2019-04-22 10:24:52 +08:00
{ key : 'dragenter' , fun : this . onDragEnter } , { key : 'dragend' , fun : this . onDragEnd } , { key : 'dragleave' , fun : this . onDragLeave } ] ;
this . eventListen ( events , '' , this . table . tr [ 0 ] ) ; //表示把事件添加到th元素上
2018-12-02 16:53:06 +08:00
} ;
2018-12-18 19:32:36 +08:00
/ * *
* 删除换列的事件监听
* /
2018-12-02 16:53:06 +08:00
TableHeader . prototype . removeDragAbleEvent = function removeDragAbleEvent ( ) {
2019-04-22 16:02:32 +08:00
var events = [ { key : 'dragstart' , fun : this . onDragStart } , { key : 'dragover' , fun : this . onDragOver } , { key : 'drop' , fun : this . onDrop } , { key : 'dragenter' , fun : this . onDragEnter } , { key : 'dragend' , fun : this . onDragEnd } , { key : 'dragleave' , fun : this . onDragLeave } ] ;
this . eventListen ( events , 'remove' , this . table . tr [ 0 ] ) ;
2018-12-02 16:53:06 +08:00
} ;
/ * *
2018-12-18 19:32:36 +08:00
* 开始调整交换列的事件
2018-12-02 16:53:06 +08:00
* /
2018-12-18 19:32:36 +08:00
2018-12-02 16:53:06 +08:00
/ * *
2019-04-22 10:24:52 +08:00
* 在一个拖动过程中 , 释放鼠标键时触发此事件 。 【 目标事件 】
* @ memberof TableHeader
* /
2018-12-02 16:53:06 +08:00
2018-12-18 19:32:36 +08:00
/ * *
* 获取当前th上的对象数据
* @ param { * } e
* @ returns
* @ memberof TableHeader
* /
2019-04-22 10:24:52 +08:00
TableHeader . prototype . getCurrentEventData = function getCurrentEventData ( th ) {
2018-12-03 16:03:32 +08:00
if ( ! th ) {
console . log ( " event target is not th ! " ) ;
return null ;
}
var key = th . getAttribute ( 'data-line-key' ) ;
2018-12-02 16:53:06 +08:00
var data = this . props . rows [ 0 ] . find ( function ( da ) {
return da . key == key ;
} ) ;
if ( data ) {
return data ;
} else {
console . log ( " getCurrentEventData data is null " ) ;
return null ;
}
} ;
//---拖拽列交换----end-----
2018-12-03 16:03:32 +08:00
2018-09-27 15:24:29 +08:00
/ * *
2018-11-29 23:29:26 +08:00
* 过滤输入后或下拉条件的回调函数
2018-09-27 15:24:29 +08:00
* /
2018-11-29 23:29:26 +08:00
2018-09-27 15:24:29 +08:00
/ * *
2018-11-29 23:29:26 +08:00
* 过滤行清除回调
2018-09-27 15:24:29 +08:00
* /
2018-11-29 23:29:26 +08:00
2018-09-27 15:24:29 +08:00
/ * *
2018-11-29 23:29:26 +08:00
* 过滤渲染的组件类型
2018-09-27 15:24:29 +08:00
* /
2017-01-12 08:53:51 +08:00
TableHeader . prototype . render = function render ( ) {
2018-11-21 22:38:32 +08:00
var _this2 = this ;
2018-05-11 09:29:43 +08:00
2019-04-25 14:19:48 +08:00
var _props2 = this . props ,
clsPrefix = _props2 . clsPrefix ,
rowStyle = _props2 . rowStyle ,
draggable = _props2 . draggable ,
dragborder = _props2 . dragborder ,
rows = _props2 . rows ,
filterable = _props2 . filterable ,
fixed = _props2 . fixed ,
lastShowIndex = _props2 . lastShowIndex ;
2018-12-18 19:32:36 +08:00
2017-01-12 08:53:51 +08:00
2018-11-07 17:11:25 +08:00
var attr = dragborder ? { id : "u-table-drag-thead-" + this . theadKey } : { } ;
2017-01-12 08:53:51 +08:00
return _react2 [ "default" ] . createElement (
2018-11-07 17:11:25 +08:00
"thead" ,
2018-12-18 19:32:36 +08:00
_extends ( { className : clsPrefix + "-thead" } , attr , { "data-theader-fixed" : "scroll" , ref : function ref ( _thead ) {
return _this2 . _thead = _thead ;
} } ) ,
2017-01-12 08:53:51 +08:00
rows . map ( function ( row , index ) {
2019-04-19 11:02:20 +08:00
var _rowLeng = row . length - 1 ;
2017-01-12 08:53:51 +08:00
return _react2 [ "default" ] . createElement (
2018-11-07 17:11:25 +08:00
"tr" ,
2019-04-25 15:44:18 +08:00
{ key : index , style : rowStyle , className : filterable && index == rows . length - 1 ? 'filterable' : '' } ,
2018-12-02 16:53:06 +08:00
row . map ( function ( da , columIndex , arr ) {
2018-11-07 17:11:25 +08:00
var thHover = da . drgHover ? " " + clsPrefix + "-thead th-drag-hover" : "" ;
2018-05-11 11:37:55 +08:00
delete da . drgHover ;
2018-11-07 17:11:25 +08:00
var fixedStyle = "" ;
var canDotDrag = "" ;
2018-12-06 21:03:05 +08:00
//主表格下、固定列或者是过滤行中含有固定列时添加该属性
if ( ! fixed && ( da . fixed || filterable && index == rows . length - 1 && rows [ 0 ] [ columIndex ] . fixed ) ) {
2018-12-20 09:41:51 +08:00
fixedStyle = " " + clsPrefix + "-row-fixed-columns-in-body" ;
2018-09-12 14:14:05 +08:00
}
2018-11-27 15:23:03 +08:00
2018-12-02 16:53:06 +08:00
if ( lastShowIndex == columIndex ) {
2018-11-07 17:11:25 +08:00
canDotDrag = "th-can-not-drag" ;
2018-09-12 14:14:05 +08:00
}
2019-01-17 18:42:57 +08:00
var thClassName = "" + da . className ? "" + da . className : '' ;
if ( da . textAlign ) {
2019-01-23 11:15:12 +08:00
thClassName += " text-" + da . textAlign + " " ;
2019-01-17 18:42:57 +08:00
}
delete da . textAlign ;
2019-01-11 10:11:25 +08:00
var keyTemp = { } ;
//避免key为undefined
2019-01-16 13:57:31 +08:00
// if(da.dataindex && da.key ===undefined ){
keyTemp . key = da . key || da . dataindex || index + '-' + columIndex ;
2019-01-16 15:18:20 +08:00
2019-01-16 13:57:31 +08:00
// }
2018-10-11 14:12:19 +08:00
if ( filterable && index == rows . length - 1 ) {
2018-12-02 16:53:06 +08:00
da . children = _this2 . filterRenderType ( da [ "filtertype" ] , da . dataindex , columIndex ) ;
2019-01-11 10:11:25 +08:00
if ( da . key === undefined ) {
2019-01-16 13:57:31 +08:00
keyTemp . key = keyTemp . key + '-filterable' ;
2019-01-11 10:11:25 +08:00
}
2018-10-15 14:59:53 +08:00
delete da . filterdropdownfocus ;
2018-10-11 14:12:19 +08:00
}
2019-01-16 13:57:31 +08:00
2018-12-02 16:53:06 +08:00
var thDefaultObj = { } ;
2019-01-17 18:42:57 +08:00
2018-12-02 16:53:06 +08:00
if ( draggable ) {
2019-02-18 14:54:33 +08:00
thClassName += " " + clsPrefix + "-thead th-drag " + thHover + " " ;
2018-12-02 16:53:06 +08:00
}
if ( dragborder ) {
2019-02-18 14:54:33 +08:00
thClassName += " " + clsPrefix + "-thead-th " + canDotDrag ;
2018-12-02 16:53:06 +08:00
}
2018-12-06 13:39:51 +08:00
thClassName += " " + fixedStyle ;
2018-12-02 16:53:06 +08:00
if ( ! da . fixed ) {
2018-11-16 14:51:40 +08:00
return _react2 [ "default" ] . createElement (
"th" ,
2019-04-22 10:24:52 +08:00
_extends ( { } , da , keyTemp , { className : thClassName , "data-th-fixed" : da . fixed , "data-line-key" : da . key ,
"data-line-index" : columIndex , "data-th-width" : da . width , "data-type" : "draggable" } ) ,
2018-11-16 14:51:40 +08:00
da . children ,
2019-04-22 10:24:52 +08:00
dragborder && columIndex != _rowLeng ? _react2 [ "default" ] . createElement (
2018-11-26 20:42:18 +08:00
"div" ,
2018-12-02 16:53:06 +08:00
{ ref : function ref ( el ) {
2018-11-26 20:42:18 +08:00
return _this2 . gap = el ;
2018-12-02 16:53:06 +08:00
} , "data-line-key" : da . key ,
"data-line-index" : columIndex , "data-th-width" : da . width ,
"data-type" : "online" , className : clsPrefix + "-thead-th-drag-gap" } ,
2019-04-22 10:24:52 +08:00
_react2 [ "default" ] . createElement ( "div" , { className : "online" } )
2018-12-02 16:53:06 +08:00
) : ""
2018-05-11 11:30:56 +08:00
) ;
2018-05-11 09:29:43 +08:00
} else {
2018-11-16 14:51:40 +08:00
thDefaultObj = _extends ( { } , da , {
2019-01-17 18:42:57 +08:00
className : thClassName + " " + fixedStyle
2018-11-16 14:51:40 +08:00
} ) ;
da . onClick ? thDefaultObj . onClick = function ( e ) {
da . onClick ( da , e ) ;
} : "" ;
2019-01-16 13:57:31 +08:00
return _react2 [ "default" ] . createElement ( "th" , _extends ( { } , thDefaultObj , keyTemp , { "data-th-fixed" : da . fixed } ) ) ;
2018-05-11 09:29:43 +08:00
}
2017-01-12 08:53:51 +08:00
} )
) ;
} )
) ;
} ;
return TableHeader ;
} ( _react . Component ) ;
2018-09-12 14:14:05 +08:00
TableHeader . defaultProps = {
contentWidthDiff : 0
} ;
2018-11-07 17:11:25 +08:00
2017-01-12 08:53:51 +08:00
TableHeader . propTypes = propTypes ;
exports [ "default" ] = TableHeader ;
2018-11-07 17:11:25 +08:00
module . exports = exports [ "default" ] ;