OrgField.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. Gef.ns('Gef.org');
  2. Gef.org.CheckboxTreeNodeUI = Ext.extend(Ext.tree.CheckboxNodeUI, {
  3. checkParent: Ext.emptyFn,
  4. checkChild: Ext.emptyFn
  5. });
  6. Gef.org.OrgField = Ext.extend(Ext.form.TriggerField, {
  7. triggerClass : "x-form-search-trigger",
  8. initComponent: function() {
  9. this.readOnly = false;
  10. Gef.org.OrgField.superclass.initComponent.call(this);
  11. this.addEvents('select');
  12. },
  13. onTriggerClick: function() {
  14. var me = this;
  15. this.showWindow();
  16. },
  17. showWindow: function(store) {
  18. var selete=[];
  19. var seleteId=[];
  20. var me = this;
  21. var requestUrl = '';
  22. if(me.name=='assignee'||me.name=='notifyPeople'){
  23. var Morgname="or_name",Mname="em_name",Mcode="em_code";
  24. requestUrl = basePath+'common/getOrgAssignees.action';
  25. }else{
  26. var Morgname="JO_ORGNAME",Mname="",Mcode="";
  27. requestUrl = basePath+'common/getJobOfOrg.action';
  28. }
  29. Ext.Msg.wait('获取数据中...');
  30. Ext.Ajax.request({//拿到tree数据
  31. url:requestUrl,
  32. method:'post',
  33. timeout:60000,
  34. success: function(response){
  35. Ext.Msg.hide();
  36. res = new Ext.decode(response.responseText);
  37. if(res.tree){
  38. store = new Ext.decode(res.tree);
  39. var window=me.getWindow(store,selete,seleteId,Morgname,Mname,Mcode);
  40. window.show();
  41. var value =window.field.value;
  42. var array = value.split(',');
  43. me.orgTree.cleanCheck();
  44. me.orgTree.setChecked(array);
  45. var array1=me.orgTree.getChecked();
  46. for (var i = 0; i < array1.length; i++){
  47. selete.push(array1[i]);
  48. }
  49. window.items.items[0].form.items.items[3].setValue(me.orgTree.getChecked()); //设置 已选择
  50. }
  51. }
  52. });
  53. Gef.activeEditor.disable();
  54. },
  55. hideWindow: function() {
  56. this.getWindow().hide();
  57. Gef.activeEditor.enable();
  58. },
  59. getWindow: function(store,selete,seleteId,Morgname,Mname,Mcode) {
  60. if (!this.orgWindow) {
  61. this.orgWindow = this.createWindow(store,selete,seleteId,Morgname,Mname,Mcode);
  62. }
  63. return this.orgWindow;
  64. },
  65. createWindow: function(store,selete,seleteId,Morgname,Mname,Mcode) {
  66. var me = this;
  67. var selectedValues = [];
  68. if(this.value.indexOf(',')>0){
  69. selectedValues = this.value.split(',');
  70. }
  71. var tree = new Ext.tree.TreePanel({
  72. autoScroll: true,
  73. loader: new Ext.tree.CustomUITreeLoader({
  74. baseAttr: {
  75. uiProvider: Gef.org.CheckboxTreeNodeUI
  76. }
  77. }),
  78. width:300,
  79. region:'center',
  80. enableDD: false,
  81. containerScroll: true,
  82. rootUIProvider: Gef.org.CheckboxTreeNodeUI,
  83. selModel: new Ext.tree.CheckNodeMultiSelectionModel(),
  84. rootVisible: false,
  85. count:1, // 这一行 是为了联合控制 click事件 加上去的,不属于树本身的属性:
  86. listeners:{
  87. 'click':function(node){
  88. var window=me.getWindow(store);
  89. if(node.isLeaf()){
  90. if(node.ui.checkboxImg.className =='x-tree-node-checkbox-none'){
  91. selete=arrayremove(selete,node.text);
  92. seleteId=arrayremove(seleteId,node.id);
  93. window.items.items[0].form.items.items[3].setValue(selete);
  94. }else if((node.ui.checkboxImg.className =='x-tree-node-checkbox-all')){
  95. if(selete.indexOf(node.text)==-1){
  96. selete.push(node.text);
  97. seleteId.push(node.id);
  98. window.items.items[0].form.items.items[3].setValue(selete);
  99. }
  100. }
  101. }else
  102. {
  103. if(node.ui.checkboxImg.className == 'x-tree-node-checkbox-all'){
  104. for(var i = 0; i < node.childNodes.length; i++) {
  105. node.ui.checkboxImg.className = 'x-tree-node-checkbox-all';
  106. node.childNodes[i].ui.checkboxImg.className = 'x-tree-node-checkbox-all';
  107. if(selete.indexOf(node.childNodes[i].text)==-1){
  108. selete.push(node.childNodes[i].text);
  109. seleteId.push(node.childNodes[i].id);
  110. }
  111. window.items.items[0].form.items.items[3].setValue(selete);
  112. }
  113. }
  114. else if(node.ui.checkboxImg.className == 'x-tree-node-checkbox-none')
  115. {
  116. for(var i = 0; i < node.childNodes.length; i++) {
  117. node.ui.checkboxImg.className = 'x-tree-node-checkbox-none';
  118. node.childNodes[i].ui.checkboxImg.className = 'x-tree-node-checkbox-none';
  119. selete=arrayremove(selete,node.childNodes[i].text);
  120. seleteId=arrayremove(seleteId,node.childNodes[i].id);
  121. window.items.items[0].form.items.items[3].setValue(selete);
  122. }
  123. }
  124. }
  125. },
  126. 'dbclick':function(){
  127. root = this.getRootNode();
  128. var childrens = root.childNodes;
  129. for(var i=0;i<childrens.length;i++){
  130. for(var j=0;j<childrens[i].childNodes.length;j++){
  131. if(childrens[i][j].attributes.qtip==me.value){
  132. childrens[i][j].ui.checkboxImg.className = 'x-tree-node-checkbox-all';
  133. childrens[i][j].attributes.checked = true;
  134. }
  135. }
  136. }
  137. },
  138. 'expandnode':function(node){
  139. if(!node.isLeaf()){
  140. var childrens = node.childNodes;
  141. for(var i=0;i<childrens.length;i++){
  142. if(childrens[i].isLeaf()){ // 传过来的 model.value(即之前保存过的值一定是 叶子节点额。)
  143. if(selectedValues.length<2){ // model.value 只选择了一个值
  144. if(childrens[i].attributes.qtip==me.value){
  145. childrens[i].ui.checkboxImg.className = 'x-tree-node-checkbox-all';
  146. childrens[i].attributes.checked = true;
  147. }
  148. }else{
  149. for(var j=0;j<selectedValues.length;j++){ //model.value 选择了多个值!
  150. if(childrens[i].attributes.qtip==selectedValues[j]){
  151. childrens[i].ui.checkboxImg.className = 'x-tree-node-checkbox-all';
  152. childrens[i].attributes.checked = true;
  153. }
  154. }
  155. }
  156. }
  157. }
  158. }
  159. }
  160. }
  161. });
  162. tree.getLoader().on('load', function(o, node) {
  163. if (node.isRoot) {
  164. tree.expandAll();
  165. }
  166. });
  167. var arrayindexof = function(val0,val1) {
  168. for (var i = 0; i < val0.length; i++) {
  169. if (val0[i] == val1){
  170. return i;
  171. }
  172. }
  173. return -1;
  174. };
  175. var arrayremove = function(val0,val1) {
  176. var index =arrayindexof(val0,val1);
  177. if (index > -1) {
  178. val0.splice(index, 1);
  179. }
  180. return val0;
  181. };
  182. var root = new Ext.tree.AsyncTreeNode({
  183. text: 'root',
  184. draggable: false,
  185. leaf:false,
  186. children:store,
  187. expanded:true
  188. });
  189. tree.setRootNode(root);
  190. tree.cleanCheck = function(node) {
  191. if (typeof node == 'undefined') {
  192. node = this.rootVisible ? this.getRootNode() : this.getRootNode().firstChild;
  193. }
  194. if (node) {
  195. if (!node.isLeaf()) {
  196. node.ui.checkboxImg.className ='x-tree-node-checkbox-none';
  197. node.attributes.checked = false;
  198. for(var i = 0; i < node.childNodes.length; i++) {
  199. this.cleanCheck(node.childNodes[i]);
  200. }
  201. }
  202. }
  203. };
  204. tree.getChecked = function(node) {
  205. var checked = [], i;
  206. if (typeof node == 'undefined') {
  207. node = this.getRootNode();
  208. } else if (node.ui.checkboxImg && node.ui.checkboxImg.className == 'x-tree-node-checkbox-all' ) {
  209. if(node.isLeaf()){
  210. checked.push(node.text);
  211. } else {
  212. node.ui.checkboxImg.className = 'x-tree-node-checkbox-none';
  213. }
  214. }
  215. if (!node.isLeaf()) {
  216. for(var i = 0; i < node.childNodes.length; i++) {
  217. checked = checked.concat(this.getChecked(node.childNodes[i]));
  218. }
  219. }
  220. return checked;
  221. };
  222. tree.setChecked = function(array) {
  223. for (var i = array.length - 1; i >= 0; i--) {
  224. var n = this.getNodeById(array[i]);
  225. if (n && !n.getUI().checked()) {
  226. n.getUI().check();
  227. }
  228. }
  229. };
  230. this.orgTree = tree;
  231. //加筛选 根据 所属组织 人员名称 以及编号 做筛选
  232. var formpanel=new Ext.form.FormPanel({
  233. height:100,
  234. region:'west',
  235. width:'30%',
  236. labelWidth: 70,
  237. labelAlign: 'right',
  238. border: false,
  239. defaultType: 'textfield',
  240. defaults: {
  241. anchor: '90%'
  242. },
  243. bodyStyle: {
  244. padding: '6px 0 0'
  245. },
  246. items:[{
  247. xtype:'textfield',
  248. name:'orname',
  249. fieldLabel:'所属组织'
  250. },{
  251. xtype:'textfield',
  252. name:'name',
  253. fieldLabel:'员工名称'
  254. },{
  255. xtype:'textfield',
  256. name:'code',
  257. fieldLabel:'员工编号'
  258. },{
  259. xtype: 'textarea',
  260. name:'selected',
  261. readOnly:true,
  262. //disabled:true,
  263. fieldLabel:'已选择'
  264. }],
  265. buttonAlign:'center',
  266. buttons:[{
  267. text:'筛选',
  268. iconCls:'x-form-search-trigger',
  269. style:'padding-bottom:150px',
  270. handler:function(){
  271. var condition=me.getCondition(win,Morgname,Mname,Mcode);
  272. if(condition){
  273. var requestUrl = '';
  274. if(me.name=='assignee'||me.name=='notifyPeople'){
  275. requestUrl = basePath+'common/getOrgAssignees.action';
  276. }else{
  277. requestUrl = basePath+'common/getJobOfOrg.action';
  278. }
  279. Ext.Ajax.request({//拿到tree数据
  280. url:requestUrl,
  281. timeout:60000,
  282. params:{
  283. condition:condition
  284. },
  285. method:'post',
  286. success: function(response){
  287. res = new Ext.decode(response.responseText);
  288. if(res.tree){
  289. var cstore = new Ext.decode(res.tree);
  290. var hisroot=tree.getRootNode();
  291. var cn = hisroot.childNodes,n;
  292. while ((n = cn[0])) {
  293. hisroot.removeChild(n);
  294. }
  295. var fn = function(node, ch) {
  296. for(var i in ch) {
  297. var n = ch[i];
  298. if(n.text){
  299. node.appendChild(new Ext.tree.AsyncTreeNode({
  300. text: n.text,
  301. draggable: false,
  302. leaf:false,
  303. children:n.children
  304. }));
  305. }
  306. }
  307. };
  308. fn(hisroot, cstore);
  309. tree.expandAll();
  310. var value =win.field.value;
  311. var array = value.split(',');
  312. tree.setChecked(seleteId);
  313. }
  314. }
  315. });
  316. }
  317. }
  318. }]
  319. });
  320. var win = new Ext.Window({
  321. title: '人事',
  322. layout: 'border',
  323. height:window.innerHeight*0.9,
  324. width: 600,
  325. closeAction: 'hide',
  326. modal: true,
  327. items: [formpanel,tree],
  328. buttons: [ {
  329. text: '确定',
  330. handler:function(){
  331. this.submit(selete);
  332. },
  333. scope: this
  334. }, {
  335. text: '取消',
  336. handler: this.hideWindow,
  337. scope: this
  338. }, {
  339. text: '刷新',
  340. handler: function() {
  341. tree.root.reload();
  342. tree.setChecked(seleteId);
  343. },
  344. scope: this
  345. }],
  346. listeners:{
  347. 'beforehide':function(c){
  348. Gef.activeEditor.existWin=false;
  349. Gef.activeEditor.enable();
  350. },
  351. 'beforeshow':function(c){
  352. Gef.activeEditor.existWin=true;
  353. Gef.activeEditor.disable();
  354. }
  355. }
  356. });
  357. win.field = this;
  358. return win;
  359. },
  360. submit: function(selete) {
  361. var value='';
  362. for (var i = 0; i < selete.length; i++) {
  363. if(value==null||value==""){
  364. value=value+selete[i];
  365. }else{
  366. value=value+','+selete[i];
  367. }
  368. }
  369. this.setValue(value);
  370. this.hideWindow();
  371. this.fireEvent('select', this);
  372. },
  373. selectOwner: function() {
  374. this.setValue("项目发起人");
  375. this.hideWindow();
  376. this.fireEvent('select', this);
  377. },
  378. refreshTree: function() {
  379. },
  380. getCondition:function(win,Morgname,Mname,Mcode){
  381. var form=win.items.items[0].form;
  382. var values=form.getValues();
  383. var orname=values.orname;
  384. var name=values.name;
  385. var code=values.code;
  386. var condition="";
  387. if((!orname && !name && !code)|| (orname=="" && name=="" && code=="")){
  388. return null;
  389. }else {
  390. condition+=(orname==null || orname=="")?"1=1 #" :" "+Morgname+" like '%"+orname+"%' #";
  391. condition+=(name==null || name=="")?"1=1 " :" "+Mname+" like '%"+name+"%'";
  392. condition+=(code==null || code=="")?" " :" and "+Mcode+" like '%"+code+"%'";
  393. return condition;
  394. }
  395. }
  396. });
  397. Ext.reg('orgfield', Gef.org.OrgField);