Ext带复选框的树,属性可配置

  1.  var textField_khz=new Ext.form.TextField({ 
  2.                     fieldLabel: '窗口测试',
  3.                     emptyText:'点击弹出',                    
  4.                     readOnly :true,
  5.                     //allowBlank:false,
  6.                     name: 'o_khzdh'
  7.                     id: 'o_khzdh_text'
  8.                     allowBlank:false,
  9.                     anchor:'90%'
  10.                 });        
  11.         textField_khz.on("focus",function(){                
  12.         parent.creatCarWithOrgTreePanel({   
  13.             //rootOrg:1,        
  14.             treedepth:3,
  15.             callbackFunction:callbackNodeFunction,
  16.             selectType:'111',
  17.             viewUserGroup:true,
  18.             viewCarGroup:true,
  19.             oneCheckModel:false             
  20.          });            
  21.         }); 
  22.         function callbackNodeFunction(nodeArr){
  23.             //alert(nodeArr.length);
  24.             Ext.getCmp("o_khzdh_text").setValue(nodeArr[0].text)
  25.         }   

  1. /**
  2.  * config:参数配置
  3.  * rootOrg:int 
  4.  * 根节点开始机构代号 比如 1,根节点从1开始,如果为空的化从session中得到。
  5.  * treedepth:int
  6.  * 机构树的深度 为1的化就显示当前机构,不显示下一级机构,为0的化显示所有的机构
  7.  * oneCheckModel:Boolean  
  8.  * 单选模式:true的时候只选一个,默认多选模式。
  9.  * viewUserGroup:Boolean  
  10.  * 显示用户客户组,默认不显示。
  11.  * viewCarGroup:Boolean  
  12.  * 显示车队用户组,默认不显示。
  13.  * selectType:模式:‘机构客户车队’,‘000’
  14.  * 选择的时候只选择客户组或者之选择车队或者机构。
  15.  * 如:只选机构‘100’,只选客户‘010’ ,只选车队‘001’,全选‘111’ 客户和车队‘011’,默认‘111’,
  16.  * 但是这里和机构树不同的是,部队机构类型做出判断,点击机构的时候选中机构和机构下面的客户组或者车队,不选择机构下面的机构
  17.  * callbackFunction 回调函数 用于向外传递值 
  18.  */
  19.  var carWithOrgTreePanel;
  20. function creatCarWithOrgTreePanel(config){
  21.     if(!config.rootOrg)config.rootOrg=0;
  22.     if(!config.treedepth)config.treedepth=0;
  23.     if(!config.oneCheckModel)config.oneCheckModel=false;
  24.     if(!config.viewUserGroup)config.viewUserGroup=false;
  25.     if(!config.viewCarGroup)config.viewCarGroup=false;  
  26.     if(!config.selectType)config.selectType='111';
  27.         
  28.     var Tree = Ext.tree;
  29.     var orghasloadNodeHashTable=new Hashtable();
  30.     var userhasloadNodeHashTable=new Hashtable();
  31.     var carhasloadNodeHashTable=new Hashtable();
  32.     var tree = new Tree.TreePanel({ 
  33.          autoScroll:true,   
  34.          region: 'center'
  35.          height:'100%',
  36.          animate:false,
  37.          border :false
  38.           });
  39.     var root;       
  40.     //如果输入了机构代号,那么直接指定根节点
  41.     if(config.rootOrg!=0){
  42.         publicInterfaceManage.getOrgMsgNOde(config.rootOrg,function(value){         
  43.             if(value!=null){                
  44.                     root = new Tree.TreeNode({ 
  45.                     id:value.n_jgdh,     
  46.                     expanded:true,  
  47.                     checked:false
  48.                     attributes:[isDept=true,isKHZ=false,isCD=false],    
  49.                     text: value.c_jgmc,  
  50.                     icon:"../../../theme/default/images/tree/icondept.gif" 
  51.                         }); 
  52.                         //当选择了显示机构的时候或者树的深度选了1的时候,这里显示本机构和本机构下一级机构
  53.                         if(config.treedepth!=1){
  54.                             publicInterfaceManage.getJgxxList(value.n_jgdh,function(va){                                                
  55.                             for(var i=0;i<va.length;i=i+1){ 
  56.                                     apendOrgNodeWithCheckBox(root,va[i]);                                               
  57.                                 }
  58.                             });
  59.                             }                           
  60.                 
  61.                 //hashtable中添加root节点
  62.                 if(!orghasloadNodeHashTable.contains(root.id)){                     
  63.                     orghasloadNodeHashTable.add(root.id,root); 
  64.                 }    
  65.                 initAllKhz(root.id);                    
  66.                 tree.setRootNode(root);             
  67.                 _init();            
  68.                 }
  69.         });
  70.     }
  71.     else{       
  72.         //将当前的机构设置为树的根节点
  73.         publicInterfaceManage.getTreeRootNode(function(value){
  74.             if(value!=null){                
  75.                     root = new Tree.TreeNode({ 
  76.                     id:value.n_jgdh,     
  77.                     expanded:true,  
  78.                     checked:false
  79.                     attributes:[isDept=true,isKHZ=false,isCD=false],    
  80.                     text: value.c_jgmc,  
  81.                     icon:"../../../theme/default/images/tree/icondept.gif" 
  82.                         }); 
  83.                         //当选择了显示机构的时候或者树的深度选了1的时候,这里显示本机构和本机构下一级机构                      
  84.                         if(config.treedepth!=1){
  85.                             publicInterfaceManage.getJgxxList(value.n_jgdh,function(va2){                               
  86.                             for(var i=0;i<va2.length;i=i+1){ 
  87.                                 apendOrgNodeWithCheckBox(root,va2[i]);                                              
  88.                                 }
  89.                             });
  90.                         }
  91.                     //hashtable中添加root节点
  92.                     if(!orghasloadNodeHashTable.contains(root.id)){                     
  93.                         orghasloadNodeHashTable.add(root.id,root); 
  94.                      }     
  95.                 initAllKhz(root.id);                            
  96.                 tree.setRootNode(root);
  97.                 _init();
  98.                 }
  99.         });
  100.     }
  101.     function _init(){                    
  102.         tree.on("dblclick",apendNodeAfterClick);
  103.         tree.on('checkchange'function(node, checked) {            
  104.             checkChangeAction(node, checked);
  105.         });
  106.         carWithOrgTreePanel=new Ext.Window({
  107.                     title: '单位选择',
  108.                     layout: 'border',
  109.                     closable:true,
  110.                     width:300,
  111.                     height:400,
  112.                     border:false,
  113.                     plain:true,
  114.                     closeAction:'close',
  115.                     items: [ tree ]
  116.                 });
  117.         carWithOrgTreePanel.show();
  118.     }
  119.         
  120. //___________________________________一些函数
  121. //添加一个带复选框的机构节点
  122.     function apendOrgNodeWithCheckBox(node,Val_Org){    
  123.         if(!orghasloadNodeHashTable.contains(Val_Org.n_jgdh)){              
  124.             var newnode = new Tree.TreeNode({ 
  125.                 id:Val_Org.n_jgdh,   
  126.                 expanded:true,
  127.                 checked:false
  128.                 attributes:[isDept=true,isKHZ=false,isCD=false], 
  129.                 text:Val_Org.c_jgmc,  
  130.                 icon:"../../../theme/default/images/tree/icondept.gif" 
  131.                 });
  132.             node.appendChild(newnode);  
  133.             orghasloadNodeHashTable.add(newnode.id,newnode); 
  134.             }
  135.     }
  136.     //添加一个带复选框的客户节点
  137.     function apendUserNodeWithCheckBox(node,Val_khz){   
  138.         if(!userhasloadNodeHashTable.contains(Val_khz.n_khzdh)){
  139.             var newnode=new Tree.TreeNode({
  140.                 id:Val_khz.n_khzdh,
  141.                 expanded:true,
  142.                 checked:false
  143.                 attributes:[isDept=false,isKHZ=true,isCD=false], 
  144.                 text:Val_khz.c_khzxm,
  145.                 icon:"../../../theme/default/images/tree/kehu.gif"
  146.                 });
  147.             node.appendChild(newnode);
  148.             userhasloadNodeHashTable.add(newnode.id,newnode);
  149.         }
  150.     }
  151.     //添加一个带复选框的车队节点
  152.     function apendCarNodeWithCheckBox(node,Val_khz){        
  153.         if(!carhasloadNodeHashTable.contains(Val_khz.n_khzdh)){
  154.             var newnode=new Tree.TreeNode({
  155.                 id:Val_khz.n_khzdh,
  156.                 expanded:true,
  157.                 checked:false
  158.                 attributes:[isDept=false,isKHZ=false,isCD=true], 
  159.                 text:Val_khz.c_khzxm,
  160.                 icon:"../../../theme/default/images/tree/chedui.gif"
  161.                 });
  162.             node.appendChild(newnode);
  163.             carhasloadNodeHashTable.add(newnode.id,newnode);
  164.             }
  165.     }   
  166.     
  167.     //树节点点击拓展事件
  168.     function apendNodeAfterClick(node){ 
  169.         node.getUI().checkbox.checked=false;
  170.         if(node.attributes.attributes[0]) initAllKhz(node.id);      
  171.     }   
  172.     function checkChangeAction(node, checked){
  173.         //当节点处于被选中状态的时候
  174.         if(node.getUI().checkbox.checked==true){
  175.             //单选模式的时候
  176.             if(config.oneCheckModel){
  177.                 clearChildNodeChecked(root);
  178.                 root.getUI().checkbox.checked=false;
  179.                 //当只选择机构且节点类型为机构的时候
  180.                 if(config.selectType.substring(0,1)==1&&node.attributes.attributes[0]){
  181.                     node.getUI().checkbox.checked=true;
  182.                     return;
  183.                 }
  184.                 //当只选择机构且节点类型为客户的时候
  185.                 if(config.selectType.substring(1,2)==1&&node.attributes.attributes[1]){
  186.                     node.getUI().checkbox.checked=true;
  187.                     return;
  188.                 }
  189.                 //当只选择机构且节点类型为车队的时候
  190.                 if(config.selectType.substring(2,3)==1&&node.attributes.attributes[2]){
  191.                     node.getUI().checkbox.checked=true;
  192.                     return;
  193.                 }
  194.             }
  195.             //当为多选模式的时候
  196.             else{
  197.                 //当节点类型为机构的时候
  198.                 if(node.attributes.attributes[0]){
  199.                     node.getUI().checkbox.checked=true;         
  200.                     //选中子节点
  201.                     makeChildNodesChecked(node);
  202.                     makeChildNodesOrgUnchecked(node);   
  203.                 }
  204.                 //当节点类型为客户的时候
  205.                 if(node.attributes.attributes[1]){
  206.                     //当客户为可选类型的时候,选中此节点,否则不予选中
  207.                     if(config.selectType.substring(1,2)==1) node.getUI().checkbox.checked=true;
  208.                     else    node.getUI().checkbox.checked=false;
  209.                 }
  210.                 //当节点类型为车队的时候
  211.                 if(node.attributes.attributes[2]){
  212.                     //当车队为可选类型的时候,选中此节点,否则不予选中
  213.                     if(config.selectType.substring(2,3)==1) node.getUI().checkbox.checked=true;
  214.                     else    node.getUI().checkbox.checked=false;
  215.                 }
  216.                 //选中子节点
  217.                 makeChildNodesChecked(node);
  218.                 makeChildNodesOrgUnchecked(node);   
  219.                 //当一个节点下面所有的字节点(不包含机构节点)都被选中的时候,自动选中根节点
  220.                 getChildNumWithoutOrg(getParentOrgNode(node));
  221.             }
  222.         }
  223.         //当节点被取消选中的时候
  224.         else{
  225.             node.getUI().checkbox.checked=false;
  226.             clearChildNodeChecked(node);
  227.             //当这个节点不是机构的时候,也取消机构节点的勾选状态
  228.             if(!node.attributes.attributes[0]){
  229.                 var parentOrgNode=getParentOrgNode(node);               
  230.                 parentOrgNode.getUI().checkbox.checked=false;
  231.             }
  232.             getChildNumWithoutOrg(getParentOrgNode(node));
  233.         }
  234.     }
  235.     //得到一个节点下面所有字节点(不包含子节点为机构的节点的字节点)的个数,传入参数为该节点的上级机构节点
  236.     function getChildNumWithoutOrg(orgNode){
  237.         var nowNum=0;   
  238.         var allNum=0;
  239.         for(var x in userhasloadNodeHashTable._hash){
  240.             //得到子节点的上级机构节点
  241.             var _parentorgnode=getParentOrgNode(userhasloadNodeHashTable._hash[x]);
  242.             //当当前遍历的子节点的机构节点为传入的机构节点的话
  243.             if(_parentorgnode==orgNode){
  244.                 allNum++;
  245.                 if(userhasloadNodeHashTable._hash[x].getUI().checkbox.checked==true)nowNum++; 
  246.             }           
  247.         }
  248.         for(var x in carhasloadNodeHashTable._hash){
  249.             //得到子节点的上级机构节点
  250.             var _parentorgnode=getParentOrgNode(carhasloadNodeHashTable._hash[x]);
  251.             //当当前遍历的子节点的机构节点为传入的机构节点的话
  252.             if(_parentorgnode==orgNode){
  253.                 allNum++;
  254.                 if(carhasloadNodeHashTable._hash[x].getUI().checkbox.checked==true)nowNum++; 
  255.             }           
  256.         }       
  257.         if(nowNum==allNum) orgNode.getUI().checkbox.checked=true;       
  258.     }
  259.     //清空一个节点下面的所有复选框
  260.     function clearChildNodeChecked(node){
  261.         if(node.childNodes.length!=0){
  262.             for(var i=0;i<node.childNodes.length;i++){
  263.                 node.childNodes[i].getUI().checkbox.checked=false;
  264.                 clearChildNodeChecked(node.childNodes[i]);
  265.             }
  266.         }       
  267.     }
  268.     //取消节点下面的字节点为机构的节点的字节点的选中状态
  269.     function makeChildNodesOrgUnchecked(node){
  270.         for(var i=0;i<node.childNodes.length;i++){
  271.             if(node.childNodes[i].attributes.attributes[0]){
  272.                 clearChildNodeChecked(node.childNodes[i]);
  273.             }
  274.         }
  275.     }
  276.     //根据条件选中所有子节点
  277.     function makeChildNodesChecked(node){
  278.         for(var i=0;i<node.childNodes.length;i++){
  279.             //当子节点为机构的时候直接不选中
  280.             if(node.childNodes[i].attributes.attributes[0]){
  281.                 node.childNodes[i].getUI().checkbox.checked=false;
  282.             }
  283.             //当子节点为客户并且可以选择客户的时候,客户也被选中
  284.             if(config.selectType.substring(1,2)==1&&node.childNodes[i].attributes.attributes[1]){
  285.                 node.childNodes[i].getUI().checkbox.checked=true;
  286.             }
  287.             //当子节点为车队并且可以选择车队的时候,车队也被选中
  288.             if(config.selectType.substring(2,3)==1&&node.childNodes[i].attributes.attributes[2]){
  289.                 node.childNodes[i].getUI().checkbox.checked=true;
  290.             }
  291.             makeChildNodesChecked(node.childNodes[i]);
  292.         }           
  293.     }
  294.     //得到所有被选中的节点
  295.     function ObjForReturnInButton(){
  296.         var returnArr=new Array();      
  297.             for(var x in orghasloadNodeHashTable._hash)
  298.              {          
  299.                 if(orghasloadNodeHashTable._hash[x].getUI().checkbox.checked==true)                 
  300.                     returnArr.push(orghasloadNodeHashTable._hash[x]);
  301.              }
  302.              for(var x in userhasloadNodeHashTable._hash)
  303.              {
  304.                 if(userhasloadNodeHashTable._hash[x].getUI().checkbox.checked==true
  305.                     returnArr.push(userhasloadNodeHashTable._hash[x]);
  306.              }
  307.              for(var x in carhasloadNodeHashTable._hash)
  308.              {
  309.                 if(carhasloadNodeHashTable._hash[x].getUI().checkbox.checked==true
  310.                     returnArr.push(carhasloadNodeHashTable._hash[x]);
  311.              }      
  312.         return returnArr;
  313.     }
  314.     //得到上级节点为机构的节点id
  315.     var _parentOrgNode;
  316.     function getParentOrgNode(node){
  317.         if(node==root) return root;
  318.         //当上级节点就为机构的时候      
  319.         if(!node.parentNode.attributes.attributes[0]) {
  320.             getParentOrgNode(node.parentNode);
  321.         }
  322.         else {
  323.             _parentOrgNode=node.parentNode;
  324.         }
  325.         return _parentOrgNode;
  326.     }   
  327.     //在初始化根节点下面的所有的车队和客户,但是部队根节点下面的机构进行拓展
  328.     function getOrgAllNode(jgdh){       
  329.         publicInterfaceManage.getAllGroupByOrgCode(jgdh,function(value){
  330.             //上级客户组的遍历,首先得到上级客户组代号最小的,这里0为机构下面直属客户组,然后逐渐增大。
  331.             var groupCodeArray=new Array();
  332.             for(var i=0;i<value.length;i++){
  333.                 var boo=true;
  334.                 for(j=0;j<groupCodeArray.length;j++){
  335.                     if(groupCodeArray[i]==value[i])boo=false;
  336.                 }
  337.                 if(boo)groupCodeArray.push(value[i]);
  338.             }
  339.             groupCodeArray.sort();//默认升序排列
  340.             var maxSuperiorsCustomerGroupCode=0;
  341.             for(var i=0;i<value.length;i++){
  342.                 for(var j=0;j<groupCodeArray;j++){
  343.                     if(value[i].n_sjkhzdh==groupCodeArray[j]){
  344.                         if(groupCodeArray[j]==0){
  345.                             var orgNode=orghasloadNodeHashTable.items(jgdh);
  346.                             //当需要显示客户,并且客户组类型为客户的时候                             
  347.                             if(config.viewUserGroup==true&&value[i].n_khzlx==1){
  348.                                  apendUserNodeWithCheckBox(orgNode,value[i]);                                       
  349.                             }
  350.                             //当需要显示车队,并且客户组类型为车队的时候
  351.                             if(config.viewCarGroup==true&&value[i].n_khzlx==2){
  352.                                 apendCarNodeWithCheckBox(orgNode,value[i]);
  353.                             }
  354.                         }
  355.                         else{
  356.                             if(config.viewUserGroup==true&&value[i].n_khzlx==1){
  357.                                 var khzNode=userhasloadNodeHashTable.items(value[i].n_sjkhzdh);
  358.                                  apendUserNodeWithCheckBox(khzNode,value[i]);                                       
  359.                             }
  360.                             //当需要显示车队,并且客户组类型为车队的时候
  361.                             if(config.viewCarGroup==true&&value[i].n_khzlx==2){
  362.                                 var khzNode=userhasloadNodeHashTable.items(value[i].n_sjkhzdh);
  363.                                 apendCarNodeWithCheckBox(khzNode,value[i]);
  364.                             }
  365.                         }
  366.                     }
  367.                     
  368.                 }
  369.             }
  370.         });
  371.     }
  372.     //根据机构代号初始化机构下面的所有客户组
  373.     function initAllKhz(n_jgdh){    
  374.         publicInterfaceManage.getAllGroupByOrgCode(n_jgdh,function(calBackValue){
  375.             /**
  376.              * key为上级节点代号,
  377.              * value=obejct 
  378.              * value.isDept=boolean,value.isKHZ=boolean
  379.              * value.valArr=array();
  380.              */         
  381.             var superiorsHashtable=new Hashtable();
  382.                 for(i=0;i<calBackValue.length;i++){
  383.                     if(superiorsHashtable.contains(calBackValue[i].n_sjkhzdh)){
  384.                             superiorsHashtable.items(calBackValue[i].n_sjkhzdh).valArr.push(calBackValue[i]);
  385.                         }
  386.                         var key=calBackValue[i].n_sjkhzdh;
  387.                         var value=new Object();
  388.                     if(calBackValue[i].n_sjkhzdh==0){
  389.                         
  390.                         value.isDept=true;
  391.                         value.isKHZ=false;                                          
  392.                     }   
  393.                     else{                   
  394.                         value.isDept=false;
  395.                         value.isKHZ=true;                   
  396.                     }   
  397.                     var arr=new Array();
  398.                         arr.push(calBackValue[i]);
  399.                         value.valArr=arr;
  400.                         superiorsHashtable.add(key,value);          
  401.                 }
  402.             //将得到的Hashtable添加到树中。                   
  403.                 var sortedHashtable=sortHashTable(superiorsHashtable);              
  404.                 for(var i=0;i<sortedHashtable.length;i++){
  405.                     var superiorsIsOrg=superiorsHashtable.items(sortedHashtable[i]);
  406.                         if(sortedHashtable[i]==0){
  407.                                 for(var j=0;j<superiorsIsOrg.valArr.length;j++){
  408.                                     var orgNode=orghasloadNodeHashTable.items(n_jgdh);
  409.                                     //当需要显示客户,并且客户组类型为客户的时候                             
  410.                                     if(config.viewUserGroup==true&&superiorsIsOrg.valArr[j].n_khzlx==1){
  411.                                         apendUserNodeWithCheckBox(orgNode,superiorsIsOrg.valArr[j]);                                        
  412.                                     }
  413.                                     //当需要显示车队,并且客户组类型为车队的时候
  414.                                     if(config.viewCarGroup==true&&superiorsIsOrg.valArr[j].n_khzlx==2){
  415.                                         apendCarNodeWithCheckBox(orgNode,superiorsIsOrg.valArr[j]);
  416.                                     }
  417.                                 }
  418.                         }               
  419.                         else{                           
  420.                             for(var j=0;j<superiorsIsOrg.valArr.length;j++){
  421.                                 //当上级节点不为空的时候
  422.                                 var cuParentNode=new Array();
  423.                                 cuParentNode=getParentNode(sortedHashtable[i]);                             
  424.                                 if(cuParentNode){
  425.                                     //当需要显示客户,并且客户组类型为客户的时候                             
  426.                                     if(config.viewUserGroup==true&&superiorsIsOrg.valArr[j].n_khzlx==1){
  427.                                         apendUserNodeWithCheckBox(cuParentNode,superiorsIsOrg.valArr[j]);                                       
  428.                                     }
  429.                                     //当需要显示车队,并且客户组类型为车队的时候
  430.                                     if(config.viewCarGroup==true&&superiorsIsOrg.valArr[j].n_khzlx==2){
  431.                                         apendCarNodeWithCheckBox(cuParentNode,superiorsIsOrg.valArr[j]);
  432.                                     }
  433.                                 }
  434.                             }
  435.                         }                   
  436.                 }
  437.         })
  438.     }
  439.     //对hashtable中的key值进行排序
  440.     function sortHashTable(hashtable){
  441.         var sortedArr=new Array();
  442.           for(var key in hashtable._hash){
  443.             sortedArr.push(key);
  444.           }
  445.           return sortedArr.sort();
  446.     }
  447.     //根据节点Id得到上一级的节点
  448.     function getParentNode(key){    
  449.         var returnObj;  
  450.         if(userhasloadNodeHashTable.items(key)) {       
  451.             returnObj=userhasloadNodeHashTable.items(key);
  452.         } 
  453.         if(carhasloadNodeHashTable.items(key)){     
  454.             returnObj=carhasloadNodeHashTable.items(key);
  455.         }  
  456.         return returnObj;
  457.     }
  458. }

使用方法:









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值