Ext.define('Ext.ux.feature.InfoSummary', { /* Begin Definitions */ extend: 'Ext.grid.feature.AbstractSummary', alias: 'feature.infoSummary', /** * @cfg {String} dock * Configure `'top'` or `'bottom'` top create a fixed summary row. * */ dock: 'bottom', dockedSummaryCls: Ext.baseCSSPrefix + 'docked-info-summary', summaryRowCls: Ext.baseCSSPrefix + 'grid-row-info-summary ' + Ext.baseCSSPrefix + 'grid-row-total', summaryRowSelector: '.' + Ext.baseCSSPrefix + 'grid-row-info-summary.' + Ext.baseCSSPrefix + 'grid-row-total', summaryCellSelector: '.' + Ext.baseCSSPrefix + 'grid-cell.' + Ext.baseCSSPrefix + 'grid-td', panelBodyCls: Ext.baseCSSPrefix + 'info-summary-', infoSummaryRowTpl: [ '', '', '
', '{label}', '
', '', '
', ], init: function(grid) { var me = this, view = me.view, dock = me.dock, store = grid.getStore(); me.grid = grid; me.callParent([ grid ]); grid.addBodyCls(me.panelBodyCls + dock); grid.headerCt.on({ add: me.onStoreUpdate, afterlayout: me.onStoreUpdate, remove: me.onStoreUpdate, scope: me }); grid.on({ beforerender: function() { var tableCls = [me.summaryTableCls]; if (view.columnLines) { tableCls[tableCls.length] = view.ownerCt.colLinesCls; } me.summaryBar = grid.addDocked({ childEls: ['innerCt', 'item'], renderTpl: [ '', ], tpl: [ '', '', '{%', 'this.renderSummaryRow(values, out)', '%}', '', '
', { renderSummaryRow: function(values, out) { let datas = values.map(function(v) { return { label: v } }); out.push((me.infoSummaryRowTpl.isXTemplate ? me.infoSummaryRowTpl : new Ext.XTemplate(me.infoSummaryRowTpl)).applyOut(datas, out)); }, } ], height: 32, scrollable: { x: false, y: false }, itemId: 'info-summary-bar', cls: [ me.dockedSummaryCls, me.dockedSummaryCls + '-' + dock ], xtype: 'component', dock: dock, weight: 10000000, })[0]; }, afterrender: function() { grid.getView().getScrollable().addPartner(me.summaryBar.getScrollable(), 'x'); me.onStoreUpdate(); me.columnSizer = me.summaryBar.el; }, single: true }); me.bindStore(grid, store); }, bindStore: function(grid, store) { var me = this; Ext.destroy(me.storeListeners); me.storeListeners = store.on({ scope: me, destroyable: true, update: me.onStoreUpdate, datachanged: me.onStoreUpdate }); me.callParent([grid, store]); }, createSummaryRecord: function (view) { var me = this, columns = view.headerCt.getGridColumns(), remoteRoot = me.remoteRoot, summaryRecord = me.summaryRecord || (me.summaryRecord = new Ext.data.Model({ id: view.id + '-info-summary-record' })), colCount = columns.length, i, column, dataIndex, summaryValue; // Set the summary field values summaryRecord.beginEdit(); if (remoteRoot) { summaryValue = me.generateSummaryData(); if (summaryValue) { summaryRecord.set(summaryValue); } } else { for (i = 0; i < colCount; i++) { column = columns[i]; // In summary records, if there's no dataIndex, then the value in regular rows must come from a renderer. // We set the data value in using the column ID. dataIndex = column.dataIndex || column.getItemId(); // We need to capture this value because it could get overwritten when setting on the model if there // is a convert() method on the model. summaryValue = me.getSummary(view.store, column.summaryType, dataIndex); summaryRecord.set(dataIndex, summaryValue); // Capture the columnId:value for the summaryRenderer in the summaryData object. me.setSummaryData(summaryRecord, column.getItemId(), summaryValue); } } summaryRecord.endEdit(true); // It's not dirty summaryRecord.commit(true); summaryRecord.isSummary = true; console.log(summaryRecord); return summaryRecord; }, onStoreUpdate: function() { var me = this, view = me.view, selector = me.summaryCellSelector, dock = me.dock, record, newCellDoms, summaryLabels = []; if (!view.rendered) { return; } record = me.createSummaryRecord(view); newCellDoms = Ext.fly(view.createRowElement(record, -1)).query(selector, true); if(!newCellDoms || newCellDoms.length === 0) { return; } if (!dock) { return; } for(let i = 0; i < newCellDoms.length; i++) { let innerText = newCellDoms[i].innerText.trim(); if(innerText.length > 0) { summaryLabels.push(innerText); } } me.summaryBar.update(summaryLabels); }, getSummaryBar: function() { return this.summaryBar; }, destroy: function() { var me = this; me.summaryRecord = me.storeListeners = Ext.destroy(me.storeListeners); me.callParent(); } });