SysTreeGrid.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. /**
  2. * ERP项目gridpanel样式5:sysNavigation专用treegrid
  3. */
  4. Ext.define('erp.view.core.grid.SysTreeGrid',{
  5. extend: 'Ext.tree.Panel',
  6. alias: 'widget.erpSysTreeGrid',
  7. region: 'south',
  8. layout : 'fit',
  9. id: 'treegrid',
  10. emptyText : $I18N.common.grid.emptyText,
  11. useArrows: true,
  12. rootVisible: false,
  13. singleExpand: true,
  14. saveNodes: [],
  15. updateNodes: [],
  16. deleteNodes: [],
  17. lockable: true,
  18. cls: 'custom',
  19. store: Ext.create('Ext.data.TreeStore', {
  20. storeId: 'systreestore',
  21. fields: [{"name":"sn_id","type":"string"},
  22. {"name":"sn_displayname","type":"string"},
  23. {"name":"sn_parentid","type":"string"},
  24. {"name":"sn_url","type":"string"},
  25. {"name":"sn_tabtitle","type":"string"},
  26. {"name":"sn_detno","type":"number"},
  27. {"name":"sn_isleaf","type":"bool"},
  28. {"name":"sn_showmode","type":"string"},
  29. {"name":"sn_deleteable","type":"bool"},
  30. {"name":"sn_using","type":"bool"},
  31. {"name":"sn_logic","type":"bool"},
  32. {"name":"sn_caller","type":"string"}],
  33. root : {
  34. text: 'root',
  35. id: 'root',
  36. expanded: true
  37. }
  38. }),
  39. columns : [ {
  40. "header" : "ID",
  41. "dbfind" : "",
  42. "cls" : "x-grid-header-1",
  43. "summaryType" : "",
  44. "dataIndex" : "sn_id",
  45. "align" : "left",
  46. "xtype" : "treecolumn",
  47. "readOnly" : false,
  48. "hidden" : true,
  49. "text" : "ID"
  50. }, {
  51. "header" : "描述",
  52. "dbfind" : "",
  53. "cls" : "x-grid-header-1",
  54. "summaryType" : "",
  55. "dataIndex" : "sn_displayname",
  56. "align" : "left",
  57. "xtype" : "treecolumn",
  58. "readOnly" : false,
  59. "hidden" : false,
  60. "width" : 260.0,
  61. "text" : "描述",
  62. "editor" : {
  63. "xtype" : "textfield"
  64. }
  65. }, {
  66. "dbfind" : "",
  67. "cls" : "x-grid-header-1",
  68. "summaryType" : "",
  69. "dataIndex" : "sn_parentid",
  70. "align" : "left",
  71. "xtype" : "treecolumn",
  72. "readOnly" : false,
  73. "hidden" : true,
  74. "width" : 0.0,
  75. "text" : "父节点ID"
  76. }, {
  77. "dbfind" : "",
  78. "cls" : "x-grid-header-1",
  79. "summaryType" : "",
  80. "dataIndex" : "sn_url",
  81. "align" : "left",
  82. "readOnly" : false,
  83. "hidden" : false,
  84. "width" : 400.0,
  85. "text" : "链接",
  86. "editor" : {
  87. "xtype" : "textfield"
  88. }
  89. }, {
  90. "dbfind" : "",
  91. "cls" : "x-grid-header-1",
  92. "summaryType" : "",
  93. "dataIndex" : "sn_detno",
  94. "align" : "center",
  95. "readOnly" : false,
  96. "hidden" : false,
  97. "width" : 40.0,
  98. "text" : "顺序",
  99. "editor" : {
  100. "xtype" : "numberfield"
  101. }
  102. }, {
  103. "dbfind" : "",
  104. "cls" : "x-grid-header-1",
  105. "summaryType" : "",
  106. "dataIndex" : "sn_isleaf",
  107. "align" : "left",
  108. "xtype" : "checkcolumn",
  109. "readOnly" : false,
  110. "hidden" : false,
  111. "width" : 60.0,
  112. "text" : "是否<br>叶节点",
  113. "headerCheckable" : false,
  114. "editor" : {
  115. "cls" : "x-grid-checkheader-editor",
  116. "xtype" : "checkbox"
  117. }
  118. }, {
  119. "dbfind" : "",
  120. "cls" : "x-grid-header-1",
  121. "summaryType" : "",
  122. "dataIndex" : "sn_deleteable",
  123. "align" : "left",
  124. "xtype" : "checkcolumn",
  125. "readOnly" : false,
  126. "hidden" : false,
  127. "width" : 60.0,
  128. "text" : "允许<br>删除",
  129. "headerCheckable" : false,
  130. "editor" : {
  131. "cls" : "x-grid-checkheader-editor",
  132. "xtype" : "checkbox"
  133. }
  134. }, {
  135. "dbfind" : "",
  136. "cls" : "x-grid-header-1",
  137. "summaryType" : "",
  138. "dataIndex" : "sn_using",
  139. "align" : "left",
  140. "xtype" : "checkcolumn",
  141. "readOnly" : false,
  142. "hidden" : false,
  143. "width" : 60.0,
  144. "text" : "是否<br>启用",
  145. "headerCheckable" : false,
  146. "editor" : {
  147. "cls" : "x-grid-checkheader-editor",
  148. "xtype" : "checkbox"
  149. }
  150. }, {
  151. "dbfind" : "",
  152. "cls" : "x-grid-header-1",
  153. "summaryType" : "",
  154. "dataIndex" : "sn_logic",
  155. "align" : "left",
  156. "xtype" : "checkcolumn",
  157. "headerCheckable" : false,
  158. "readOnly" : false,
  159. "hidden" : false,
  160. "width" : 60.0,
  161. "text" : "允许<br>扩展",
  162. "editor" : {
  163. "cls" : "x-grid-checkheader-editor",
  164. "xtype" : "checkbox"
  165. }
  166. }, {
  167. "dbfind" : "",
  168. "cls" : "x-grid-header-1",
  169. "summaryType" : "",
  170. "dataIndex" : "sn_caller",
  171. "align" : "left",
  172. "readOnly" : false,
  173. "hidden" : false,
  174. "width" : 120.0,
  175. "text" : "页面Caller",
  176. "editor" : {
  177. "xtype" : "textfield"
  178. }
  179. }, {
  180. "dbfind" : "",
  181. "cls" : "x-grid-header-1",
  182. "summaryType" : "",
  183. "dataIndex" : "sn_showmode",
  184. "align" : "left",
  185. "readOnly" : false,
  186. "hidden" : false,
  187. "width" : 80.0,
  188. "text" : "打开模式",
  189. "editor" : {
  190. "cls" : "x-grid-checkheader-editor",
  191. "xtype" : "combo",
  192. "store" : Ext.create('Ext.data.Store', {
  193. fields : [ 'display', 'value' ],
  194. data : [ {
  195. "display" : "选项卡模式",
  196. "value" : 0
  197. }, {
  198. "display" : "弹出框式",
  199. "value" : 1
  200. }, {
  201. "display" : "空白页",
  202. "value" : 2
  203. }, {
  204. "display" : "窗口模式",
  205. "value" : 3
  206. } ]
  207. }),
  208. "displayField" : 'display',
  209. "valueField" : 'value',
  210. "queryMode" : 'local',
  211. "value" : 0
  212. },
  213. "renderer" : function(val){
  214. var rVal = "选项卡模式";
  215. val = val || 0;
  216. switch (Number(val)) {
  217. case 0:
  218. rVal = "选项卡模式";break;
  219. case 1:
  220. rVal = "弹出框式";break;
  221. case 2:
  222. rVal = "空白页";break;
  223. case 3:
  224. rVal = "窗口模式";break;
  225. }
  226. return rVal;
  227. }
  228. }],
  229. plugins: Ext.create('Ext.grid.plugin.CellEditing', {
  230. clicksToEdit: 1
  231. }),
  232. tbar: ['->',{
  233. iconCls: 'tree-add',
  234. cls: 'x-btn-gray',
  235. text: $I18N.common.button.erpAddButton,
  236. handler: function(){
  237. var treegrid = Ext.getCmp('treegrid');
  238. var items = treegrid.selModel.selected.items;
  239. if(items.length > 0 && items[0].isLeaf() == true){
  240. if(items[0].data['sn_id'] == null || items[0].data['sn_id'] == ''){
  241. warnMsg('如果在该节点下添加子节点,需先保存该节点,是否保存?', function(btn){
  242. if(btn == 'yes'){
  243. if(items[0].data['sn_displayname'] == null || items[0].data['sn_displayname'] == ''){
  244. showError('请先描述该节点');
  245. return;
  246. } else {
  247. items[0].data['leaf'] = false;
  248. items[0].data['cls'] = 'x-tree-cls-parent';
  249. items[0].data['sn_isleaf'] = false;
  250. treegrid.saveNodes.push(items[0]);
  251. treegrid.saveNode();
  252. }
  253. } else if(btn == 'no'){
  254. return;
  255. }
  256. });
  257. } else {
  258. items[0].data['leaf'] = false;
  259. items[0].data['cls'] = 'x-tree-cls-parent';
  260. items[0].data['sn_isleaf'] = false;
  261. items[0].dirty = true;
  262. var o = {
  263. sn_parentid: items[0].data['sn_id'],
  264. sn_isleaf: true,
  265. cls: "x-tree-cls-node",
  266. parentId: items[0].data['sn_id'],
  267. leaf: true,
  268. detno: 0,
  269. sn_detno: 0,
  270. sn_deleteable: true,
  271. deleteable: true,
  272. allowDrag: true,
  273. showMode: 0,
  274. sn_logic: 0
  275. };
  276. items[0].appendChild(o);
  277. items[0].expand(true);
  278. }
  279. } else {
  280. var record = treegrid.getExpandItem();
  281. var detno = null;
  282. if(record){
  283. if(record.childNodes.length==0){
  284. detno = 1;
  285. } else {
  286. detno = record.childNodes[record.childNodes.length-1].data.detno + 1;
  287. }
  288. var o = {
  289. sn_parentid: record.data['sn_id'],
  290. sn_isleaf: true,
  291. cls: "x-tree-cls-node",
  292. parentId: record.data['sn_id'],
  293. sn_deleteable: true,
  294. deleteable: true,
  295. leaf: true,
  296. detno: detno,
  297. sn_detno: detno,
  298. allowDrag: true,
  299. showMode: 0,
  300. sn_logic: 0
  301. };
  302. record.appendChild(o);
  303. }
  304. }
  305. }
  306. },'-',{
  307. iconCls: 'tree-add',
  308. cls: 'x-btn-gray',
  309. text: '添加根节点',
  310. handler: function(){
  311. }
  312. },'-',{
  313. iconCls: 'tree-delete',
  314. cls: 'x-btn-gray',
  315. text: $I18N.common.button.erpDeleteButton,
  316. handler: function(){
  317. var treegrid = Ext.getCmp('treegrid');
  318. var items = treegrid.selModel.selected.items;
  319. if(items.length > 0){
  320. if(items[0].isLeaf() == true){
  321. if(items[0].data['sn_id'] != null && items[0].data['sn_id'] != ''){
  322. if(items[0].data['sn_deleteable'] == true){
  323. warnMsg('确定删除节点[' + items[0].data['sn_displayname'] + "]?", function(btn){
  324. if(btn == 'yes'){
  325. treegrid.deleteNode(items[0]);
  326. } else if(btn == 'no'){
  327. return;
  328. }
  329. });
  330. } else {
  331. showError('该节点不允许删除!');
  332. }
  333. } else {
  334. items[0].remove(true);
  335. }
  336. } else {
  337. if(items[0].data['sn_id'] != null || items[0].data['sn_id'] != ''){
  338. if(items[0].data['sn_deleteable'] == true){
  339. Ext.each(items[0].childNodes, function(){
  340. if(this.data['sn_deleteable'] == false){
  341. showError('该节点有不可删除子节点,无法删除该节点!');
  342. return;
  343. }
  344. });
  345. warnMsg('确定删除节点[' + items[0].data['sn_displayname'] + ']及其子节点?', function(btn){
  346. if(btn == 'yes'){
  347. treegrid.deleteNode(items[0]);
  348. } else if(btn == 'no'){
  349. return;
  350. }
  351. });
  352. } else {
  353. showError('该节点不允许删除!');
  354. }
  355. } else {
  356. items[0].remove(true);
  357. }
  358. }
  359. } else {
  360. var record = treegrid.getExpandItem();
  361. if(record){
  362. if(record.childNodes.length == 0){
  363. if(record.data['sn_id'] != null && record.data['sn_id'] != ''){
  364. if(record.data['sn_deleteable'] == true){
  365. warnMsg('确定删除节点[' + record.data['sn_displayname'] + ']?', function(btn){
  366. if(btn == 'yes'){
  367. treegrid.deleteNode(record);
  368. } else if(btn == 'no'){
  369. return;
  370. }
  371. });
  372. } else {
  373. showError('该节点不允许删除!');
  374. }
  375. } else {
  376. record.remove(true);
  377. }
  378. }
  379. }
  380. }
  381. }
  382. },'-',{
  383. iconCls: 'tree-save',
  384. cls: 'x-btn-gray',
  385. text: $I18N.common.button.erpSaveButton,
  386. handler: function(){
  387. var treegrid = Ext.getCmp('treegrid'),
  388. nodes = treegrid.store.tree.root.childNodes;
  389. treegrid.saveNodes = [];
  390. Ext.each(nodes, function(){
  391. treegrid.checkChild(this);
  392. });
  393. treegrid.saveNode();
  394. }
  395. },'->'],
  396. bodyStyle:'background-color:#f1f1f1;',
  397. initComponent : function(){
  398. Ext.override(Ext.data.AbstractStore,{
  399. indexOf: Ext.emptyFn
  400. });
  401. this.callParent(arguments);
  402. this.getTreeGridNode({parentId: 0});
  403. this.view.onItemClick = function() {
  404. return true;
  405. };
  406. },
  407. listeners: {//滚动条有时候没反应,添加此监听器
  408. scrollershow: function(scroller) {
  409. if (scroller && scroller.scrollEl) {
  410. scroller.clearManagedListeners();
  411. scroller.mon(scroller.scrollEl, 'scroll', scroller.onElScroll, scroller);
  412. }
  413. }
  414. },
  415. getTreeGridNode: function(param){
  416. var me = this;
  417. var activeTab = me.getActiveTab();
  418. activeTab.setLoading(true);
  419. Ext.Ajax.request({//拿到tree数据
  420. url : basePath + 'ma/lazyTree.action',
  421. params: param,
  422. callback : function(options,success,response){
  423. var res = new Ext.decode(response.responseText);
  424. activeTab.setLoading(false);
  425. if(res.tree){
  426. var tree = res.tree;
  427. Ext.each(tree, function(t){
  428. t.sn_id = t.id;
  429. t.sn_parentid = t.parentId;
  430. t.sn_displayname = t.text;
  431. t.sn_isleaf = t.leaf;
  432. t.sn_detno = t.detno;
  433. t.sn_tabtitle = t.text;
  434. t.sn_url = t.url;
  435. t.sn_deleteable = t.deleteable;
  436. t.sn_using = t.using;
  437. t.sn_showmode = t.showMode;
  438. t.sn_logic = t.data.sn_logic;
  439. t.sn_caller = t.data.sn_caller;
  440. t.data = null;
  441. });
  442. me.store.setRootNode({
  443. text: 'root',
  444. id: 'root',
  445. expanded: true,
  446. children: tree
  447. });
  448. Ext.each(me.store.tree.root.childNodes, function(){
  449. this.dirty = false;
  450. });
  451. me.setParentNodes(me.store.tree.root, true);
  452. } else if(res.exceptionInfo){
  453. showError(res.exceptionInfo);
  454. }
  455. }
  456. });
  457. },
  458. setParentNodes: function(record, isExpand){
  459. var tree = this,
  460. grid = tree.ownerCt.down('grid'), data = new Array(), nodes = record.childNodes;
  461. Ext.each(nodes, function(node){
  462. data.push({
  463. sn_id: node.get('sn_id'),
  464. sn_displayname: node.get('sn_displayname'),
  465. sn_detno: node.get('sn_detno')
  466. });
  467. });
  468. grid.store.loadData(data);
  469. },
  470. checkChild: function(record){
  471. var me = this;
  472. if(!record.data['leaf']){
  473. if(record.childNodes.length > 0){
  474. if(record.data['sn_id'] == null || record.data['sn_id'] == ''){
  475. warnMsg('如果在节点' + record.data['sn_id'] + '下添加子节点,需先保存该节点,是否保存?', function(btn){
  476. if(btn == 'yes'){
  477. if(items[0].data['sn_displayname'] == null || items[0].data['sn_displayname'] == ''){
  478. showError('请先描述该节点');
  479. return;
  480. } else {
  481. me.saveNodes.push(items[0]);
  482. me.saveNode();
  483. }
  484. } else if(btn == 'no'){
  485. return;
  486. }
  487. });
  488. }
  489. Ext.each(record.childNodes, function(){
  490. me.checkChild(this);
  491. });
  492. }
  493. } else {
  494. if(record.dirty){
  495. if(record.data['sn_id'] == null || record.data['sn_id'] == ''){
  496. me.saveNodes.push(record);
  497. } else {
  498. me.updateNodes.push(record);
  499. }
  500. }
  501. }
  502. },
  503. saveNode: function(){
  504. var me = this;
  505. me.getUpdateNodes();
  506. var save = new Array();
  507. var update = new Array();
  508. var index = 0;
  509. Ext.each(me.saveNodes, function(){
  510. if(this.data.sn_displayname != null && this.data.sn_displayname != ''){
  511. if(this.data.sn_tabtitle == null || this.data.sn_tabtitle == ''){
  512. this.data.sn_tabtitle == this.data.sn_displayname;
  513. }
  514. if(this.data.sn_deleteable == null || this.data.sn_deleteable == ''){
  515. this.data.sn_deleteable == 'T';
  516. }
  517. var o = {
  518. sn_id: this.data.sn_id,
  519. sn_displayname: this.data.sn_displayname,
  520. sn_url: this.data.sn_url,
  521. sn_detno: this.data.sn_detno,
  522. sn_isleaf: this.data.sn_isleaf ? 'T' : 'F',
  523. sn_tabtitle: this.data.sn_tabtitle,
  524. sn_parentid: this.data.sn_parentid,
  525. sn_deleteable: this.data.sn_deleteable ? 'T' : 'F',
  526. sn_using: this.data.sn_using ? 1 : 0,
  527. sn_showmode: this.data.sn_showmode || 0,
  528. sn_logic: this.data.sn_logic ? 1 : 0,
  529. sn_caller: this.data.sn_caller
  530. };
  531. save[index++] = Ext.JSON.encode(o);
  532. }
  533. });
  534. index = 0;
  535. Ext.each(me.updateNodes, function(){
  536. if(this.data.sn_displayname != null && this.data.sn_displayname != ''){
  537. if(this.data.sn_tabtitle == null || this.data.sn_tabtitle == ''){
  538. this.data.sn_tabtitle == this.data.sn_displayname;
  539. }
  540. if(this.data.sn_deleteable == null || this.data.sn_deleteable == ''){
  541. this.data.sn_deleteable == 'T';
  542. }
  543. var o = {
  544. sn_id: this.data.sn_id,
  545. sn_displayname: this.data.sn_displayname,
  546. sn_url: this.data.sn_url,
  547. sn_detno: this.data.sn_detno,
  548. sn_isleaf: this.data.sn_isleaf ? 'T' : 'F',
  549. sn_tabtitle: this.data.sn_tabtitle,
  550. sn_parentid: this.data.sn_parentid,
  551. sn_deleteable: this.data.sn_deleteable ? 'T' : 'F',
  552. sn_using: this.data.sn_using ? 1 : 0,
  553. sn_showmode: this.data.sn_showmode || 0,
  554. sn_logic: this.data.sn_logic ? 1 : 0,
  555. sn_caller: this.data.sn_caller
  556. };
  557. update[index++] = Ext.JSON.encode(o);
  558. }
  559. });
  560. var grid = me.ownerCt.down('grid'), other = new Array();
  561. grid.store.each(function(){
  562. if(this.dirty)
  563. other.push(this.data);
  564. });
  565. if(save.length > 0 || update.length > 0 || other.length > 0){
  566. var activeTab = me.getActiveTab();
  567. activeTab.setLoading(true);
  568. Ext.Ajax.request({
  569. url : basePath + 'ma/saveSysNavigation.action',
  570. params: {
  571. save: unescape(save.toString().replace(/\\/g,"%")),
  572. update: unescape(update.toString().replace(/\\/g,"%")),
  573. other: unescape(Ext.JSON.encode(other).toString().replace(/\\/g,"%"))
  574. },
  575. callback : function(options,success,response){
  576. var res = new Ext.decode(response.responseText);
  577. activeTab.setLoading(false);
  578. if(res.success){
  579. me.saveNodes = [];
  580. me.updateNodes = [];
  581. me.getTreeGridNode({parentId: 0});
  582. } else if(res.exceptionInfo){
  583. showError(res.exceptionInfo);
  584. }
  585. }
  586. });
  587. }
  588. },
  589. getExpandItem: function(root){
  590. var me = this;
  591. if(!root){
  592. root = this.store.tree.root;
  593. }
  594. var node = null;
  595. if(root.childNodes.length > 0){
  596. Ext.each(root.childNodes, function(){
  597. if(this.isExpanded()){
  598. node = this;
  599. if(this.childNodes.length > 0){
  600. var n = me.getExpandItem(this);
  601. node = n == null ? node : n;
  602. }
  603. }
  604. });
  605. }
  606. return node;
  607. },
  608. deleteNode: function(record){
  609. var me = this;
  610. if(record){
  611. var activeTab = me.getActiveTab();
  612. activeTab.setLoading(true);
  613. Ext.Ajax.request({
  614. url : basePath + 'ma/deleteSysNavigation.action',
  615. params: {
  616. id: Number(record.data['sn_id'])
  617. },
  618. callback : function(options,success,response){
  619. var res = new Ext.decode(response.responseText);
  620. activeTab.setLoading(false);
  621. if(res.success){
  622. record.remove(true);
  623. } else if(res.exceptionInfo){
  624. showError(res.exceptionInfo);
  625. }
  626. }
  627. });
  628. }
  629. },
  630. getUpdateNodes: function(root){
  631. var me = this;
  632. if(!root){
  633. root = this.store.tree.root;
  634. me.updateNodes = [];
  635. }
  636. if(root.childNodes.length > 0){
  637. Ext.each(root.childNodes, function(){
  638. if(this.dirty){
  639. if(this.data['sn_id'] != null && this.data['sn_id'] != ''){
  640. me.updateNodes.push(this);
  641. }
  642. }
  643. if(this.data['leaf'] == false && this.childNodes.length > 0){
  644. me.getUpdateNodes(this);
  645. }
  646. });
  647. } else {
  648. if(root.dirty){
  649. if(root.data['sn_id'] != null && root.data['sn_id'] != ''){
  650. me.updateNodes.push(root);
  651. }
  652. }
  653. }
  654. },
  655. getActiveTab: function(){
  656. var tab = null;
  657. if(Ext.getCmp("content-panel")){
  658. tab = Ext.getCmp("content-panel").getActiveTab();
  659. }
  660. if(!tab){
  661. var win = parent.Ext.ComponentQuery.query('window');
  662. if(win.length > 0){
  663. tab = win[win.length-1];
  664. }
  665. }
  666. if(!tab && parent.Ext.getCmp("content-panel"))
  667. tab = parent.Ext.getCmp("content-panel").getActiveTab();
  668. if(!tab && parent.parent.Ext.getCmp("content-panel"))
  669. tab = parent.parent.Ext.getCmp("content-panel").getActiveTab();
  670. return tab;
  671. },
  672. /**
  673. * treegrid用到了checkcolumn时,由于其store的差异,根据recordIndex不能直接得到record,
  674. * 采用下面的方法可以在点击checkbox时,得到当前的record,再进而就可以修改checkbox的check属性等...
  675. */
  676. getRecordByRecordIndex: function(recordIndex, node){
  677. var me = this;
  678. if(!node){
  679. node = this.store.tree.root;
  680. me.findIndex = 0;
  681. me.findRecord = null;
  682. }
  683. if(me.findRecord == null){
  684. if(node.childNodes.length > 0 && node.isExpanded()){
  685. Ext.each(node.childNodes, function(){
  686. if(me.findIndex == recordIndex){
  687. me.findRecord = this;
  688. me.findIndex++;
  689. } else {
  690. me.findIndex++;
  691. me.getRecordByRecordIndex(recordIndex, this);
  692. }
  693. });
  694. } else {
  695. if(me.findIndex == recordIndex){
  696. me.findRecord = node;
  697. }
  698. }
  699. }
  700. },
  701. checkRecord: function(record, dataIndex, checked){
  702. var me = this;
  703. if(record.childNodes.length > 0){
  704. Ext.each(record.childNodes, function(){
  705. this.set(dataIndex, checked);
  706. me.checkRecord(this, dataIndex, checked);
  707. });
  708. }
  709. }
  710. });