Angular Material includes a built-in drag-and-drop feature that simplifies the development process. With the introduction of DragDropModule in Angular versions 7 thru 16, developers can easily implement drag-and-drop functionality in Angular applications.
In this article we will provide you information about Angular Drag and Drop Table Rows Example with Demo. Hear I will give you detail about Reorder table rows using drag drop.
As you can see in the above video that user is able to drag drop table rows using the angular mat-table. Angular 7-15 drag and drop table rows is a good feature of a user interface now a days.
Using the angular material table reorder columns can be achieved by module @angular/cdk/drag-drop and @angular/material/table
Create tabledragdrop component
create new component using the command
ng g component tabledragdrop –skipTest
This will create three files
tabledragdrop.component.ts, tabledragdrop.component.html, tabledragdrop.component.css
1 – tabledragdrop.component.ts check the code inside
import { Component, ViewChild } from '@angular/core';
import {CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';
import {MatTable} from '@angular/material/table';
export interface IHeaders {
id: string | number;
name: string;
age: number | string;
gender: string;
country: string;
}
@Component({
selector: 'app-tabledragdrop',
templateUrl: './tabledragdrop.component.html',
styleUrls: ['./tabledragdrop.component.css']
})
export class TabledragdropComponent {
@ViewChild('table') table: MatTable<IHeaders>;
displayedColumns: string[] = ['id', 'name', 'age', 'gender', 'country'];
dataSource:IHeaders[] = [
{
id: '1',
name: 'John',
age: '21',
gender: 'Male',
country: 'UK'
},
{
id: '2',
name: 'Robin',
age: '25',
gender: 'Male',
country: 'London'
},
{
id: '3',
name: 'Robert',
age: '12',
gender: 'Male',
country: 'Dubai'
},
{
id: '4',
name: 'Neeraj',
age: '23',
gender: 'Male',
country: 'India'
},
{
id: '5',
name: 'Wiliiams',
age: '30',
gender: 'Male',
country: 'Ausralia'
},
{
id: '6',
name: 'ChinZee',
age: '25',
gender: 'Female',
country: 'China'
}
];
dropTable(event: CdkDragDrop<IHeaders[]>) {
const prevIndex = this.dataSource.findIndex((d) => d === event.item.data);
moveItemInArray(this.dataSource, prevIndex, event.currentIndex);
this.table.renderRows();
}
}
2 – tabledragdrop.component.html add html code as below
<table mat-table #table [dataSource]="dataSource" class="mat-elevation-z8"
cdkDropList
[cdkDropListData]="dataSource"
(cdkDropListDropped)="dropTable($event)">
<!-- Position Column -->
<ng-container matColumnDef="id">
<th mat-header-cell *matHeaderCellDef> No. </th>
<td mat-cell *matCellDef="let element">
<mat-icon cdkDragHandle>reorder</mat-icon>
</td>
</ng-container>
<!-- Name Column -->
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef> Name </th>
<td mat-cell *matCellDef="let element"> {{element.name}} </td>
</ng-container>
<!-- Weight Column -->
<ng-container matColumnDef="age">
<th mat-header-cell *matHeaderCellDef> Age </th>
<td mat-cell *matCellDef="let element"> {{element.age}} </td>
</ng-container>
<!-- Symbol Column -->
<ng-container matColumnDef="gender">
<th mat-header-cell *matHeaderCellDef> Gender </th>
<td mat-cell *matCellDef="let element"> {{element.gender}} </td>
</ng-container>
<ng-container matColumnDef="country">
<th mat-header-cell *matHeaderCellDef> Country </th>
<td mat-cell *matCellDef="let element"> {{element.country}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;" cdkDrag [cdkDragData]="row"></tr>
</table>
3 – tabledragdrop.component.css
p {
font-family: Lato;
}
Install and run the project
npm install
npm start
Once everything is OK with no error, then after npm start open the url http://localhost:4200 in browser. you should see the table with angular 9 drag and drop table rows feature.
The working example code I have added on my github https://github.com/infotechseo/drap-drop-rows-of-table
Read also Containerizing Node.js applications with docker, Dockerize node web app