Angular 7 brought the powerful DragDropModule
with it: https://material.angular.io/cdk/drag-drop/examples
The documentation deals with rearranging items within lists or transferring items between several lists. However, it doesn't talk about tables.
I was wondering whether there is a comfortable way of using angular material's drag-and-drop system for reordering rows in mat-table or cdk-table.
(You can add cdkDropList
to mat-table
which makes the mechanism work but without all the fancy animations and default drag placeholders.)
Does something like an easy-to-implement default for sorting table rows via drag-and-drop exist?
The styling is done by CSS (look at the CSS tab on the example page). I tweaked it to work with mat-table:
.cdk-drag-preview {
box-sizing: border-box;
border-radius: 4px;
box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
0 8px 10px 1px rgba(0, 0, 0, 0.14),
0 3px 14px 2px rgba(0, 0, 0, 0.12);
}
.cdk-drag-placeholder {
opacity: 0;
}
.cdk-drag-animating {
transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
}
.cdk-drop-list-dragging .mat-row:not(.cdk-drag-placeholder) {
transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
}
I placed this in my main styles.scss file.
For anyone wondering how to implement drag and drop on a mat-table, you need to:
cdkDropList
to mat-table
(cdkDropListDropped)="onListDrop($event)"
to mat-table
cdkDrag
to mat-row
onListDrop
will look something like:
onListDrop(event: CdkDragDrop<string[]>) {
// Swap the elements around
moveItemInArray(this.myArray, event.previousIndex, event.currentIndex);
}
moveItemInArray
is an Angular Material function. You can import it.