Ext.define('Ext.overrides.grid.feature.Summary', { override: 'Ext.grid.feature.Summary', // override fixed: undefined, fixedSummaryCls: Ext.baseCSSPrefix + 'fixed-summary', init: function (grid) { var me = this, view = me.view, dock = me.dock, fixed = me.fixed; // when 'fixed' is true, 'dock' must be a defined value, default 'bottom' if(fixed) { dock = me.dock = dock || 'bottom'; } me.callParent([grid]); if (dock) { grid.addBodyCls(me.panelBodyCls + dock); grid.headerCt.on({ add: me.onStoreUpdate, // we need to fire onStoreUpdate afterlayout for docked items // to re-run the renderSummaryRow on show/hide columns. 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: [ '' ], scrollable: { x: false, y: false }, hidden: !me.showSummaryRow, itemId: 'summaryBar', cls: [me.dockedSummaryCls, me.dockedSummaryCls + '-' + dock, (fixed ? me.fixedSummaryCls : '')], 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 }); } else { if (grid.bufferedRenderer) { me.wrapsItem = true; view.addRowTpl(me.fullSummaryTpl).summaryFeature = me; view.on('refresh', me.onViewRefresh, me); } else { me.wrapsItem = false; me.view.addFooterFn(me.renderSummaryRow); } } grid.headerCt.on({ afterlayout: me.afterHeaderCtLayout, scope: me }); grid.ownerGrid.on({ beforereconfigure: me.onBeforeReconfigure, columnmove: me.onStoreUpdate, scope: me }); me.bindStore(grid, grid.getStore()); }, onStoreUpdate: function () { var me = this, view = me.view, selector = me.summaryRowSelector, dock = me.dock, fixed = me.fixed, record, newRowDom, oldRowDom, newCellDoms, p; if (!view.rendered) { return; } record = me.createSummaryRecord(view); newRowDom = Ext.fly(view.createRowElement(record, -1)).down(selector, true); if (!newRowDom) { return; } if(fixed) { newCellDoms = newRowDom.children; for(let i = newCellDoms.length - 1; i >= 0 ; i--) { let innerText = newCellDoms[i].innerText.trim(); if(innerText.length === 0) { newRowDom.removeChild(newCellDoms[i]) }else { newCellDoms[i].style.removeProperty('width'); } } } // Summary row is inside the docked summaryBar Component if (dock) { p = me.summaryBar.item.dom.firstChild; oldRowDom = p.firstChild; p.insertBefore(newRowDom, oldRowDom); p.removeChild(oldRowDom); } // Summary row is a regular row in a THEAD inside the View. // Downlinked through the summary record's ID else { oldRowDom = view.el.down(selector, true); p = oldRowDom && oldRowDom.parentNode; if (p) { p.removeChild(oldRowDom); } // We're always inserting the new summary row into the last rendered row, // unless no rows exist. In that case we will be appending to the special // placeholder in the node container. p = view.getRow(view.all.last()); if (p) { p = p.parentElement; } // View might not have nodeContainer yet. else { p = me.getSummaryRowPlaceholder(view); p = p && p.tBodies && p.tBodies[0]; } if (p) { p.appendChild(newRowDom); } } }, // Synchronize column widths in the docked summary Component or the inline summary row // depending on whether we are docked or not. afterHeaderCtLayout: function (headerCt) { var me = this, view = me.view, columns = view.getVisibleColumnManager().getColumns(), column, len = columns.length, i, summaryEl, el, width, innerCt; if (me.showSummaryRow && view.refreshCounter) { if(me.fixed) { return; } if (me.dock) { summaryEl = me.summaryBar.el; width = headerCt.getTableWidth(); innerCt = me.summaryBar.innerCt; // Stretch the innerCt of the summary bar upon headerCt layout me.summaryBar.item.setWidth(width); // headerCt's tooNarrow flag is set by its layout if the columns overflow. // Must not measure+set in after layout phase, this is a write phase. if (headerCt.tooNarrow) { width += Ext.getScrollbarSize().width; } innerCt.setWidth(width); } else { summaryEl = Ext.fly(Ext.fly(view.getNodeContainer()).down('.' + me.summaryItemCls, true)); } // If the layout was in response to a clearView, there'll be no summary element if (summaryEl) { for (i = 0; i < len; i++) { column = columns[i]; el = summaryEl.down(view.getCellSelector(column), true); if (el) { Ext.fly(el).setWidth(column.width || (column.lastBox ? column.lastBox.width : 100)); } } } } }, });