'status', 'value' => trim($s), 'label' => 'Status: ' . trim($s)]; } } if (!empty($_GET['priority'])) { $pArr = is_array($_GET['priority']) ? $_GET['priority'] : explode(',', $_GET['priority']); foreach ($pArr as $p) { $activeFilters[] = ['type' => 'priority', 'value' => trim($p), 'label' => 'Priority: P' . trim($p)]; } } if (!empty($_GET['category'])) { $activeFilters[] = ['type' => 'category', 'value' => $_GET['category'], 'label' => 'Category: ' . htmlspecialchars($_GET['category'])]; } if (!empty($_GET['type'])) { $activeFilters[] = ['type' => 'type', 'value' => $_GET['type'], 'label' => 'Type: ' . htmlspecialchars($_GET['type'])]; } if (!empty($_GET['assigned_to'])) { $label = $_GET['assigned_to'] === 'unassigned' ? 'Unassigned' : 'User #' . htmlspecialchars($_GET['assigned_to']); $activeFilters[] = ['type' => 'assigned_to', 'value' => $_GET['assigned_to'], 'label' => 'Assigned: ' . $label]; } if (!empty($_GET['created_from']) || !empty($_GET['created_to'])) { $from = $_GET['created_from'] ?? ''; $to = $_GET['created_to'] ?? ''; $label = $from === $to && $from ? 'Created: ' . $from : 'Created: ' . ($from ?: '…') . ' – ' . ($to ?: '…'); $activeFilters[] = ['type' => 'created_from', 'value' => $from, 'label' => $label]; } if (!empty($_GET['updated_from']) || !empty($_GET['updated_to'])) { $from = $_GET['updated_from'] ?? ''; $to = $_GET['updated_to'] ?? ''; $label = $from === $to && $from ? 'Updated: ' . $from : 'Updated: ' . ($from ?: '…') . ' – ' . ($to ?: '…'); $activeFilters[] = ['type' => 'updated_from', 'value' => $from, 'label' => $label]; } if (!empty($_GET['closed_from']) || !empty($_GET['closed_to'])) { $from = $_GET['closed_from'] ?? ''; $to = $_GET['closed_to'] ?? ''; $label = $from === $to && $from ? 'Closed: ' . $from : 'Closed: ' . ($from ?: '…') . ' – ' . ($to ?: '…'); $activeFilters[] = ['type' => 'closed_from', 'value' => $from, 'label' => $label]; } $_lt_statuses = $GLOBALS['config']['TICKET_STATUSES']; $currentStatus = isset($_GET['status']) ? explode(',', $_GET['status']) : ['Open', 'Pending', 'In Progress']; $currentCategories = isset($_GET['category']) ? explode(',', $_GET['category']) : []; $currentTypes = isset($_GET['type']) ? explode(',', $_GET['type']) : []; $isAdmin = $GLOBALS['currentUser']['is_admin'] ?? false; $colCount = $isAdmin ? 12 : 11; include __DIR__ . '/layout_header.php'; ?>

[ TICKETS ]

+ NEW TICKET
$stats['created_today']) ? 'lt-dot-up' : ($stats['created_today'] > $stats['closed_today'] ? 'lt-dot-warn' : 'lt-dot-idle'); $trendCrit = ($stats['critical'] > 0) ? 'lt-dot-warn' : 'lt-dot-up'; $trendUnassi = ($stats['unassigned'] > 0) ? 'lt-dot-warn' : 'lt-dot-idle'; $trendToday = ($stats['created_today'] > 0) ? 'lt-dot-warn' : 'lt-dot-idle'; $trendClosed = ($stats['closed_today'] > 0) ? 'lt-dot-up' : 'lt-dot-idle'; ?>
[ # ]
Open Tickets
[ ! ]
Critical (P1)
[ @ ]
Unassigned
[ + ]
Created Today
[ OK ]
Closed Today
0 ? number_format($avgHours, 1) . ' hours' : 'No data'; ?>
Avg Resolution
Priority Distribution
Status Breakdown
Category Breakdown
Team Workload — open tickets by assignee
0 ? round(($count / $maxLoad) * 100) : 0; $barClass = $pct >= 80 ? 'lt-progress--red' : ($pct >= 50 ? 'lt-progress--cyan' : 'lt-progress--green'); $words = array_filter(explode(' ', $name)); $initials = strtoupper(implode('', array_map(fn($w) => $w[0], array_slice($words, 0, 2)))); $avatarColors = ['lt-avatar--orange', 'lt-avatar--green', 'lt-avatar--purple', '']; $avatarColor = $avatarColors[abs(crc32($name)) % count($avatarColors)]; $userId = (int)($a['user_id'] ?? 0); ?>
ticket
Active:
Showing results for: ticket found
Ticket Queue
'Ticket ID', 'priority' => 'Priority', 'title' => 'Title', 'category' => 'Category', 'type' => 'Type', 'status' => 'Status', 'created_by' => 'Created By', 'assigned_to' => 'Assigned To', 'created_at' => 'Created', 'updated_at' => 'Updated', '_actions' => 'Actions', ]; foreach ($columns as $col => $label): if ($col === '_actions'): ?> $col, 'dir' => $newDir, 'page' => 1]); $sortUrl = htmlspecialchars('?' . http_build_query($sortParams), ENT_QUOTES, 'UTF-8'); ?>
Ticket queue sorted by
Actions style="cursor:pointer">
📭
No Tickets Found
No tickets match your current filters.
Clear Filters
'lt-badge-p1', 2 => 'lt-badge-p2', 3 => 'lt-badge-p3', default => 'lt-badge-p4' }; ?> P 'lt-dot-up', 'In Progress' => 'lt-dot-warn', 'Pending' => 'lt-dot--orange', 'Closed' => 'lt-dot-idle', default => 'lt-dot-idle', }; ?> Unassigned
1): ?>
Open
Pending
In Progress
Closed