MySummary.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. Ext.define('Ext.ux.feature.MySummary', {
  2. extend: 'Ext.grid.feature.Summary',
  3. alias: 'feature.mysummary',
  4. dock: 'bottom',
  5. dockedSummaryCls: Ext.baseCSSPrefix + 'docked-mysummary',
  6. showSummaryRow: true,
  7. init: function(grid) {
  8. var me = this,
  9. view = me.view,
  10. dock = me.dock,
  11. store = grid.getStore();
  12. me.grid = grid;
  13. me.callParent([
  14. grid
  15. ]);
  16. grid.headerCt.on({
  17. add: me.onStoreUpdate,
  18. afterlayout: me.onStoreUpdate,
  19. remove: me.onStoreUpdate,
  20. scope: me
  21. });
  22. grid.on({
  23. beforerender: function() {
  24. var tableCls = [
  25. me.summaryTableCls
  26. ];
  27. if (view.columnLines) {
  28. tableCls[tableCls.length] = view.ownerCt.colLinesCls;
  29. }
  30. me.summaryBar = grid.addDocked({
  31. childEls: ['innerCt', 'item'],
  32. renderTpl: [
  33. '<div id="{id}-innerCt" data-ref="innerCt" role="presentation">',
  34. '{%this.renderContent(out,values)%}',
  35. '</div>'
  36. ],
  37. tpl: [
  38. '<table class="x-grid-row-mysummary">',
  39. '<tbody>',
  40. '<tr>',
  41. '<tpl for=".">',
  42. '<td class="x-grid-cell x-grid-td x-grid-cell-numbercolumn-1526 x-unselectable x-mysummary-item">',
  43. '<div class="x-grid-cell-inner x-mysummary-item-cell">{label}',
  44. '<tpl if="typeLabel">',
  45. '({typeLabel})',
  46. '</tpl>',
  47. ': {value}',
  48. '</div>',
  49. '</td>',
  50. '</tpl>',
  51. '</tr>',
  52. '</tbody>',
  53. '</table>',
  54. ],
  55. data: me.getSummarys(),
  56. height: 36,
  57. scrollable: {
  58. x: false,
  59. y: false
  60. },
  61. hidden: !me.showSummaryRow,
  62. itemId: 'mysummaryBar',
  63. cls: [ me.dockedSummaryCls, me.dockedSummaryCls + '-' + dock ],
  64. xtype: 'component',
  65. dock: dock,
  66. weight: 10000000
  67. })[0];
  68. },
  69. afterrender: function() {
  70. grid.getView().getScrollable().addPartner(me.summaryBar.getScrollable(), 'x');
  71. me.onStoreUpdate();
  72. me.columnSizer = me.summaryBar.el;
  73. },
  74. single: true
  75. });
  76. store.on('load', function( s, records, successful, operation, eOpts) {
  77. var _res = operation._response.responseJson,
  78. _calculateProperty = grid.calculateProperty,
  79. _rootProperty = grid.rootProperty;
  80. var _root = _calculateProperty.split('.')[0];
  81. eval('var ' + _root + ' = _res[_root];');
  82. try {
  83. var columns = grid.columns,
  84. summaryData = [],
  85. datas = [];
  86. try {
  87. summaryData = eval(_calculateProperty);
  88. datas = eval(_rootProperty);
  89. if(!Ext.isArray(summaryData)) {
  90. summaryData = [];
  91. }
  92. if(!Ext.isArray(datas)) {
  93. datas = [];
  94. }
  95. }catch(e) {
  96. // don't care this...
  97. }
  98. Ext.Array.each(columns, function (c) {
  99. var type = c._summaryType,
  100. name = c.dataIndex;
  101. var d = Ext.Array.findBy(summaryData, function (s) {
  102. return s.hasOwnProperty(name);
  103. })
  104. if (type && d) {
  105. if(typeof c.mySummaryRenderer == 'function') {
  106. c.summaryValue = c.mySummaryRenderer(grid, c, datas);
  107. }else if (type == 'count') {
  108. c.summaryValue = Ext.util.Format.number(d[name], c.format || '0');
  109. } else if (typeof c.summaryRenderer == 'function') {
  110. c.summaryValue = c.summaryRenderer(d[name]);
  111. } else if (typeof c.renderer == 'function') {
  112. c.summaryValue = c.renderer(d[name]);
  113. } else {
  114. c.summaryValue = Ext.util.Format.number(d[name], c.format || '0.00');
  115. }
  116. } else if(type && !d) {
  117. if(typeof c.mySummaryRenderer == 'function') {
  118. c.summaryValue = c.mySummaryRenderer(grid, c, datas);
  119. }else {
  120. c.summaryValue = me.applySummaryValue(datas, c);
  121. }
  122. } else {
  123. c.summaryValue = null;
  124. }
  125. });
  126. return datas;
  127. } catch (e) {
  128. console.error(e);
  129. saas.util.BaseUtil.showErrorToast(e.message);
  130. }
  131. });
  132. me.bindStore(grid, store);
  133. },
  134. onStoreUpdate: function(store) {
  135. var me = this,
  136. summaryBar = me.summaryBar,
  137. newSummarys = me.getSummarys();
  138. summaryBar && summaryBar.update(newSummarys);
  139. },
  140. getSummarys: function() {
  141. var me = this,
  142. view = me.view,
  143. columns = view.headerCt.getGridColumns(),
  144. summarys = me.summarys;
  145. if(summarys && summarys.length > 0) {
  146. return me.updateSummarys();
  147. }else {
  148. return me.initSummarys();
  149. }
  150. },
  151. initSummarys: function() {
  152. var me = this,
  153. summarys = [],
  154. grid = me.grid,
  155. columns = grid.columns;
  156. var typeLabels = {
  157. sum: '合计',
  158. count: '计数',
  159. avg: '平均值',
  160. max: '最大值',
  161. min: '最小值'
  162. };
  163. Ext.Array.each(columns, function(c) {
  164. var summaryType = c._summaryType || c.summaryType;
  165. if(!c.disableMySummary&&summaryType) {
  166. summarys.push({
  167. name: c.dataIndex,
  168. label: me.getSummaryLabel(c),
  169. type: summaryType,
  170. typeLabel: summaryType ? typeLabels[summaryType] : '',
  171. value: me.getSummaryValue(c)
  172. });
  173. }
  174. });
  175. grid.mysummarys = summarys;
  176. if(summarys.length == 0) {
  177. me.showSummaryRow = false;
  178. }else {
  179. me.showSummaryRow = true;
  180. }
  181. me.summarys = summarys;
  182. return summarys;
  183. },
  184. updateSummarys: function() {
  185. var me = this,
  186. grid = me.grid,
  187. columns = grid.columns,
  188. summarys = me.summarys;
  189. Ext.Array.each(summarys, function(s) {
  190. var col = Ext.Array.findBy(columns, function(c) {
  191. return c.dataIndex == s.name;
  192. });
  193. if(col) {
  194. s.value = me.getSummaryValue(col);
  195. }
  196. });
  197. return summarys;
  198. },
  199. getSummaryLabel: function(c) {
  200. var text = c.text,
  201. summaryLabel = c.summaryLabel;
  202. if(typeof summaryLabel === 'string') {
  203. return summaryLabel;
  204. }else if(typeof summaryLabel === 'function') {
  205. return summaryLabel(c, text);
  206. }else {
  207. return text;
  208. }
  209. },
  210. getSummaryValue: function(c) {
  211. var summaryValue = c.summaryValue || 0,
  212. summaryValueRender = c.summaryValueRender;
  213. if(typeof summaryValueRender === 'function') {
  214. return summaryValueRender(summaryValue);
  215. }else {
  216. return summaryValue;
  217. }
  218. },
  219. applySummaryValue: function(datas, c) {
  220. var dataIndex = c.dataIndex,
  221. type = c.summaryType,
  222. values = datas.map(function(d) {
  223. return d[c.dataIndex];
  224. }),
  225. sum = Ext.Array.sum(values);
  226. if (type == 'count') {
  227. return Ext.util.Format.number(values.length, '0');
  228. } else if (typeof c.summaryRenderer == 'function') {
  229. return c.summaryRenderer(sum);
  230. } else if (typeof c.renderer == 'function') {
  231. return c.renderer(sum);
  232. } else {
  233. return Ext.util.Format.number(sum, c.format || '0.00');
  234. }
  235. },
  236. afterHeaderCtLayout: function(headerCt) {
  237. // do nothing...
  238. },
  239. });