SysTreeGrid.js 23 KB

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