MultiDbfindTrigger.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. /**
  2. * multi dbfind trigger
  3. *
  4. */
  5. Ext.define('erp.view.core.trigger.MultiDbfindTrigger', {
  6. extend: 'Ext.form.field.Trigger',
  7. alias: 'widget.multidbfindtrigger',
  8. triggerCls: 'x-form-search-trigger',
  9. initComponent: function() {
  10. var me = this;
  11. me.addEvents({
  12. aftertrigger: true,
  13. beforetrigger: true
  14. });
  15. me.callParent(arguments);
  16. if(me.clearable) {
  17. me.trigger2Cls = 'x-form-clear-trigger';
  18. if(!me.onTrigger2Click) {
  19. me.onTrigger2Click = function(){
  20. this.setValue(null);
  21. };
  22. }
  23. }
  24. },
  25. onTriggerClick: function() {
  26. var trigger = this;
  27. this.setFieldStyle('background:#C6E2FF;');
  28. this.fireEvent('beforetrigger', trigger);
  29. var trigger = this,// 放大镜所在
  30. key = this.name,// name属性
  31. dbfind = '',// 需要dbfind的表和字段
  32. dbBaseCondition = '',
  33. dbCondition = '',
  34. dbGridCondition = '',
  35. dbKey = this.dbKey,
  36. mappingKey = this.mappingKey,
  37. mappinggirdKey = this.mappinggirdKey,
  38. gridKey = this.gridKey,
  39. gridErrorMessage = this.gridErrorMessage;
  40. window.onTriggerClick = this.id;
  41. // 存在查询条件的字段
  42. if(dbKey){
  43. var dbKeyValue = Ext.getCmp(dbKey).value;
  44. if(dbKeyValue){
  45. dbCondition = mappingKey + " IS '" + dbKeyValue + "'";
  46. } else {
  47. showError(this.dbMessage);
  48. return;
  49. }
  50. }
  51. if(gridKey){
  52. var gridKeys = gridKey.split('|');
  53. var mappinggirdKeys;
  54. var gridErrorMessages;
  55. if(mappinggirdKey){
  56. mappinggirdKeys = mappinggirdKey.split('|');
  57. gridErrorMessages = this.gridErrorMessage.split('|');
  58. }
  59. for(var i=0;i<gridKeys.length;i++){
  60. var gridkeyvalue = Ext.getCmp(gridKeys[i]).value;
  61. if(i==0){
  62. if(gridkeyvalue){
  63. dbGridCondition = mappinggirdKeys[i] + " IS '"+gridkeyvalue+"' ";
  64. }else{
  65. showError(gridErrorMessages[i]);
  66. return;
  67. }
  68. }else{
  69. if(gridkeyvalue){
  70. dbGridCondition =dbGridCondition+" AND "+ mappinggirdKeys[i] + " IS '"+gridkeyvalue+"' ";
  71. }else{
  72. showError(gridErrorMessages[i]);
  73. return;
  74. }
  75. }
  76. }
  77. }
  78. if(this.dbBaseCondition){
  79. dbBaseCondition = this.dbBaseCondition;
  80. }
  81. if(!trigger.ownerCt){// 如果是grid的dbfind
  82. var grid = Ext.ComponentQuery.query('gridpanel');
  83. Ext.Array.each(grid, function(g, index){
  84. Ext.Array.each(g.columns,function(column){
  85. if(column.dataIndex == key) {
  86. dbfind = column.dbfind;
  87. trigger.owner = g;
  88. }
  89. });
  90. });
  91. if(trigger.owner.editingPlugin.activeEditor.field.id == trigger.id) {
  92. trigger.record = trigger.owner.editingPlugin.activeRecord;
  93. } else {
  94. trigger.record = trigger.owner.selModel.lastSelected;
  95. }
  96. }else caller=caller||trigger.ownerCt.caller;
  97. var keyValue = this.value;// 当前值
  98. keyValue = keyValue == null ? '' : keyValue;
  99. var _config=getUrlParam('_config');
  100. var dbwin = this.createWin();
  101. dbwin.show();
  102. if(this.multistore){
  103. this.showButtons();
  104. } else {
  105. trigger.multiValue = new Object();
  106. var iframe = dbwin.getEl().down('iframe');
  107. if(!iframe) {
  108. dbwin.add({
  109. tag : 'iframe',
  110. frame : true,
  111. anchor : '100% 100%',
  112. layout : 'fit',
  113. html : '<iframe src="#" height="100%" width="100%" frameborder="0" scrolling="auto"></iframe>'
  114. });
  115. iframe = dbwin.getEl().down('iframe');
  116. }
  117. iframe.dom.src = basePath + 'jsps/common/multidbfind.jsp?key=' +
  118. key + "&dbfind=" + encodeURIComponent(dbfind) +
  119. "&dbGridCondition=" + encodeURIComponent(dbGridCondition) + "&dbCondition=" + encodeURIComponent(dbCondition) +
  120. "&dbBaseCondition=" + encodeURIComponent(dbBaseCondition) + "&keyValue=&caller=" + caller +"&_config="+_config+
  121. "&trigger=" + trigger.id;
  122. }
  123. },
  124. createWin: function() {
  125. var trigger = this;
  126. this.win = Ext.create('Ext.Window', {
  127. title: '查找',
  128. height: "100%",
  129. width: "80%",
  130. maximizable : true,
  131. buttonAlign : 'left',
  132. layout : 'anchor',
  133. items: [],
  134. dbtriggr: trigger,
  135. closeAction: 'hide',
  136. buttons : [{
  137. xtype:'panel',
  138. width:150,
  139. height:25,
  140. border:false,
  141. bodyStyle:'background-color:#e8e8e8',
  142. items:[{
  143. boxLabel : '<span style="font-size:13px;font-weight:bold;">只显示已选中数据</span>',
  144. xtype:'checkbox',
  145. style:'margin-left:10px;',
  146. align:'left',
  147. hidden:true,
  148. width:140,
  149. id:'onlyChecked',
  150. listeners:{
  151. change:function( f, newValue, oldValue, eOpts ){
  152. var win = trigger.win;
  153. var findgrid = win.getEl().down('iframe').dom.contentWindow.document.defaultView.Ext.getCmp('dbfindGridPanel');//所有
  154. var resgrid = win.getEl().down('iframe').dom.contentWindow.document.defaultView.Ext.getCmp('dbfindresultgrid');//选中
  155. if(newValue){
  156. findgrid.hide();
  157. var datachecked=new Array();
  158. Ext.each(Ext.Object.getKeys(resgrid.selectObject),function(k){
  159. datachecked.push(resgrid.selectObject[k]);
  160. });
  161. resgrid.selectAll=false;
  162. resgrid.store.loadData(datachecked);
  163. resgrid.selModel.selectAll();
  164. resgrid.show();
  165. }else{
  166. findgrid.show();
  167. findgrid.selectAll=false;
  168. findgrid.selModel.deselectAll();
  169. findgrid.selectDefaultRecord();
  170. resgrid.hide();
  171. }
  172. }
  173. }
  174. }]
  175. },'->',{
  176. text : '确 认',
  177. iconCls: 'x-button-icon-save',
  178. id:'mutidbaffirm',
  179. cls: 'x-btn-gray',
  180. handler : function(){
  181. trigger.onConfirm();
  182. }
  183. },{
  184. text : '按条件全选',
  185. iconCls: 'x-button-icon-save',
  186. cls: 'x-btn-gray',
  187. handler : function(){
  188. trigger.onConfirm(true);
  189. }
  190. },{
  191. text : '关 闭',
  192. iconCls: 'x-button-icon-close',
  193. cls: 'x-btn-gray',
  194. style:'margin-right:140px',
  195. handler : function(btn){
  196. btn.ownerCt.ownerCt.close();
  197. }
  198. } ,'->'
  199. ]
  200. });
  201. return this.win;
  202. },
  203. showButtons: function() {
  204. var value = this.value, dbwin = this.win, grid = dbwin.down('gridpanel');
  205. if (grid) {
  206. grid.store.loadData(this.multistore);
  207. } else {
  208. grid = dbwin.add({
  209. xtype: 'gridpanel',
  210. height: '100%',
  211. autoScroll: true,
  212. columnLines : true,
  213. columns: [{
  214. text: '描述',
  215. dataIndex: 'display' ,
  216. flex: 1,
  217. filter: {
  218. xtype: 'textfield'
  219. }
  220. }, {
  221. text: '代码',
  222. dataIndex: 'value',
  223. flex: 1,
  224. filter: {
  225. xtype: 'textfield'
  226. }
  227. }],
  228. store: this.multistore,
  229. plugins: [Ext.create('erp.view.core.grid.HeaderFilter', {
  230. ignoreCase: true
  231. })],
  232. selModel: Ext.create('Ext.selection.CheckboxModel',{
  233. ignoreRightMouseSelection : false,
  234. listeners:{
  235. selectionchange:function(selectionModel, selected, options){
  236. if(selected.length==0&&selectionModel.store.data.length>0){//取消全选
  237. Ext.each(selectionModel.store.data.items,function(item){
  238. Ext.Array.remove(grid.multiselected, item.data.value);
  239. });
  240. }else{
  241. Ext.each(selected,function(s){
  242. grid.multiselected.push(s.data.value);
  243. });
  244. }
  245. grid.multiselected=Ext.Array.unique(grid.multiselected);
  246. }
  247. },
  248. onRowMouseDown: function(view, record, item, index, e) {//改写的onRowMouseDown方法
  249. view.el.focus();
  250. var me = view.ownerCt, val = record.get('value');
  251. var checkbox = item.childNodes[0].childNodes[0].childNodes[0];
  252. if(contains(value, val, true)){
  253. me.selModel.deselect(record);
  254. Ext.Array.remove(me.multiselected, val);
  255. checkbox.setAttribute('class','x-grid-row-checker');
  256. } else {
  257. if(checkbox.getAttribute('class') == 'x-grid-row-checker'){
  258. checkbox.setAttribute('class','x-grid-row-checker-checked');//只是修改了其样式,并没有将record加到selModel里面
  259. me.multiselected.push(val);
  260. } else {
  261. Ext.Array.remove(me.multiselected, val);
  262. checkbox.setAttribute('class','x-grid-row-checker');
  263. }
  264. }
  265. }
  266. })
  267. });
  268. grid.store.on('datachanged', function(){
  269. var selected = new Array();
  270. grid.store.each(function(){
  271. if(Ext.Array.contains(grid.multiselected, this.get('value'))){
  272. selected.push(this);
  273. }
  274. });
  275. grid.selModel.select(selected);
  276. });
  277. }
  278. var selected = new Array();
  279. grid.multiselected = Ext.isEmpty(value) ? [] : value.split('#');
  280. grid.store.each(function(){
  281. if(contains(value, this.data['value'], true)){
  282. selected.push(this);
  283. }
  284. });
  285. grid.selModel.select(selected);
  286. },
  287. onConfirm: function(selectAll) {
  288. var trigger = this;
  289. if(trigger.multistore){
  290. var grid = this.win.down('gridpanel');
  291. if(selectAll&&grid.store.data.length>0){//按条件全选
  292. Ext.each(grid.store.data.items,function(item){
  293. grid.multiselected.push(item.data.value);
  294. });
  295. }
  296. grid.multiselected=Ext.Array.unique(grid.multiselected);
  297. trigger.setValue(grid.multiselected.join('#'));
  298. this.win.close();
  299. } else {
  300. if(!trigger.ownerCt){
  301. var grid = trigger.owner;
  302. var record = grid.lastSelectedRecord || trigger.record || grid.getSelectionModel().selected.items[0] || grid.selModel.lastSelected;//detailgrid里面selected
  303. if(selectAll) {
  304. trigger.getAllData(trigger, grid, record);
  305. } else {
  306. var win = trigger.win;
  307. var findgrid = win.getEl().down('iframe').dom.contentWindow.document.defaultView.Ext.getCmp('dbfindGridPanel');//所有
  308. findgrid.setMultiValues();
  309. Ext.each(trigger.multiValue, function(item, index){
  310. if(index > 0){
  311. record = trigger.next(grid, record);
  312. }
  313. if(record) {
  314. if(item){
  315. Ext.Array.each(Ext.Object.getKeys(item), function(k){
  316. Ext.Array.each(grid.dbfinds,function(ds){
  317. if(Ext.isEmpty(ds.trigger) || ds.trigger == trigger.name) {
  318. if(Ext.Array.contains(ds.dbGridField.split(';'), k)) {
  319. record.set(ds.field, item[k]);
  320. }
  321. }
  322. });
  323. });
  324. }
  325. }
  326. });
  327. }
  328. } else {
  329. var win = trigger.win;
  330. var findgrid = win.getEl().down('iframe').dom.contentWindow.document.defaultView.Ext.getCmp('dbfindGridPanel');//所有
  331. findgrid.setMultiValues();
  332. var k = Ext.Object.getKeys(trigger.multiValue),cp;
  333. Ext.each(k, function(key){
  334. cp = Ext.getCmp(key);
  335. if(cp.setValue !== undefined)
  336. cp.setValue(trigger.multiValue[key]);
  337. });
  338. trigger.setValue(trigger.multiValue[trigger.name]);
  339. }
  340. if(!selectAll) {
  341. trigger.fireEvent('aftertrigger', trigger, trigger.multiRecords);
  342. this.win.close();
  343. }
  344. }
  345. },
  346. /**
  347. * 全选模式下,取全部满足条件的数据
  348. */
  349. getAllData: function(trigger, grid, record) {
  350. var win = this.win, g = win.getEl().down('iframe').dom.contentWindow.document.defaultView.Ext.getCmp('dbfindGridPanel');
  351. g.setLoading(true);
  352. g.getAllData(function(datas){
  353. if(datas) {
  354. Ext.each(datas, function(item, index){
  355. if(index > 0){
  356. record = trigger.next(grid, record);
  357. }
  358. if(record) {
  359. Ext.Array.each(Ext.Object.getKeys(item), function(k){
  360. Ext.Array.each(grid.dbfinds, function(ds){
  361. if(Ext.isEmpty(ds.trigger) || ds.trigger == trigger.name) {
  362. if(Ext.Array.contains(ds.dbGridField.split(';'), k)) {
  363. record.set(ds.field, item[k]);
  364. }
  365. }
  366. });
  367. });
  368. }
  369. });
  370. }
  371. g.setLoading(false);
  372. trigger.fireEvent('aftertrigger', trigger, datas);
  373. win.close();
  374. });
  375. },
  376. /**
  377. * 递归grid的下一条
  378. */
  379. next: function(grid, record){
  380. record = record || grid.selModel.lastSelected;
  381. if(record){
  382. //递归查找下一条,并取到数据
  383. var store = grid.store, idx = store.indexOf(record),
  384. d = store.getAt(idx + 1), len = store.data.items.length;
  385. if(d){
  386. return d;
  387. } else {
  388. if(idx + 1 < len){
  389. this.next(grid, d);
  390. } else {
  391. if (grid.GridUtil) {
  392. grid.GridUtil.add10EmptyItems(grid);
  393. return this.next(grid, record);
  394. }
  395. }
  396. }
  397. }
  398. }
  399. });