Last week I shared steps to make a drag & drop application in Angular in just a few minutes. This is great for sorting items within a single list, but drag & drop is more exciting when used for interaction between elements. Today we’ll look at what it takes to extend last week’s project to include two lists that we can drag & drop between.
Code from the previous article is available here.
The first thing we’ll do is modify the todo-list
component to have two lists. Modify todo-list-component.html
to have a second cdkDropList
element as shown in the code below. We also need to indicate that these lists are connected.
<h2>TODO</h2>
<div
cdkDropList
#todoList="cdkDropList"
[cdkDropListData]="tasks"
[cdkDropListConnectedTo]="[doneList]"
class="example-list"
(cdkDropListDropped)="drop($event)">
<div class="example-box" *ngFor="let task of tasks" cdkDrag>{{task}}</div>
</div>
<h2>COMPLETED</h2>
<div
cdkDropList
#doneList="cdkDropList"
[cdkDropListData]="completedTasks"
[cdkDropListConnectedTo]="[todoList]"
class="example-list"
(cdkDropListDropped)="drop($event)">
<div class="example-box" *ngFor="let task of completedTasks" cdkDrag>{{task}}</div>
</div>
Now we need to make a pair of changes to todo-list.component.ts
. First, we need to add the completedTasks
collection referenced by our second list. We also need to modify the drop
event handler to determine whether we’re rearranging a list or moving an item between lists.
import { Component, OnInit } from '@angular/core';
import {CdkDragDrop, moveItemInArray, transferArrayItem} from '@angular/cdk/drag-drop';
@Component({
selector: 'app-todo-list',
templateUrl: './todo-list.component.html',
styleUrls: ['./todo-list.component.css']
})
export class TodoListComponent implements OnInit {
tasks = [
'Cleaning',
'Gardening',
'Shopping'
];
completedTasks = [];
constructor() { }
ngOnInit(): void {
}
drop(event: CdkDragDrop<string[]>) {
if (event.previousContainer === event.container) {
moveItemInArray(
event.container.data,
event.previousIndex,
event.currentIndex);
} else {
transferArrayItem(
event.previousContainer.data,
event.container.data,
event.previousIndex,
event.currentIndex);
}
}
}
That’s it–we’re done! Let’s run the application and see what happens.
$ ng serve --open

We can now rearrange items in the individual lists, as we could before, and move items between the two lists. Final code for this article is available on GitHub, here.
Feature image by Alexandra_Koch from Pixabay
One thought on “Angular Drag & Drop Between Lists”