GridPanel.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. Ext.util.Sorter.prototype.defaultSorterFn=function(d, c) {
  2. var b = this, a = b.transform, g = b.getRoot(d)[b.property], e = b.getRoot(c)[b.property];
  3. if (a) {
  4. g = a(g);
  5. e = a(e)
  6. }
  7. if (typeof(g) == "string") {
  8. return g.localeCompare(e);
  9. }
  10. return g > e ? 1 : (g < e ? -1 : 0)
  11. };
  12. Ext.define('erp.view.common.editorColumn.GridPanel',{
  13. extend: 'Ext.grid.Panel',
  14. alias: 'widget.erpEditorColumnGridPanel',
  15. id: 'editorColumnGridPanel',
  16. emptyText : $I18N.common.grid.emptyText,
  17. columnLines : true,
  18. autoScroll : true,
  19. store: [],
  20. columns: [],
  21. GridUtil: Ext.create('erp.util.GridUtil'),
  22. BaseUtil: Ext.create('erp.util.BaseUtil'),
  23. RenderUtil: Ext.create('erp.util.RenderUtil'),
  24. plugins: [Ext.create('Ext.grid.plugin.CellEditing', {
  25. clicksToEdit: 1
  26. }), Ext.create('erp.view.core.plugin.CopyPasteMenu')],
  27. bodyStyle:'background-color:#f1f1f1;',
  28. multiselected: new Array(),
  29. features : [Ext.create('Ext.grid.feature.Grouping',{
  30. groupHeaderTpl: '{name} (Count:{rows.length})'
  31. })],
  32. selModel: Ext.create('Ext.selection.CheckboxModel',{
  33. ignoreRightMouseSelection : false,
  34. checkOnly: true,
  35. listeners:{
  36. selectionchange:function(selectionModel, selected, options){
  37. }
  38. },
  39. getEditor: function(){
  40. return null;
  41. }
  42. }),
  43. caller: null,
  44. condition: null,
  45. initComponent : function(){
  46. // 额外的plugin
  47. if(this.pluginConfig)
  48. this.plugins = Ext.Array.merge(this.plugins, this.pluginConfig);
  49. this.getGridColumnsAndStore(this.condition || condition);
  50. this.addEvents({
  51. storeloaded: true
  52. });
  53. this.callParent(arguments);
  54. },
  55. getEffectData: function(){
  56. var grid = this;
  57. var items = grid.selModel.getSelection();
  58. Ext.each(items, function(item, index){
  59. if(this.data[grid.keyField] != null && this.data[grid.keyField] != ''
  60. && this.data[grid.keyField] != '0' && this.data[grid.keyField] != 0){
  61. grid.multiselected.push(item);
  62. }
  63. });
  64. var records = this.unique(grid.multiselected);
  65. if(records.length > 0){
  66. var data = new Array();
  67. Ext.each(records, function(record, index){
  68. if((grid.keyField && this.data[grid.keyField] != null && this.data[grid.keyField] != ''
  69. && this.data[grid.keyField] != '0' && this.data[grid.keyField] != 0)){
  70. var o = new Object();
  71. if(grid.keyField){
  72. o[grid.keyField] = record.data[grid.keyField];
  73. }
  74. if(grid.necessaryFields){
  75. Ext.each(grid.necessaryFields, function(f, index){
  76. var v = record.data[f];
  77. if(Ext.isDate(v)){
  78. v = Ext.Date.toString(v);
  79. }
  80. o[f] = v;
  81. });
  82. }
  83. data.push(o);
  84. }
  85. });
  86. return data;
  87. }
  88. },
  89. unique: function(items) {
  90. var d = new Object();
  91. Ext.Array.each(items, function(item){
  92. d[item.id] = item;
  93. });
  94. return Ext.Object.getValues(d);
  95. },
  96. updateAction: function(url){
  97. var grid = this, btn = parent.Ext.getCmp('win').down('button[name=confirm]');
  98. var data = grid.getEffectData();
  99. if(data != null){
  100. grid.setLoading(true);
  101. Ext.Ajax.request({
  102. url : basePath + url,
  103. params: {
  104. caller: caller,
  105. data: Ext.encode(data)
  106. },
  107. method : 'post',
  108. async: false,
  109. callback : function(options,success,response){
  110. grid.setLoading(false);
  111. btn.setDisabled(false);
  112. grid.multiselected = new Array();
  113. var localJson = new Ext.decode(response.responseText);
  114. if(localJson.exceptionInfo){
  115. showError(localJson.exceptionInfo);
  116. return "";
  117. }
  118. if(localJson.success){
  119. if(localJson.log){
  120. showMessage("提示", localJson.log);
  121. }
  122. Ext.Msg.alert("提示", "处理成功!", function(){
  123. window.location.href = window.location.href;
  124. });
  125. }
  126. }
  127. });
  128. } else {
  129. btn.setDisabled(false);
  130. }
  131. },
  132. reloadData: function(condition, callback) {
  133. var grid = this;
  134. grid.setLoading(true);
  135. Ext.Ajax.request({
  136. url : basePath + 'common/singleGridPanel.action',
  137. params: {
  138. caller: this.caller || caller,
  139. condition: condition
  140. },
  141. method : 'post',
  142. callback : function(opt, s, resp){
  143. grid.setLoading(false);
  144. var res = new Ext.decode(resp.responseText);
  145. callback && callback.call(null, res.data ?
  146. Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']')) : []);
  147. }
  148. });
  149. },
  150. getGridColumnsAndStore: function(condition){
  151. var grid = this;
  152. grid.setLoading(true);
  153. Ext.Ajax.request({//拿到grid的columns
  154. url : basePath + 'common/singleGridPanel.action',
  155. params: {
  156. caller: this.caller || caller,
  157. condition: condition
  158. },
  159. method : 'post',
  160. async: false,
  161. callback : function(options,success,response){
  162. grid.setLoading(false);
  163. var res = new Ext.decode(response.responseText);
  164. if(res.exceptionInfo){
  165. showError(res.exceptionInfo);return;
  166. }
  167. var data = [];
  168. if(!res.data || res.data.length == 2){
  169. grid.GridUtil.add10EmptyData(grid.detno, data);
  170. grid.GridUtil.add10EmptyData(grid.detno, data);
  171. } else {
  172. data = Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']'));
  173. }
  174. if(grid.columns && grid.columns.length > 2){
  175. grid.store.loadData(data);
  176. if(grid.normalGrid){
  177. grid.normalGrid.on('scrollershow',function(scroller){
  178. if (scroller && scroller.scrollEl) {
  179. scroller.clearManagedListeners();
  180. scroller.mon(scroller.scrollEl, 'scroll', scroller.onElScroll, scroller);
  181. }
  182. });
  183. }
  184. grid.fireEvent('scrollershow', grid.verticalScroller, 'vertical');
  185. } else {
  186. if(res.columns){
  187. Ext.each(res.columns, function(column, y){
  188. //render
  189. if(!column.haveRendered && column.renderer != null && column.renderer != ""){
  190. var renderName = column.renderer;
  191. if(contains(column.renderer, ':', true)){
  192. var args = new Array();
  193. Ext.each(column.renderer.split(':'), function(a, index){
  194. if(index == 0){
  195. renderName = a;
  196. } else {
  197. args.push(a);
  198. }
  199. });
  200. if(!grid.RenderUtil.args[renderName]){
  201. grid.RenderUtil.args[renderName] = new Object();
  202. }
  203. grid.RenderUtil.args[renderName][column.dataIndex] = args;
  204. }
  205. column.renderer = grid.RenderUtil[renderName];
  206. column.haveRendered = true;
  207. }
  208. //logictype
  209. var logic = column.logic;
  210. if(logic != null){
  211. if(logic == 'detno'){
  212. grid.detno = column.dataIndex;
  213. } else if(logic == 'keyField'){
  214. grid.keyField = column.dataIndex;
  215. } else if(logic == 'mainField'){
  216. grid.mainField = column.dataIndex;
  217. } else if(logic == 'necessaryField'){
  218. grid.necessaryField = column.dataIndex;
  219. if(!grid.necessaryFields){
  220. grid.necessaryFields = new Array();
  221. }
  222. grid.necessaryFields.push(column.dataIndex);
  223. if(!column.haveRendered){
  224. column.renderer = function(val, meta, record, x, y, store, view){
  225. var c = this.columns[y];
  226. if(val != null && val.toString().trim() != ''){
  227. if(c.xtype == 'datecolumn'){
  228. val = Ext.Date.format(val, 'Y-m-d');
  229. }
  230. return val;
  231. } else {
  232. if(c.xtype == 'datecolumn'){
  233. val = '';
  234. }
  235. return '<img src="' + basePath + 'resource/images/icon/need.png" title="必填字段">' +
  236. '<span style="color:blue;padding-left:2px;" title="必填字段">' + val + '</span>';
  237. }
  238. };
  239. }
  240. } else if(logic == 'groupField'){
  241. grid.groupField = column.dataIndex;
  242. }
  243. }
  244. /**
  245. *****如果有固定咧,grid不能分组*****
  246. */
  247. });
  248. var store = Ext.create('Ext.data.Store', {
  249. storeId: 'gridStore',
  250. fields: res.fields,
  251. data: data,
  252. groupField: grid.groupField
  253. });
  254. if(grid.selModel.views == null){
  255. grid.selModel.views = [];
  256. }
  257. if(res.dbfinds.length > 0){
  258. grid.dbfinds = res.dbfinds;
  259. }
  260. grid.columns = res.columns;
  261. if(grid.autoRowNumber) {
  262. Ext.Array.insert(grid.columns, 0, [{xtype: 'rownumberer', width: 35, locked: true, cls: 'x-grid-header-1'}]);
  263. }
  264. grid.store = store;
  265. //grid.fireEvent('storeloaded', grid, store);
  266. }
  267. }
  268. }
  269. });
  270. },
  271. viewConfig: {// 显示分仓库库存
  272. listeners: {
  273. render: function(view) {
  274. var prodfield = Ext.getCmp('editorColumnGridPanel').getProdField();
  275. if(prodfield && !view.tip) {
  276. view.tip = Ext.create('Ext.tip.ToolTip', {
  277. target: view.el,
  278. delegate: view.itemSelector,
  279. trackMouse: true,
  280. renderTo: Ext.getBody(),
  281. listeners: {
  282. beforeshow: function updateTipBody(tip) {
  283. var record = view.getRecord(tip.triggerElement),
  284. grid = view.ownerCt.ownerCt;
  285. if(record && grid.productwh) {
  286. var c = record.get(prodfield), pws = new Array();
  287. Ext.each(grid.productwh, function(d){
  288. if(d.PW_PRODCODE == c) {
  289. pws.push(d);
  290. }
  291. });
  292. tip.down('grid').setTitle(c);
  293. tip.down('grid').store.loadData(pws);
  294. }
  295. }
  296. },
  297. items: [{
  298. xtype: 'grid',
  299. width: 300,
  300. columns: [{
  301. text: '仓库编号',
  302. cls: 'x-grid-header-1',
  303. dataIndex: 'PW_WHCODE',
  304. width: 80
  305. },{
  306. text: '仓库名称',
  307. cls: 'x-grid-header-1',
  308. dataIndex: 'WH_DESCRIPTION',
  309. width: 120
  310. },{
  311. text: '库存',
  312. cls: 'x-grid-header-1',
  313. xtype: 'numbercolumn',
  314. align: 'right',
  315. dataIndex: 'PW_ONHAND',
  316. width: 90
  317. }],
  318. columnLines: true,
  319. title: '物料分仓库存',
  320. store: new Ext.data.Store({
  321. fields: ['PW_WHCODE', 'WH_DESCRIPTION', 'PW_ONHAND'],
  322. data: [{}]
  323. })
  324. }]
  325. });
  326. }
  327. }
  328. }
  329. },
  330. getProdField : function() {
  331. var f = null;
  332. switch (caller){
  333. case 'SendNotify!ToProdIN!Deal' ://通知单转出货
  334. f = 'snd_prodcode';
  335. break;
  336. /*case 'Sale!ToAccept!Deal' ://订单转出货
  337. f = 'sd_prodcode';
  338. break;*/
  339. }
  340. return f;
  341. }
  342. });