RelativeSearch.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. Ext.QuickTips.init();
  2. Ext.define('erp.controller.common.RelativeSearch', {
  3. extend: 'Ext.app.Controller',
  4. requires: ['erp.util.BaseUtil'],
  5. views:[
  6. 'common.RelativeSearch'
  7. ],
  8. init:function(){
  9. var me = this;
  10. me.BaseUtil = Ext.create('erp.util.BaseUtil');
  11. this.control({
  12. 'tabpanel': {
  13. afterrender: function(tb) {
  14. this.getRelativeSearch(tb, caller);
  15. },
  16. add: function(t, p) {
  17. p.on('activate', function(){
  18. if(!p.down('gridpanel') && p.datas) {
  19. var _f = p.datas.form, _g = p.datas.grid;
  20. p.add({
  21. xtype: 'grid',
  22. columnLines: true,
  23. layout: 'fit',
  24. autoScroll : true,
  25. anchor: '100% 85%',
  26. selModel: Ext.create('Ext.selection.CheckboxModel',{
  27. headerWidth: 0,
  28. views: []
  29. }),
  30. headerCt: Ext.create("Ext.grid.header.Container", {
  31. suspendLayout: true
  32. }),
  33. plugins: [Ext.create('Ext.ux.grid.GridHeaderFilters')],
  34. dockedItems: [new Ext.toolbar.Paging(me.pagingConfig)],
  35. tableName: _f.tablename,
  36. defaultCondition: _f.condition,
  37. fields: Ext.Array.concate(_g.gridFields, ',', 'name'),
  38. store: new Ext.data.Store({
  39. fields: _g.gridFields,
  40. data: []
  41. }),
  42. listeners: {
  43. scrollershow: function(scroller) {
  44. if (scroller && scroller.scrollEl) {
  45. scroller.clearManagedListeners();
  46. scroller.mon(scroller.scrollEl, 'scroll', scroller.onElScroll, scroller);
  47. }
  48. }
  49. },
  50. columns: new Array(),
  51. getGridData: function(page) {
  52. me.query(this.ownerCt.down('form'), this, page);
  53. }
  54. });
  55. var cm = _g.gridColumns, fn = me.link;
  56. Ext.each(cm, function(){
  57. if(this.logic) {
  58. this.renderer = fn;
  59. }
  60. });
  61. p.down('grid').reconfigure(new Ext.data.Store({
  62. fields: _g.gridFields,
  63. data: [{},{},{},{},{},{},{},{},{},{}]
  64. }), cm);
  65. } else {
  66. var g = p.down('gridpanel');
  67. g.getGridData(g.plugins[0].page || 1);
  68. }
  69. });
  70. }
  71. },
  72. 'field' : {
  73. afterrender : function(f) {
  74. var name = f.name, form = f.ownerCt,
  75. c = form.down('combo');
  76. if (!c) {
  77. var a = parent.Ext.getCmp(name);
  78. if (a) {
  79. f.setValue(a.getValue());
  80. }
  81. }
  82. if(f.logic) {
  83. var s = parent.Ext.getCmp(name);
  84. if(s) {
  85. f.setValue(s.getValue());
  86. }
  87. }
  88. }
  89. },
  90. 'combo': {
  91. afterrender: function(f) {
  92. var cm = parent.Ext.ComponentQuery.query('grid[relative=true]');
  93. var grid = cm.length > 0 ? cm[0] : parent.Ext.getCmp('grid');
  94. if(grid) {
  95. var d = [];
  96. grid.store.each(function(item){
  97. if(!Ext.isEmpty(item.get(f.name))) {
  98. d.push({
  99. display: item.get(f.name),
  100. value: item.get(f.name),
  101. data: item.data
  102. });
  103. }
  104. });
  105. f.store = Ext.create('Ext.data.Store', {
  106. fields: ['display','value','data'],
  107. data: d
  108. });
  109. if(d.length > 0)
  110. f.setValue(d[0].value);
  111. }
  112. },
  113. change: function(f) {
  114. if(!Ext.isEmpty(f.value)) {
  115. var form = f.ownerCt;
  116. if (f.lastSelection[0])
  117. {
  118. var d = f.lastSelection[0].data.data;
  119. form.getForm().getFields().each(function(e){
  120. typeof d[e.name] !== 'undefined' && (e.setValue(d[e.name]));
  121. });
  122. }
  123. var grid = form.ownerCt.down('grid');
  124. if(grid && grid.rendered) {
  125. grid.plugins[0].clearFilters();
  126. this.query(form, grid, 1);
  127. }
  128. }
  129. }
  130. },
  131. 'gridpanel': {
  132. reconfigure: function(grid) {
  133. grid.reconfigured = true;
  134. this.query(grid.ownerCt.down('form'), grid, 1);
  135. },
  136. headerfiltersapply: function(grid, filters) {
  137. if(grid.reconfigured){
  138. var condition = null;
  139. for(var fn in filters){
  140. var value = filters[fn], f = grid.getHeaderFilterField(fn);
  141. if(!Ext.isEmpty(value)){
  142. if(f.filtertype) {
  143. if (f.filtertype == 'numberfield') {
  144. value = fn + "=" + value + " ";
  145. }
  146. } else {
  147. if(Ext.isDate(value)){
  148. value = Ext.Date.toString(value);
  149. value = fn + "=to_date('" + value + "','yyyy-MM-dd') ";
  150. } else {
  151. var exp_t = /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/,
  152. exp_d = /^(\d{4})\-(\d{2})\-(\d{2})$/;
  153. if(exp_d.test(value)){
  154. value = fn + "=to_date('" + value + "','yyyy-MM-dd') ";
  155. } else if(exp_t.test(value)){
  156. value = fn + "=to_date('" + value + "','yyyy-MM-dd HH24:mi:ss') ";
  157. } else{
  158. value = fn + " LIKE '%" + value + "%' ";
  159. }
  160. }
  161. }
  162. if(condition == null){
  163. condition = value;
  164. } else {
  165. condition = condition + " AND " + value;
  166. }
  167. }
  168. }
  169. grid.filterCondition = condition;
  170. grid.getGridData(1);
  171. }
  172. return false;
  173. }
  174. },
  175. 'button[name=export]': {
  176. click: function(btn) {
  177. var grid = btn.up('gridpanel');
  178. if(grid) {
  179. this.BaseUtil.exportGrid(grid);
  180. }
  181. }
  182. }
  183. });
  184. },
  185. getRelativeSearch: function(tb, cal) {
  186. var me = this;
  187. Ext.Ajax.request({
  188. url: basePath + 'common/form/relativeSearch.action',
  189. params: {
  190. caller: cal
  191. },
  192. callback: function(opt, s, r) {
  193. if (s) {
  194. var rs = Ext.decode(r.responseText);
  195. if(rs.data) {
  196. var s = null, _f = null;
  197. for(var i in rs.data) {
  198. s = rs.data[i];
  199. _f = s.form;
  200. _g = s.grid;
  201. tb.add({
  202. title: _f.title,
  203. datas: s,
  204. items: [{
  205. xtype: 'form',
  206. layout: 'column',
  207. items: _f.items,
  208. rs_id: _f.fo_id,
  209. cls: 'custom',
  210. bodyStyle: 'background: #f1f1f1;border: none;',
  211. fieldDefaults: {
  212. margin: '6 0 0 0',
  213. labelWidth: 70
  214. },
  215. anchor: '100% 15%',
  216. buttonAlign: 'center',
  217. buttons: [{
  218. text: $I18N.common.button.erpQueryButton,
  219. iconCls: 'x-button-icon-query',
  220. cls: 'x-btn-blue',
  221. handler: function(btn) {
  222. var f = btn.ownerCt.ownerCt, g = f.ownerCt.down('grid');
  223. me.query(f, g, 1);
  224. }
  225. },{
  226. text: $I18N.common.button.erpCloseButton,
  227. iconCls: 'x-button-icon-close',
  228. cls: 'x-btn-blue',
  229. handler: function() {
  230. var w = parent.Ext.getCmp('ext-relative-query');
  231. if (w) {
  232. w.hide();
  233. }
  234. }
  235. }]
  236. }]
  237. });
  238. }
  239. if(tb.items.items.length > 0) {
  240. var p = tb.items.items[0];
  241. p.fireEvent('activate', p);
  242. }
  243. }
  244. }
  245. }
  246. });
  247. },
  248. pageSize: 11,
  249. query: function(form, grid, page) {
  250. var cols = grid.fields,
  251. pageSize = this.pageSize,
  252. start = (page - 1) * pageSize + 1,
  253. end = page * pageSize;
  254. var con = grid.defaultCondition, fileter = grid.filterCondition;
  255. if(!Ext.isEmpty(con)) {
  256. con = "(" + con + ")";
  257. }
  258. if(!Ext.isEmpty(fileter)) {
  259. if(!Ext.isEmpty(con)) {
  260. con += " AND (" + fileter + ")";
  261. } else {
  262. con = fileter;
  263. }
  264. }
  265. form.getForm().getFields().each(function(f){
  266. if(f.logic) {
  267. if(f.logic.indexOf('to:') > -1) {
  268. var _field = f.logic.split('to:')[1];
  269. if(!Ext.isEmpty(con)) {
  270. if(f.xtype == 'datefield') {
  271. con += " AND (to_char(" + _field + ",'yyyymmdd')='" +
  272. Ext.Date.format(f.value, 'Ymd') + "')";
  273. } else {
  274. con += " AND (" + _field + "='" + f.value + "')";
  275. }
  276. } else {
  277. if(f.xtype == 'datefield') {
  278. con = " to_char(" + _field + ",'yyyymmdd')='" +
  279. Ext.Date.format(f.value, 'Ymd') + "'";
  280. } else {
  281. con = _field + "='" + f.value + "'";
  282. }
  283. }
  284. }
  285. }
  286. });
  287. grid.setLoading(true);
  288. Ext.Ajax.request({
  289. url: basePath + 'common/form/search.action',
  290. params: {
  291. _id: form.rs_id,
  292. _tab: grid.tableName,
  293. _fies: cols,
  294. _start: start,
  295. _end: end,
  296. _cond: con
  297. },
  298. callback: function(opt, s, r) {
  299. grid.setLoading(false);
  300. var rs = Ext.decode(r.responseText);
  301. if(rs.data) {
  302. grid.store.loadData(rs.data);
  303. grid.down('pagingtoolbar').page = page;
  304. grid.down('pagingtoolbar').dataCount = rs.count;
  305. grid.down('pagingtoolbar').onLoad();
  306. }
  307. }
  308. });
  309. },
  310. pagingConfig: {
  311. dock: 'bottom',
  312. displayInfo: true,
  313. pageSize: 12,
  314. items: ['-',{
  315. name: 'export',
  316. tooltip: $I18N.common.button.erpExportButton,
  317. iconCls: 'x-button-icon-excel',
  318. cls: 'x-btn-tb',
  319. width: 24,
  320. handler: function(){
  321. }
  322. }],
  323. updateInfo : function(){
  324. var page = this.child('#inputItem').getValue() || 1;
  325. var me = this,
  326. pageSize = 12,
  327. dataCount = me.dataCount || 0;
  328. var displayItem = me.child('#displayItem'),
  329. pageData = me.getPageData();
  330. pageData.fromRecord = (page-1)*pageSize+1;
  331. pageData.toRecord = page*pageSize > dataCount ? dataCount : page*pageSize;
  332. pageData.total = dataCount;
  333. var msg;
  334. if (displayItem) {
  335. if (me.dataCount === 0) {
  336. msg = me.emptyMsg;
  337. } else {
  338. msg = Ext.String.format(
  339. me.displayMsg,
  340. pageData.fromRecord,
  341. pageData.toRecord,
  342. pageData.total
  343. );
  344. }
  345. displayItem.setText(msg);
  346. me.doComponentLayout();
  347. }
  348. },
  349. getPageData : function(){
  350. var me = this,
  351. totalCount = me.dataCount;
  352. return {
  353. total : totalCount,
  354. currentPage : me.page,
  355. pageCount: Math.ceil(me.dataCount / me.pageSize),
  356. fromRecord: ((me.page - 1) * me.pageSize) + 1,
  357. toRecord: Math.min(me.page * me.pageSize, totalCount)
  358. };
  359. },
  360. doRefresh:function(){
  361. this.moveFirst();
  362. },
  363. onPagingKeyDown : function(field, e){
  364. var me = this,
  365. k = e.getKey(),
  366. pageData = me.getPageData(),
  367. increment = e.shiftKey ? 10 : 1,
  368. pageNum = 0;
  369. if (k == e.RETURN) {
  370. e.stopEvent();
  371. pageNum = me.readPageFromInput(pageData);
  372. if (pageNum !== false) {
  373. pageNum = Math.min(Math.max(1, pageNum), pageData.pageCount);
  374. me.child('#inputItem').setValue(pageNum);
  375. if(me.fireEvent('beforechange', me, pageNum) !== false){
  376. me.page = pageNum;
  377. me.ownerCt.getGridData(me.page);
  378. }
  379. }
  380. } else if (k == e.HOME || k == e.END) {
  381. e.stopEvent();
  382. pageNum = k == e.HOME ? 1 : pageData.pageCount;
  383. field.setValue(pageNum);
  384. } else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN) {
  385. e.stopEvent();
  386. pageNum = me.readPageFromInput(pageData);
  387. if (pageNum) {
  388. if (k == e.DOWN || k == e.PAGEDOWN) {
  389. increment *= -1;
  390. }
  391. pageNum += increment;
  392. if (pageNum >= 1 && pageNum <= pageData.pages) {
  393. field.setValue(pageNum);
  394. }
  395. }
  396. }
  397. me.updateInfo();
  398. me.resetTool(pageNum);
  399. },
  400. moveFirst : function(){
  401. var me = this;
  402. me.child('#inputItem').setValue(1);
  403. value = 1;
  404. me.page = value;
  405. me.ownerCt.getGridData(value);
  406. me.updateInfo();
  407. me.resetTool(value);
  408. },
  409. movePrevious : function(){
  410. var me = this;
  411. me.child('#inputItem').setValue(me.child('#inputItem').getValue() - 1);
  412. value = me.child('#inputItem').getValue();
  413. me.page = value;
  414. me.ownerCt.getGridData(value);
  415. me.updateInfo();
  416. me.resetTool(value);
  417. },
  418. moveNext : function(){
  419. var me = this,
  420. last = me.getPageData().pageCount;
  421. total = last;
  422. me.child('#inputItem').setValue(me.child('#inputItem').getValue() + 1);
  423. value = me.child('#inputItem').getValue();
  424. me.page = value;
  425. me.ownerCt.getGridData(value);
  426. me.updateInfo();
  427. me.resetTool(value);
  428. },
  429. moveLast : function(){
  430. var me = this,
  431. last = me.getPageData().pageCount;
  432. total = last;
  433. me.child('#inputItem').setValue(last);
  434. value = me.child('#inputItem').getValue();
  435. me.page = value;
  436. me.ownerCt.getGridData(value);
  437. me.updateInfo();
  438. me.resetTool(value);
  439. },
  440. onLoad : function() {
  441. var e = this, d, b, c, a;
  442. if (!e.rendered) {
  443. return
  444. }
  445. d = e.getPageData();
  446. b = d.currentPage || 1;
  447. c = Math.ceil(e.dataCount / e.pageSize);
  448. a = Ext.String.format(e.afterPageText, isNaN(c) ? 1 : c);
  449. e.child("#afterTextItem").setText(a);
  450. e.child("#inputItem").setValue(b);
  451. e.child("#first").setDisabled(b === 1);
  452. e.child("#prev").setDisabled(b === 1);
  453. e.child("#next").setDisabled(b === c || c===1);//
  454. e.child("#last").setDisabled(b === c || c===1);
  455. e.child("#refresh").enable();
  456. e.updateInfo();
  457. e.fireEvent("change", e, d);
  458. },
  459. resetTool: function(value){
  460. var pageCount = this.getPageData().pageCount;
  461. this.child('#last').setDisabled(value == pageCount || pageCount == 1);
  462. this.child('#next').setDisabled(value == pageCount || pageCount == 1);
  463. this.child('#first').setDisabled(value <= 1);
  464. this.child('#prev').setDisabled(value <= 1);
  465. }
  466. },
  467. link: function(val, m, record, x, y, store, view) {
  468. var grid = view.ownerCt, column = grid.columns[y], url = column.logic;
  469. if(url) {
  470. var index = 0, length = url.length, s, e;
  471. while(index < length) {
  472. if((s = url.indexOf('{', index)) != -1 && (e = url.indexOf('}', s + 1)) != -1) {
  473. url = url.substring(0, s) + record.get(url.substring(s+1, e)) + url.substring(e+1);
  474. index = e + 1;
  475. } else {
  476. break;
  477. }
  478. }
  479. return '<a href="javascript:openUrl(\'' + url + '\');">' + val + '</a>';
  480. }
  481. return val;
  482. }
  483. });