Task Reordering
#1. To Make TodoList Sortable by Using sortable.js NPM package.
To achieve TodoList Sortable perform the below instruction
Include the npm package(via cdn) in task_list.html
<script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>
Include a script to perform the Sortable TodoList
<script> var taskList = document.getElementById("tasklist"); let sortable = Sortable.create(taskList, { handle: '.handle', ghostClass: 'dropArea', chosenClass: 'selectedTask', }); </script>
#2 To make sortable TodoList permanent.
Setting unique key for each task using HTML attribute called
data-position="{{task.pk}}"
Define a hidden form to get the unique keys as input to perform task list to reordering in permanent.
<!-- Hidden form. To collect the unique keys of the tasks list --> <form style="display: none;" id="reorderForm" method="post" action="{% url 'task-reorder' %}"> {% csrf_token %} <input type="hidden" id="positionInput" name="position"> </form>
To write a script to collect the actual unique keys of the tasks list:
var reorderForm = document.getElementById("reorderForm"); var positionInput = document.getElementById("positionInput"); function reordering() { const rows = document.getElementsByClassName("task-wrapper"); let pos = []; for (let row of rows) { pos.push(row.dataset.position); } console.log(pos.join(",")) positionInput.value = pos.join(','); reorderForm.submit(); } let result = document.getElementsByClassName("task-wrapper"); document.ondrop = reordering
For every drag and drop of task list, above function is invoked.
From the function, after collecting unique keys from the current todolist and store it in pos
list variable.
Getting collected unique keys using
input tag
<!-- Hidden form. To get collected unique keys --> <form style="display: none;" id="reorderForm" method="post" action="{% url 'task-reorder' %}"> {% csrf_token %} <input type="hidden" id="positionInput" name="position"> </form>
We cannot process the above form data in django so we have to create forms.py file
todo/forms.py
from django import forms # Reordering Form and View class PositionForm(forms.Form): position = forms.CharField()
Now write a django view to process the reordering operation
from django.shortcuts import redirect from django.db import transaction from .forms import PositionForm
class TaskReorder(View): def post(self, request): form = PositionForm(request.POST) if form.is_valid(): positionList = form.cleaned_data["position"].split(',') with transaction.atomic(): self.request.user.set_task_order(positionList) return redirect(reverse_lazy('tasks'))
Mapping the task-reordering url
path('task-reorder/', TaskReorder.as_view(), name='task-reorder'),
Last updated