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) ; 
} ) ;