GridPanel.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. Ext.define('erp.view.fa.arp.vmCopQuery.GridPanel',{
  2. extend: 'Ext.grid.Panel',
  3. alias: 'widget.erpVmCopQueryGridPanel',
  4. id: 'vmcopquerygrid',
  5. emptyText : '无数据',
  6. columnLines : true,
  7. autoScroll : true,
  8. store: [],
  9. columns: [],
  10. chkumio:false,
  11. tbar: [{
  12. name: 'query',
  13. text: $I18N.common.button.erpQueryButton,
  14. iconCls: 'x-button-icon-query',
  15. cls: 'x-btn-gray'
  16. }, '->', {
  17. name: 'export',
  18. text: $I18N.common.button.erpExportButton,
  19. iconCls: 'x-button-icon-excel',
  20. cls: 'x-btn-gray',
  21. handler: function(btn){
  22. var grid = Ext.getCmp('vmcopquerygrid');
  23. grid.BaseUtil.exportGrid(grid, '应付总账');
  24. }
  25. }, '-',{
  26. name: 'refresh',
  27. text: $I18N.common.button.erpRefreshButton,
  28. iconCls: 'x-button-icon-check',
  29. cls: 'x-btn-gray'
  30. }, '-', {
  31. text: $I18N.common.button.erpCloseButton,
  32. iconCls: 'x-button-icon-close',
  33. cls: 'x-btn-gray',
  34. handler: function(){
  35. var main = parent.Ext.getCmp("content-panel");
  36. main.getActiveTab().close();
  37. }
  38. }],
  39. GridUtil: Ext.create('erp.util.GridUtil'),
  40. selModel: Ext.create('Ext.selection.CheckboxModel',{
  41. headerWidth: 0
  42. }),
  43. plugins: Ext.create('Ext.grid.plugin.CellEditing', {
  44. clicksToEdit: 1
  45. }),
  46. BaseUtil: Ext.create('erp.util.BaseUtil'),
  47. FormUtil: Ext.create('erp.util.FormUtil'),
  48. RenderUtil: Ext.create('erp.util.RenderUtil'),
  49. features : [Ext.create('Ext.grid.feature.Grouping',{
  50. hideGroupedHeader: true,
  51. groupHeaderTpl: '{name} (Count:{rows.length})'
  52. }),{
  53. ftype : 'summary',
  54. showSummaryRow : false,//不显示默认合计行
  55. generateSummaryData: function(){
  56. var me = this,
  57. data = {},
  58. store = me.view.store,
  59. columns = me.view.headerCt.getColumnsForTpl(),
  60. i = 0,
  61. length = columns.length,
  62. //fieldData,
  63. //key,
  64. comp;
  65. for (i = 0, length = columns.length; i < length; ++i) {
  66. comp = Ext.getCmp(columns[i].id);
  67. data[comp.id] = me.getSummary(store, comp.summaryType, comp.dataIndex, false);
  68. var tb = Ext.getCmp(columns[i].dataIndex + '_' + comp.summaryType);
  69. if(tb){
  70. tb.setText(tb.text.split(':')[0] + ':' + data[comp.id]);
  71. }
  72. }
  73. return data;
  74. }
  75. }],
  76. initComponent : function(){
  77. condition = this.BaseUtil.getUrlParam('urlcondition');
  78. condition = (condition == null) ? "" : condition;
  79. condition = condition.replace(/@/,"'%").replace(/@/,"%'");
  80. this.defaultCondition = condition;
  81. var gridParam = {caller: caller, condition: condition};
  82. this.getGridColumnsAndStore(this, 'common/singleGridPanel.action', gridParam, "");
  83. //给页面加上ctrl+alt+s键盘事件,自动跳转form配置界面
  84. this.addKeyBoardEvents();//监听Ctrl+Alt+S事件
  85. this.callParent(arguments);
  86. },
  87. getGridColumnsAndStore: function(grid, url, param, no){
  88. var me = this;
  89. me.setLoading(true);//loading...
  90. Ext.Ajax.request({//拿到grid的columns
  91. url : basePath + url,
  92. params: param,
  93. method : 'post',
  94. async: false,
  95. callback : function(options,success,response){
  96. me.setLoading(false);
  97. var res = new Ext.decode(response.responseText);
  98. if(res.exceptionInfo){
  99. showError(res.exceptionInfo);return;
  100. }
  101. if(me.columns && me.columns.length > 2){
  102. var data = res.data != null ? Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']')) : [];
  103. me.store.loadData(data);
  104. //解决固定列左右不对齐的情况
  105. var lockedView = me.view.lockedView;
  106. if(lockedView){
  107. var tableEl = lockedView.el.child('.x-grid-table');
  108. if(tableEl){
  109. tableEl.dom.style.marginBottom = '7px';
  110. }
  111. }
  112. me.initRecords();
  113. } else {
  114. if(res.columns){
  115. Ext.each(res.columns, function(column, y){
  116. me.setRenderer(column);
  117. var logic = column.logic;
  118. if(logic != null){
  119. me.setLogicType(column, logic, y);
  120. }
  121. });
  122. //store
  123. me.store = me.setDefaultStore(res.data, res.fields);
  124. //view
  125. if(me.selModel.views == null){
  126. me.selModel.views = [];
  127. }
  128. if(res.dbfinds.length > 0){
  129. me.dbfinds = res.dbfinds;
  130. }
  131. //toolbar
  132. me.setToolbar(res.columns);
  133. //reconfigure store&columns
  134. me.columns = res.columns;
  135. }
  136. }
  137. }
  138. });
  139. },
  140. setDefaultStore: function(d, f){
  141. var me = this;
  142. var data = [];
  143. if(!d || d.length == 2){
  144. me.GridUtil.add10EmptyData(me.detno, data);
  145. me.GridUtil.add10EmptyData(me.detno, data);
  146. } else {
  147. data = Ext.decode(d.replace(/,}/g, '}').replace(/,]/g, ']'));
  148. }
  149. var store = Ext.create('Ext.data.Store', {
  150. fields: f,
  151. data: data,
  152. groupField: me.groupField,
  153. getSum: function(field) {
  154. var records = me.selModel.getSelection(),
  155. total = 0,
  156. i = 0,
  157. len = records.length;
  158. for (; i < len; ++i) {
  159. total += records[i].get(field);
  160. }
  161. return total;
  162. },
  163. getCount: function() {
  164. var records = me.selModel.getSelection(),
  165. count = 0;
  166. Ext.each(records, function(item){
  167. count++;
  168. });
  169. return count;
  170. },
  171. getAverage: function(field) {
  172. var records = me.selModel.getSelection(),
  173. count = 0,
  174. sum = 0;
  175. Ext.each(records, function(item){
  176. if(item.data[me.necessaryField] != null && item.data[me.necessaryField] != ''){
  177. count++;sum += item.data[field];
  178. }
  179. });
  180. return Ext.Number.format(sum/count, '0.00');
  181. }
  182. });
  183. return store;
  184. },
  185. setLogicType: function(column, logic, y){
  186. var grid = this;
  187. if(logic == 'detno'){
  188. grid.detno = column.dataIndex;
  189. } else if(logic == 'keyField'){
  190. grid.keyField = column.dataIndex;
  191. } else if(logic == 'mainField'){
  192. grid.mainField = column.dataIndex;
  193. } else if(logic == 'necessaryField'){
  194. grid.necessaryField = column.dataIndex;
  195. if(!grid.necessaryFields){
  196. grid.necessaryFields = new Array();
  197. }
  198. grid.necessaryFields.push(column.dataIndex);
  199. if(!column.haveRendered){
  200. column.renderer = function(val, meta, record, x, y, store, view){
  201. var c = this.columns[y];
  202. if(val != null && val.toString().trim() != ''){
  203. if(c.xtype == 'datecolumn'){
  204. val = Ext.Date.format(val, 'Y-m-d');
  205. }
  206. return val;
  207. } else {
  208. if(c.xtype == 'datecolumn'){
  209. val = '';
  210. }
  211. return '<img src="' + basePath + 'resource/images/icon/need.png" title="必填字段">' +
  212. '<span style="color:blue;padding-left:2px;" title="必填字段">' + val + '</span>';
  213. }
  214. };
  215. }
  216. } else if(logic == 'groupField'){
  217. grid.groupField = column.dataIndex;
  218. }
  219. },
  220. initRecords: function(){
  221. var records = this.store.data.items;
  222. var count = 0;
  223. Ext.each(records, function(record){
  224. if(!record.index){
  225. record.index = count++;
  226. }
  227. });
  228. },
  229. setRenderer: function(column){
  230. var grid = this;
  231. if(!column.haveRendered && column.renderer != null && column.renderer != ""){
  232. var renderName = column.renderer;
  233. if(contains(column.renderer, ':', true)){
  234. var args = new Array();
  235. Ext.each(column.renderer.split(':'), function(a, index){
  236. if(index == 0){
  237. renderName = a;
  238. } else {
  239. args.push(a);
  240. }
  241. });
  242. if(!grid.RenderUtil.args[renderName]){
  243. grid.RenderUtil.args[renderName] = new Object();
  244. }
  245. grid.RenderUtil.args[renderName][column.dataIndex] = args;
  246. }
  247. column.renderer = grid.RenderUtil[renderName];
  248. column.haveRendered = true;
  249. }
  250. },
  251. setToolbar: function(columns){
  252. var grid = this;
  253. var items = [];
  254. Ext.each(columns, function(column){
  255. if(column.summaryType == 'sum'){
  256. items.push('-',{
  257. id: column.dataIndex + '_sum',
  258. itemId: column.dataIndex,
  259. xtype: 'tbtext',
  260. text: column.header + '(sum):0'
  261. });
  262. } else if(column.summaryType == 'average') {
  263. items.push('-',{
  264. id: column.dataIndex + '_average',
  265. itemId: column.dataIndex,
  266. xtype: 'tbtext',
  267. text: column.header + '(average):0'
  268. });
  269. } else if(column.summaryType == 'count') {
  270. items.push('-',{
  271. id: column.dataIndex + '_count',
  272. itemId: column.dataIndex,
  273. xtype: 'tbtext',
  274. text: column.header + '(count):0'
  275. });
  276. }
  277. });
  278. grid.bbar = {
  279. xtype: 'toolbar',
  280. dock: 'bottom',
  281. items: items
  282. };
  283. },
  284. summary: function(){
  285. var me = this,
  286. store = this.store,
  287. value;
  288. Ext.each(me.columns, function(c){
  289. if(c.summaryType == 'sum'){
  290. value = store.getSum(store.data.items, c.dataIndex);
  291. me.down('tbtext[id=' + c.dataIndex + '_sum]').setText(c.header + '(sum):' + value);
  292. } else if(c.summaryType == 'count'){
  293. value = store.getCount();
  294. me.down('tbtext[id=' + c.dataIndex + '_count]').setText(c.header + '(count):' + value);
  295. } else if(c.summaryType == 'average'){
  296. value = store.getAverage(c.dataIndex);
  297. me.down('tbtext[id=' + c.dataIndex + '_average]').setText(c.header + '(average):' + value);
  298. }
  299. });
  300. },
  301. listeners: {
  302. 'headerfiltersapply': function(grid, filters) {
  303. grid.summary();
  304. return true;
  305. },
  306. 'afterrender':function(){
  307. var me = this;
  308. var lockGrid = me.lockedGrid;
  309. var normalGrid = me.normalGrid;
  310. lockGrid.addListener('itemclick',function(grid,record){
  311. if(Number(record.data.vm_id)>0){
  312. me.FormUtil.onAdd('showVmCopDetail'+record.data.vm_id, "查询明细("+record.data.vm_id+")", 'jsps/fa/arp/showVmCopDetail.jsp?showtype='+record.data.vm_showtype+'&vmid='+record.data.vm_id+'&currency='+record.data.vm_currency+'&vendcode='+record.data.vm_vendcode+'&vendname='+record.data.ve_name+'&yearmonth='+record.data.vm_yearmonth+'&chkumio='+me.chkumio+'&cop='+record.data.vm_cop);
  313. }
  314. });
  315. normalGrid.addListener('itemclick',function(grid,record){
  316. if(Number(record.data.vm_id)>0){
  317. me.FormUtil.onAdd('showVmCopDetail'+record.data.vm_id, "查询明细("+record.data.vm_id+")", 'jsps/fa/arp/showVmCopDetail.jsp?showtype='+record.data.vm_showtype+'&vmid='+record.data.vm_id+'&currency='+record.data.vm_currency+'&vendcode='+record.data.vm_vendcode+'&vendname='+record.data.ve_name+'&yearmonth='+record.data.vm_yearmonth+'&chkumio='+me.chkumio+'&cop='+record.data.vm_cop);
  318. }
  319. });
  320. }
  321. }, /**
  322. * 监听一些事件,
  323. * 如Ctrl+Alt+S
  324. */
  325. addKeyBoardEvents: function(){
  326. var me = this;
  327. if(Ext.isIE){
  328. document.body.attachEvent('onkeydown', function(){//ie的事件名称不同,也不支持addEventListener
  329. if(window.event.altKey && window.event.ctrlKey && window.event.keyCode == 83){
  330. if(Ext.ComponentQuery.query('gridpanel').length > 0){//有grid
  331. me.FormUtil.onAdd('form' + caller, 'Form配置维护(' + caller + ')', "jsps/ma/multiform.jsp?formCondition=fo_idIS" + me.fo_id +
  332. "&gridCondition=fd_foidIS" + me.fo_id + "&whoami=" + caller);
  333. }else if(Ext.ComponentQuery.query('formpanel').length == 0){
  334. me.FormUtil.onAdd('form' + caller, 'Form配置维护(' + caller + ')', "jsps/ma/multiform.jsp?formCondition=fo_idIS" + me.fo_id +
  335. "&gridCondition=fd_foidIS" + me.fo_id + "&whoami=" + caller);
  336. } else {
  337. me.FormUtil.onAdd('form' + caller, 'Form配置维护(' + caller + ')', "jsps/ma/form.jsp?formCondition=fo_idIS" + me.fo_id +
  338. "&gridCondition=fd_foidIS" + me.fo_id);
  339. }
  340. }
  341. });
  342. document.body.attachEvent("onmouseover", function(){
  343. if(window.event.ctrlKey){
  344. var e = window.event;
  345. me.Contextvalue = e.target.textContent == "" ? e.target.value : e.target.textContent;
  346. textarea_text = parent.document.getElementById("textarea_text");
  347. textarea_text.value = me.Contextvalue;
  348. textarea_text.focus();
  349. textarea_text.select();
  350. }
  351. });
  352. } else {
  353. document.body.addEventListener("keydown", function(e){
  354. if(Ext.isFF5){//firefox不支持window.event
  355. e = e || window.event;
  356. }
  357. if(e.altKey && e.ctrlKey && e.keyCode == 83){
  358. if(Ext.ComponentQuery.query('gridpanel').length > 0&&Ext.ComponentQuery.query('formpanel').length > 0){//有grid
  359. me.FormUtil.onAdd('form' + caller, 'Form配置维护(' + caller + ')', "jsps/ma/multiform.jsp?formCondition=fo_idIS" + me.fo_id +
  360. "&gridCondition=fd_foidIS" + me.fo_id + "&whoami=" + caller);
  361. }else if(Ext.ComponentQuery.query('formpanel').length == 0&&Ext.ComponentQuery.query('gridpanel').length > 0){//只有form
  362. me.FormUtil.onAdd('form' + caller, 'Form配置维护(' + caller + ')', "jsps/ma/multigrid.jsp?formCondition=fo_idIS" + me.fo_id +
  363. "&gridCondition=fd_foidIS" + me.fo_id + "&whoami=" + caller);
  364. } else {
  365. me.FormUtil.onAdd('form' + caller, 'Form配置维护(' + caller + ')', "jsps/ma/form.jsp?formCondition=fo_idIS" + me.fo_id +
  366. "&gridCondition=fd_foidIS" + me.fo_id);
  367. }
  368. }
  369. });
  370. document.body.addEventListener("mouseover", function(e){
  371. if(Ext.isFF5){
  372. e = e || window.event;
  373. }
  374. if(e.ctrlKey){
  375. me.Contextvalue = e.target.textContent == "" ? e.target.value : e.target.textContent;
  376. textarea_text = parent.document.getElementById("textarea_text");
  377. textarea_text.value = me.Contextvalue;
  378. textarea_text.focus();
  379. textarea_text.select();
  380. }
  381. });
  382. }
  383. },
  384. cls: 'custom-grid',
  385. viewConfig: {
  386. getRowClass: function(record) {
  387. if(record.get('vm_showtype')=='1'){
  388. return 'custom';
  389. }else if(record.get('vm_showtype')=='3'){
  390. return 'custom-blank';
  391. }else{
  392. return 'custom-alt';
  393. }
  394. // return record.get('cm_showtype')=='1'?'custom':'custom-alt';
  395. // return record.get('index')%2 == 0 ? (!Ext.isEmpty(record.get('cm_id')) ? 'custom-first' : 'custom') :
  396. // (!Ext.isEmpty(record.get('cm_id')) ? 'custom-alt-first' : 'custom-alt');
  397. }
  398. }
  399. });