GridPanel.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. Ext.define('erp.view.common.Batchlevel.GridPanel',{
  2. extend: 'Ext.grid.Panel',
  3. alias: 'widget.erpBatchDealGridPanel',
  4. id: 'batchDealGridPanel',
  5. emptyText : $I18N.common.grid.emptyText,
  6. columnLines : true,
  7. autoScroll : true,
  8. multiselected: [],
  9. store: [],
  10. columns: [],
  11. bodyStyle: 'background-color:#f1f1f1;',
  12. plugins: Ext.create('Ext.grid.plugin.CellEditing', {
  13. clicksToEdit: 1
  14. }),
  15. features : [Ext.create('Ext.grid.feature.Grouping',{
  16. //startCollapsed: true,
  17. hideGroupedHeader: true,
  18. groupHeaderTpl: '{name} (Count:{rows.length})'
  19. }),{
  20. ftype : 'summary',
  21. showSummaryRow : false,//不显示默认合计行
  22. generateSummaryData: function(){
  23. var me = this,
  24. data = {},
  25. store = me.view.store,
  26. columns = me.view.headerCt.getColumnsForTpl(),
  27. i = 0,
  28. length = columns.length,
  29. //fieldData,
  30. //key,
  31. comp;
  32. //将feature的data打印在toolbar上面
  33. for (i = 0, length = columns.length; i < length; ++i) {
  34. comp = Ext.getCmp(columns[i].id);
  35. data[comp.id] = me.getSummary(store, comp.summaryType, comp.dataIndex, false);
  36. var tb = Ext.getCmp(columns[i].dataIndex + '_' + comp.summaryType);
  37. if(tb){
  38. tb.setText(tb.text.split(':')[0] + ':' + data[comp.id]);
  39. }
  40. }
  41. return data;
  42. }
  43. }],
  44. selModel: Ext.create('Ext.selection.CheckboxModel',{
  45. ignoreRightMouseSelection : false,
  46. listeners:{
  47. selectionchange:function(selectionModel, selected, options){
  48. }
  49. },
  50. getEditor: function(){
  51. return null;
  52. },
  53. onRowMouseDown: function(view, record, item, index, e) {//改写的onRowMouseDown方法
  54. var me = Ext.getCmp('batchDealGridPanel');
  55. var bool = true;
  56. var items = me.selModel.getSelection();
  57. Ext.each(items, function(item, index){
  58. if(this.index == record.index){
  59. bool = false;
  60. me.selModel.deselect(record);
  61. Ext.Array.remove(items, item);
  62. Ext.Array.remove(me.multiselected, record);
  63. }
  64. });
  65. Ext.each(me.multiselected, function(item, index){
  66. items.push(item);
  67. });
  68. me.selModel.select(items);
  69. if(bool){
  70. view.el.focus();
  71. var checkbox = item.childNodes[0].childNodes[0].childNodes[0];
  72. if(checkbox.getAttribute && checkbox.getAttribute('class') == 'x-grid-row-checker'){
  73. me.multiselected.push(record);
  74. items.push(record);
  75. me.selModel.select(items);
  76. } else {
  77. me.selModel.deselect(record);
  78. Ext.Array.remove(me.multiselected, record);
  79. }
  80. }
  81. me.summary();
  82. },
  83. onHeaderClick: function(headerCt, header, e) {
  84. if (header.isCheckerHd) {
  85. e.stopEvent();
  86. var isChecked = header.el.hasCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');
  87. if (isChecked) {
  88. this.deselectAll(true);
  89. var grid = Ext.getCmp('batchDealGridPanel');
  90. this.deselect(grid.multiselected);
  91. grid.multiselected = new Array();
  92. var els = Ext.select('div[@class=x-grid-row-checker-checked]').elements;
  93. Ext.each(els, function(el, index){
  94. el.setAttribute('class','x-grid-row-checker');
  95. });
  96. header.el.removeCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');//添加这个
  97. } else {
  98. var grid = Ext.getCmp('batchDealGridPanel');
  99. this.deselect(grid.multiselected);
  100. grid.multiselected = new Array();
  101. var els = Ext.select('div[@class=x-grid-row-checker-checked]').elements;
  102. Ext.each(els, function(el, index){
  103. el.setAttribute('class','x-grid-row-checker');
  104. });
  105. this.selectAll(true);
  106. header.el.addCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');//添加这个
  107. }
  108. }
  109. Ext.getCmp('batchDealGridPanel').summary();
  110. }
  111. }),
  112. initComponent : function(){
  113. this.GridUtil = Ext.create('erp.util.GridUtil');
  114. this.BaseUtil = Ext.create('erp.util.BaseUtil');
  115. this.RenderUtil = Ext.create('erp.util.RenderUtil');
  116. condition = this.BaseUtil.getUrlParam('urlcondition');
  117. condition = (condition == null) ? "" : condition;
  118. condition = condition.replace(/@/,"'%").replace(/@/,"%'");
  119. this.defaultCondition = condition;
  120. var gridParam = {caller: caller, condition: condition};
  121. this.getGridColumnsAndStore(this, 'common/singleGridPanel.action?', gridParam, "");
  122. this.callParent(arguments);
  123. this.initRecords();
  124. },
  125. getMultiSelected: function(){
  126. var grid = this;
  127. var items = grid.selModel.getSelection();
  128. Ext.each(items, function(item, index){
  129. if(!grid.keyField) {
  130. grid.multiselected.push(item);
  131. } else {
  132. if(this.data[grid.keyField] != null && this.data[grid.keyField] != ''
  133. && this.data[grid.keyField] != '0' && this.data[grid.keyField] != 0){
  134. grid.multiselected.push(item);
  135. }
  136. }
  137. });
  138. return Ext.Array.unique(grid.multiselected);
  139. },
  140. getGridColumnsAndStore: function(grid, url, param, no){
  141. var me = this;
  142. var main = parent.Ext.getCmp("content-panel");
  143. if(main){
  144. main.getActiveTab().setLoading(true);//loading...
  145. }
  146. Ext.Ajax.request({//拿到grid的columns
  147. url : basePath + url,
  148. params: param,
  149. method : 'post',
  150. async: false,
  151. callback : function(options,success,response){
  152. if(main){
  153. main.getActiveTab().setLoading(false);
  154. }
  155. var res = new Ext.decode(response.responseText);
  156. if(res.exceptionInfo){
  157. showError(res.exceptionInfo);return;
  158. }
  159. if(me.columns && me.columns.length > 2){
  160. var data = res.data != null ? Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']')) : [];
  161. me.store.loadData(data);
  162. me.initRecords();
  163. cmp = Ext.getCmp('pr_level');
  164. var arr;
  165. if(!cmp){
  166. cmp = Ext.getCmp('bo_style');
  167. arr = Ext.Array.unique(Ext.Array.pluck(data, 'bo_style'));
  168. cmp.checkValue(Ext.Array.concate(arr, ','));
  169. }else{
  170. arr = Ext.Array.unique(Ext.Array.pluck(data, 'pr_level'));
  171. cmp.checkValue(Ext.Array.concate(arr, ','));
  172. }
  173. } else {
  174. if(res.columns){
  175. Ext.each(res.columns, function(column, y){
  176. //render
  177. me.setRenderer(column);
  178. //logictype
  179. var logic = column.logic;
  180. if(logic != null){
  181. me.setLogicType(column, logic, y);
  182. }
  183. });
  184. //store
  185. me.store = me.setDefaultStore(res.data, res.fields);
  186. //view
  187. if(me.selModel.views == null){
  188. me.selModel.views = [];
  189. }
  190. if(res.dbfinds.length > 0){
  191. me.dbfinds = res.dbfinds;
  192. }
  193. //toolbar
  194. me.setToolbar(res.columns);
  195. //reconfigure store&columns
  196. me.columns = res.columns;
  197. }
  198. }
  199. }
  200. });
  201. },
  202. setRenderer: function(column){
  203. var grid = this;
  204. if(!column.haveRendered && column.renderer != null && column.renderer != ""){
  205. var renderName = column.renderer;
  206. if(contains(column.renderer, ':', true)){
  207. var args = new Array();
  208. Ext.each(column.renderer.split(':'), function(a, index){
  209. if(index == 0){
  210. renderName = a;
  211. } else {
  212. args.push(a);
  213. }
  214. });
  215. if(!grid.RenderUtil.args[renderName]){
  216. grid.RenderUtil.args[renderName] = new Object();
  217. }
  218. grid.RenderUtil.args[renderName][column.dataIndex] = args;
  219. }
  220. column.renderer = grid.RenderUtil[renderName];
  221. column.haveRendered = true;
  222. }
  223. },
  224. setLogicType: function(column, logic, y){
  225. var grid = this;
  226. if(logic == 'detno'){
  227. grid.detno = column.dataIndex;
  228. } else if(logic == 'keyField'){
  229. grid.keyField = column.dataIndex;
  230. } else if(logic == 'mainField'){
  231. grid.mainField = column.dataIndex;
  232. } else if(logic == 'necessaryField'){
  233. grid.necessaryField = column.dataIndex;
  234. if(!grid.necessaryFields){
  235. grid.necessaryFields = new Array();
  236. }
  237. grid.necessaryFields.push(column.dataIndex);
  238. if(!column.haveRendered){
  239. column.renderer = function(val, meta, record, x, y, store, view){
  240. var c = this.columns[y];
  241. if(val != null && val.toString().trim() != ''){
  242. if(c.xtype == 'datecolumn'){
  243. val = Ext.Date.format(val, 'Y-m-d');
  244. }
  245. return val;
  246. } else {
  247. if(c.xtype == 'datecolumn'){
  248. val = '';
  249. }
  250. return '<img src="' + basePath + 'resource/images/icon/need.png" title="必填字段">' +
  251. '<span style="color:blue;padding-left:2px;" title="必填字段">' + val + '</span>';
  252. }
  253. };
  254. }
  255. } else if(logic == 'groupField'){
  256. grid.groupField = column.dataIndex;
  257. }
  258. },
  259. setToolbar: function(columns){
  260. var grid = this;
  261. var items = [];
  262. Ext.each(columns, function(column){
  263. if(column.summaryType == 'sum'){
  264. items.push('-',{
  265. id: column.dataIndex + '_sum',
  266. itemId: column.dataIndex,
  267. xtype: 'tbtext',
  268. text: column.header + '(sum):0'
  269. });
  270. } else if(column.summaryType == 'average') {
  271. items.push('-',{
  272. id: column.dataIndex + '_average',
  273. itemId: column.dataIndex,
  274. xtype: 'tbtext',
  275. text: column.header + '(average):0'
  276. });
  277. } else if(column.summaryType == 'count') {
  278. items.push('-',{
  279. id: column.dataIndex + '_count',
  280. itemId: column.dataIndex,
  281. xtype: 'tbtext',
  282. text: column.header + '(count):0'
  283. });
  284. }
  285. });
  286. grid.bbar = {
  287. xtype: 'toolbar',
  288. dock: 'bottom',
  289. items: items
  290. };
  291. },
  292. setDefaultStore: function(d, f){
  293. var me = this;
  294. var data = [];
  295. if(!d || d.length == 2){
  296. me.GridUtil.add10EmptyData(me.detno, data);
  297. me.GridUtil.add10EmptyData(me.detno, data);
  298. } else {
  299. data = Ext.decode(d.replace(/,}/g, '}').replace(/,]/g, ']'));
  300. }
  301. var store = Ext.create('Ext.data.Store', {
  302. fields: f,
  303. data: data,
  304. groupField: me.groupField,
  305. getSum: function(field) {
  306. var records = me.selModel.getSelection(),
  307. total = 0,
  308. i = 0,
  309. len = records.length;
  310. for (; i < len; ++i) {
  311. total += records[i].get(field);
  312. }
  313. return total;
  314. },
  315. getCount: function() {
  316. var records = me.selModel.getSelection(),
  317. count = 0;
  318. Ext.each(records, function(item){
  319. count++;
  320. });
  321. return count;
  322. },
  323. getAverage: function(field) {
  324. var records = me.selModel.getSelection(),
  325. count = 0,
  326. sum = 0;
  327. Ext.each(records, function(item){
  328. if(item.data[me.necessaryField] != null && item.data[me.necessaryField] != ''){
  329. count++;sum += item.data[field];
  330. }
  331. });
  332. return Ext.Number.format(sum/count, '0.00');
  333. }
  334. });
  335. return store;
  336. },
  337. /**
  338. * 修改为selection改变时,summary也动态改变
  339. */
  340. summary: function(){
  341. var me = this,
  342. store = this.store,
  343. value;
  344. Ext.each(me.columns, function(c){
  345. if(c.summaryType == 'sum'){
  346. value = store.getSum(c.dataIndex);
  347. me.down('tbtext[id=' + c.dataIndex + '_sum]').setText(c.header + '(sum):' + value);
  348. } else if(c.summaryType == 'count'){
  349. value = store.getCount();
  350. me.down('tbtext[id=' + c.dataIndex + '_count]').setText(c.header + '(count):' + value);
  351. } else if(c.summaryType == 'average'){
  352. value = store.getAverage(c.dataIndex);
  353. me.down('tbtext[id=' + c.dataIndex + '_average]').setText(c.header + '(average):' + value);
  354. }
  355. });
  356. },
  357. initRecords: function(){
  358. var records = this.store.data.items;
  359. var count = 0;
  360. Ext.each(records, function(record){
  361. if(!record.index){
  362. record.index = count++;
  363. }
  364. });
  365. }
  366. });