GridPanel.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. Ext.define('erp.view.common.multiDbfind.GridPanel',{
  2. extend: 'Ext.grid.Panel',
  3. alias: 'widget.erpMultiDbfindGridPanel',
  4. layout : 'fit',
  5. id: 'dbfindGridPanel',
  6. headerfilter:false,
  7. emptyText : $I18N.common.grid.emptyText,
  8. columnLines : true,
  9. autoScroll : true,
  10. store: [],
  11. columns: [],
  12. multiselected: new Array(),
  13. selectAll:true,
  14. selModel: Ext.create('Ext.selection.CheckboxModel',{
  15. ignoreRightMouseSelection : false,
  16. checkOnly: true,
  17. listeners:{
  18. selectionchange:function(selModel, selected, options){//表头全选、取消全选
  19. var grid=selModel.view.ownerCt;
  20. if(grid.selectAll){
  21. if(selected.length>0){//全选
  22. Ext.each(selected,function(select){
  23. var resgrid=Ext.getCmp('dbfindresultgrid');
  24. var d=select.data;
  25. delete d.RN;
  26. resgrid.selectObject[Ext.JSON.encode(d)]=d;
  27. });
  28. parent.Ext.getCmp('onlyChecked').show();
  29. }else{//取消全选
  30. if(!grid.headerfilter){
  31. var grid=selModel.view.ownerCt;
  32. var resgrid=Ext.getCmp('dbfindresultgrid');
  33. Ext.each(grid.store.data.items,function(deselect){
  34. var d=deselect.data;
  35. delete d.RN;
  36. var key=Ext.JSON.encode(d);
  37. delete resgrid.selectObject[key];
  38. });
  39. if(Ext.Object.getKeys(resgrid.selectObject).length==0){
  40. parent.Ext.getCmp('onlyChecked').hide();
  41. }
  42. }
  43. }
  44. }else{
  45. grid.selectAll=true;
  46. grid.headerfilter=false;
  47. }
  48. },
  49. select:function(selModel, record, index, opts){//选中
  50. var grid=selModel.view.ownerCt;
  51. grid.selectAll=false;
  52. var d=record.data;
  53. delete d.RN;
  54. var resgrid=Ext.getCmp('dbfindresultgrid');
  55. resgrid.selectObject[Ext.JSON.encode(d)]=d;
  56. parent.Ext.getCmp('onlyChecked').show();
  57. },
  58. deselect:function(selModel, record, index, opts){//取消选中
  59. var grid=selModel.view.ownerCt;
  60. if(grid.selectAll){
  61. var resgrid=Ext.getCmp('dbfindresultgrid');
  62. var d=record.data;
  63. delete d.RN;
  64. var key=Ext.JSON.encode(d);
  65. delete resgrid.selectObject[key];
  66. if(Ext.Object.getKeys(resgrid.selectObject).length==0){
  67. parent.Ext.getCmp('onlyChecked').hide();
  68. }
  69. grid.selectAll=false;
  70. }
  71. }
  72. }
  73. }),
  74. plugins: [Ext.create('Ext.ux.grid.GridHeaderFilters')],
  75. initComponent : function(){
  76. this.callParent(arguments);
  77. this.getCount();
  78. },
  79. RenderUtil: Ext.create('erp.util.RenderUtil'),
  80. setMultiValues: function() {
  81. var me=this;
  82. var selected=new Array();
  83. var resgrid=Ext.getCmp('dbfindresultgrid');
  84. Ext.each(Ext.Object.getKeys(resgrid.selectObject),function(k){
  85. selected.push(resgrid.selectObject[k]);
  86. });
  87. if(selected.length > 0) {
  88. if(dbfinds){
  89. trigger.multiValue = new Object();
  90. var keys = Ext.Object.getKeys(selected[0]);
  91. Ext.Array.each(selected, function(item){
  92. var keyValues = item;
  93. Ext.each(keys, function(k){
  94. Ext.Array.each(dbfinds,function(ds){
  95. if(k == ds.dbGridField) {
  96. if(ds.field && parent.Ext.getCmp(ds.field)){
  97. if(trigger.multiValue == null){
  98. trigger.multiValue = new Object();
  99. }
  100. if(trigger.multiValue[ds.field] == null || trigger.multiValue[ds.field] == ''){
  101. trigger.multiValue[ds.field] = keyValues[k];
  102. } else if(!contains(trigger.multiValue[ds.field], keyValues[k], true)){
  103. trigger.multiValue[ds.field] = trigger.multiValue[ds.field] + '#' + keyValues[k];
  104. }
  105. }
  106. }
  107. });
  108. });
  109. });
  110. } else {
  111. trigger.multiValue = selected;
  112. }
  113. } else {
  114. if(dbfinds)
  115. trigger.multiValue = {};
  116. else
  117. trigger.multiValue = [];
  118. }
  119. //给trigger.multiRecords赋值,用于aftertrigger事件
  120. var datachecked=new Array();
  121. Ext.each(Ext.Object.getKeys(resgrid.selectObject),function(k){
  122. datachecked.push(resgrid.selectObject[k]);
  123. });
  124. resgrid.store.loadData(datachecked);
  125. resgrid.selModel.selectAll();
  126. trigger.multiRecords = resgrid.selModel.getSelection();
  127. },
  128. getColumnsAndStore: function(c, d, g, s, callback){
  129. var me = this;
  130. c = c || caller;
  131. d = d || condition;
  132. g = g || page;
  133. s = s || pageSize;
  134. var f = d;
  135. if(me.filterCondition){
  136. if(d == null || d == ''){
  137. f = me.filterCondition;
  138. } else {
  139. f += ' AND ' + me.filterCondition;
  140. }
  141. }
  142. me.setLoading(true);
  143. Ext.Ajax.request({//拿到grid的columns
  144. url : basePath + 'common/dbfind.action',
  145. method : 'post',
  146. params : {
  147. which : which,
  148. caller : c,
  149. field: key,
  150. condition: f,
  151. page: g,
  152. pageSize: s,
  153. _config:getUrlParam('_config')
  154. },
  155. callback : function(options, success, response){
  156. me.setLoading(false);
  157. var res = new Ext.decode(response.responseText);
  158. if(res.exceptionInfo){
  159. showError(res.exceptionInfo);
  160. return ;
  161. }
  162. var data = Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']'));
  163. if(callback)
  164. callback.call(me, data);
  165. else {
  166. if(me.columns && me.columns.length > 2){
  167. me.store.loadData(data);
  168. if(me.store.data.items.length != data.length){
  169. me.store.add(data);
  170. }
  171. //勾选已选中记录
  172. //me.selectAll=false;
  173. //me.headerfilter=false;
  174. me.selectDefaultRecord();
  175. } else {
  176. //处理render
  177. var grid = this;
  178. Ext.Array.each(res.columns, function(column, y) {
  179. if(!column.haveRendered && column.renderer != null && column.renderer != ""){
  180. if(!grid.RenderUtil){
  181. grid.RenderUtil = Ext.create('erp.util.RenderUtil');
  182. }
  183. var renderName = column.renderer;
  184. if(contains(column.renderer, ':', true)){
  185. var args = new Array();
  186. Ext.each(column.renderer.split(':'), function(a, index){
  187. if(index == 0){
  188. renderName = a;
  189. } else {
  190. args.push(a);
  191. }
  192. });
  193. if(!grid.RenderUtil.args[renderName]){
  194. grid.RenderUtil.args[renderName] = new Object();
  195. }
  196. grid.RenderUtil.args[renderName][column.dataIndex] = args;
  197. }
  198. column.renderer = grid.RenderUtil[renderName];
  199. column.haveRendered = true;
  200. }
  201. });
  202. me.reconfigure(Ext.create('Ext.data.Store', {
  203. fields: res.fields,
  204. data: data
  205. }), res.columns);
  206. Ext.getCmp('dbfindresultgrid').setDefaultColumns(res.fields,res.columns);
  207. /*Ext.create('Ext.data.Store', {
  208. fields: res.fields,
  209. data: [],
  210. listeners:{
  211. 'datachanged':function(){
  212. Ext.getCmp('dbfindresultgrid').selectDefault();
  213. }
  214. }
  215. }), res.columns);*/
  216. dbfinds = res.dbfinds;
  217. me.selectDefault();
  218. }
  219. Ext.getCmp('pagingtoolbar').afterOnLoad();
  220. }
  221. }
  222. });
  223. },
  224. /**
  225. * 只取全部数据
  226. */
  227. getAllData: function(callback) {
  228. if(callback) {
  229. var me = this;
  230. me.getCount(null, null, function(count, cal, cond){
  231. if(count>200){
  232. count=200;
  233. }
  234. me.getColumnsAndStore(cal, cond, 1, count, callback);
  235. });
  236. }
  237. },
  238. getCount: function(c, d, callback){
  239. var me = this;
  240. c = c || caller;
  241. d = d || condition;
  242. var f = d;
  243. if(me.filterCondition){
  244. if(d == null || d == ''){
  245. f = me.filterCondition;
  246. } else {
  247. f += ' AND ' + me.filterCondition;
  248. }
  249. }
  250. Ext.Ajax.request({//拿到grid的数据总数count
  251. url : basePath + 'common/dbfindCount.action',
  252. params : {
  253. which : which,
  254. caller : c,
  255. field: key,
  256. condition: f,
  257. _config:getUrlParam('_config')
  258. },
  259. method : 'post',
  260. callback : function(options,success,response){
  261. var res = new Ext.decode(response.responseText);
  262. dataCount = res.count;
  263. if(callback)
  264. callback.call(me, dataCount, c, d);
  265. else
  266. me.getColumnsAndStore(c, d);
  267. }
  268. });
  269. },
  270. selectDefault: function(){
  271. var grid = this;
  272. var def = new Array();
  273. if(!Ext.isEmpty(trigger.value)){
  274. var f = '';
  275. Ext.each(dbfinds, function(d){
  276. if(d.field == key){
  277. f = d.dbGridField;
  278. }
  279. });
  280. var arr = trigger.value.split('#');
  281. Ext.each(grid.store.data.items, function(item){
  282. if(Ext.Array.contains(arr, item.data[f])){
  283. def.push(item);
  284. var keyValues = item.data;
  285. Ext.each(Ext.Object.getKeys(keyValues), function(k){
  286. Ext.Array.each(dbfinds,function(ds){
  287. if(k == ds.dbGridField) {
  288. if(parent.Ext.getCmp(ds.field)){
  289. if(trigger.multiValue == null){
  290. trigger.multiValue = new Object();
  291. }
  292. if(trigger.multiValue[ds.field] == null || trigger.multiValue[ds.field] == ''){
  293. trigger.multiValue[ds.field] = keyValues[k];
  294. } else if(!contains(trigger.multiValue[ds.field], keyValues[k], true)){
  295. trigger.multiValue[ds.field] = trigger.multiValue[ds.field] + '#' + keyValues[k];
  296. }
  297. }
  298. }
  299. });
  300. });
  301. }
  302. });
  303. grid.selModel.select(def);
  304. Ext.each(def,function(select){
  305. var resgrid=Ext.getCmp('dbfindresultgrid');
  306. resgrid.selectObject[Ext.JSON.encode(select.data)]=select.data;
  307. });
  308. }
  309. var datachecked=new Array();
  310. var resgrid=Ext.getCmp('dbfindresultgrid');
  311. Ext.each(Ext.Object.getKeys(resgrid.selectObject),function(k){
  312. datachecked.push(resgrid.selectObject[k]);
  313. });
  314. if(datachecked.length>0){
  315. var selectArr=new Array();
  316. Ext.each(grid.store.data.items, function(item){
  317. delete item.data.RN;
  318. Ext.each(datachecked,function(checked){
  319. var checkflag=true;
  320. var keys=Ext.Object.getKeys(item.data);
  321. for(var i=0;i<keys.length && checkflag;i++){
  322. var k=keys[i];
  323. if(item.data[k]!=checked[k]){
  324. checkflag=false;
  325. }
  326. if(i==keys.length-1&&checkflag){
  327. selectArr.push(item);
  328. }
  329. }
  330. });
  331. });
  332. grid.selModel.select(selectArr);
  333. }
  334. },
  335. selectDefaultRecord:function(){//数据回显
  336. var grid = this;
  337. var datachecked=new Array();
  338. var resgrid=Ext.getCmp('dbfindresultgrid');
  339. Ext.each(Ext.Object.getKeys(resgrid.selectObject),function(k){
  340. datachecked.push(resgrid.selectObject[k]);
  341. });
  342. if(datachecked.length>0){
  343. var selectArr=new Array();
  344. Ext.each(grid.store.data.items, function(item){
  345. delete item.data.RN;
  346. Ext.each(datachecked,function(checked){
  347. var checkflag=true;
  348. var keys=Ext.Object.getKeys(item.data);
  349. for(var i=0;i<keys.length && checkflag;i++){
  350. var k=keys[i];
  351. if(item.data[k]!=checked[k]){
  352. checkflag=false;
  353. }
  354. if(i==keys.length-1&&checkflag){
  355. selectArr.push(item);
  356. }
  357. }
  358. });
  359. });
  360. grid.selModel.select(selectArr);
  361. }
  362. if(Ext.Object.getKeys(resgrid.selectObject).length==0){
  363. parent.Ext.getCmp('onlyChecked').hide();
  364. }
  365. },
  366. listeners: {
  367. 'headerfiltersapply': function(grid, filters) {
  368. if(this.allowFilter){
  369. grid.headerfilter=true;
  370. var condition = null;
  371. for(var fn in filters){
  372. var value = filters[fn],f = grid.getHeaderFilterField(fn);
  373. if(!Ext.isEmpty(value)){
  374. if(f.filtertype) {
  375. if (f.filtertype == 'numberfield') {
  376. value = fn + "=" + value + " ";
  377. }
  378. } else {
  379. if(Ext.isDate(value)){
  380. value = Ext.Date.toString(value);
  381. value = "to_char(" + fn + ",'yyyy-MM-dd')='" + value + "' ";
  382. } else {
  383. var exp_t = /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/,
  384. exp_d = /^(\d{4})\-(\d{2})\-(\d{2})$/;
  385. if(exp_d.test(value)){
  386. value = "to_char(" + fn + ",'yyyy-MM-dd')='" + value + "' ";
  387. } else if(exp_t.test(value)){
  388. value = "to_char(" + fn + ",'yyyy-MM-dd')='" + value.substr(0, 10) + "' ";
  389. } else{
  390. if(!f.autoDim) {
  391. value = fn + " LIKE '" + value + "%' ";
  392. } else {
  393. value = fn + " LIKE '%" + value + "%' ";
  394. }
  395. }
  396. }
  397. }
  398. if(condition == null){
  399. condition = value;
  400. } else {
  401. condition = condition + " AND " + value;
  402. }
  403. }
  404. }
  405. this.filterCondition = condition;
  406. page = 1;
  407. this.getCount();
  408. } else {
  409. this.allowFilter = true;
  410. }
  411. return false;
  412. }
  413. }
  414. });