From 1617dc5442afde54806e690e8d2ee17ce72ce04a Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Tue, 8 Sep 2026 10:41:24 -0400 Subject: [PATCH 01/29] Fix 'Clear All Filters' to clear the real date-range params (#75) clearAllFilters() deleted the nonexistent date_from/date_to query params. Every actual date filter (sidebar, Advanced Search, saved filters, stat-card links) uses created_from/to, updated_from/to, and closed_from/to, so clicking the button silently left any active date range in place. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01MGDKHiU5RJdo3dqQUDow3X --- assets/js/dashboard.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/assets/js/dashboard.js b/assets/js/dashboard.js index 6d38c2c..65a13e9 100644 --- a/assets/js/dashboard.js +++ b/assets/js/dashboard.js @@ -297,8 +297,12 @@ function clearAllFilters() { params.delete('type'); params.delete('assigned_to'); params.delete('search'); - params.delete('date_from'); - params.delete('date_to'); + params.delete('created_from'); + params.delete('created_to'); + params.delete('updated_from'); + params.delete('updated_to'); + params.delete('closed_from'); + params.delete('closed_to'); params.delete('page'); // Keep sort parameters From 6183bcd4219714a3436b5fe5ea4f74e95ac95ed8 Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Tue, 8 Sep 2026 10:41:29 -0400 Subject: [PATCH 02/29] Notification titles: handle non-status ticket edits (#84) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 'update' notification formatter unconditionally read details['status']['from']/['to'], so any title/priority/description/ category/type/visibility-only edit fell through to '?' on both sides and produced a broken "changed status on #123: ? → ?" title regardless of what actually changed. Now it branches on the delta shape actually present: the flat {field, from, to} shape used for visibility changes, then each per-field {from, to} delta in priority order, falling back to a generic "updated ticket" message only if none match. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01MGDKHiU5RJdo3dqQUDow3X --- api/notifications.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/api/notifications.php b/api/notifications.php index c3d6449..e5c0586 100644 --- a/api/notifications.php +++ b/api/notifications.php @@ -225,10 +225,21 @@ foreach ($all as $row) { 'comment' => "{$row['actor_name']} commented on ticket #{$ticketId}", 'mention' => "{$row['actor_name']} mentioned you on ticket #{$ticketId}", 'update' => (function () use ($row, $details, $ticketId) { - // logTicketUpdate stores delta as {"status": {"from": "Open", "to": "In Progress"}} - $from = $details['status']['from'] ?? ($details['old_value'] ?? '?'); - $to = $details['status']['to'] ?? ($details['new_value'] ?? '?'); - return "{$row['actor_name']} changed status on #{$ticketId}: {$from} → {$to}"; + // Visibility changes log a flat {field, from, to} shape (api/update_ticket.php). + if (isset($details['field'], $details['from'], $details['to'])) { + return "{$row['actor_name']} changed {$details['field']} on #{$ticketId}: {$details['from']} → {$details['to']}"; + } + + // Single/bulk field updates log a per-field delta, e.g. + // {"status": {"from": "Open", "to": "In Progress"}}. Only one field + // changed at a time is reported, in priority order below. + foreach (['status', 'priority', 'title', 'category', 'type', 'description'] as $field) { + if (isset($details[$field]['from'], $details[$field]['to'])) { + return "{$row['actor_name']} changed {$field} on #{$ticketId}: {$details[$field]['from']} → {$details[$field]['to']}"; + } + } + + return "{$row['actor_name']} updated ticket #{$ticketId}"; })(), default => "{$row['actor_name']} updated ticket #{$ticketId}", }; From 1ab4d01a3a57c454cddff6925a8cff3d3024b30d Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Tue, 8 Sep 2026 10:41:47 -0400 Subject: [PATCH 03/29] Fix broken Quick Assign dropdown (#102) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit quickAssign() wired lt.combobox.init() with an onSelect callback, but combobox only supports the multi-select onChange(selected[]) contract — onSelect is never invoked, so _quickAssignUserId stayed undefined no matter what the user picked and Quick Assign always showed "Please select a user from the list." Switched to lt.typeahead.init(), which does support onSelect, matching the already-working Bulk Assign modal. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01MGDKHiU5RJdo3dqQUDow3X --- assets/js/dashboard.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/assets/js/dashboard.js b/assets/js/dashboard.js index 65a13e9..a354ec0 100644 --- a/assets/js/dashboard.js +++ b/assets/js/dashboard.js @@ -1139,12 +1139,11 @@ function quickAssign(ticketId) {

Ticket #${lt.escHtml(String(ticketId))}

-
-
- -
- +
+ +