'Angular 2 - expand collapse table row
There is a requirement to show an in-place row details when I click on an inspector icon of the table which would expand or collapse just like a toggle on click of a button at each row
.
In the expanded view, I need to query backend and fetch some details and show information including image thumbnails.
There are a couple of angular 2 tables like ngx-datatable, ngprime etc. Currently, for some reason, we cannot use any of those plugins to achieve this functionality.
Attached an image which has an inline expansion of a row to show the row details.
How do we achieve this functionality in Angular without using any plugins. Could any of you please help?
Solution 1:[1]
<table class="table">
<thead>
<tr>
<th style="width:200px;">Name</th>
<th>Created On</th>
<th>Last Modified</th>
</tr>
</thead>
<tbody>
<ng-container *ngFor="let item of menuList">
<tr>
<td style="width:10px" attr.data-target=".row{{item._id}}" data-toggle="collapse"
data-role="expander">
<span *ngIf="item.SubMenu?.length && item.SubMenu[0].MenuName!==undefined"
class="fa fa-plus" (click)="toggleChildren($event)">
</span> {{ item.MenuName }}
</td>
<td>{{ item.CreatedBy }}</td>
<td>{{ item.CreatedDate }}</td>
</tr>
<ng-template [ngIf]="item.SubMenu.length>0">
<ng-container *ngFor="let subitem of item.SubMenu">
<tr class="collapse row{{subitem.ParentId}}" aria-expanded="true">
<td style="width:10px" attr.data-target=".row{{subitem._id}}"
data-toggle="collapse"
data-role="expander">
<span *ngIf="subitem.SubMenu?.length && subitem.SubMenu[0].MenuName!==undefined"
class="fa fa-plus" (click)="toggleChildren($event)">
</span> {{ subitem.MenuName }}
</td>
<td>{{ subitem.CreatedBy }}</td>
<td>{{ subitem.CreatedDate }}</td>
</tr>
<ng-template [ngIf]="subitem.SubMenu.length>0">
<ng-container *ngFor="let sub of subitem.SubMenu">
<tr class="collapse row{{sub.ParentId}}" aria-expanded="true">
<td> {{ sub.MenuName }}</td>
<td>{{ sub.CreatedBy }}</td>
<td>{{ sub.CreatedDate }}</td>
</tr>
</ng-container>
</ng-template>
</ng-container>
</ng-template>
</ng-container>
</tbody>
</table>
Solution 2:[2]
I am using the normal table row in angular.
I have given example in StackBlitz and Result
In the TS file, we have created a variable to store table data.
data = [
{
id: 1,
name: 'Abc',
email: '[email protected]',
isExpand: false,
address: [
{
add1: 'Delhi',
add2: 'Bangalore',
}
]
},
{
id: 2,
name: 'Xyz',
email: '[email protected]',
isExpand: false,
address: [
{
add1: 'Mumbai',
add2: 'Pune',
}
]
},
{
id: 3,
name: 'ijk',
email: '[email protected]',
isExpand: false,
address: [
{
add1: 'Chennai',
add2: 'Bangalore',
}
]
},
{
id: 4,
name: 'def',
email: '[email protected]',
isExpand: false,
address: [
{
add1: 'Kolkata',
add2: 'Hyderabad',
}
]
}
]
In the HTML file, we have a table.
<table>
<thead>
<tr>
<th></th>
<th>SL</th>
<th>Name</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<ng-container *ngFor="let row of data">
<tr>
<td (click)="row.isExpand = !row.isExpand">
<span *ngIf="!row.isExpand">+</span>
<span *ngIf="row.isExpand">-</span>
</td>
<td>{{ row.id }}</td>
<td>{{ row.name }}</td>
<td>{{ row.email }}</td>
</tr>
<tr *ngIf="row.isExpand">
<td colspan="4">
<table>
<thead>
<th>Address1</th>
<th>Address2</th>
</thead>
<tbody>
<tr *ngFor="let row2 of row.address">
<td>{{ row2.add1 }}</td>
<td>{{ row2.add2 }}</td>
</tr>
</tbody>
</table>
</td>
</tr>
</ng-container>
</tbody>
</table>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Muniaswari D |
| Solution 2 | Nashir |
