Skip to content

Commit 912de83

Browse files
authored
Merge pull request #10649 from IgniteUI/mkirova/fix-10642
Add additional summary column for columns with children, that is always visible and shows the parent's aggregates.
2 parents 3546c89 + 8c8e4c8 commit 912de83

File tree

2 files changed

+71
-39
lines changed

2 files changed

+71
-39
lines changed

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@
119119
<div class="igx-grid__tr--header">
120120
<igx-icon [attr.draggable]="false"
121121
(click)="toggleColumn(column)">
122-
{{columnGroupStates.get(column.field) ? 'expand_more' : 'expand_less'}}</igx-icon>
122+
{{getColumnGroupExpandState(column) ? 'chevron_right' : 'expand_more'}}</igx-icon>
123123
{{column.header}}
124124
</div>
125125
</ng-template>

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts

Lines changed: 70 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -935,24 +935,32 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
935935
return this.calcHeight;
936936
}
937937

938+
public getColumnGroupExpandState(col: IgxColumnComponent) {
939+
const state = this.columnGroupStates.get(col.field);
940+
// columns are expanded by default?
941+
return state !== undefined && state !== null ? state : false;
942+
}
943+
938944
public toggleRowGroup(col: IgxColumnComponent, newState: boolean) {
939945
if (this.hasMultipleValues) {
940-
const fieldColumns = col.children.filter(x => !x.columnGroup);
941-
const groupColumns = col.children.filter(x => x.columnGroup);
942-
groupColumns.forEach(groupColumn => {
943-
groupColumn.hidden = newState;
944-
this.resolveToggle(groupColumn);
945-
});
946-
fieldColumns.forEach(fieldColumn => {
947-
fieldColumn.hidden = !newState;
948-
});
946+
const parentCols = col.parent ? col.parent.children.toArray() : this.columns.filter(x => x.level === 0);
947+
const siblingCol = parentCols.filter(x => x.header === col.header && x !== col)[0];
948+
const currIndex = parentCols.indexOf(col);
949+
const siblingIndex = parentCols.indexOf(siblingCol);
950+
if (currIndex < siblingIndex) {
951+
// clicked on the full hierarchy header
952+
this.resolveToggle(col, newState);
953+
siblingCol.headerTemplate = this.headerTemplate;
954+
} else {
955+
// clicked on summary parent column that contains just the measures
956+
col.headerTemplate = undefined;
957+
this.resolveToggle(siblingCol, newState);
958+
}
949959
} else {
950960
const parentCols = col.parent ? col.parent.children : this.columns.filter(x => x.level === 0);
951961
const fieldColumn = parentCols.filter(x => x.header === col.header && !x.columnGroup)[0];
952962
const groupColumn = parentCols.filter(x => x.header === col.header && x.columnGroup)[0];
953-
groupColumn.hidden = newState;
954-
this.resolveToggle(groupColumn);
955-
fieldColumn.hidden = !newState;
963+
this.resolveToggle(groupColumn, newState);
956964
if (newState) {
957965
fieldColumn.headerTemplate = this.headerTemplate;
958966
} else {
@@ -970,16 +978,25 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
970978
super.setupColumns();
971979
}
972980

973-
protected resolveToggle(groupColumn: IgxColumnComponent) {
974-
const hasChildGroup = groupColumn.children.filter(x => x.columnGroup).length > 0;
975-
if (!groupColumn.hidden && hasChildGroup) {
976-
const fieldChildren = groupColumn.children.filter(x => !x.columnGroup);
977-
const groupChildren = groupColumn.children.filter(x => x.columnGroup);
978-
groupChildren.forEach(group => {
979-
this.resolveToggle(group);
980-
});
981-
fieldChildren.forEach(fieldChild => {
982-
fieldChild.hidden = true;
981+
protected resolveToggle(groupColumn: IgxColumnComponent, state: boolean) {
982+
groupColumn.hidden = state;
983+
this.columnGroupStates.set(groupColumn.field, state);
984+
const childrenTotal = this.hasMultipleValues ?
985+
groupColumn.children.filter(x => x.columnGroup && x.children.filter(y => !y.columnGroup).length === this.values.length) :
986+
groupColumn.children.filter(x => !x.columnGroup);
987+
const childrenSubgroups = this.hasMultipleValues ?
988+
groupColumn.children.filter(x => x.columnGroup && x.children.filter(y => !y.columnGroup).length === 0) :
989+
groupColumn.children.filter(x => x.columnGroup);
990+
childrenTotal.forEach(group => {
991+
if (state) {
992+
group.headerTemplate = this.headerTemplate;
993+
} else {
994+
group.headerTemplate = undefined;
995+
}
996+
});
997+
if (!groupColumn.hidden && childrenSubgroups.length > 0) {
998+
childrenSubgroups.forEach(group => {
999+
this.resolveToggle(group, state);
9831000
});
9841001
}
9851002
}
@@ -1125,31 +1142,46 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
11251142
if (value.expandable) {
11261143
ref.instance.headerTemplate = this.headerTemplate;
11271144
}
1128-
if (!this.hasMultipleValues) {
1129-
const refSibling = factoryColumn.create(this.viewRef.injector);
1130-
refSibling.instance.header = parent != null ? key.split(parent.header + '-')[1] : key;
1131-
refSibling.instance.field = key;
1132-
refSibling.instance.parent = parent;
1133-
ref.instance.width = value.dimension.width || MINIMUM_COLUMN_WIDTH + 'px';
1134-
ref.instance.sortable = true;
1135-
refSibling.instance.hidden = true;
1136-
refSibling.instance.dataType = this.pivotConfiguration.values[0]?.dataType || this.resolveDataTypes(data[0][key]);
1137-
refSibling.instance.formatter = this.pivotConfiguration.values[0]?.formatter;
1138-
columns.push(refSibling.instance);
1139-
}
11401145
const children = this.generateColumnHierarchy(value.children, data, ref.instance);
11411146
const filteredChildren = children.filter(x => x.level === ref.instance.level + 1);
11421147
ref.changeDetectorRef.detectChanges();
11431148
columns.push(ref.instance);
11441149
if (this.hasMultipleValues) {
1145-
const measureChildren = this.getMeasureChildren(factoryColumn, data, ref.instance, true, value.dimension.width);
1146-
const nestedChildren = filteredChildren.concat(measureChildren);
1147-
const allChildren = children.concat(measureChildren);
1150+
let measureChildren = this.getMeasureChildren(factoryColumn, data, ref.instance, true, value.dimension.width);
1151+
const nestedChildren = filteredChildren;
1152+
//const allChildren = children.concat(measureChildren);
11481153
ref.instance.children.reset(nestedChildren);
1149-
columns = columns.concat(allChildren);
1154+
columns = columns.concat(children);
1155+
if (value.dimension.childLevel) {
1156+
const refSibling = factoryColumnGroup.create(this.viewRef.injector);
1157+
refSibling.instance.header = parent != null ? key.split(parent.header + '-')[1] : key;
1158+
refSibling.instance.field = key;
1159+
refSibling.instance.parent = parent;
1160+
ref.instance.width = value.dimension.width || MINIMUM_COLUMN_WIDTH + 'px';
1161+
ref.instance.sortable = true;
1162+
refSibling.instance.dataType = this.pivotConfiguration.values[0]?.dataType || this.resolveDataTypes(data[0][key]);
1163+
refSibling.instance.formatter = this.pivotConfiguration.values[0]?.formatter;
1164+
columns.push(refSibling.instance);
1165+
1166+
measureChildren = this.getMeasureChildren(factoryColumn, data, refSibling.instance, false, value.dimension.width);
1167+
refSibling.instance.children.reset(measureChildren);
1168+
columns = columns.concat(measureChildren);
1169+
}
1170+
11501171
} else {
11511172
ref.instance.children.reset(filteredChildren);
11521173
columns = columns.concat(children);
1174+
if (value.dimension.childLevel) {
1175+
const refSibling = factoryColumn.create(this.viewRef.injector);
1176+
refSibling.instance.header = parent != null ? key.split(parent.header + '-')[1] : key;
1177+
refSibling.instance.field = key;
1178+
refSibling.instance.parent = parent;
1179+
ref.instance.width = value.dimension.width || MINIMUM_COLUMN_WIDTH + 'px';
1180+
ref.instance.sortable = true;
1181+
refSibling.instance.dataType = this.pivotConfiguration.values[0]?.dataType || this.resolveDataTypes(data[0][key]);
1182+
refSibling.instance.formatter = this.pivotConfiguration.values[0]?.formatter;
1183+
columns.push(refSibling.instance);
1184+
}
11531185
}
11541186
}
11551187
});

0 commit comments

Comments
 (0)