Add worker overview and leave management features with modals for enhanced usability

This commit is contained in:
Ross
2025-12-17 16:26:11 +00:00
parent 86201ec1d7
commit 105b37feae
6 changed files with 153 additions and 4 deletions
+2
View File
@@ -14,7 +14,9 @@ urlpatterns = [
path("rota/<int:rota_id>/edit/", views.rota_edit, name="rota_edit"),
path("worker/add/", views.worker_create, name="worker_add"),
path("worker/<int:rota_id>/<int:worker_id>/edit/", views.worker_edit, name="worker_edit"),
path("worker/<int:rota_id>/<int:worker_id>/overview/", views.worker_overview, name="worker_overview"),
path("worker/<int:rota_id>/<int:worker_id>/delete/", views.worker_delete, name="worker_delete"),
path("worker/<int:worker_id>/leave/add/", views.worker_leave_add, name="worker_leave_add"),
path("worker/<int:worker_id>/", views.worker_detail, name="worker_detail"),
path("worker/<int:worker_id>/leaves.json", views.leaves_json, name="worker_leaves_json"),
path("leave/request/", views.request_leave, name="request_leave"),
+53
View File
@@ -14,6 +14,7 @@ from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.shortcuts import HttpResponseRedirect
import traceback
def _get_constraint_description(key: str):
@@ -345,6 +346,58 @@ def worker_detail(request, worker_id):
return render(request, "rota/worker_detail.html", {"worker": worker, "form": form, "leaves": leaves, "leaves_json": leaves_json})
@require_http_methods(["GET", "POST"])
def worker_leave_add(request, worker_id):
"""HTMX endpoint: show a leave form modal for a worker, or create the leave on POST."""
worker = get_object_or_404(Worker, pk=worker_id)
is_hx = request.headers.get("HX-Request", "false").lower() == "true"
if request.method == "POST":
form = LeaveForm(request.POST)
if form.is_valid():
leave = form.save(commit=False)
leave.worker = worker
leave.save()
if is_hx:
# Close modal and optionally trigger an update; leave list can be refreshed separately
response = HttpResponse("")
response["HX-Trigger"] = "closeModal"
return response
return redirect("rota:worker_detail", worker_id=worker.id)
# invalid: return modal with errors
if is_hx:
modal_html = render_to_string("rota/partials/leave_form_modal.html", {"form": form, "worker": worker, "form_action": request.path}, request=request)
return HttpResponse(modal_html)
# non-HTMX fallthrough
# GET: render modal partial
form = LeaveForm()
if is_hx:
modal_html = render_to_string("rota/partials/leave_form_modal.html", {"form": form, "worker": worker, "form_action": request.path}, request=request)
return HttpResponse(modal_html)
return redirect("rota:worker_detail", worker_id=worker.id)
@require_http_methods(["GET"])
def worker_overview(request, rota_id, worker_id):
"""Return a read-only modal overview of the worker (HTMX GET)."""
rota = get_object_or_404(RotaSchedule, pk=rota_id)
worker = get_object_or_404(Worker, pk=worker_id)
try:
pretty_options = json.dumps(worker.options or {}, indent=2, default=str)
except Exception:
pretty_options = str(worker.options or {})
modal_html = render_to_string(
"rota/partials/worker_overview_modal.html",
{"worker": worker, "rota": rota, "pretty_options": pretty_options},
request=request,
)
return HttpResponse(modal_html)
@require_http_methods(["GET", "POST"])
def worker_edit(request, rota_id, worker_id):
rota = get_object_or_404(RotaSchedule, pk=rota_id)