InfoSummary.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. Ext.define('Ext.ux.feature.InfoSummary', {
  2. /* Begin Definitions */
  3. extend: 'Ext.grid.feature.AbstractSummary',
  4. alias: 'feature.infoSummary',
  5. /**
  6. * @cfg {String} dock
  7. * Configure `'top'` or `'bottom'` top create a fixed summary row.
  8. *
  9. */
  10. dock: 'bottom',
  11. dockedSummaryCls: Ext.baseCSSPrefix + 'docked-info-summary',
  12. summaryRowCls: Ext.baseCSSPrefix + 'grid-row-info-summary ' + Ext.baseCSSPrefix + 'grid-row-total',
  13. summaryRowSelector: '.' + Ext.baseCSSPrefix + 'grid-row-info-summary.' + Ext.baseCSSPrefix + 'grid-row-total',
  14. summaryCellSelector: '.' + Ext.baseCSSPrefix + 'grid-cell.' + Ext.baseCSSPrefix + 'grid-td',
  15. panelBodyCls: Ext.baseCSSPrefix + 'info-summary-',
  16. infoSummaryRowTpl: [
  17. '<tpl for=".">',
  18. '<td class="' + Ext.baseCSSPrefix + 'grid-cell ' + Ext.baseCSSPrefix + 'grid-td">',
  19. '<div class="' + Ext.baseCSSPrefix + 'grid-cell-inner">',
  20. '{label}',
  21. '</div>',
  22. '</td>',
  23. '</tpl>',
  24. ],
  25. init: function(grid) {
  26. var me = this,
  27. view = me.view,
  28. dock = me.dock,
  29. store = grid.getStore();
  30. me.grid = grid;
  31. me.callParent([
  32. grid
  33. ]);
  34. grid.addBodyCls(me.panelBodyCls + dock);
  35. grid.headerCt.on({
  36. add: me.onStoreUpdate,
  37. afterlayout: me.onStoreUpdate,
  38. remove: me.onStoreUpdate,
  39. scope: me
  40. });
  41. grid.on({
  42. beforerender: function() {
  43. var tableCls = [me.summaryTableCls];
  44. if (view.columnLines) {
  45. tableCls[tableCls.length] = view.ownerCt.colLinesCls;
  46. }
  47. me.summaryBar = grid.addDocked({
  48. childEls: ['innerCt', 'item'],
  49. renderTpl: [
  50. '<div id="{id}-innerCt" data-ref="innerCt" role="presentation">',
  51. '{%this.renderContent(out, values)%}',
  52. '</div>',
  53. ],
  54. tpl: [
  55. '<table id="{id}-item" data-ref="item" cellPadding="0" cellSpacing="0" class="' + tableCls.join(' ') + '">',
  56. '<tr class="' + me.summaryRowCls + '">',
  57. '{%',
  58. 'this.renderSummaryRow(values, out)',
  59. '%}',
  60. '</tr>',
  61. '</table>',
  62. {
  63. renderSummaryRow: function(values, out) {
  64. let datas = values.map(function(v) {
  65. return { label: v }
  66. });
  67. out.push((me.infoSummaryRowTpl.isXTemplate ? me.infoSummaryRowTpl : new Ext.XTemplate(me.infoSummaryRowTpl)).applyOut(datas, out));
  68. },
  69. }
  70. ],
  71. height: 32,
  72. scrollable: {
  73. x: false,
  74. y: false
  75. },
  76. itemId: 'info-summary-bar',
  77. cls: [ me.dockedSummaryCls, me.dockedSummaryCls + '-' + dock ],
  78. xtype: 'component',
  79. dock: dock,
  80. weight: 10000000,
  81. })[0];
  82. },
  83. afterrender: function() {
  84. grid.getView().getScrollable().addPartner(me.summaryBar.getScrollable(), 'x');
  85. me.onStoreUpdate();
  86. me.columnSizer = me.summaryBar.el;
  87. },
  88. single: true
  89. });
  90. me.bindStore(grid, store);
  91. },
  92. bindStore: function(grid, store) {
  93. var me = this;
  94. Ext.destroy(me.storeListeners);
  95. me.storeListeners = store.on({
  96. scope: me,
  97. destroyable: true,
  98. update: me.onStoreUpdate,
  99. datachanged: me.onStoreUpdate
  100. });
  101. me.callParent([grid, store]);
  102. },
  103. createSummaryRecord: function (view) {
  104. var me = this,
  105. columns = view.headerCt.getGridColumns(),
  106. remoteRoot = me.remoteRoot,
  107. summaryRecord = me.summaryRecord || (me.summaryRecord = new Ext.data.Model({
  108. id: view.id + '-info-summary-record'
  109. })),
  110. colCount = columns.length, i, column,
  111. dataIndex, summaryValue;
  112. // Set the summary field values
  113. summaryRecord.beginEdit();
  114. if (remoteRoot) {
  115. summaryValue = me.generateSummaryData();
  116. if (summaryValue) {
  117. summaryRecord.set(summaryValue);
  118. }
  119. }
  120. else {
  121. for (i = 0; i < colCount; i++) {
  122. column = columns[i];
  123. // In summary records, if there's no dataIndex, then the value in regular rows must come from a renderer.
  124. // We set the data value in using the column ID.
  125. dataIndex = column.dataIndex || column.getItemId();
  126. // We need to capture this value because it could get overwritten when setting on the model if there
  127. // is a convert() method on the model.
  128. summaryValue = me.getSummary(view.store, column.summaryType, dataIndex);
  129. summaryRecord.set(dataIndex, summaryValue);
  130. // Capture the columnId:value for the summaryRenderer in the summaryData object.
  131. me.setSummaryData(summaryRecord, column.getItemId(), summaryValue);
  132. }
  133. }
  134. summaryRecord.endEdit(true);
  135. // It's not dirty
  136. summaryRecord.commit(true);
  137. summaryRecord.isSummary = true;
  138. console.log(summaryRecord);
  139. return summaryRecord;
  140. },
  141. onStoreUpdate: function() {
  142. var me = this,
  143. view = me.view,
  144. selector = me.summaryCellSelector,
  145. dock = me.dock,
  146. record, newCellDoms, summaryLabels = [];
  147. if (!view.rendered) {
  148. return;
  149. }
  150. record = me.createSummaryRecord(view);
  151. newCellDoms = Ext.fly(view.createRowElement(record, -1)).query(selector, true);
  152. if(!newCellDoms || newCellDoms.length === 0) {
  153. return;
  154. }
  155. if (!dock) {
  156. return;
  157. }
  158. for(let i = 0; i < newCellDoms.length; i++) {
  159. let innerText = newCellDoms[i].innerText.trim();
  160. if(innerText.length > 0) {
  161. summaryLabels.push(innerText);
  162. }
  163. }
  164. me.summaryBar.update(summaryLabels);
  165. },
  166. getSummaryBar: function() {
  167. return this.summaryBar;
  168. },
  169. destroy: function() {
  170. var me = this;
  171. me.summaryRecord = me.storeListeners = Ext.destroy(me.storeListeners);
  172. me.callParent();
  173. }
  174. });