Skip to content

Commit 675e9cb

Browse files
committed
feat(IgxColumnGroup): add properties that allow expand/collapse colGroup #3343
1 parent 41c3a0f commit 675e9cb

File tree

2 files changed

+91
-19
lines changed

2 files changed

+91
-19
lines changed

projects/igniteui-angular/src/lib/grids/columns/column-group.component.ts

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,22 @@ import { flatten } from '../../core/utils';
2323
template: ``
2424
})
2525
export class IgxColumnGroupComponent extends IgxColumnComponent implements AfterContentInit {
26-
private _collapsible = false;
27-
private _expanded = true;
2826

2927
@ContentChildren(IgxColumnComponent, { read: IgxColumnComponent })
3028
children = new QueryList<IgxColumnComponent>();
3129

30+
/**
31+
* Set if the column group is collapsible.
32+
* Default value is `false`
33+
* ```html
34+
* <igx-column-group [collapsible] = "true"></igx-column-group>
35+
* ```
36+
* @memberof IgxColumnGroupComponent
37+
*/
3238
@Input()
3339
public set collapsible(value: boolean) {
3440
this._collapsible = value;
41+
this.collapsibleChange.emit(this._collapsible);
3542
if (this.children) {
3643
if (value) {
3744
this.setExpandCollapseState();
@@ -44,17 +51,28 @@ export class IgxColumnGroupComponent extends IgxColumnComponent implements After
4451
return this._collapsible;
4552
}
4653

54+
/**
55+
* Set whether the group is expanded or collapsed initially.
56+
* Applied only if the collapsible property is set to `true`
57+
* Default value is `true`
58+
* ```html
59+
* const state = false
60+
* <igx-column-group [(expand)] = "state"></igx-column-group>
61+
* ```
62+
* @memberof IgxColumnGroupComponent
63+
*/
4764
@Input()
48-
public get expanded() {
49-
return this._expanded;
50-
}
51-
public set expanded(value: boolean) {
52-
this._expanded = value;
65+
public set expand(value: boolean) {
5366
if (!this.collapsible) { return; }
67+
this._expand = value;
68+
this.expandChange.emit(this._expand);
5469
if (!this.hidden && this.children) {
5570
this.setExpandCollapseState();
5671
}
5772
}
73+
public get expand() {
74+
return this._expand;
75+
}
5876

5977
/**
6078
* Gets the column group `summaries`.
@@ -123,6 +141,18 @@ export class IgxColumnGroupComponent extends IgxColumnComponent implements After
123141
*/
124142
set bodyTemplate(template: TemplateRef<any>) { }
125143

144+
/**
145+
* Allows you to define a custom template for expand/collapse indicator
146+
* @memberof IgxColumnGroupComponent
147+
*/
148+
@Input()
149+
get collapsibleIndicatorTemplate(): TemplateRef<any> {
150+
return this._collapseIndicatorTemplate;
151+
}
152+
set collapsibleIndicatorTemplate(template: TemplateRef<any>) {
153+
this._collapseIndicatorTemplate = template;
154+
}
155+
126156
/**
127157
* Returns a reference to the inline editor template.
128158
* ```typescript
@@ -177,8 +207,8 @@ export class IgxColumnGroupComponent extends IgxColumnComponent implements After
177207
this.children.forEach(child => child.hidden = value);
178208
} else {
179209
this.children.forEach(c => {
180-
if (c.openOnGroupCollapsed === undefined) {c.hidden = false; return; }
181-
c.hidden = this.expanded ? c.openOnGroupCollapsed : !c.openOnGroupCollapsed;
210+
if (c.visibleOnCollapse === undefined) {c.hidden = false; return; }
211+
c.hidden = this.expand ? c.visibleOnCollapse : !c.visibleOnCollapse;
182212
});
183213
}
184214
}
@@ -200,6 +230,9 @@ export class IgxColumnGroupComponent extends IgxColumnComponent implements After
200230
if (this.headTemplate && this.headTemplate.length) {
201231
this._headerTemplate = this.headTemplate.toArray()[0].template;
202232
}
233+
if (this.collapseIndicatorTemplate) {
234+
this._collapseIndicatorTemplate = this.collapseIndicatorTemplate.template;
235+
}
203236
// currently only ivy fixes the issue, we have to slice only if the first child is group
204237
if (this.children.first === this) {
205238
this.children.reset(this.children.toArray().slice(1));
@@ -208,7 +241,7 @@ export class IgxColumnGroupComponent extends IgxColumnComponent implements After
208241
child.parent = this;
209242
});
210243
if (this.collapsible) {
211-
const cols = this.children.map(child => child.openOnGroupCollapsed);
244+
const cols = this.children.map(child => child.visibleOnCollapse);
212245
if (!(cols.some(c => c === true) && cols.some(c => c === false))) {
213246
this.collapsible = false;
214247
return;
@@ -271,8 +304,8 @@ export class IgxColumnGroupComponent extends IgxColumnComponent implements After
271304
set width(val) { }
272305

273306
private setExpandCollapseState() {
274-
this.children.filter(col => (col.openOnGroupCollapsed !== undefined)).forEach(c => {
275-
c.hidden = this._expanded ? c.openOnGroupCollapsed : !c.openOnGroupCollapsed;
307+
this.children.filter(col => (col.visibleOnCollapse !== undefined)).forEach(c => {
308+
c.hidden = this._expand ? c.visibleOnCollapse : !c.visibleOnCollapse;
276309
});
277310
}
278311

projects/igniteui-angular/src/lib/grids/columns/column.component.ts

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import {
3838
IgxCellTemplateDirective,
3939
IgxCellHeaderTemplateDirective,
4040
IgxCellEditorTemplateDirective,
41+
IgxCollapsibleIndicatorTemplateDirective,
4142
IgxFilterCellTemplateDirective
4243
} from './templates.directive';
4344
import { MRLResizeColumnInfo, MRLColumnSizeInfo } from './interfaces';
@@ -249,6 +250,15 @@ export class IgxColumnComponent implements AfterContentInit {
249250
*/
250251
@Output()
251252
public hiddenChange = new EventEmitter<boolean>();
253+
254+
/** @hidden */
255+
@Output()
256+
public expandChange = new EventEmitter<boolean>();
257+
258+
/** @hidden */
259+
@Output()
260+
public collapsibleChange = new EventEmitter<boolean>();
261+
252262
/**
253263
* Gets whether the hiding is disabled.
254264
* ```typescript
@@ -827,6 +837,10 @@ export class IgxColumnComponent implements AfterContentInit {
827837
set filterCellTemplate(template: TemplateRef<any>) {
828838
this._filterCellTemplate = template;
829839
}
840+
841+
/** @hidden */
842+
@Input('collapsibleIndicatorTemplate')
843+
public collapsibleIndicatorTemplate: TemplateRef<any>;
830844
/**
831845
* Gets the cells of the column.
832846
* ```typescript
@@ -995,14 +1009,23 @@ export class IgxColumnComponent implements AfterContentInit {
9951009
*/
9961010
@Input() colStart: number;
9971011

1012+
/**
1013+
* Indicates whether the column will be visible when its parent is collapsed.
1014+
* ```html
1015+
* <igx-column-group>
1016+
* <igx-column [visibleOnCollapse]="true"></igx-column>
1017+
* </igx-column-group>
1018+
* ```
1019+
* @memberof IgxColumnComponent
1020+
*/
9981021
@Input()
999-
set openOnGroupCollapsed(value: boolean) {
1000-
this._openOnGroupCollapsed = value;
1022+
set visibleOnCollapse(value: boolean) {
1023+
this._visibleOnCollapse = value;
10011024
}
10021025

1003-
get openOnGroupCollapsed(): boolean {
1026+
get visibleOnCollapse(): boolean {
10041027
if (!this.parent) { return false; }
1005-
return this._openOnGroupCollapsed;
1028+
return this._visibleOnCollapse;
10061029
}
10071030

10081031
/**
@@ -1015,7 +1038,7 @@ export class IgxColumnComponent implements AfterContentInit {
10151038
* @hidden
10161039
* @internal
10171040
*/
1018-
public expanded = true;
1041+
public expand = true;
10191042

10201043
/**
10211044
* hidden
@@ -1084,6 +1107,10 @@ export class IgxColumnComponent implements AfterContentInit {
10841107
*@hidden
10851108
*/
10861109
protected _filterCellTemplate: TemplateRef<any>;
1110+
/**
1111+
*@hidden
1112+
*/
1113+
protected _collapseIndicatorTemplate: TemplateRef<any>;
10871114
/**
10881115
*@hidden
10891116
*/
@@ -1128,11 +1155,18 @@ export class IgxColumnComponent implements AfterContentInit {
11281155
* @hidden
11291156
*/
11301157
protected _editable: boolean;
1158+
/**
1159+
* @hidden
1160+
*/
1161+
protected _visibleOnCollapse;
11311162
/**
11321163
* @hidden
11331164
*/
1134-
protected _openOnGroupCollapsed;
1135-
1165+
protected _collapsible = false;
1166+
/**
1167+
* @hidden
1168+
*/
1169+
protected _expand = true;
11361170
/**
11371171
* @hidden
11381172
*/
@@ -1161,6 +1195,11 @@ export class IgxColumnComponent implements AfterContentInit {
11611195
*/
11621196
@ContentChild(IgxFilterCellTemplateDirective, { read: IgxFilterCellTemplateDirective, static: false })
11631197
public filterCellTemplateDirective: IgxFilterCellTemplateDirective;
1198+
/**
1199+
*@hidden
1200+
*/
1201+
@ContentChild(IgxCollapsibleIndicatorTemplateDirective, { read: IgxCollapsibleIndicatorTemplateDirective, static: false })
1202+
protected collapseIndicatorTemplate: IgxCollapsibleIndicatorTemplateDirective;
11641203

11651204
constructor(public gridAPI: GridBaseAPIService<IgxGridBaseDirective & GridType>, public cdr: ChangeDetectorRef) { }
11661205

0 commit comments

Comments
 (0)