Fix: Multiple UI and functionality improvements

Fixed all reported issues:

1. **Dark Mode Improvements:**
   - Fixed bulk-actions-info white on white text (now yellow on dark background)
   - Fixed timeline-content boxes with explicit dark mode colors
   - All text now properly visible in dark mode

2. **Dashboard Enhancement:**
   - Added "Assigned To" column showing ticket assignments
   - Updated TicketModel query to include assigned user information
   - Shows "Unassigned" when no user assigned

3. **Removed Ticket View Tracking:**
   - Removed logTicketView call from TicketController
   - Created migration 011 to delete all view records from audit_log
   - Viewing tickets no longer clutters activity timeline

4. **Removed Duplicate Status Dropdown:**
   - Removed status field from hamburger menu
   - Status can now only be changed via the workflow-validated dropdown in ticket header
   - Prevents confusion and ensures all status changes follow workflow rules

All changes improve usability and reduce clutter.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-01 19:28:07 -05:00
parent 2086730c9b
commit c95f1db871
7 changed files with 32 additions and 26 deletions

View File

@@ -727,11 +727,16 @@ th.sort-desc::after {
/* Dark mode bulk actions */
body.dark-mode .bulk-actions-toolbar {
--toolbar-bg: #3e3400;
--toolbar-bg: #1a1a00;
--toolbar-border: #ffc107;
--text-primary: #f8f9fa;
}
body.dark-mode .bulk-actions-info {
color: #ffc107;
font-weight: bold;
}
body.dark-mode .btn-bulk {
--btn-bulk-bg: #0d6efd;
--btn-bulk-hover: #0b5ed7;

View File

@@ -515,6 +515,20 @@ body.dark-mode .timeline-content {
--border-color: #444;
--text-muted: #a0aec0;
--text-secondary: #cbd5e0;
background: #2d3748;
color: #f7fafc;
}
body.dark-mode .timeline-header strong {
color: #f7fafc;
}
body.dark-mode .timeline-action {
color: #a0aec0;
}
body.dark-mode .timeline-date {
color: #718096;
}
/* Status select dropdown */
.status-select {

View File

@@ -403,22 +403,6 @@ function createHamburgerMenu() {
<div class="close-hamburger">☰</div>
<h3>Ticket Actions</h3>
<div class="ticket-info-editable">
<div class="editable-field" data-field="status">
<label><strong>Status:</strong></label>
<span class="editable-value" data-current="${window.ticketData.status}">${window.ticketData.status}</span>
<div class="edit-dropdown" style="display: none;">
<select class="field-select">
<option value="Open" ${window.ticketData.status === 'Open' ? 'selected' : ''}>Open</option>
<option value="In Progress" ${window.ticketData.status === 'In Progress' ? 'selected' : ''}>In Progress</option>
<option value="Closed" ${window.ticketData.status === 'Closed' ? 'selected' : ''}>Closed</option>
</select>
<div class="edit-actions">
<button class="save-btn">✓</button>
<button class="cancel-btn">✗</button>
</div>
</div>
</div>
<div class="editable-field" data-field="priority">
<label><strong>Priority:</strong></label>
<span class="editable-value" data-current="${window.ticketData.priority}">P${window.ticketData.priority}</span>

View File

@@ -59,11 +59,6 @@ class TicketController {
return;
}
// Log ticket view to audit log
if (isset($GLOBALS['auditLog']) && $userId) {
$GLOBALS['auditLog']->logTicketView($userId, $id);
}
// Get comments for this ticket using CommentModel
$comments = $this->commentModel->getCommentsByTicketId($id);

View File

@@ -0,0 +1,2 @@
-- Remove all ticket view tracking records from audit_log
DELETE FROM audit_log WHERE action_type = 'view';

View File

@@ -118,10 +118,13 @@ class TicketModel {
// Get tickets with pagination and creator info
$sql = "SELECT t.*,
u.username as creator_username,
u.display_name as creator_display_name
u_created.username as creator_username,
u_created.display_name as creator_display_name,
u_assigned.username as assigned_username,
u_assigned.display_name as assigned_display_name
FROM tickets t
LEFT JOIN users u ON t.created_by = u.user_id
LEFT JOIN users u_created ON t.created_by = u_created.user_id
LEFT JOIN users u_assigned ON t.assigned_to = u_assigned.user_id
$whereClause
ORDER BY $sortColumn $sortDirection
LIMIT ? OFFSET ?";

View File

@@ -205,6 +205,7 @@
'type' => 'Type',
'status' => 'Status',
'created_by' => 'Created By',
'assigned_to' => 'Assigned To',
'created_at' => 'Created',
'updated_at' => 'Updated'
];
@@ -225,6 +226,7 @@
if (count($tickets) > 0) {
foreach($tickets as $row) {
$creator = $row['creator_display_name'] ?? $row['creator_username'] ?? 'System';
$assignedTo = $row['assigned_display_name'] ?? $row['assigned_username'] ?? 'Unassigned';
echo "<tr class='priority-{$row['priority']}'>";
// Add checkbox column for admins
@@ -239,12 +241,13 @@
echo "<td>{$row['type']}</td>";
echo "<td><span class='status-" . str_replace(' ', '-', $row['status']) . "'>{$row['status']}</span></td>";
echo "<td>" . htmlspecialchars($creator) . "</td>";
echo "<td>" . htmlspecialchars($assignedTo) . "</td>";
echo "<td>" . date('Y-m-d H:i', strtotime($row['created_at'])) . "</td>";
echo "<td>" . date('Y-m-d H:i', strtotime($row['updated_at'])) . "</td>";
echo "</tr>";
}
} else {
$colspan = ($GLOBALS['currentUser']['is_admin'] ?? false) ? '10' : '9';
$colspan = ($GLOBALS['currentUser']['is_admin'] ?? false) ? '11' : '10';
echo "<tr><td colspan='$colspan'>No tickets found</td></tr>";
}
?>