From 67a7d769f022f2a27afb6a723241ea3152823e7c Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Sat, 4 Apr 2026 22:35:04 -0400 Subject: [PATCH] fix: unassigned filter not working + null guards on modal selects - DashboardController: handle assigned_to='unassigned' before validateUserId() which discarded the string, causing the filter to never reach TicketModel; model already correctly converts 'unassigned' to IS NULL in SQL - dashboard.js: add null guards before .value access on dynamically-created modal selects (bulkPriority, bulkStatus, quickStatusSelect) Co-Authored-By: Claude Sonnet 4.6 --- assets/js/dashboard.js | 12 +++++++++--- controllers/DashboardController.php | 12 +++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/assets/js/dashboard.js b/assets/js/dashboard.js index f7dcfff..465d78d 100644 --- a/assets/js/dashboard.js +++ b/assets/js/dashboard.js @@ -686,7 +686,9 @@ function closeBulkPriorityModal() { } function performBulkPriority() { - const priority = document.getElementById('bulkPriority').value; + const priorityEl = document.getElementById('bulkPriority'); + if (!priorityEl) return; + const priority = priorityEl.value; const ticketIds = getSelectedTicketIds(); if (!priority) { @@ -789,7 +791,9 @@ function closeBulkStatusModal() { } function performBulkStatusChange() { - const status = document.getElementById('bulkStatus').value; + const bulkStatusEl = document.getElementById('bulkStatus'); + if (!bulkStatusEl) return; + const status = bulkStatusEl.value; const ticketIds = getSelectedTicketIds(); if (!status) { @@ -986,7 +990,9 @@ function closeQuickStatusModal() { } function performQuickStatusChange(ticketId) { - const newStatus = document.getElementById('quickStatusSelect').value; + const quickStatusEl = document.getElementById('quickStatusSelect'); + if (!quickStatusEl) return; + const newStatus = quickStatusEl.value; lt.api.post('/api/update_ticket.php', { ticket_id: ticketId, status: newStatus }) .then(data => { diff --git a/controllers/DashboardController.php b/controllers/DashboardController.php index a767c90..45f738e 100644 --- a/controllers/DashboardController.php +++ b/controllers/DashboardController.php @@ -136,10 +136,16 @@ class DashboardController { // Validate user ID filters $createdBy = $this->validateUserId($_GET['created_by'] ?? null); - $assignedTo = $this->validateUserId($_GET['assigned_to'] ?? null); - if ($createdBy !== null) $filters['created_by'] = $createdBy; - if ($assignedTo !== null) $filters['assigned_to'] = $assignedTo; + + // assigned_to accepts a numeric user ID or the special string 'unassigned' + $assignedToRaw = $_GET['assigned_to'] ?? null; + if ($assignedToRaw === 'unassigned') { + $filters['assigned_to'] = 'unassigned'; + } else { + $assignedTo = $this->validateUserId($assignedToRaw); + if ($assignedTo !== null) $filters['assigned_to'] = $assignedTo; + } // Get tickets with pagination, sorting, search, and advanced filters $result = $this->ticketModel->getAllTickets($page, $limit, $status, $sortColumn, $sortDirection, $category, $type, $search, $filters, $GLOBALS['currentUser'] ?? []);