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:
@@ -727,11 +727,16 @@ th.sort-desc::after {
|
|||||||
|
|
||||||
/* Dark mode bulk actions */
|
/* Dark mode bulk actions */
|
||||||
body.dark-mode .bulk-actions-toolbar {
|
body.dark-mode .bulk-actions-toolbar {
|
||||||
--toolbar-bg: #3e3400;
|
--toolbar-bg: #1a1a00;
|
||||||
--toolbar-border: #ffc107;
|
--toolbar-border: #ffc107;
|
||||||
--text-primary: #f8f9fa;
|
--text-primary: #f8f9fa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.dark-mode .bulk-actions-info {
|
||||||
|
color: #ffc107;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
body.dark-mode .btn-bulk {
|
body.dark-mode .btn-bulk {
|
||||||
--btn-bulk-bg: #0d6efd;
|
--btn-bulk-bg: #0d6efd;
|
||||||
--btn-bulk-hover: #0b5ed7;
|
--btn-bulk-hover: #0b5ed7;
|
||||||
|
|||||||
@@ -515,6 +515,20 @@ body.dark-mode .timeline-content {
|
|||||||
--border-color: #444;
|
--border-color: #444;
|
||||||
--text-muted: #a0aec0;
|
--text-muted: #a0aec0;
|
||||||
--text-secondary: #cbd5e0;
|
--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 dropdown */
|
||||||
.status-select {
|
.status-select {
|
||||||
|
|||||||
@@ -403,22 +403,6 @@ function createHamburgerMenu() {
|
|||||||
<div class="close-hamburger">☰</div>
|
<div class="close-hamburger">☰</div>
|
||||||
<h3>Ticket Actions</h3>
|
<h3>Ticket Actions</h3>
|
||||||
<div class="ticket-info-editable">
|
<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">
|
<div class="editable-field" data-field="priority">
|
||||||
<label><strong>Priority:</strong></label>
|
<label><strong>Priority:</strong></label>
|
||||||
<span class="editable-value" data-current="${window.ticketData.priority}">P${window.ticketData.priority}</span>
|
<span class="editable-value" data-current="${window.ticketData.priority}">P${window.ticketData.priority}</span>
|
||||||
|
|||||||
@@ -59,11 +59,6 @@ class TicketController {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log ticket view to audit log
|
|
||||||
if (isset($GLOBALS['auditLog']) && $userId) {
|
|
||||||
$GLOBALS['auditLog']->logTicketView($userId, $id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get comments for this ticket using CommentModel
|
// Get comments for this ticket using CommentModel
|
||||||
$comments = $this->commentModel->getCommentsByTicketId($id);
|
$comments = $this->commentModel->getCommentsByTicketId($id);
|
||||||
|
|
||||||
|
|||||||
2
migrations/011_remove_view_tracking.sql
Normal file
2
migrations/011_remove_view_tracking.sql
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
-- Remove all ticket view tracking records from audit_log
|
||||||
|
DELETE FROM audit_log WHERE action_type = 'view';
|
||||||
@@ -118,10 +118,13 @@ class TicketModel {
|
|||||||
|
|
||||||
// Get tickets with pagination and creator info
|
// Get tickets with pagination and creator info
|
||||||
$sql = "SELECT t.*,
|
$sql = "SELECT t.*,
|
||||||
u.username as creator_username,
|
u_created.username as creator_username,
|
||||||
u.display_name as creator_display_name
|
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
|
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
|
$whereClause
|
||||||
ORDER BY $sortColumn $sortDirection
|
ORDER BY $sortColumn $sortDirection
|
||||||
LIMIT ? OFFSET ?";
|
LIMIT ? OFFSET ?";
|
||||||
|
|||||||
@@ -205,6 +205,7 @@
|
|||||||
'type' => 'Type',
|
'type' => 'Type',
|
||||||
'status' => 'Status',
|
'status' => 'Status',
|
||||||
'created_by' => 'Created By',
|
'created_by' => 'Created By',
|
||||||
|
'assigned_to' => 'Assigned To',
|
||||||
'created_at' => 'Created',
|
'created_at' => 'Created',
|
||||||
'updated_at' => 'Updated'
|
'updated_at' => 'Updated'
|
||||||
];
|
];
|
||||||
@@ -225,6 +226,7 @@
|
|||||||
if (count($tickets) > 0) {
|
if (count($tickets) > 0) {
|
||||||
foreach($tickets as $row) {
|
foreach($tickets as $row) {
|
||||||
$creator = $row['creator_display_name'] ?? $row['creator_username'] ?? 'System';
|
$creator = $row['creator_display_name'] ?? $row['creator_username'] ?? 'System';
|
||||||
|
$assignedTo = $row['assigned_display_name'] ?? $row['assigned_username'] ?? 'Unassigned';
|
||||||
echo "<tr class='priority-{$row['priority']}'>";
|
echo "<tr class='priority-{$row['priority']}'>";
|
||||||
|
|
||||||
// Add checkbox column for admins
|
// Add checkbox column for admins
|
||||||
@@ -239,12 +241,13 @@
|
|||||||
echo "<td>{$row['type']}</td>";
|
echo "<td>{$row['type']}</td>";
|
||||||
echo "<td><span class='status-" . str_replace(' ', '-', $row['status']) . "'>{$row['status']}</span></td>";
|
echo "<td><span class='status-" . str_replace(' ', '-', $row['status']) . "'>{$row['status']}</span></td>";
|
||||||
echo "<td>" . htmlspecialchars($creator) . "</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['created_at'])) . "</td>";
|
||||||
echo "<td>" . date('Y-m-d H:i', strtotime($row['updated_at'])) . "</td>";
|
echo "<td>" . date('Y-m-d H:i', strtotime($row['updated_at'])) . "</td>";
|
||||||
echo "</tr>";
|
echo "</tr>";
|
||||||
}
|
}
|
||||||
} else {
|
} 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>";
|
echo "<tr><td colspan='$colspan'>No tickets found</td></tr>";
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|||||||
Reference in New Issue
Block a user