1、先将插件源码进行下载,新建 tableTree.js
文件,将源码放进去
2、将 tableTree.js
文件 配置之后,在需要使用的页面进行引入:
layui. define ( [ "tableTree" ] , function ( exports ) {
var tableTree = layui. tableTree;
var handleList = function ( ) {
let tableData = [ {
"pid" : "0" ,
"title" : "1" ,
"parentTitle" : null ,
"sid" : "1111111111" ,
"children" : null
} ,
{
"pid" : "1111111111" ,
"title" : "1-1" ,
"parentTitle" : "1" ,
"sid" : "2"
} ,
{
"pid" : "1111111111" ,
"title" : "1-2" ,
"parentTitle" : "1" ,
"sid" : "3"
} ,
{
"pid" : "0" ,
"title" : "2" ,
"parentTitle" : null ,
"sid" : "2222222"
} , {
"pid" : "0" ,
"title" : "3" ,
"parentTitle" : null ,
"sid" : "3333333"
} , {
"pid" : "0" ,
"title" : "4" ,
"parentTitle" : null ,
"sid" : "44444"
} , {
"pid" : "0" ,
"title" : "5" ,
"parentTitle" : null ,
"sid" : "5555"
} , {
"pid" : "5555" ,
"title" : "5" ,
"parentTitle" : "5" ,
"sid" : "6"
} ]
renderTable ( tableData)
}
var renderTable = function ( tableData ) {
tableTree. render ( {
id : 'test' ,
tree : {
iconIndex : 3 ,
isPidData : true ,
idName : 'sid' ,
pidName : 'pid' ,
openName : 'open' ,
} ,
elem : '#test' ,
skin : 'line'
, page : false
, limit : 100
, cols : [ [
{ field : 'sid' , hide : true } ,
{ type : 'radio' }
, { field : 'title' , title : '名称' , align : 'left' , width : 200 }
, {
field : 'opt' , title : '操作' , templet :
function ( item ) {
if ( item. sid < 100000 ) {
return '<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i> </a>'
}
return '<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i> </a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i></a>'
}
}
] ] ,
data : tableData,
done : function ( ) {
}
, event : true
} )
} ;
tableTree. on ( 'checkbox(LAY-model-manager)' , function ( obj ) {
var data = obj. data;
console. log ( '拿到的当前行的数据' , data)
} ) ;
tableTree. on ( "tool(LAY-model-manager)" , function ( obj ) {
var data = obj. data;
var layEvent = obj. event;
var tr = obj. tr;
if ( "del" === layEvent) {
console. log ( 删除的数据', data)
} else if ( "edit" === layEvent) {
console. log ( 操作的数据', data)
}
} ) ;
var Class = {
init : function ( ) {
handleList ( )
return this ;
} ,
} ;
}
) ;
效果图:
插件源码如下:
layui. define ( [ 'laytpl' , 'form' , 'util' ] , function ( exports ) {
var $ = layui. jquery;
var laytpl = layui. laytpl;
var form = layui. form;
var util = layui. util;
var device = layui. device ( ) ;
var MOD_NAME = 'treeTable' ;
var _instances = { } ;
var defaultOption = {
elem : undefined ,
cols : undefined ,
url : undefined ,
method : undefined ,
where : undefined ,
contentType : undefined ,
headers : undefined ,
parseData : undefined ,
request : { pidName : 'pid' } ,
toolbar : undefined ,
defaultToolbar : undefined ,
width : undefined ,
height : undefined ,
cellMinWidth : 90 ,
done : undefined ,
data : undefined ,
title : undefined ,
skin : undefined ,
even : undefined ,
size : undefined ,
text : {
none : '无数据'
} ,
reqData : undefined ,
useAdmin : false ,
tree : {
idName : 'id' ,
pidName : 'pid' ,
childName : 'children' ,
haveChildName : 'haveChild' ,
openName : 'open' ,
iconIndex : 0 ,
arrowType : undefined ,
onlyIconControl : undefined ,
getIcon : function ( d ) {
var haveChild = d[ this . haveChildName] ;
if ( haveChild !== undefined ) haveChild = haveChild === true || haveChild === 'true' ;
else if ( d[ this . childName] ) haveChild = d[ this . childName] . length > 0 ;
if ( haveChild) return '<i class="ew-tree-icon layui-icon layui-icon-layer"></i>' ;
else return '<i class="ew-tree-icon layui-icon layui-icon-file"></i>' ;
}
}
} ;
var colDefaultOption = {
field : undefined ,
title : undefined ,
width : undefined ,
minWidth : undefined ,
type : 'normal' ,
fixed : undefined ,
hide : undefined ,
unresize : undefined ,
style : undefined ,
align : undefined ,
colspan : undefined ,
rowspan : undefined ,
templet : undefined ,
toolbar : undefined ,
'class' : undefined ,
singleLine : undefined
} ;
var TreeTable = function ( options ) {
_instances[ options. elem. substring ( 1 ) ] = this ;
this . reload ( options) ;
} ;
TreeTable . prototype. initOptions = function ( opt ) {
var that = this ;
function initCol ( item ) {
if ( ! item. INIT_OK ) item = $. extend ( { INIT_OK : true } , colDefaultOption, item) ;
if ( item. type === 'space' ) {
if ( ! item. width) item. width = 15 ;
item. minWidth = item. width;
} else if ( item. type === 'numbers' ) {
if ( ! item. width) item. width = 40 ;
item. minWidth = item. width;
if ( ! item. singleLine) item. singleLine = false ;
if ( ! item. unresize) item. unresize = true ;
if ( ! item. align) item. align = 'center' ;
} else if ( item. type === 'checkbox' || item. type === 'radio' ) {
if ( ! item. width) item. width = 48 ;
item. minWidth = item. width;
if ( ! item. singleLine) item. singleLine = false ;
if ( ! item. unresize) item. unresize = true ;
if ( ! item. align) item. align = 'center' ;
}
if ( item. toolbar) item. type = 'tool' ;
return item;
}
if ( 'Array' !== isClass ( opt. cols[ 0 ] ) ) opt. cols = [ opt. cols] ;
for ( var m = 0 ; m < opt. cols. length; m++ ) {
for ( var n = 0 ; n < opt. cols[ m] . length; n++ ) {
opt. cols[ m] [ n] . INIT_OK = undefined ;
opt. cols[ m] [ n] . key = undefined ;
opt. cols[ m] [ n] . colGroup = undefined ;
opt. cols[ m] [ n] . HAS_PARENT = undefined ;
opt. cols[ m] [ n] . parentKey = undefined ;
opt. cols[ m] [ n] . PARENT_COL_INDEX = undefined ;
}
}
var colArrays = [ ] , colIndex = 0 ;
for ( var i1 = 0 ; i1 < opt. cols. length; i1++ ) {
var item1 = opt. cols[ i1] ;
for ( var i2 = 0 ; i2 < item1. length; i2++ ) {
var item2 = item1[ i2] ;
if ( ! item2) {
item1. splice ( i2, 1 ) ;
continue ;
}
item2 = initCol ( item2) ;
item2. key = i1 + '-' + i2;
var CHILD_COLS = undefined ;
if ( item2. colGroup || item2. colspan > 1 ) {
item2. colGroup = true ;
item2. type = 'group' ;
CHILD_COLS = [ ] ;
colIndex++ ;
var childIndex = 0 ;
for ( var i22 = 0 ; i22 < opt. cols[ i1 + 1 ] . length; i22++ ) {
var item22 = $. extend ( { INIT_OK : true } , colDefaultOption, opt. cols[ i1 + 1 ] [ i22] ) ;
if ( item22. HAS_PARENT || ( childIndex > 1 && childIndex == item2. colspan) ) {
opt. cols[ i1 + 1 ] [ i22] = item22;
continue ;
}
item22. HAS_PARENT = true ;
item22. parentKey = i1 + '-' + i2;
item22. key = ( i1 + 1 ) + '-' + i22;
item22. PARENT_COL_INDEX = colIndex;
item22 = initCol ( item22) ;
CHILD_COLS . push ( item22) ;
childIndex = childIndex + parseInt ( item22. colspan > 1 ? item22. colspan : 1 ) ;
opt. cols[ i1 + 1 ] [ i22] = item22;
}
}
item2. CHILD_COLS = CHILD_COLS ;
if ( ! item2. PARENT_COL_INDEX ) colArrays. push ( item2) ;
opt. cols[ i1] [ i2] = item2;
}
}
this . options = $. extend ( true , { } , defaultOption, opt) ;
this . options. colArrays = colArrays;
if ( this . options. url) {
this . options. reqData = function ( data, callback ) {
if ( ! that. options. where) that. options. where = { } ;
if ( data) that. options. where[ that. options. request. pidName] = data[ that. options. tree. idName] ;
( that. options. useAdmin ? layui. admin : $) . ajax ( {
url : that. options. url,
data : that. options. contentType && that. options. contentType. indexOf ( 'application/json' ) === 0 ? JSON . stringify ( that. options. where) : that. options. where,
headers : that. options. headers,
type : that. options. method,
dataType : 'json' ,
contentType : that. options. contentType,
success : function ( res ) {
if ( that. options. parseData) res = that. options. parseData ( res) ;
if ( res. code == 0 ) callback ( res. data) ;
else callback ( res. msg || '加载失败' ) ;
} ,
error : function ( xhr ) {
callback ( xhr. status + ' - ' + xhr. statusText) ;
}
} ) ;
} ;
} else if ( this . options. data && this . options. data. length > 0 && this . options. tree. isPidData) {
this . options. data = tt. pidToChildren ( this . options. data, this . options. tree. idName, this . options. tree. pidName, this . options. tree. childName) ;
}
if ( 'default' === this . options. toolbar) {
this . options. toolbar = [
'<div>' ,
' <div class="ew-tree-table-tool-item" title="添加" lay-event="add">' ,
' <i class="layui-icon layui-icon-add-1"></i>' ,
' </div>' ,
' <div class="ew-tree-table-tool-item" title="修改" lay-event="update">' ,
' <i class="layui-icon layui-icon-edit"></i>' ,
' </div>' ,
' <div class="ew-tree-table-tool-item" title="删除" lay-event="delete">' ,
' <i class="layui-icon layui-icon-delete"></i>' ,
' </div>' ,
'</div>'
] . join ( '' ) ;
}
if ( this . options. defaultToolbar === undefined ) this . options. defaultToolbar = [ 'filter' , 'exports' , 'print' ] ;
if ( typeof this . options. tree. getIcon === 'string' ) {
var icon = this . options. tree. getIcon;
this . options. tree. getIcon = function ( d ) {
if ( icon !== 'ew-tree-icon-style2' ) return icon;
var haveChild = d[ this . haveChildName] ;
if ( haveChild !== undefined ) haveChild = haveChild === true || haveChild === 'true' ;
else if ( d[ this . childName] ) haveChild = d[ this . childName] . length > 0 ;
if ( haveChild) return '<i class="ew-tree-icon ew-tree-icon-folder"></i>' ;
else return '<i class="ew-tree-icon ew-tree-icon-file"></i>' ;
}
}
} ;
TreeTable . prototype. init = function ( ) {
var options = this . options;
var $elem = $ ( options. elem) ;
var tbFilter = options. elem. substring ( 1 ) ;
$elem. removeAttr ( 'lay-filter' ) ;
if ( $elem. next ( '.ew-tree-table' ) . length === 0 ) {
$elem. css ( 'display' , 'none' ) ;
$elem. after ( [
'<div class="layui-form ew-tree-table" lay-filter="' , tbFilter, '" style="' , options. style || '' , '">' ,
' <div class="ew-tree-table-tool" style="display: none;"></div>' ,
' <div class="ew-tree-table-head">' ,
' <table class="layui-table"></table>' ,
' </div>' ,
' <div class="ew-tree-table-box">' ,
' <table class="layui-table"></table>' ,
' <div class="ew-tree-table-loading">' ,
' <i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>' ,
' </div>' ,
' <div class="ew-tree-table-empty">' , options. text. none || '' , '</div>' ,
' </div>' ,
'</div>'
] . join ( '' ) ) ;
}
var components = this . getComponents ( ) ;
if ( options. skin) components. $table. attr ( 'lay-skin' , options. skin) ;
if ( options. size) components. $table. attr ( 'lay-size' , options. size) ;
if ( options. even) components. $table. attr ( 'lay-even' , options. even) ;
components. $toolbar. empty ( ) ;
if ( options. toolbar === false || options. toolbar === undefined ) {
components. $toolbar. hide ( ) ;
} else {
components. $toolbar. show ( ) ;
if ( typeof options. toolbar === 'string' ) {
laytpl ( $ ( options. toolbar) . html ( ) ) . render ( { } , function ( html ) {
components. $toolbar. html ( '<div style="display: inline-block;">' + html + '</div>' ) ;
} ) ;
}
var tbRights = [ '<div class="ew-tree-table-tool-right">' ] ;
for ( var i = 0 ; i < options. defaultToolbar. length; i++ ) {
var tbItem;
if ( 'filter' === options. defaultToolbar[ i] ) {
tbItem = { title : '筛选' , layEvent : 'LAYTABLE_COLS' , icon : 'layui-icon-cols' } ;
} else if ( 'exports' === options. defaultToolbar[ i] ) {
tbItem = { title : '导出' , layEvent : 'LAYTABLE_EXPORT' , icon : 'layui-icon-export' } ;
} else if ( 'print' === options. defaultToolbar[ i] ) {
tbItem = { title : '打印' , layEvent : 'LAYTABLE_PRINT' , icon : 'layui-icon-print' } ;
} else {
tbItem = options. defaultToolbar[ i] ;
}
if ( tbItem) {
tbRights. push ( '<div class="ew-tree-table-tool-item"' ) ;
tbRights. push ( ' title="' + tbItem. title + '"' ) ;
tbRights. push ( ' lay-event="' + tbItem. layEvent + '">' ) ;
tbRights. push ( '<i class="layui-icon ' + tbItem. icon + '"></i></div>' ) ;
}
}
components. $toolbar. append ( tbRights. join ( '' ) + '</div>' ) ;
}
if ( options. width) {
components. $view. css ( 'width' , options. width) ;
components. $tHeadGroup. css ( 'width' , options. width) ;
components. $tBodyGroup. css ( 'width' , options. width) ;
}
var colgroupHtml = this . resize ( true ) ;
var headHtml = '<thead>' + this . renderBodyTh ( ) + '</thead>' ;
components. $tBodyGroup. children ( 'style' ) . remove ( ) ;
if ( options. height) {
components. $tHead. html ( colgroupHtml + headHtml) ;
components. $tBody. html ( colgroupHtml + '<tbody></tbody>' ) ;
if ( options. height. indexOf ( 'full-' ) === 0 ) {
var h = parseFloat ( options. height. substring ( 5 ) ) + components. $toolbar. outerHeight ( )
+ components. $tHeadGroup. outerHeight ( ) + 1 ;
components. $tBodyGroup. append ( [
'<style>[lay-filter="' , tbFilter, '"] .ew-tree-table-box {' ,
' height: ' , getPageHeight ( ) - h, 'px;' ,
' height: -moz-calc(100vh - ' , h, 'px);' ,
' height: -webkit-calc(100vh - ' , h, 'px);' ,
' height: calc(100vh - ' , h, 'px);' ,
'}</style>'
] . join ( '' ) ) ;
components. $tBodyGroup. data ( 'full' , h) ;
components. $tBodyGroup. css ( 'height' , '' ) ;
} else {
components. $tBodyGroup. css ( 'height' , options. height) ;
components. $tBodyGroup. data ( 'full' , '' ) ;
}
components. $tHeadGroup. show ( ) ;
} else {
components. $tHeadGroup. hide ( ) ;
var trH = { lg : 50 , sm : 30 , md : 38 } ;
components. $tBodyGroup. append ( [
'<style>[lay-filter="' , tbFilter, '"] .ew-tree-table-box:before {' ,
' content: "";' ,
' position: absolute;' ,
' top: 0; left: 0; right: 0;' ,
' height: ' + ( trH[ options. size || 'md' ] * options. cols. length) + 'px;' ,
' background-color: #f2f2f2;' ,
' border-bottom: 1px solid #e6e6e6;' ,
'}</style>'
] . join ( '' ) ) ;
components. $tBody. html ( colgroupHtml + headHtml + '<tbody></tbody>' ) ;
}
form. render ( 'checkbox' , tbFilter) ;
function patchHide ( $tr ) {
var parentKey = $tr. data ( 'parent' ) , pCol;
if ( ! parentKey) return ;
var $parent = components. $table. children ( 'thead' ) . children ( 'tr' ) . children ( '[data-key="' + parentKey + '"]' ) ;
var colspan = $parent. attr ( 'colspan' ) - 1 ;
$parent. attr ( 'colspan' , colspan) ;
if ( colspan === 0 ) $parent. addClass ( 'layui-hide' ) ;
patchHide ( $parent) ;
}
components. $table. children ( 'thead' ) . children ( 'tr' ) . children ( 'th.layui-hide' ) . each ( function ( ) {
patchHide ( $ ( this ) ) ;
} ) ;
if ( options. reqData) {
this . options. data = undefined ;
this . renderBodyAsync ( ) ;
} else if ( options. data && options. data. length > 0 ) {
this . renderBodyData ( options. data) ;
} else {
components. $loading. hide ( ) ;
components. $empty. show ( ) ;
}
} ;
TreeTable . prototype. bindEvents = function ( ) {
var that = this ;
var options = this . options;
var components = this . getComponents ( ) ;
var $allBody = components. $table. children ( 'tbody' ) ;
var member = function ( ext ) {
var $tr = $ ( this ) ;
if ( ! $tr. is ( 'tr' ) ) {
var $temp = $tr. parent ( 'tr' ) ;
if ( $temp. length > 0 ) $tr = $temp;
else $tr = $tr. parentsUntil ( 'tr' ) . last ( ) . parent ( ) ;
}
var data = that. getDataByTr ( $tr) ;
var obj = {
tr : $tr,
data : data,
del : function ( ) {
var index = $tr. data ( 'index' ) ;
var indent = parseInt ( $tr. data ( 'indent' ) ) ;
$tr. nextAll ( 'tr' ) . each ( function ( ) {
if ( parseInt ( $ ( this ) . data ( 'indent' ) ) <= indent) return false ;
$ ( this ) . remove ( ) ;
} ) ;
var indexLength = ( typeof index === 'number' ? 1 : index. split ( '-' ) . length) ;
$tr. nextAll ( 'tr' ) . each ( function ( ) {
var $this = $ ( this ) ;
if ( parseInt ( $this . data ( 'indent' ) ) < indent) return false ;
var _index = $this . data ( 'index' ) . toString ( ) . split ( '-' ) ;
_index[ indexLength - 1 ] = parseInt ( _index[ indexLength - 1 ] ) - 1 ;
$this . data ( 'index' , _index. join ( '-' ) ) ;
} ) ;
var $pTr = $tr. prevAll ( 'tr' ) ;
that. del ( undefined , index) ;
$tr. remove ( ) ;
that. renderNumberCol ( ) ;
$pTr. each ( function ( ) {
var tInd = parseInt ( $ ( this ) . data ( 'indent' ) ) ;
if ( tInd >= indent) return true ;
that. checkParentCB ( $ ( this ) ) ;
indent = tInd;
} ) ;
that. checkChooseAllCB ( ) ;
if ( options. data. length === 0 ) components. $empty. show ( ) ;
updateFixedTbHead ( components. $view) ;
} ,
update : function ( fields ) {
data = $. extend ( true , data, fields) ;
var indent = parseInt ( $tr. data ( 'indent' ) ) ;
that. renderBodyTr ( data, indent, undefined , $tr) ;
form. render ( null , components. filter) ;
that. renderNumberCol ( ) ;
$tr. prevAll ( 'tr' ) . each ( function ( ) {
var tInd = parseInt ( $ ( this ) . data ( 'indent' ) ) ;
if ( tInd >= indent) return true ;
that. checkParentCB ( $ ( this ) ) ;
indent = tInd;
} ) ;
that. checkChooseAllCB ( ) ;
}
} ;
return $. extend ( obj, ext) ;
} ;
$allBody. off ( 'click.fold' ) . on ( 'click.fold' , '.ew-tree-pack' , function ( e ) {
layui. stope ( e) ;
var $tr = $ ( this ) . parentsUntil ( 'tr' ) . last ( ) . parent ( ) ;
if ( $tr. hasClass ( 'ew-tree-table-loading' ) ) return ;
var haveChild = $tr. data ( 'have-child' ) ;
if ( haveChild !== true && haveChild !== 'true' ) return ;
var open = $tr. hasClass ( 'ew-tree-table-open' ) ;
var data = that. getDataByTr ( $tr) ;
if ( ! open && ! data[ options. tree. childName] ) {
that. renderBodyAsync ( data, $tr) ;
} else {
data[ options. tree. openName] = toggleRow ( $tr) ;
}
} ) ;
$allBody. off ( 'click.tool' ) . on ( 'click.tool' , '*[lay-event]' , function ( e ) {
layui. stope ( e) ;
var $this = $ ( this ) ;
layui. event . call ( this , MOD_NAME , 'tool(' + components. filter + ')' , member . call ( this , {
event : $this . attr ( 'lay-event' )
} ) ) ;
} ) ;
form. on ( 'radio(' + components. radioFilter + ')' , function ( data ) {
var d = that. getDataByTr ( $ ( data. elem) . parentsUntil ( 'tr' ) . last ( ) . parent ( ) ) ;
that. removeAllChecked ( ) ;
d. LAY_CHECKED = true ;
d. LAY_INDETERMINATE = false ;
layui. event . call ( this , MOD_NAME , 'checkbox(' + components. filter + ')' ,
{ checked : true , data : d, type : 'one' } ) ;
} ) ;
form. on ( 'checkbox(' + components. checkboxFilter + ')' , function ( data ) {
var checked = data. elem. checked;
var $cb = $ ( data. elem) ;
var $layCb = $cb. next ( '.layui-form-checkbox' ) ;
if ( ! checked && $cb. hasClass ( 'ew-form-indeterminate' ) ) {
checked = true ;
$cb. prop ( 'checked' , checked) ;
$layCb. addClass ( 'layui-form-checked' ) ;
$cb. removeClass ( 'ew-form-indeterminate' ) ;
}
var $tr = $cb. parentsUntil ( 'tr' ) . last ( ) . parent ( ) ;
var d = that. getDataByTr ( $tr) ;
d. LAY_CHECKED = checked;
d. LAY_INDETERMINATE = false ;
if ( d[ options. tree. childName] && d[ options. tree. childName] . length > 0 ) {
that. checkSubCB ( $tr, checked) ;
}
var indent = parseInt ( $tr. data ( 'indent' ) ) ;
$tr. prevAll ( 'tr' ) . each ( function ( ) {
var tInd = parseInt ( $ ( this ) . data ( 'indent' ) ) ;
if ( tInd < indent) {
that. checkParentCB ( $ ( this ) ) ;
indent = tInd;
}
} ) ;
that. checkChooseAllCB ( ) ;
layui. event . call ( this , MOD_NAME , 'checkbox(' + components. filter + ')' ,
{ checked : checked, data : d, type : 'more' } ) ;
} ) ;
form. on ( 'checkbox(' + components. chooseAllFilter + ')' , function ( data ) {
var checked = data. elem. checked;
var $cb = $ ( data. elem) ;
var $layCb = $cb. next ( '.layui-form-checkbox' ) ;
if ( ! options. data || options. data. length === 0 ) {
$cb. prop ( 'checked' , false ) ;
$layCb. removeClass ( 'layui-form-checked' ) ;
$cb. removeClass ( 'ew-form-indeterminate' ) ;
return ;
}
if ( ! checked && $cb. hasClass ( 'ew-form-indeterminate' ) ) {
checked = true ;
$cb. prop ( 'checked' , checked) ;
$layCb. addClass ( 'layui-form-checked' ) ;
$cb. removeClass ( 'ew-form-indeterminate' ) ;
}
layui. event . call ( this , MOD_NAME , 'checkbox(' + components. filter + ')' , { checked : checked, type : 'all' } ) ;
that. checkSubCB ( components. $tBody. children ( 'tbody' ) , checked) ;
} ) ;
$allBody. off ( 'click.row' ) . on ( 'click.row' , 'tr' , function ( ) {
layui. event . call ( this , MOD_NAME , 'row(' + components. filter + ')' , member . call ( this , { } ) ) ;
} ) ;
$allBody. off ( 'dblclick.rowDouble' ) . on ( 'dblclick.rowDouble' , 'tr' , function ( ) {
layui. event . call ( this , MOD_NAME , 'rowDouble(' + components. filter + ')' , member . call ( this , { } ) ) ;
} ) ;
$allBody. off ( 'click.cell' ) . on ( 'click.cell' , 'td' , function ( e ) {
var $td = $ ( this ) ;
var type = $td. data ( 'type' ) ;
if ( type === 'checkbox' || type === 'radio' ) return layui. stope ( e) ;
var edit = $td. data ( 'edit' ) ;
var field = $td. data ( 'field' ) ;
if ( edit) {
layui. stope ( e) ;
if ( $allBody. find ( '.ew-tree-table-edit' ) . length > 0 ) return ;
var index = $td. data ( 'index' ) ;
var indent = $td. find ( '.ew-tree-table-indent' ) . length;
var d = that. getDataByTr ( $td. parent ( ) ) ;
if ( 'text' === edit || 'number' === edit) {
var $input = $ ( '<input type="' + edit + '" class="layui-input ew-tree-table-edit"/>' ) ;
$input[ 0 ] . value = d[ field] ;
$td. append ( $input) ;
$input. focus ( ) ;
$input. blur ( function ( ) {
var value = $ ( this ) . val ( ) ;
if ( value == d[ field] ) return $ ( this ) . remove ( ) ;
var rs = layui. event . call ( this , MOD_NAME , 'edit(' + components. filter + ')' , member . call ( this ,
{ value : value, field : field} ) ) ;
if ( rs === false ) {
$ ( this ) . addClass ( 'layui-form-danger' ) ;
$ ( this ) . focus ( ) ;
} else {
d[ field] = value;
var keys = $td. data ( 'key' ) . split ( '-' ) ;
that. renderBodyTd ( d, indent, index, $td, options. cols[ keys[ 0 ] ] [ keys[ 1 ] ] ) ;
}
} ) ;
} else {
console. error ( '不支持的单元格编辑类型:' + edit) ;
}
} else {
var rs = layui. event . call ( this , MOD_NAME , 'cell(' + components. filter + ')' , member . call ( this ,
{ td : $td, field : field} ) ) ;
if ( rs === false ) layui. stope ( e) ;
}
} ) ;
$allBody. off ( 'dblclick.cellDouble' ) . on ( 'dblclick.cellDouble' , 'td' , function ( e ) {
var $td = $ ( this ) ;
var type = $td. data ( 'type' ) ;
if ( type === 'checkbox' || type === 'radio' ) return layui. stope ( e) ;
var edit = $td. data ( 'edit' ) ;
var field = $td. data ( 'field' ) ;
if ( edit) return layui. stope ( e) ;
var rs = layui. event . call ( this , MOD_NAME , 'cellDouble(' + components. filter + ')' , member . call ( this ,
{ td : $td, field : field} ) ) ;
if ( rs === false ) layui. stope ( e) ;
} ) ;
components. $toolbar. off ( 'click.toolbar' ) . on ( 'click.toolbar' , '*[lay-event]' , function ( e ) {
layui. stope ( e) ;
var $this = $ ( this ) ;
var event = $this . attr ( 'lay-event' ) ;
if ( 'LAYTABLE_COLS' === event) that. toggleCol ( ) ;
else if ( 'LAYTABLE_EXPORT' === event) that. exportData ( 'show' ) ;
else if ( 'LAYTABLE_PRINT' === event) that. printTable ( ) ;
else layui. event . call ( this , MOD_NAME , 'toolbar(' + components. filter + ')' , { event : event, elem : $this } ) ;
} ) ;
components. $tBodyGroup. on ( 'scroll' , function ( ) {
var $this = $ ( this ) ;
components. $tHeadGroup. scrollLeft ( $this . scrollLeft ( ) ) ;
} ) ;
components. $toolbar. off ( 'click.export' ) . on ( 'click.export' , '.layui-table-tool-panel>[data-type]' , function ( ) {
var type = $ ( this ) . data ( 'type' ) ;
if ( 'csv' === type || 'xls' === type) that. exportData ( type) ;
} ) ;
components. $toolbar. off ( 'click.panel' ) . on ( 'click.panel' , '.layui-table-tool-panel' , function ( e ) {
layui. stope ( e) ;
} ) ;
form. on ( 'checkbox(' + components. colsToggleFilter + ')' , function ( data ) {
that. toggleCol ( data. elem. checked, undefined , data. value) ;
} ) ;
} ;
TreeTable . prototype. getComponents = function ( ) {
var $view = $ ( this . options. elem) . next ( '.ew-tree-table' ) ;
var filter = $view. attr ( 'lay-filter' ) ;
var $tHeadGroup = $view. children ( '.ew-tree-table-head' ) ;
var $tBodyGroup = $view. children ( '.ew-tree-table-box' ) ;
return {
$view : $view,
filter : filter,
$tHeadGroup : $tHeadGroup,
$tBodyGroup : $tBodyGroup,
$tHead : $tHeadGroup. children ( '.layui-table' ) ,
$tBody : $tBodyGroup. children ( '.layui-table' ) ,
$table : $view. find ( '.layui-table' ) ,
$toolbar : $view. children ( '.ew-tree-table-tool' ) ,
$empty : $tBodyGroup. children ( '.ew-tree-table-empty' ) ,
$loading : $tBodyGroup. children ( '.ew-tree-table-loading' ) ,
checkboxFilter : 'ew_tb_checkbox_' + filter,
radioFilter : 'ew_tb_radio_' + filter,
chooseAllFilter : 'ew_tb_choose_all_' + filter,
colsToggleFilter : 'ew_tb_toggle_cols' + filter
} ;
} ;
TreeTable . prototype. eachCols = function ( callback, obj ) {
if ( ! obj) obj = this . options. colArrays;
for ( var i = 0 ; i < obj. length; i++ ) {
var item = obj[ i] ;
callback && callback ( i, item) ;
if ( item. CHILD_COLS ) this . eachCols ( callback, item. CHILD_COLS ) ;
}
} ;
TreeTable . prototype. eachData = function ( callback, data ) {
if ( ! data) data = this . options. data;
for ( var i = 0 ; i < data. length; i++ ) {
var item = data[ i] ;
callback && callback ( i, item) ;
if ( item[ this . options. tree. childName] ) this . eachData ( callback, item[ this . options. tree. childName] ) ;
}
} ;
TreeTable . prototype. renderBodyAsync = function ( d, $tr ) {
var that = this ;
var options = this . options;
var components = this . getComponents ( ) ;
if ( $tr) {
$tr. addClass ( 'ew-tree-table-loading' ) ;
$tr. find ( '.ew-tree-pack' ) . children ( '.ew-tree-table-arrow' ) . addClass ( 'layui-anim layui-anim-rotate layui-anim-loop' ) ;
} else {
components. $empty. hide ( ) ;
if ( options. data && options. data. length > 0 ) components. $loading. addClass ( 'ew-loading-float' ) ;
components. $loading. show ( ) ;
}
options. reqData ( d, function ( data ) {
if ( typeof data !== 'string' && data && data. length > 0 && options. tree. isPidData) {
data = tt. pidToChildren ( data, options. tree. idName, options. tree. pidName, options. tree. childName) ;
}
that. renderBodyData ( data, d, $tr) ;
} ) ;
} ;
TreeTable . prototype. renderBodyData = function ( data, d, $tr ) {
var msg;
if ( typeof data === 'string' ) {
msg = data;
data = [ ] ;
}
var that = this ;
var options = this . options;
var components = this . getComponents ( ) ;
if ( d === undefined ) options. data = data;
else d[ options. tree. childName] = data;
var indent;
if ( $tr) {
indent = parseInt ( $tr. data ( 'indent' ) ) + 1 ;
d[ options. tree. openName] = true ;
}
var htmlStr = this . renderBody ( data, indent, d) ;
if ( $tr) {
$tr. nextAll ( 'tr' ) . each ( function ( ) {
if ( parseInt ( $ ( this ) . data ( 'indent' ) ) <= ( indent - 1 ) ) return false ;
$ ( this ) . remove ( ) ;
} ) ;
$tr. after ( htmlStr) . addClass ( 'ew-tree-table-open' ) ;
} else {
components. $tBody. children ( 'tbody' ) . html ( htmlStr) ;
}
form. render ( null , components. filter) ;
this . renderNumberCol ( ) ;
if ( $tr) {
this . checkParentCB ( $tr) ;
$tr. prevAll ( 'tr' ) . each ( function ( ) {
var tInd = parseInt ( $ ( this ) . data ( 'indent' ) ) ;
if ( tInd < ( indent - 1 ) ) {
that. checkParentCB ( $ ( this ) ) ;
indent = tInd + 1 ;
}
} ) ;
$tr. removeClass ( 'ew-tree-table-loading' ) ;
var $arrow = $tr. find ( '.ew-tree-pack' ) . children ( '.ew-tree-table-arrow' ) ;
$arrow. removeClass ( 'layui-anim layui-anim-rotate layui-anim-loop' ) ;
if ( msg) {
$tr. removeClass ( 'ew-tree-table-open' ) ;
} else if ( data && data. length === 0 ) {
d[ options. tree. haveChildName] = false ;
$tr. data ( 'have-child' , false ) ;
$arrow. addClass ( 'ew-tree-table-arrow-hide' ) ;
$arrow. next ( '.ew-tree-icon' ) . after ( options. tree. getIcon ( d) ) . remove ( ) ;
}
} else {
components. $loading. hide ( ) ;
components. $loading. removeClass ( 'ew-loading-float' ) ;
if ( data && data. length > 0 ) {
components. $empty. hide ( ) ;
} else {
components. $empty. show ( ) ;
if ( msg) components. $empty. text ( msg) ;
else components. $empty. html ( options. text. none) ;
}
}
this . checkChooseAllCB ( ) ;
updateFixedTbHead ( components. $view) ;
options. done && options. done ( data) ;
} ;
TreeTable . prototype. renderBody = function ( data, indent, parent, h ) {
var options = this . options;
if ( ! indent) indent = 0 ;
var html = '' ;
if ( ! data || data. length === 0 ) return html;
var hide = parent ? ! parent[ options. tree. openName] : undefined ;
if ( h) hide = h;
for ( var i = 0 ; i < data. length; i++ ) {
var d = data[ i] ;
d. LAY_INDEX = ( parent ? parent. LAY_INDEX + '-' : '' ) + i;
html += this . renderBodyTr ( d, indent, hide) ;
html += this . renderBody ( d[ options. tree. childName] , indent + 1 , d, h) ;
}
return html;
} ;
TreeTable . prototype. renderBodyTr = function ( d, indent, hide, $tr ) {
var that = this ;
var options = this . options;
if ( ! indent) indent = 0 ;
var haveChild = d[ options. tree. haveChildName] ;
if ( haveChild === undefined ) haveChild = d[ options. tree. childName] && d[ options. tree. childName] . length > 0 ;
if ( $tr) {
$tr. data ( 'have-child' , haveChild ? 'true' : 'false' ) ;
$tr. data ( 'indent' , indent) ;
$tr. removeClass ( 'ew-tree-table-loading' ) ;
}
var html = '<tr' ;
var classNames = '' ;
if ( haveChild && d[ options. tree. openName] ) classNames += 'ew-tree-table-open' ;
if ( hide) classNames += 'ew-tree-tb-hide' ;
html += ( ' class="' + classNames + '"' ) ;
if ( haveChild) html += ( ' data-have-child="' + haveChild + '"' ) ;
html += ( ' data-index="' + d. LAY_INDEX + '"' ) ;
html += ( ' data-indent="' + indent + '">' ) ;
var index = 0 ;
this . eachCols ( function ( i, col ) {
if ( col. colGroup) return ;
html += that. renderBodyTd ( d, indent, index, $tr ? $tr. children ( 'td' ) . eq ( index) : undefined , col) ;
index++ ;
} ) ;
html += '</tr>' ;
return html;
} ;
TreeTable . prototype. renderBodyTd = function ( d, indent, index, $td, col ) {
if ( ! col|| col. colGroup) return '' ;
var options = this . options;
var components = this . getComponents ( ) ;
if ( ! indent) indent = 0 ;
var content = '' , cell = '' , icon = '' ;
if ( col. type === 'numbers' ) {
content = '<span class="ew-tree-table-numbers"></span>' ;
} else if ( col. type === 'checkbox' ) {
content = [
'<input type="checkbox"' , d. LAY_CHECKED ? ' checked="checked"' : '' ,
' lay-filter="' , components. checkboxFilter, '"' ,
' lay-skin="primary" class="ew-tree-table-checkbox' ,
d. LAY_INDETERMINATE ? ' ew-form-indeterminate' : '' , '" />'
] . join ( '' ) ;
} else if ( col. type === 'radio' ) {
content = [
'<input type="radio"' , d. LAY_CHECKED ? ' checked="checked"' : '' ,
' lay-filter="' , components. radioFilter, '"' ,
' name="' , components. radioFilter, '"' ,
' class="ew-tree-table-radio" />'
] . join ( '' ) ;
} else if ( col. templet) {
if ( typeof col. templet === 'function' ) {
content = col. templet ( d) ;
} else if ( typeof col. templet === 'string' ) {
laytpl ( $ ( col. templet) . html ( ) ) . render ( d, function ( html ) {
content = html;
} ) ;
}
} else if ( col. toolbar) {
if ( typeof col. toolbar === 'function' ) {
content = col. toolbar ( d) ;
} else if ( typeof col. toolbar === 'string' ) {
laytpl ( $ ( col. toolbar) . html ( ) ) . render ( d, function ( html ) {
content = html;
} ) ;
}
} else if ( col. field && d[ col. field] !== undefined && d[ col. field] !== null ) {
content = util. escape ( d[ col. field] === 0 ? '0' : d[ col. field] ) ;
}
if ( index === options. tree. iconIndex) {
for ( var i = 0 ; i < indent; i++ ) icon += '<span class="ew-tree-table-indent"></span>' ;
icon += '<span class="ew-tree-pack">' ;
var haveChild = d[ options. tree. haveChildName] ;
if ( haveChild === undefined ) haveChild = d[ options. tree. childName] && d[ options. tree. childName] . length > 0 ;
icon += ( '<i class="ew-tree-table-arrow layui-icon' + ( haveChild ? '' : ' ew-tree-table-arrow-hide' ) ) ;
icon += ( ' ' + ( options. tree. arrowType || '' ) + '"></i>' ) ;
icon += options. tree. getIcon ( d) ;
content = '<span>' + content + '</span>' ;
if ( options. tree. onlyIconControl) content = icon + '</span>' + content;
else content = icon + content + '</span>' ;
}
cell = [
'<div class="ew-tree-table-cell' , col. singleLine === undefined || col. singleLine ? ' single-line' : '' , '"' ,
col. align ? ' align="' + col. align + '"' : '' ,
'>' ,
' <div class="ew-tree-table-cell-content">' , content, '</div>' ,
' <i class="layui-icon layui-icon-close ew-tree-tips-c"></i>' ,
' <div class="layui-table-grid-down" style="display: none;"><i class="layui-icon layui-icon-down"></i></div>' ,
'</div>'
] . join ( '' ) ;
if ( $td) $td. html ( cell) ;
var html = '<td' ;
if ( col. field) html += ( ' data-field="' + col. field + '"' ) ;
if ( col. edit) html += ( ' data-edit="' + col. edit + '"' ) ;
if ( col. type) html += ( ' data-type="' + col. type + '"' ) ;
if ( col. key) html += ( ' data-key="' + col. key + '"' ) ;
if ( col. style) html += ( ' style="' + col. style + '"' ) ;
if ( col[ 'class' ] ) html += ( ' class="' + col[ 'class' ] + ( col. hide ? ' layui-hide' : '' ) + '"' ) ;
else if ( col. hide) html += ( ' class="layui-hide"' ) ;
html += ( '>' + cell + '</td>' ) ;
return html;
} ;
TreeTable . prototype. renderBodyTh = function ( ) {
var options = this . options;
var components = this . getComponents ( ) ;
var html = [ ] ;
$. each ( options. cols, function ( i1, item1 ) {
html. push ( '<tr>' ) ;
$. each ( item1, function ( i2, item2 ) {
html. push ( '<th' ) ;
if ( item2. colspan) html. push ( ' colspan="' + item2. colspan + '"' ) ;
if ( item2. rowspan) html. push ( ' rowspan="' + item2. rowspan + '"' ) ;
if ( item2. type) html. push ( ' data-type="' + item2. type + '"' ) ;
if ( item2. key) html. push ( ' data-key="' + item2. key + '"' ) ;
if ( item2. parentKey) html. push ( ' data-parent="' + item2. parentKey + '"' ) ;
if ( item2. hide) html. push ( ' class="layui-hide"' ) ;
html. push ( '>' ) ;
html. push ( '<div class="ew-tree-table-cell' + ( item2. singleLine === undefined || item2. singleLine ? ' single-line' : '' ) + '"' ) ;
if ( item2. thAlign || item2. align) html. push ( ' align="' + ( item2. thAlign || item2. align) + '"' ) ;
html. push ( '>' ) ;
html. push ( '<div class="ew-tree-table-cell-content">' ) ;
var ca = '<input type="checkbox" lay-filter="' + components. chooseAllFilter + '" lay-skin="primary" class="ew-tree-table-checkbox"/>' ;
if ( item2. type === 'checkbox' ) html. push ( ca) ;
else html. push ( item2. title || '' ) ;
html. push ( '</div><i class="layui-icon layui-icon-close ew-tree-tips-c"></i>' ) ;
html. push ( '<div class="layui-table-grid-down" style="display: none;"><i class="layui-icon layui-icon-down"></i></div></div>' ) ;
if ( ! item2. colGroup && ! item2. unresize) html. push ( '<span class="ew-tb-resize"></span>' ) ;
html. push ( '</th>' ) ;
} ) ;
html. push ( '</tr>' ) ;
} ) ;
return html. join ( '' ) ;
} ;
TreeTable . prototype. resize = function ( returnColgroup ) {
var options = this . options;
var components = this . getComponents ( ) ;
var minWidth = 1 , width = 1 , needSetWidth = true , mwPercent = 0 ;
this . eachCols ( function ( i, item ) {
if ( item. colGroup || item. hide) return ;
if ( item. width) {
width += ( item. width + 1 ) ;
if ( item. minWidth) {
if ( item. width < item. minWidth) item. width = item. minWidth;
} else if ( item. width < options. cellMinWidth) item. width = options. cellMinWidth;
} else needSetWidth = false ;
if ( item. width) minWidth += ( item. width + 1 ) ;
else if ( item. minWidth) {
minWidth += ( item. minWidth + 1 ) ;
mwPercent += item. minWidth;
} else {
minWidth += ( options. cellMinWidth + 1 ) ;
mwPercent += options. cellMinWidth;
}
} ) ;
if ( minWidth) {
components. $tHead. css ( 'min-width' , minWidth) ;
components. $tBody. css ( 'min-width' , minWidth) ;
} else {
components. $tHead. css ( 'min-width' , 'auto' ) ;
components. $tBody. css ( 'min-width' , 'auto' ) ;
}
if ( needSetWidth) {
components. $tHead. css ( 'width' , width) ;
components. $tBody. css ( 'width' , width) ;
} else {
components. $tHead. css ( 'width' , '100%' ) ;
components. $tBody. css ( 'width' , '100%' ) ;
}
var colgroupHtml = [ ] ;
this . eachCols ( function ( i, item ) {
if ( item. colGroup || item. hide) return ;
colgroupHtml. push ( '<col' ) ;
if ( item. width) colgroupHtml. push ( ' width="' + item. width + '"' ) ;
else if ( item. minWidth) colgroupHtml. push ( ' width="' + ( item. minWidth / mwPercent * 100 ) . toFixed ( 2 ) + '%"' ) ;
else colgroupHtml. push ( ' width="' + ( options. cellMinWidth / mwPercent * 100 ) . toFixed ( 2 ) + '%"' ) ;
if ( item. type) colgroupHtml. push ( ' data-type="' + item. type + '"' ) ;
if ( item. key) colgroupHtml. push ( ' data-key="' + item. key + '"' ) ;
colgroupHtml. push ( '/>' ) ;
} ) ;
colgroupHtml = colgroupHtml. join ( '' ) ;
if ( returnColgroup) return '<colgroup>' + colgroupHtml + '</colgroup>' ;
components. $table. children ( 'colgroup' ) . html ( colgroupHtml) ;
} ;
TreeTable . prototype. getDataByTr = function ( $tr ) {
var data, index;
if ( typeof $tr !== 'string' && typeof $tr !== 'number' ) {
if ( $tr) index = $tr. data ( 'index' ) ;
} else index = $tr;
if ( index === undefined ) return ;
if ( typeof index === 'number' ) index = [ index] ;
else index = index. split ( '-' ) ;
for ( var i = 0 ; i < index. length; i++ ) {
if ( data) data = data[ this . options. tree. childName] [ index[ i] ] ;
else data = this . options. data[ index[ i] ] ;
}
return data;
} ;
TreeTable . prototype. checkSubCB = function ( $tr, checked ) {
var that = this ;
var components = this . getComponents ( ) ;
var indent = - 1 , $trList;
if ( $tr. is ( 'tbody' ) ) {
$trList = $tr. children ( 'tr' ) ;
} else {
indent = parseInt ( $tr. data ( 'indent' ) ) ;
$trList = $tr. nextAll ( 'tr' ) ;
}
$trList. each ( function ( ) {
if ( parseInt ( $ ( this ) . data ( 'indent' ) ) <= indent) return false ;
var $cb = $ ( this ) . children ( 'td' ) . find ( 'input[lay-filter="' + components. checkboxFilter + '"]' ) ;
$cb. prop ( 'checked' , checked) ;
$cb. removeClass ( 'ew-form-indeterminate' ) ;
if ( checked) $cb. next ( '.layui-form-checkbox' ) . addClass ( 'layui-form-checked' ) ;
else $cb. next ( '.layui-form-checkbox' ) . removeClass ( 'layui-form-checked' ) ;
var d = that. getDataByTr ( $ ( this ) ) ;
d. LAY_CHECKED = checked;
d. LAY_INDETERMINATE = false ;
} ) ;
} ;
TreeTable . prototype. checkParentCB = function ( $tr ) {
var options = this . options;
var components = this . getComponents ( ) ;
var d = this . getDataByTr ( $tr) ;
var ckNum = 0 , unCkNum = 0 ;
if ( d[ options. tree. childName] ) {
function checkNum ( data ) {
for ( var i = 0 ; i < data. length; i++ ) {
if ( data[ i] . LAY_CHECKED ) ckNum++ ;
else unCkNum++ ;
if ( data[ i] [ options. tree. childName] ) checkNum ( data[ i] [ options. tree. childName] ) ;
}
}
checkNum ( d[ options. tree. childName] ) ;
}
var $cb = $tr. children ( 'td' ) . find ( 'input[lay-filter="' + components. checkboxFilter + '"]' ) ;
if ( ckNum > 0 && unCkNum === 0 ) {
$cb. prop ( 'checked' , true ) ;
$cb. removeClass ( 'ew-form-indeterminate' ) ;
$cb. next ( '.layui-form-checkbox' ) . addClass ( 'layui-form-checked' ) ;
d. LAY_CHECKED = true ;
d. LAY_INDETERMINATE = false ;
} else if ( ckNum === 0 && unCkNum > 0 ) {
$cb. prop ( 'checked' , false ) ;
$cb. removeClass ( 'ew-form-indeterminate' ) ;
$cb. next ( '.layui-form-checkbox' ) . removeClass ( 'layui-form-checked' ) ;
d. LAY_CHECKED = false ;
d. LAY_INDETERMINATE = false ;
} else if ( ckNum > 0 && unCkNum > 0 ) {
$cb. prop ( 'checked' , true ) ;
$cb. data ( 'indeterminate' , 'true' ) ;
$cb. addClass ( 'ew-form-indeterminate' ) ;
$cb. next ( '.layui-form-checkbox' ) . addClass ( 'layui-form-checked' ) ;
d. LAY_CHECKED = true ;
d. LAY_INDETERMINATE = true ;
}
} ;
TreeTable . prototype. checkChooseAllCB = function ( ) {
var options = this . options;
var components = this . getComponents ( ) ;
var ckNum = 0 , unCkNum = 0 ;
function checkNum ( data ) {
for ( var i = 0 ; i < data. length; i++ ) {
if ( data[ i] . LAY_CHECKED ) ckNum++ ;
else unCkNum++ ;
if ( data[ i] [ options. tree. childName] ) checkNum ( data[ i] [ options. tree. childName] ) ;
}
}
checkNum ( options. data) ;
var $cb = components. $view. find ( 'input[lay-filter="' + components. chooseAllFilter + '"]' ) ;
if ( ckNum > 0 && unCkNum === 0 ) {
$cb. prop ( 'checked' , true ) ;
$cb. removeClass ( 'ew-form-indeterminate' ) ;
$cb. next ( '.layui-form-checkbox' ) . addClass ( 'layui-form-checked' ) ;
} else if ( ( ckNum === 0 && unCkNum > 0 ) || ( ckNum === 0 && unCkNum === 0 ) ) {
$cb. prop ( 'checked' , false ) ;
$cb. removeClass ( 'ew-form-indeterminate' ) ;
$cb. next ( '.layui-form-checkbox' ) . removeClass ( 'layui-form-checked' ) ;
} else if ( ckNum > 0 && unCkNum > 0 ) {
$cb. prop ( 'checked' , true ) ;
$cb. addClass ( 'ew-form-indeterminate' ) ;
$cb. next ( '.layui-form-checkbox' ) . addClass ( 'layui-form-checked' ) ;
}
} ;
TreeTable . prototype. renderNumberCol = function ( ) {
this . getComponents ( ) . $tBody. children ( 'tbody' ) . children ( 'tr' ) . each ( function ( i ) {
$ ( this ) . children ( 'td' ) . find ( '.ew-tree-table-numbers' ) . text ( i + 1 ) ;
} ) ;
} ;
TreeTable . prototype. getIndexById = function ( id ) {
var options = this . options;
function each ( data, pi ) {
for ( var i = 0 ; i < data. length; i++ ) {
if ( data[ i] [ options. tree. idName] === id) return pi !== undefined ? pi + '-' + i : i;
if ( data[ i] [ options. tree. childName] ) {
var res = each ( data[ i] [ options. tree. childName] , pi !== undefined ? pi + '-' + i : i) ;
if ( res) return res;
}
}
}
return each ( options. data) ;
} ;
TreeTable . prototype. expand = function ( id, cascade ) {
var components = this . getComponents ( ) ;
var $tr = components. $table. children ( 'tbody' ) . children ( 'tr[data-index="' + this . getIndexById ( id) + '"]' ) ;
if ( ! $tr. hasClass ( 'ew-tree-table-open' ) ) $tr. children ( 'td' ) . find ( '.ew-tree-pack' ) . trigger ( 'click' ) ;
if ( cascade === false ) return ;
var indent = parseInt ( $tr. data ( 'indent' ) ) ;
$tr. prevAll ( 'tr' ) . each ( function ( ) {
var tInd = parseInt ( $ ( this ) . data ( 'indent' ) ) ;
if ( tInd < indent) {
if ( ! $ ( this ) . hasClass ( 'ew-tree-table-open' ) ) {
$ ( this ) . children ( 'td' ) . find ( '.ew-tree-pack' ) . trigger ( 'click' ) ;
}
indent = tInd;
}
} ) ;
} ;
TreeTable . prototype. fold = function ( id ) {
var components = this . getComponents ( ) ;
var $tr = components. $table. children ( 'tbody' ) . children ( 'tr[data-index="' + this . getIndexById ( id) + '"]' ) ;
if ( $tr. hasClass ( 'ew-tree-table-open' ) ) $tr. children ( 'td' ) . find ( '.ew-tree-pack' ) . trigger ( 'click' ) ;
} ;
TreeTable . prototype. expandAll = function ( ) {
this . getComponents ( ) . $table. children ( 'tbody' ) . children ( 'tr' ) . each ( function ( ) {
if ( ! $ ( this ) . hasClass ( 'ew-tree-table-open' ) ) $ ( this ) . children ( 'td' ) . find ( '.ew-tree-pack' ) . trigger ( 'click' ) ;
} ) ;
} ;
TreeTable . prototype. foldAll = function ( ) {
this . getComponents ( ) . $table. children ( 'tbody' ) . children ( 'tr' ) . each ( function ( ) {
if ( $ ( this ) . hasClass ( 'ew-tree-table-open' ) ) $ ( this ) . children ( 'td' ) . find ( '.ew-tree-pack' ) . trigger ( 'click' ) ;
} ) ;
} ;
TreeTable . prototype. getData = function ( ) {
return this . options. data;
} ;
TreeTable . prototype. reload = function ( opt ) {
this . initOptions ( this . options ? $. extend ( true , this . options, opt) : opt) ;
this . init ( ) ;
this . bindEvents ( ) ;
} ;
TreeTable . prototype. checkStatus = function ( needIndeterminate ) {
if ( needIndeterminate === undefined ) needIndeterminate = true ;
var list = [ ] ;
this . eachData ( function ( i, item ) {
if ( ( needIndeterminate || ! item. LAY_INDETERMINATE ) && item. LAY_CHECKED )
list. push ( $. extend ( { isIndeterminate : item. LAY_INDETERMINATE } , item) ) ;
} ) ;
return list;
} ;
TreeTable . prototype. setChecked = function ( ids ) {
var that = this ;
var components = this . getComponents ( ) ;
var $radio = components. $table. find ( 'input[lay-filter="' + components. radioFilter + '"]' ) ;
if ( $radio. length > 0 ) {
$radio. each ( function ( ) {
var d = that. getDataByTr ( $ ( this ) . parentsUntil ( 'tr' ) . parent ( ) ) ;
if ( d && ids[ ids. length - 1 ] == d[ that. options. tree. idName] ) {
$ ( this ) . next ( '.layui-form-radio' ) . trigger ( 'click' ) ;
return false ;
}
} ) ;
} else {
components. $table. find ( 'input[lay-filter="' + components. checkboxFilter + '"]' ) . each ( function ( ) {
var $cb = $ ( this ) ;
var $layCb = $cb. next ( '.layui-form-checkbox' ) ;
var checked = $cb. prop ( 'checked' ) ;
var indeterminate = $cb. hasClass ( 'ew-form-indeterminate' ) ;
var d = that. getDataByTr ( $cb. parentsUntil ( 'tr' ) . parent ( ) ) ;
for ( var i = 0 ; i < ids. length; i++ ) {
if ( d && ids[ i] == d[ that. options. tree. idName] ) {
if ( d[ that. options. tree. childName] && d[ that. options. tree. childName] . length > 0 ) continue ;
if ( ! checked || indeterminate) $layCb. trigger ( 'click' ) ;
}
}
} ) ;
}
} ;
TreeTable . prototype. removeAllChecked = function ( ) {
this . checkSubCB ( this . getComponents ( ) . $table. children ( 'tbody' ) , false ) ;
} ;
TreeTable . prototype. exportData = function ( type ) {
var components = this . getComponents ( ) ;
if ( 'show' === type) {
components. $toolbar. find ( '.layui-table-tool-panel' ) . remove ( ) ;
components. $toolbar. find ( '[lay-event="LAYTABLE_EXPORT"]' ) . append ( [
'<ul class="layui-table-tool-panel">' ,
' <li data-type="csv">导出到 Csv 文件</li>' ,
' <li data-type="xls">导出到 Excel 文件</li>' ,
'</ul>'
] . join ( '' ) ) ;
} else {
if ( device. ie) return layer. msg ( '不支持ie导出' ) ;
if ( ! type) type = 'xls' ;
var head = [ ] , body = [ ] ;
this . eachCols ( function ( i, item ) {
if ( item. type !== 'normal' || item. hide) return ;
head. push ( item. title || '' ) ;
} ) ;
components. $tBody. children ( 'tbody' ) . children ( 'tr' ) . each ( function ( ) {
var items = [ ] ;
$ ( this ) . children ( 'td' ) . each ( function ( ) {
var $this = $ ( this ) ;
if ( $this . data ( 'type' ) !== 'normal' || $this . hasClass ( 'layui-hide' ) ) return true ;
items. push ( $this . text ( ) . trim ( ) . replace ( / , / g , ',' ) ) ;
} ) ;
body. push ( items. join ( ',' ) ) ;
} ) ;
var alink = document. createElement ( 'a' ) ;
var content = encodeURIComponent ( head. join ( ',' ) + '\r\n' + body. join ( '\r\n' ) ) ;
var contentType = ( { csv : 'text/csv' , xls : 'application/vnd.ms-excel' } ) [ type] ;
alink. href = 'data:' + contentType + ';charset=utf-8,\ufeff' + content;
alink. download = ( this . options. title || 'table' ) + '.' + type;
document. body. appendChild ( alink) ;
alink. click ( ) ;
document. body. removeChild ( alink) ;
}
} ;
TreeTable . prototype. printTable = function ( ) {
var components = this . getComponents ( ) ;
var head = components. $tHead. children ( 'thead' ) . html ( ) ;
if ( ! head) head = components. $tBody. children ( 'thead' ) . html ( ) ;
var body = components. $tBody. children ( 'tbody' ) . html ( ) ;
var colgroup = components. $tBody. children ( 'colgroup' ) . html ( ) ;
var $html = $ ( [
'<table class="ew-tree-table-print">' ,
' <colgroup>' , colgroup, '</colgroup>' ,
' <thead>' , head, '</thead>' ,
' <tbody>' , body, '</tbody>' ,
'</table>'
] . join ( '' ) ) ;
$html. find ( 'col[data-type="checkbox"],col[data-type="radio"],col[data-type="tool"]' ) . remove ( ) ;
$html. find ( 'td[data-type="checkbox"],td[data-type="radio"],td[data-type="tool"],.layui-hide' ) . remove ( ) ;
function hideCol ( $temp ) {
var parentKey = $temp. data ( 'parent' ) , pCol;
if ( ! parentKey) return ;
var $parent = $html. children ( 'thead' ) . children ( 'tr' ) . children ( '[data-key="' + parentKey + '"]' ) ;
var colspan = parseInt ( $parent. attr ( 'colspan' ) ) - 1 ;
$parent. attr ( 'colspan' , colspan) ;
if ( colspan === 0 ) $parent. remove ( ) ;
hideCol ( $parent) ;
}
$html. find ( 'th[data-type="checkbox"],th[data-type="radio"],th[data-type="tool"]' ) . each ( function ( ) {
hideCol ( $ ( this ) ) ;
} ) . remove ( ) ;
var style = [
'<style>' ,
' /* 打印表格样式 */' ,
' .ew-tree-table-print {' ,
' border: none;' ,
' border-collapse: collapse;' ,
' width: 100%;' ,
' table-layout: fixed;' ,
' }' ,
' .ew-tree-table-print td, .ew-tree-table-print th {' ,
' color: #555;' ,
' font-size: 14px;' ,
' padding: 9px 15px;' ,
' word-break: break-all;' ,
' border: 1px solid #888;' ,
' text-align: left;' ,
' }' ,
' .ew-tree-table-print .ew-tree-table-cell {' ,
' min-height: 20px;' ,
' }' ,
' /* 序号列样式 */' ,
' .ew-tree-table-print td[data-type="numbers"], .ew-tree-table-print th[data-type="numbers"] {' ,
' padding-left: 0;' ,
' padding-right: 0;' ,
' }' ,
' /* 单/复选框列样式 */' ,
' .ew-tree-table-print td[data-type="tool"], .ew-tree-table-print th[data-type="tool"], ' ,
' .ew-tree-table-print td[data-type="checkbox"], .ew-tree-table-print th[data-type="checkbox"], ' ,
' .ew-tree-table-print td[data-type="radio"], .ew-tree-table-print th[data-type="radio"] {' ,
' border: none;' ,
' }' ,
' .ew-tree-table-print td.layui-hide + td, .ew-tree-table-print th.layui-hide + th, ' ,
' .ew-tree-table-print td[data-type="tool"] + td, .ew-tree-table-print th[data-type="tool"] + th, ' ,
' .ew-tree-table-print td[data-type="checkbox"] + td, .ew-tree-table-print th[data-type="checkbox"] + th, ' ,
' .ew-tree-table-print td[data-type="radio"] + td, .ew-tree-table-print th[data-type="radio"] + th {' ,
' border-left: none;' ,
' }' ,
' /* 不显示的元素 */' ,
' .layui-hide, ' ,
' .ew-tree-table-print td[data-type="tool"] *, .ew-tree-table-print th[data-type="tool"] *, ' ,
' .ew-tree-table-print td[data-type="checkbox"] *, .ew-tree-table-print th[data-type="checkbox"] *, ' ,
' .ew-tree-table-print td[data-type="radio"] *, .ew-tree-table-print th[data-type="radio"] *, ' ,
' .layui-table-grid-down, .ew-tree-tips-c, .ew-tree-icon, .ew-tree-table-arrow.ew-tree-table-arrow-hide {' ,
' display: none;' ,
' }' ,
' /* tree缩进 */' ,
' .ew-tree-table-indent {' ,
' padding-left: 13px;' ,
' }' ,
' /* 箭头 */' ,
' .ew-tree-table-arrow {' ,
' position: relative;' ,
' padding-left: 13px;' ,
' }' ,
' .ew-tree-table-arrow:before {' ,
' content: "";' ,
' border: 5px solid transparent;' ,
' border-top-color: #666;' ,
' position: absolute;' ,
' left: 0;' ,
' top: 6px;' ,
' }' ,
'</style>'
] . join ( '' ) ;
var pWindow = window. open ( '' , '_blank' ) ;
pWindow. focus ( ) ;
var pDocument = pWindow. document;
pDocument. open ( ) ;
pDocument. write ( $html[ 0 ] . outerHTML + style) ;
pDocument. close ( ) ;
pWindow. print ( ) ;
pWindow. close ( ) ;
} ;
TreeTable . prototype. toggleCol = function ( show, field, key ) {
var components = this . getComponents ( ) ;
if ( show === undefined ) {
components. $toolbar. find ( '.layui-table-tool-panel' ) . remove ( ) ;
var cols = [ '<ul class="layui-table-tool-panel">' ] ;
this . eachCols ( function ( i, item ) {
if ( item. type !== 'normal' ) return ;
cols. push ( '<li><input type="checkbox" lay-skin="primary"' ) ;
cols. push ( ' lay-filter="' + components. colsToggleFilter + '"' ) ;
cols. push ( ' value="' + item. key + '" title="' + util. escape ( item. title || '' ) + '"' ) ;
cols. push ( ( item. hide ? '' : ' checked' ) + '></li>' ) ;
} ) ;
components. $toolbar. find ( '[lay-event="LAYTABLE_COLS"]' ) . append ( cols. join ( '' ) + '</ul>' ) ;
form. render ( 'checkbox' , components. filter) ;
} else {
if ( key) {
var $td = components. $table. children ( 'tbody' ) . children ( 'tr' ) . children ( '[data-key="' + key + '"]' ) ;
var $th = components. $table. children ( 'thead' ) . children ( 'tr' ) . children ( '[data-key="' + key + '"]' ) ;
if ( show) {
$td. removeClass ( 'layui-hide' ) ;
$th. removeClass ( 'layui-hide' ) ;
} else {
$td. addClass ( 'layui-hide' ) ;
$th. addClass ( 'layui-hide' ) ;
}
var ks = key. split ( '-' ) ;
var col = this . options. cols[ ks[ 0 ] ] [ ks[ 1 ] ] ;
col. hide = ! show;
function changeParent ( $temp ) {
var parentKey = $temp. data ( 'parent' ) , pCol;
if ( ! parentKey) return ;
var $parent = components. $table. children ( 'thead' ) . children ( 'tr' ) . children ( '[data-key="' + parentKey + '"]' ) ;
var colspan = $parent. attr ( 'colspan' ) ;
show ? colspan++ : colspan-- ;
$parent. attr ( 'colspan' , colspan) ;
if ( colspan === 0 ) $parent. addClass ( 'layui-hide' ) ;
else $parent. removeClass ( 'layui-hide' ) ;
changeParent ( $parent) ;
}
changeParent ( $th) ;
this . eachCols ( function ( i, item ) {
if ( item. key === key) item. hide = col. hide;
} ) ;
this . resize ( ) ;
}
}
} ;
TreeTable . prototype. filterData = function ( ids ) {
var components = this . getComponents ( ) ;
components. $loading. show ( ) ;
if ( this . options. data. length > 0 ) components. $loading. addClass ( 'ew-loading-float' ) ;
var $trList = components. $table. children ( 'tbody' ) . children ( 'tr' ) ;
var indexList = [ ] ;
if ( typeof ids === 'string' ) {
$trList. each ( function ( ) {
var index = $ ( this ) . data ( 'index' ) ;
$ ( this ) . children ( 'td' ) . each ( function ( ) {
if ( $ ( this ) . text ( ) . indexOf ( ids) !== - 1 ) {
indexList. push ( index) ;
return false ;
}
} ) ;
} ) ;
} else {
for ( var i = 0 ; i < ids. length; i++ ) {
indexList. push ( this . getIndexById ( ids[ i] ) ) ;
}
}
$trList. addClass ( 'ew-tree-table-filter-hide' ) ;
for ( var j = 0 ; j < indexList. length; j++ ) {
var $tr = $trList. filter ( '[data-index="' + indexList[ j] + '"]' ) ;
$tr. removeClass ( 'ew-tree-table-filter-hide' ) ;
var indent = parseInt ( $tr. data ( 'indent' ) ) ;
$tr. nextAll ( 'tr' ) . each ( function ( ) {
if ( parseInt ( $ ( this ) . data ( 'indent' ) ) <= indent) return false ;
$ ( this ) . removeClass ( 'ew-tree-table-filter-hide' ) ;
} ) ;
if ( $tr. hasClass ( 'ew-tree-table-open' ) ) toggleRow ( $tr) ;
$tr. prevAll ( 'tr' ) . each ( function ( ) {
var tInd = parseInt ( $ ( this ) . data ( 'indent' ) ) ;
if ( tInd < indent) {
$ ( this ) . removeClass ( 'ew-tree-table-filter-hide' ) ;
if ( ! $ ( this ) . hasClass ( 'ew-tree-table-open' ) ) toggleRow ( $ ( this ) ) ;
indent = tInd;
}
} ) ;
}
components. $loading. hide ( ) ;
components. $loading. removeClass ( 'ew-loading-float' ) ;
if ( indexList. length === 0 ) components. $empty. show ( ) ;
updateFixedTbHead ( components. $view) ;
} ;
TreeTable . prototype. clearFilter = function ( ) {
var components = this . getComponents ( ) ;
components. $table. children ( 'tbody' ) . children ( 'tr' ) . removeClass ( 'ew-tree-table-filter-hide' ) ;
if ( this . options. data. length > 0 ) components. $empty. hide ( ) ;
updateFixedTbHead ( components. $view) ;
} ;
TreeTable . prototype. refresh = function ( id, data ) {
if ( isClass ( id) === 'Array' ) {
data = id;
id = undefined ;
}
var components = this . getComponents ( ) ;
var d, $tr;
if ( id !== undefined ) {
$tr = components. $table. children ( 'tbody' ) . children ( 'tr[data-index="' + this . getIndexById ( id) + '"]' ) ;
d = this . getDataByTr ( $tr) ;
}
if ( data) {
if ( data. length > 0 ) components. $loading. addClass ( 'ew-loading-float' ) ;
components. $loading. show ( ) ;
if ( data. length > 0 && this . options. tree. isPidData) {
this . renderBodyData ( tt. pidToChildren ( data, this . options. tree. idName, this . options. tree. pidName, this . options. tree. childName) , d, $tr) ;
} else {
this . renderBodyData ( data, d, $tr) ;
}
} else {
this . renderBodyAsync ( d, $tr) ;
}
} ;
TreeTable . prototype. del = function ( id, index ) {
if ( index === undefined ) index = this . getIndexById ( id) ;
var indexList = ( typeof index === 'number' ? [ index] : index. split ( '-' ) ) ;
var d = this . options. data;
if ( indexList. length > 1 ) {
for ( var i = 0 ; i < indexList. length - 1 ; i++ ) {
d = d[ parseInt ( indexList[ i] ) ] [ this . options. tree. childName] ;
}
}
d. splice ( indexList[ indexList. length - 1 ] , 1 ) ;
} ;
TreeTable . prototype. update = function ( id, fields ) {
$. extend ( true , this . getDataByTr ( this . getIndexById ( id) ) , fields) ;
} ;
function toggleRow ( $tr ) {
var indent = parseInt ( $tr. data ( 'indent' ) ) ;
var open = $tr. hasClass ( 'ew-tree-table-open' ) ;
if ( open) {
$tr. removeClass ( 'ew-tree-table-open' ) ;
$tr. nextAll ( 'tr' ) . each ( function ( ) {
if ( parseInt ( $ ( this ) . data ( 'indent' ) ) <= indent) return false ;
$ ( this ) . addClass ( 'ew-tree-tb-hide' ) ;
} ) ;
} else {
$tr. addClass ( 'ew-tree-table-open' ) ;
var hideInd;
$tr. nextAll ( 'tr' ) . each ( function ( ) {
var ind = parseInt ( $ ( this ) . data ( 'indent' ) ) ;
if ( ind <= indent) return false ;
if ( hideInd !== undefined && ind > hideInd) return true ;
$ ( this ) . removeClass ( 'ew-tree-tb-hide' ) ;
if ( ! $ ( this ) . hasClass ( 'ew-tree-table-open' ) ) hideInd = parseInt ( $ ( this ) . data ( 'indent' ) ) ;
else hideInd = undefined ;
} ) ;
}
updateFixedTbHead ( $tr. parentsUntil ( '.ew-tree-table' ) . last ( ) . parent ( ) ) ;
return open;
}
function updateFixedTbHead ( $view ) {
var $headBox = $view. children ( '.ew-tree-table-head' ) ;
var $tbBox = $view. children ( '.ew-tree-table-box' ) ;
var sWidth = $tbBox. width ( ) - $tbBox. prop ( 'clientWidth' ) ;
$headBox. css ( 'border-right' , ( sWidth > 0 ? sWidth : 0 ) + 'px solid #f2f2f2' ) ;
}
$ ( window) . resize ( function ( ) {
$ ( '.ew-tree-table' ) . each ( function ( ) {
updateFixedTbHead ( $ ( this ) ) ;
var $tbBox = $ ( this ) . children ( '.ew-tree-table-box' ) ;
var full = $tbBox. data ( 'full' ) ;
if ( full && device. ie && device. ie < 10 ) {
$tbBox. css ( 'height' , getPageHeight ( ) - full) ;
}
} ) ;
} ) ;
$ ( document) . on ( 'mouseenter' , '.ew-tree-table-cell.single-line' , function ( ) {
var $content = $ ( this ) . children ( '.ew-tree-table-cell-content' ) ;
if ( $content. prop ( 'scrollWidth' ) > $content. outerWidth ( ) ) $ ( this ) . children ( '.layui-table-grid-down' ) . show ( ) ;
} ) . on ( 'mouseleave' , '.ew-tree-table-cell.single-line' , function ( ) {
$ ( this ) . children ( '.layui-table-grid-down' ) . hide ( ) ;
} ) ;
$ ( document) . on ( 'click' , '.ew-tree-table-cell>.layui-table-grid-down' , function ( e ) {
e. stopPropagation ( ) ;
hideAllTdTips ( ) ;
var $cell = $ ( this ) . parent ( ) ;
$cell. addClass ( 'ew-tree-tips-open' ) ;
$cell. children ( '.layui-table-grid-down' ) . hide ( ) ;
var tw = $cell. parent ( ) . outerWidth ( ) + 4 ;
if ( $cell. outerWidth ( ) < tw) $cell. children ( '.ew-tree-table-cell-content' ) . css ( { 'width' : tw, 'max-width' : tw} ) ;
var $box = $cell. parents ( ) . filter ( '.ew-tree-table-box' ) ;
if ( $box. length === 0 ) $box = $cell. parents ( ) . filter ( '.ew-tree-table-head' ) ;
if ( $box. length === 0 ) return ;
if ( ( $cell. outerWidth ( ) + $cell. offset ( ) . left) + 20 > $box. offset ( ) . left + $box. outerWidth ( ) ) {
$cell. addClass ( 'ew-show-left' ) ;
}
if ( ( $cell. outerHeight ( ) + $cell. offset ( ) . top + 10 ) > $box. offset ( ) . top + $box. outerHeight ( ) ) {
$cell. addClass ( 'ew-show-bottom' ) ;
}
} ) ;
$ ( document) . on ( 'click' , '.ew-tree-table-cell>.ew-tree-tips-c' , function ( ) {
hideAllTdTips ( ) ;
} ) ;
$ ( document) . on ( 'click' , function ( ) {
hideAllTdTips ( ) ;
$ ( '.ew-tree-table .layui-table-tool-panel' ) . remove ( ) ;
} ) ;
$ ( document) . on ( 'click' , '.ew-tree-table-cell.ew-tree-tips-open' , function ( e ) {
e. stopPropagation ( ) ;
} ) ;
function hideAllTdTips ( ) {
$ ( '.ew-tree-table-cell' ) . removeClass ( 'ew-tree-tips-open ew-show-left ew-show-bottom' ) ;
$ ( '.ew-tree-table-cell>.ew-tree-table-cell-content' ) . css ( { 'width' : '' , 'max-width' : '' } ) ;
}
$ ( document) . on ( 'mousedown' , '.ew-tb-resize' , function ( e ) {
layui. stope ( e) ;
var $this = $ ( this ) ;
$this . attr ( 'move' , 'true' ) ;
var key = $this . parent ( ) . data ( 'key' ) ;
$this . data ( 'x' , e. clientX) ;
var w = $this . parent ( ) . parent ( ) . parent ( ) . parent ( ) . children ( 'colgroup' ) . children ( 'col[data-key="' + key + '"]' ) . attr ( 'width' ) ;
if ( ! w || w. toString ( ) . indexOf ( '%' ) !== - 1 ) w = $this . parent ( ) . outerWidth ( ) ;
$this . data ( 'width' , w) ;
$ ( 'body' ) . addClass ( 'ew-tree-table-resizing' ) ;
} ) . on ( 'mousemove' , function ( e ) {
var $rs = $ ( '.ew-tree-table .ew-tb-resize[move="true"]' ) ;
if ( $rs. length === 0 ) return ;
layui. stope ( e) ;
var x = $rs. data ( 'x' ) ;
var w = $rs. data ( 'width' ) ;
var nw = parseFloat ( w) + e. clientX - parseFloat ( x) ;
if ( nw <= 0 ) nw = 1 ;
var ins = _instances[ $rs. parentsUntil ( '.ew-tree-table' ) . last ( ) . parent ( ) . attr ( 'lay-filter' ) ] ;
var key = $rs. parent ( ) . data ( 'key' ) ;
var ks = key. split ( '-' ) ;
ins. options. cols[ ks[ 0 ] ] [ ks[ 1 ] ] . width = nw;
ins. eachCols ( function ( i, item ) {
if ( item. key === key) item. width = nw;
} ) ;
ins. resize ( ) ;
} ) . on ( 'mouseup' , function ( e ) {
$ ( '.ew-tree-table .ew-tb-resize[move="true"]' ) . attr ( 'move' , 'false' ) ;
$ ( 'body' ) . removeClass ( 'ew-tree-table-resizing' ) ;
} ) . on ( 'mouseleave' , function ( e ) {
$ ( '.ew-tree-table .ew-tb-resize[move="true"]' ) . attr ( 'move' , 'false' ) ;
$ ( 'body' ) . removeClass ( 'ew-tree-table-resizing' ) ;
} ) ;
function getPids ( data, idName, pidName ) {
var pids = [ ] ;
for ( var i = 0 ; i < data. length; i++ ) {
var hasPid = false ;
for ( var j = 0 ; j < data. length; j++ ) {
if ( data[ i] [ pidName] == data[ j] [ idName] ) {
hasPid = true ;
break ;
}
}
if ( ! hasPid) pids. push ( data[ i] [ pidName] ) ;
}
return pids;
}
function pidEquals ( pId, pIds ) {
if ( isClass ( pIds) === 'Array' ) {
for ( var i = 0 ; i < pIds. length; i++ )
if ( pId == pIds[ i] ) return true ;
}
return pId == pIds;
}
function isClass ( o ) {
if ( o === null ) return 'Null' ;
if ( o === undefined ) return 'Undefined' ;
return Object . prototype. toString . call ( o) . slice ( 8 , - 1 ) ;
}
function getPageHeight ( ) {
return document. documentElement. clientHeight || document. body. clientHeight;
}
var tt = {
render : function ( options ) {
return new TreeTable ( options) ;
} ,
reload : function ( id, opt ) {
_instances[ id] . reload ( opt) ;
} ,
on : function ( events, callback ) {
return layui. onevent . call ( this , MOD_NAME , events, callback) ;
} ,
pidToChildren : function ( data, idName, pidName, childName, pId ) {
if ( ! childName) childName = 'children' ;
var newList = [ ] ;
for ( var i = 0 ; i < data. length; i++ ) {
if ( data[ i] [ idName] == data[ i] [ pidName] )
return console. error ( '第' + i + '条数据的' + idName + '与' + pidName + '相同' , data[ i] ) ;
if ( pId === undefined ) pId = getPids ( data, idName, pidName) ;
if ( pidEquals ( data[ i] [ pidName] , pId) ) {
var children = this . pidToChildren ( data, idName, pidName, childName, data[ i] [ idName] ) ;
if ( children. length > 0 ) data[ i] [ childName] = children;
newList. push ( data[ i] ) ;
}
}
return newList;
}
} ;
$ ( 'head' ) . append ( [
'<style id="ew-tree-table-css">' ,
'/** 最外层容器 */' ,
'.ew-tree-table {' ,
' margin: 10px 0;' ,
' position: relative;' ,
' border: 1px solid #e6e6e6;' ,
' border-bottom: none;' ,
' border-right: none;' ,
'}' ,
'.ew-tree-table:before, .ew-tree-table:after, .ew-tree-table .ew-tree-table-head:after {' ,
' content: "";' ,
' background-color: #e6e6e6;' ,
' position: absolute;' ,
' right: 0;' ,
' bottom: 0;' ,
'}' ,
'.ew-tree-table:before {' ,
' width: 1px;' ,
' top: 0;' ,
' z-index: 1;' ,
'}' ,
'.ew-tree-table:after, .ew-tree-table .ew-tree-table-head:after {' ,
' height: 1px;' ,
' left: 0;' ,
'}' ,
'.ew-tree-table .layui-table {' ,
' margin: 0;' ,
' position: relative;' ,
' table-layout: fixed;' ,
'}' ,
'/** 表格 */' ,
'.ew-tree-table .layui-table td, .ew-tree-table .layui-table th {' ,
' border-top: none;' ,
' border-left: none;' ,
' padding: 0 !important;' ,
'}' ,
'.ew-tree-table .ew-tree-table-box {' ,
' overflow: auto;' ,
' position: relative;' ,
'}' ,
'.ew-tree-table .ew-tree-table-head {' ,
' overflow: hidden;' ,
' box-sizing: border-box;' ,
' background-color: #f2f2f2;' ,
' position: relative;' ,
'}' ,
'/** loading */' ,
'.ew-tree-table div.ew-tree-table-loading {' ,
' padding: 10px 0;' ,
' text-align: center;' ,
'}' ,
'.ew-tree-table div.ew-tree-table-loading > i {' ,
' color: #999;' ,
' font-size: 30px;' ,
'}' ,
'.ew-tree-table div.ew-tree-table-loading.ew-loading-float {' ,
' position: absolute;' ,
' top: 0;' ,
' left: 0;' ,
' right: 0;' ,
'}' ,
'/** 空数据 */' ,
'.ew-tree-table .ew-tree-table-empty {' ,
' color: #666;' ,
' font-size: 14px;' ,
' padding: 18px 0;' ,
' text-align: center;' ,
' display: none;' ,
'}' ,
'/** 单元格 */' ,
'.ew-tree-table-cell.ew-tree-tips-open {' ,
' position: absolute;' ,
' top: 0;' ,
' left: 0;' ,
' padding: 0;' ,
' z-index: 9999;' ,
' background-color: #fff;' ,
' box-shadow: 3px 3px 8px rgba(0, 0, 0, .15);' ,
'}' ,
'thead .ew-tree-table-cell.ew-tree-tips-open {' ,
' background-color: #f2f2f2;' ,
'}' ,
'.ew-tree-table-cell.ew-tree-tips-open.ew-show-left {' ,
' right: 0;' ,
' left: auto;' ,
' box-shadow: -3px 3px 8px rgba(0, 0, 0, .15);' ,
'}' ,
'.ew-tree-table-cell.ew-tree-tips-open.ew-show-bottom {' ,
' bottom: 0;' ,
' top: auto;' ,
' box-shadow: 3px -3px 8px rgba(0, 0, 0, .15);' ,
'}' ,
'.ew-tree-table-cell.ew-tree-tips-open.ew-show-left.ew-show-bottom {' ,
' box-shadow: -3px -3px 8px rgba(0, 0, 0, .15);' ,
'}' ,
'.ew-tree-table-cell > .ew-tree-tips-c {' ,
' position: absolute;' ,
' right: -6px;' ,
' top: -3px;' ,
' width: 22px;' ,
' height: 22px;' ,
' line-height: 22px;' ,
' font-size: 16px;' ,
' color: #fff;' ,
' background-color: #666;' ,
' border-radius: 50%;' ,
' text-align: center;' ,
' cursor: pointer;' ,
' display: none;' ,
'}' ,
'table tr:first-child .ew-tree-table-cell > .ew-tree-tips-c {' ,
' top: 0;' ,
'}' ,
'.ew-tree-table-cell.ew-tree-tips-open > .ew-tree-tips-c {' ,
' display: block;' ,
'}' ,
'.ew-tree-table-cell.ew-tree-tips-open.ew-show-left > .ew-tree-tips-c {' ,
' left: -6px;' ,
' right: auto;' ,
'}' ,
'.ew-tree-table-cell > .ew-tree-table-cell-content {' ,
' padding: 5px 15px;' ,
' line-height: 28px;' ,
'}' ,
'[lay-size="lg"] .ew-tree-table-cell > .ew-tree-table-cell-content {' ,
' line-height: 40px;' ,
'}' ,
'[lay-size="sm"] .ew-tree-table-cell > .ew-tree-table-cell-content {' ,
' padding: 1px 15px;' ,
'}' ,
'.ew-tree-table-cell.single-line > .ew-tree-table-cell-content {' ,
' overflow: hidden;' ,
' white-space: nowrap;' ,
' text-overflow: ellipsis;' ,
'}' ,
'.ew-tree-table-cell.ew-tree-tips-open > .ew-tree-table-cell-content {' ,
' overflow: auto;' ,
' padding: 9px 15px;' ,
' height: auto;' ,
' min-height: 100%;' ,
' max-height: 110px;' ,
' line-height: inherit;' ,
' max-width: 260px;' ,
' width: 200px;' ,
' width: max-content;' ,
' width: -moz-max-content;' ,
' box-sizing: border-box;' ,
' white-space: normal;' ,
'}' ,
'.ew-tree-table-cell > .layui-table-grid-down {' ,
' box-sizing: border-box;' ,
'}' ,
'/** 图标列 */' ,
'.ew-tree-table .ew-tree-pack {' ,
' cursor: pointer;' ,
' line-height: 16px;' ,
'}' ,
'.ew-tree-table .ew-tree-pack > .layui-icon, .ew-tree-table .ew-tree-pack > .ew-tree-icon {' ,
' margin-right: 5px;' ,
'}' ,
'.ew-tree-table .ew-tree-pack > * {' ,
' vertical-align: middle;' ,
'}' ,
'/* 缩进 */' ,
'.ew-tree-table .ew-tree-table-indent {' ,
' margin-right: 5px;' ,
' padding-left: 16px;' ,
'}' ,
'/* 箭头 */' ,
'.ew-tree-table .ew-tree-table-arrow:before {' ,
' content: "\\e623";' ,
'}' ,
'.ew-tree-table .ew-tree-table-open .ew-tree-table-arrow:before {' ,
' content: "\\e625";' ,
'}' ,
'.ew-tree-table .ew-tree-table-arrow.arrow2 {' ,
' font-size: 12px;' ,
' font-weight: 600;' ,
' line-height: 16px;' ,
' height: 16px;' ,
' width: 16px;' ,
' display: inline-block;' ,
' text-align: center;' ,
' color: #888;' ,
'}' ,
'.ew-tree-table .ew-tree-table-arrow.arrow2:before {' ,
' content: "\\e602";' ,
'}' ,
'.ew-tree-table .ew-tree-table-open .ew-tree-table-arrow.arrow2:before {' ,
' content: "\\e61a";' ,
'}' ,
'.ew-tree-table-arrow.ew-tree-table-arrow-hide {' ,
' visibility: hidden;' ,
'}' ,
'/* 箭头变加载中状态 */' ,
'.ew-tree-table tr.ew-tree-table-loading > td .ew-tree-table-arrow:before {' ,
' content: "\\e63d" !important;' ,
'}' ,
'.ew-tree-table tr.ew-tree-table-loading > td .ew-tree-table-arrow {' ,
' margin-right: 0;' ,
'}' ,
'.ew-tree-table tr.ew-tree-table-loading > td .ew-tree-table-arrow + * {' ,
' margin-left: 5px;' ,
'}' ,
'.ew-tree-table tr.ew-tree-table-loading * {' ,
' pointer-events: none !important;' ,
'}' ,
'/** 折叠行 */' ,
'.ew-tree-table .ew-tree-tb-hide {' ,
' display: none;' ,
'}' ,
'/** 特殊列调整 */' ,
'.ew-tree-table td[data-type="numbers"] > .ew-tree-table-cell,' ,
'.ew-tree-table th[data-type="numbers"] > .ew-tree-table-cell,' ,
'.ew-tree-table td[data-type="checkbox"] > .ew-tree-table-cell,' ,
'.ew-tree-table th[data-type="checkbox"] > .ew-tree-table-cell,' ,
'.ew-tree-table td[data-type="radio"] > .ew-tree-table-cell,' ,
'.ew-tree-table th[data-type="radio"] > .ew-tree-table-cell,' ,
'.ew-tree-table td[data-type="space"] > .ew-tree-table-cell,' ,
'.ew-tree-table th[data-type="space"] > .ew-tree-table-cell {' ,
' padding-left: 0;' ,
' padding-right: 0;' ,
'}' ,
'/* 单元格内表单元素样式调整 */' ,
'.ew-tree-table .layui-form-switch' ,
'.ew-tree-table .layui-form-radio {' ,
' margin: 0;' ,
'}' ,
'/* checkbox列调整 */' ,
'.ew-tree-table-checkbox + .layui-form-checkbox {' ,
' padding: 0;' ,
'}' ,
'.ew-tree-table-checkbox + .layui-form-checkbox > .layui-icon {' ,
' font-weight: 600;' ,
' color: transparent;' ,
' transition: background-color .1s linear;' ,
' -webkit-transition: background-color .1s linear;' ,
'}' ,
'.ew-tree-table-checkbox + .layui-form-checkbox.layui-form-checked > .layui-icon {' ,
' color: #fff;' ,
'}' ,
'/* checkbox半选状态 */' ,
'.ew-form-indeterminate + .layui-form-checkbox .layui-icon:before {' ,
' content: "";' ,
' width: 10px;' ,
' height: 2px;' ,
' background-color: #f1f1f1;' ,
' position: absolute;' ,
' top: 50%;' ,
' left: 50%;' ,
' margin: -1px 0 0 -5px;' ,
'}' ,
'/* radio列调整 */' ,
'.ew-tree-table-radio + .layui-form-radio {' ,
' margin: 0;' ,
' padding: 0;' ,
' height: 20px;' ,
' line-height: 20px;' ,
'}' ,
'.ew-tree-table-radio + .layui-form-radio > i {' ,
' margin: 0;' ,
' height: 20px;' ,
' font-size: 20px;' ,
' line-height: 20px;' ,
'}' ,
'/** 单元格编辑 */' ,
'.ew-tree-table .layui-table td[data-edit] {' ,
' cursor: text;' ,
'}' ,
'.ew-tree-table .ew-tree-table-edit {' ,
' position: absolute;' ,
' left: 0;' ,
' top: 0;' ,
' width: 100%;' ,
' height: 100%;' ,
' border-radius: 0;' ,
' box-shadow: 1px 1px 20px rgba(0, 0, 0, .15);' ,
'}' ,
'.ew-tree-table .ew-tree-table-edit:focus {' ,
' border-color: #5FB878 !important;' ,
'}' ,
'.ew-tree-table .ew-tree-table-edit.layui-form-danger {' ,
' border-color: #FF5722 !important;' ,
'}' ,
'/** 搜索数据隐藏行 */' ,
'.ew-tree-table tr.ew-tree-table-filter-hide {' ,
' display: none !important;' ,
'}' ,
'/** 头部工具栏 */' ,
'.ew-tree-table .ew-tree-table-tool {' ,
' min-height: 50px;' ,
' line-height: 30px;' ,
' padding: 10px 15px;' ,
' box-sizing: border-box;' ,
' background-color: #f2f2f2;' ,
' border-bottom: 1px solid #e6e6e6;' ,
'}' ,
'.ew-tree-table .ew-tree-table-tool .ew-tree-table-tool-right {' ,
' float: right;' ,
'}' ,
'.ew-tree-table .ew-tree-table-tool .ew-tree-table-tool-item {' ,
' position: relative;' ,
' color: #333;' ,
' width: 26px;' ,
' height: 26px;' ,
' line-height: 26px;' ,
' text-align: center;' ,
' margin-left: 10px;' ,
' display: inline-block;' ,
' border: 1px solid #ccc;' ,
' box-sizing: border-box;' ,
' vertical-align: middle;' ,
' -webkit-transition: .3s all;' ,
' transition: .3s all;' ,
' cursor: pointer;' ,
'}' ,
'.ew-tree-table .ew-tree-table-tool .ew-tree-table-tool-item:first-child {' ,
' margin-left: 0;' ,
'}' ,
'.ew-tree-table .ew-tree-table-tool .ew-tree-table-tool-item:hover {' ,
' border-color: #999;' ,
'}' ,
'.ew-tree-table .ew-tree-table-tool-right .layui-table-tool-panel {' ,
' left: auto;' ,
' right: -1px;' ,
' z-index: 9999;' ,
'}' ,
'/* 列宽拖拽调整 */' ,
'.ew-tree-table .ew-tb-resize {' ,
' position: absolute;' ,
' right: 0;' ,
' top: 0;' ,
' bottom: 0;' ,
' width: 10px;' ,
' cursor: col-resize;' ,
'}' ,
'.ew-tree-table-resizing {' ,
' cursor: col-resize;' ,
' -ms-user-select: none;' ,
' -moz-user-select: none;' ,
' -webkit-user-select: none;' ,
' user-select: none;' ,
'}' ,
'/* 辅助样式 */' ,
'.ew-tree-table .layui-form-switch {' ,
' margin: 0;' ,
'}' ,
'.ew-tree-table .pd-tb-0 {' ,
' padding-top: 0 !important;' ,
' padding-bottom: 0 !important;' ,
'}' ,
'.ew-tree-table .break-all {' ,
' word-break: break-all !important;' ,
'}' ,
'/** 扩展图标 */' ,
'.ew-tree-table .ew-tree-icon-folder:after, .ew-tree-table .ew-tree-icon-file:after {' ,
' content: "";' ,
' padding: 2px 10px;' ,
' -webkit-background-size: cover;' ,
' -moz-background-size: cover;' ,
' -o-background-size: cover;' ,
' background-size: cover;' ,
' background-repeat: no-repeat;' ,
' background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAE6UlEQVR4Xu2ZPYhcVRiGny9hC0FsTEBCGkFTWIQE/IlpgmKpWAiLyR0XLbYTxEKxkCAEhRCxEOwsjJnJioKIYClWKgqiskIIaCoLYyASVJT87JGspN37LrOXvec777Tzzrnvz7Nn2dnAr6YbiKbTOzwGoHEIDIABaLyBxuP7BjAAjTfQeHzfAAag8QYaj+8bwAA03kDj8X0DGIDGG2g8/lw3QFlhD9fZN7oOF7gYT3NudL5GaGjTAJQP2c1VXgIOExyGkf4/oXCe4I3oeH+EvY/G0qYAKFOWCV4Hdo8mQb+RL7jBE7HE3/3S9hQyAGXGCeDVSiv6lqscief4t1L/g9mWAChTHiD4ZrTXvVbPu9GxrEnbUWkAzPgeOJCglsXo+ChBji2L0AtAmfEgrP/0Z3hdZoF7Y5HLGcJsRQYFgLeAF7fiYSM540x0LI3Ey7bb6AdgytcEh7bd6VYa2MGhOJrmVpurmX4AZlwCds31lPF9+AI32O8/DYUvccqUKwR3jG/DuR29Gd36F1pNv/pvgKwAFK5RuC+e4eeWCWgXgJurFz6LCY8bgA0aSPwr4P/UhVNc43ir3xK2fQPcAr/wO/AewU/Ar6xRqroVdvAnC6zGIlc369sAbLax8er/ofAJOzkVR9e/uZVeBkCqqTrRyeh4RXFtAJSWatQUno0Jp/usG4C+hup9/yJ72BuPcH2jCAag3oEV50vRccYAKFXl1LwdHS8YgJzj9qcqfBoTnjQA/VVlVXwXHfcbgKzz9uf6IToOGoD+orIqDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzGUAxKKyygxA1mXFXAZALCqrzABkXVbMZQDEorLKDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzGUAxKKyygxA1mXFXAZALCqrzABkXVbMZQDEorLKDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzGUAxKKyygxA1mXFXAZALCqrzABkXVbMZQDEorLKDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzGUAxKKyygxA1mXFXAZALCqrzABkXVbMZQDEorLKDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzGUAxKKyygxA1mXFXAZALCqrzABkXVbMZQDEorLKDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzLUFAMy4BOwSH2jZmBoorMaE/RtZij6/ZcoFgrv7dH5/lA38Eh33zAfAjM+BR0cZz6Y2bqDwY0w4MB8AU04SvOyuq2zg4+h4aj4AzvIwha+qjN+66cLzMeGduQC4+eEy4zywr/U+K8t/hQX2xiJ/zQ/ACgdZ40vgtspKaNducCyOsdJXQO9fAbcOKGc5whofENzVd6jf3/YGTkTHccWFDMD6r4LT3MlOloHHCB4CblceYs3gDfxB4TeCcxReiwmr6hM3BYB6qHX1NGAA6tlqEKcGYJBa6znUANSz1SBODcAgtdZzqAGoZ6tBnBqAQWqt51ADUM9Wgzg1AIPUWs+hBqCerQZxagAGqbWeQw1APVsN4tQADFJrPYcagHq2GsTpf+KxwJB5Cd5mAAAAAElFTkSuQmCC");' ,
'}' ,
'.ew-tree-table tr.ew-tree-table-open > td .ew-tree-icon-folder:after {' ,
' background-image: url("data:image/png;base64,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");' ,
'}' ,
'.ew-tree-table .ew-tree-icon-file:after {' ,
' background-image: url("data:image/png;base64,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");' ,
'}' ,
'</style>'
] . join ( '' ) ) ;
exports ( 'tableTree' , tt) ;
} ) ;