@@ -18,6 +18,7 @@ import type DataSourceAdapter from '@ts/grids/grid_core/data_source_adapter/m_da
1818import type { EditingControllerRequired , ModuleType } from '@ts/grids/grid_core/m_types' ;
1919import { ColumnsView } from '@ts/grids/grid_core/views/m_columns_view' ;
2020
21+ import type { Column } from '../../grid_core/columns_controller/types' ;
2122import type { EditingController } from '../../grid_core/editing/m_editing' ;
2223import type { RowsView } from '../../grid_core/views/m_rows_view' ;
2324import AggregateCalculator from '../m_aggregate_calculator' ;
@@ -471,9 +472,9 @@ const data = (Base: ModuleType<DataController>) => class SummaryDataControllerEx
471472 private _processGroupItem ( groupItem , options ) {
472473 const that = this ;
473474
474- if ( ! options . summaryGroupItems ) {
475- options . summaryGroupItems = that . option ( 'summary.groupItems' ) || [ ] ;
476- }
475+ options . summaryGroupItems ??= that . option ( 'summary.groupItems' ) || [ ] ;
476+ options . summaryColumnMap ??= this . _buildColumnLookupMap ( ) ;
477+
477478 if ( groupItem . rowType === 'group' ) {
478479 let groupColumnIndex = - 1 ;
479480 let afterGroupColumnIndex = - 1 ;
@@ -490,32 +491,97 @@ const data = (Base: ModuleType<DataController>) => class SummaryDataControllerEx
490491 }
491492 } ) ;
492493
493- groupItem . summaryCells = this . _calculateSummaryCells ( options . summaryGroupItems , getGroupAggregates ( groupItem . data ) , options . visibleColumns , ( summaryItem , column ) => {
494- if ( summaryItem . showInGroupFooter ) {
495- return - 1 ;
496- }
494+ groupItem . summaryCells = this . _calculateSummaryCells (
495+ options . summaryGroupItems ,
496+ getGroupAggregates ( groupItem . data ) ,
497+ options . visibleColumns ,
498+ ( summaryItem , column ) => {
499+ if ( summaryItem . showInGroupFooter ) {
500+ return - 1 ;
501+ }
497502
498- if ( summaryItem . alignByColumn && column && ! isDefined ( column . groupIndex ) && ( column . index !== afterGroupColumnIndex ) ) {
499- return column . index ;
500- }
501- return groupColumnIndex ;
502- } , true ) ;
503+ if ( summaryItem . alignByColumn
504+ && column
505+ && ! isDefined ( column . groupIndex )
506+ && ( column . index !== afterGroupColumnIndex )
507+ ) {
508+ return column . index ;
509+ }
510+
511+ return groupColumnIndex ;
512+ } ,
513+ true ,
514+ options . summaryColumnMap ,
515+ ) ;
503516 }
517+
504518 if ( groupItem . rowType === DATAGRID_GROUP_FOOTER_ROW_TYPE ) {
505- groupItem . summaryCells = this . _calculateSummaryCells ( options . summaryGroupItems , getGroupAggregates ( groupItem . data ) , options . visibleColumns , ( summaryItem , column ) => ( summaryItem . showInGroupFooter && that . _isDataColumn ( column ) ? column . index : - 1 ) ) ;
519+ groupItem . summaryCells = this . _calculateSummaryCells (
520+ options . summaryGroupItems ,
521+ getGroupAggregates ( groupItem . data ) ,
522+ options . visibleColumns ,
523+ ( summaryItem , column ) => (
524+ summaryItem . showInGroupFooter && that . _isDataColumn ( column ) ? column . index : - 1
525+ ) ,
526+ false ,
527+ options . summaryColumnMap ,
528+ ) ;
506529 }
507530
508531 return groupItem ;
509532 }
510533
511- private _calculateSummaryCells ( summaryItems , aggregates , visibleColumns , calculateTargetColumnIndex , isGroupRow ?) {
534+ // The map is built once per _processItems cycle (via options) and discarded after.
535+ private _buildColumnLookupMap ( ) : Map < string | number , Column > {
536+ const columnMap = new Map < string | number , Column > ( ) ;
537+ const { _columnsController : ctrl } = this ;
538+ const allColumns = ctrl . getColumns ( )
539+ . concat ( ctrl . _commandColumns ?? [ ] ) ;
540+
541+ for ( const column of allColumns ) {
542+ const copy = extend ( { } , column ) as Column ;
543+ const keys = [
544+ column . index , column . name ,
545+ column . dataField , column . caption ,
546+ ] ;
547+ for ( const key of keys ) {
548+ if ( key !== undefined && ! columnMap . has ( key ) ) {
549+ columnMap . set ( key , copy ) ;
550+ }
551+ }
552+ }
553+
554+ return columnMap ;
555+ }
556+
557+ private static _getColumnFromMap (
558+ identifier : string | number | undefined ,
559+ columnMap : Map < string | number , Column > ,
560+ ) : Column | undefined {
561+ return identifier !== undefined ? columnMap . get ( identifier ) : undefined ;
562+ }
563+
564+ private _calculateSummaryCells (
565+ summaryItems ,
566+ aggregates ,
567+ visibleColumns ,
568+ calculateTargetColumnIndex ,
569+ isGroupRow ?,
570+ columnMap ?: Map < string | number , Column > ,
571+ ) {
512572 const that = this ;
513573 const summaryCells : any = [ ] ;
514574 const summaryCellsByColumns = { } ;
515575
516576 each ( summaryItems , ( summaryIndex , summaryItem ) => {
517- const column = that . _columnsController . columnOption ( summaryItem . column ) ;
518- const showInColumn = summaryItem . showInColumn && that . _columnsController . columnOption ( summaryItem . showInColumn ) || column ;
577+ const column = columnMap
578+ ? SummaryDataControllerExtender . _getColumnFromMap ( summaryItem . column , columnMap )
579+ : that . _columnsController . columnOption ( summaryItem . column ) ;
580+ const showInColumn = ( summaryItem . showInColumn
581+ && ( columnMap
582+ ? SummaryDataControllerExtender . _getColumnFromMap ( summaryItem . showInColumn , columnMap )
583+ : that . _columnsController . columnOption ( summaryItem . showInColumn ) ) )
584+ || column ;
519585 const columnIndex = calculateTargetColumnIndex ( summaryItem , showInColumn ) ;
520586
521587 if ( columnIndex >= 0 ) {
0 commit comments