GridPanel.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. Ext.define('erp.view.common.vastDatalist.GridPanel',{
  2. extend: 'Ext.grid.Panel',
  3. alias: 'widget.erpVastDatalistGridPanel',
  4. layout : 'fit',
  5. id: 'grid',
  6. emptyText : '无数据',
  7. columnLines : true,
  8. autoScroll : true,
  9. store: [],
  10. columns: [],
  11. multiselected: [],
  12. bodyStyle: 'background: #f1f1f1;',
  13. selModel: Ext.create('Ext.selection.CheckboxModel',{
  14. ignoreRightMouseSelection : false,
  15. listeners:{
  16. selectionchange:function(selectionModel, selected, options){
  17. }
  18. },
  19. onRowMouseDown: function(view, record, item, index, e) {//改写的onRowMouseDown方法
  20. var me = Ext.getCmp('grid');
  21. var bool = true;
  22. var items = me.selModel.getSelection();
  23. Ext.each(items, function(item, index){
  24. if(item &&record==item&&item.index == record.index){
  25. bool = false;
  26. me.selModel.deselect(record);
  27. Ext.Array.remove(items, item);
  28. Ext.Array.remove(me.multiselected, record);
  29. }
  30. });
  31. Ext.each(me.multiselected, function(item, index){
  32. items.push(item);
  33. });
  34. me.selModel.select(items);
  35. if(bool){
  36. view.el.focus();
  37. var checkbox = item.childNodes[0].childNodes[0].childNodes[0];
  38. if(checkbox.getAttribute && checkbox.getAttribute('class') == 'x-grid-row-checker'){
  39. me.multiselected.push(record);
  40. items.push(record);
  41. me.selModel.select(items);
  42. } else {
  43. me.selModel.deselect(record);
  44. Ext.Array.remove(me.multiselected, record);
  45. }
  46. }
  47. },
  48. onHeaderClick: function(headerCt, header, e) {
  49. if (header.isCheckerHd) {
  50. e.stopEvent();
  51. var isChecked = header.el.hasCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');
  52. if (isChecked) {
  53. this.deselectAll(true);
  54. var grid = Ext.getCmp('grid');
  55. this.deselect(grid.multiselected);
  56. grid.multiselected = new Array();
  57. var els = Ext.select('div[@class=x-grid-row-checker-checked]').elements;
  58. Ext.each(els, function(el, index){
  59. el.setAttribute('class','x-grid-row-checker');
  60. });
  61. header.el.removeCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');//添加这个
  62. } else {
  63. var grid = Ext.getCmp('grid');
  64. this.deselect(grid.multiselected);
  65. grid.multiselected = new Array();
  66. var els = Ext.select('div[@class=x-grid-row-checker-checked]').elements;
  67. Ext.each(els, function(el, index){
  68. el.setAttribute('class','x-grid-row-checker');
  69. });
  70. this.selectAll(true);
  71. header.el.addCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');//添加这个
  72. }
  73. }
  74. }
  75. }),
  76. dockedItems: [{
  77. id : 'pagingtoolbar',
  78. xtype: 'erpVastDatalistToolbar',
  79. dock: 'bottom',
  80. displayInfo: true
  81. }],
  82. plugins: [Ext.create('Ext.ux.grid.GridHeaderFilters'),
  83. Ext.create('Ext.grid.plugin.CellEditing', {
  84. clicksToEdit: 1
  85. })],
  86. BaseUtil: Ext.create('erp.util.BaseUtil'),
  87. RenderUtil: Ext.create('erp.util.RenderUtil'),
  88. initComponent : function(){
  89. this.addEvents({
  90. beforereconfigure: true
  91. });
  92. condition = this.BaseUtil.getUrlParam('urlcondition');
  93. condition = (condition == null) ? "" : condition;
  94. caller = this.BaseUtil.getUrlParam('whoami');
  95. this.getCount(caller, condition);
  96. this.callParent(arguments);
  97. Ext.getCmp("pagingtoolbar").bind(this.store);
  98. Ext.getCmp('pagingtoolbar').updateInfo();
  99. } ,
  100. _noc: 0,
  101. getColumnsAndStore: function(c, d, g, s){
  102. c = c || caller;
  103. d = d || condition;
  104. g = g || page;
  105. s = s || pageSize;
  106. var me = this;
  107. var f = d;
  108. if(me.filterCondition){
  109. if(d == null || d == ''){
  110. f = me.filterCondition;
  111. } else {
  112. f += ' AND ' + me.filterCondition;
  113. }
  114. }
  115. this.multiselected = [];
  116. me.setLoading(true);//loading...
  117. Ext.Ajax.request({//拿到grid的columns
  118. url : basePath + 'common/datalist.action',
  119. params: {
  120. caller: c,
  121. _noc:(me._noc || getUrlParam('_noc')),
  122. condition: f,
  123. page: g,
  124. pageSize: s
  125. },
  126. method : 'post',
  127. //async: false,
  128. callback : function(options,success,response){
  129. me.setLoading(false);
  130. var res = new Ext.decode(response.responseText);
  131. if(res.exception || res.exceptionInfo){
  132. showError(res.exceptionInfo);
  133. return;
  134. }
  135. var data = res.data != null ? Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']')) : [];
  136. if(me.columns && me.columns.length > 2){
  137. me.store.loadData(data);
  138. } else {
  139. var store = Ext.create('Ext.data.Store', {
  140. storeId: 'gridStore',
  141. fields: res.fields,
  142. data: data
  143. });
  144. //me.fireEvent('beforereconfigure', me, res.columns, store);
  145. Ext.each(res.columns, function(c){
  146. me.setRenderer(c);
  147. if(c.editor){
  148. // c.locked = true;
  149. c.sortable = false;
  150. }
  151. });
  152. /*me.columns = res.columns;
  153. me.store = store;*/
  154. me.reconfigure(store, res.columns);
  155. //拿到datalist对应的单表的关键词
  156. keyField = res.keyField;
  157. /*me.on('afterrender', function(){
  158. me.getButtons();
  159. });*/
  160. }
  161. }
  162. });
  163. },
  164. getCount: function(c, d){
  165. c = c || caller;
  166. d = d || condition;
  167. var me = this;
  168. var f = d;
  169. if(me.filterCondition){
  170. if(d == null || d == ''){
  171. f = me.filterCondition;
  172. } else {
  173. f += ' AND ' + me.filterCondition;
  174. }
  175. }
  176. Ext.Ajax.request({//拿到grid的数据总数count
  177. url : basePath + '/common/datalistCount.action',
  178. params: {
  179. caller: c,
  180. condition: d
  181. },
  182. method : 'post',
  183. async: false,
  184. callback : function(options,success,response){
  185. var res = new Ext.decode(response.responseText);
  186. dataCount = res.count;
  187. me.getColumnsAndStore();
  188. }
  189. });
  190. },
  191. /**
  192. * buttons由原先在datalist里面配置改为在GridButton表配置;
  193. * 支持多个button;
  194. * 支持传递actionName
  195. */
  196. getButtons: function(){
  197. Ext.Ajax.request({
  198. url : basePath + "common/gridButton.action",
  199. params: {
  200. caller: caller
  201. },
  202. method : 'post',
  203. callback : function(options,success,response){
  204. var localJson = new Ext.decode(response.responseText);
  205. if(localJson.exceptionInfo){
  206. showError(localJson.exceptionInfo);
  207. }
  208. if(localJson.buttons){
  209. var buttons = Ext.decode(localJson.buttons);
  210. Ext.each(buttons, function(b){
  211. var btn = Ext.ComponentQuery.query(b.xtype);
  212. if(btn.length > 0){
  213. btn[0].url = b.url;
  214. btn[0].show();
  215. }
  216. });
  217. }
  218. }
  219. });
  220. },
  221. listeners: {
  222. 'beforeheaderfiltersapply': function(grid, filters) {
  223. if(this.allowFilter){
  224. var condition = null;
  225. for(var fn in filters){
  226. var value = filters[fn];
  227. if(!Ext.isEmpty(value)){
  228. if(Ext.isDate(value)){
  229. value = Ext.Date.toString(value);
  230. value = fn + "=to_date('" + value + "','yyyy-MM-dd') ";
  231. } else {
  232. var exp_t = /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/,
  233. exp_d = /^(\d{4})\-(\d{2})\-(\d{2})$/;
  234. if(exp_d.test(value)){
  235. value = fn + "=to_date('" + value + "','yyyy-MM-dd') ";
  236. } else if(exp_t.test(value)){
  237. value = fn + "=to_date('" + value + "','yyyy-MM-dd HH24:mi:ss') ";
  238. } else{
  239. value = fn + " LIKE '%" + value + "%' ";
  240. }
  241. }
  242. if(condition == null){
  243. condition = value;
  244. } else {
  245. condition = condition + " AND " + value;
  246. }
  247. }
  248. }
  249. this.filterCondition = condition;
  250. page = 1;
  251. this.getCount();
  252. } else {
  253. this.allowFilter = true;
  254. }
  255. return false;
  256. }
  257. },
  258. viewConfig: {
  259. stripeRows: true
  260. },
  261. getMultiSelected: function(){
  262. var grid = this;
  263. var records = grid.multiselected;
  264. var items = grid.selModel.getSelection();
  265. Ext.each(items, function(item, index){
  266. records.push(item);
  267. });
  268. return Ext.Array.unique(records);
  269. },
  270. getEffectData: function(){
  271. var grid = this;
  272. var items = grid.selModel.getSelection();
  273. Ext.each(items, function(item, index){
  274. if(this.data[keyField] != null && this.data[keyField] != ''
  275. && this.data[keyField] != '0' && this.data[keyField] != 0){
  276. grid.multiselected.push(item);
  277. }
  278. });
  279. var records = Ext.Array.unique(grid.multiselected);
  280. var fields = new Array();
  281. fields.push({name: keyField, type: 'number'});
  282. Ext.each(grid.columns, function(c, index){
  283. if (c.editor != null || (c.getEditor && c.getEditor() != null)) {
  284. var type = 'string';
  285. if(c.xtype == 'datecolumn'){
  286. type = 'date';
  287. } else if(c.xtype == 'datetimecolumn'){
  288. type = 'datetime';
  289. }
  290. fields.push({
  291. name: c.dataIndex,
  292. type: type
  293. });
  294. }
  295. });
  296. var data = new Array();
  297. var o = null;
  298. Ext.each(records, function(record, index){
  299. o = new Object();
  300. Ext.each(fields, function(f){
  301. var v = record.data[f.name];
  302. if(f.type == 'date'){
  303. if (Ext.isDate(v)) {
  304. v = Ext.Date.format(v, 'Y-m-d');
  305. }
  306. } else if(f.type == 'datetime'){
  307. if (Ext.isDate(v)) {
  308. v = Ext.Date.format(v, 'Y-m-d H:i:s');
  309. }
  310. }
  311. o[f.name] = v;
  312. });
  313. data.push(o);
  314. });
  315. return data;
  316. },
  317. setRenderer: function(column){
  318. var grid = this;
  319. if(!column.haveRendered && column.renderer != null && column.renderer != ""){
  320. var renderName = column.renderer;
  321. if(contains(column.renderer, ':', true)){
  322. var args = new Array();
  323. Ext.each(column.renderer.split(':'), function(a, index){
  324. if(index == 0){
  325. renderName = a;
  326. } else {
  327. args.push(a);
  328. }
  329. });
  330. if(!grid.RenderUtil.args[renderName]){
  331. grid.RenderUtil.args[renderName] = new Object();
  332. }
  333. grid.RenderUtil.args[renderName][column.dataIndex] = args;
  334. }
  335. column.renderer = grid.RenderUtil[renderName];
  336. column.haveRendered = true;
  337. }
  338. }
  339. });