Fix views/controllers/router: command palette, create form, admin views

- Consolidate the duplicated command palette to a single overlay + init in
  the footer; fix New Ticket to route to /ticket/create (was a 404 /create);
  keep the CSP nonce and all commands
- TicketController create(): trim title, require a non-empty description,
  and honor the posted status (validated against the canonical list) instead
  of silently discarding it
- UserActivityView: 'Active Users' counts only users active in the selected
  range, not every registered user
- layout_footer/DashboardView: local esc() now escapes quotes so values used
  in HTML attributes can't break out
- TicketView: comments tab badge shows the true total, not just page one
- layout_header: gate the 'View activity log' link behind the admin flag
- index.php: validate /admin/user-activity date params; anchor the legacy
  /ticket.php route; align the audit action-type whitelist with the dropdown
- ApiKeysView: correct the external API sample to /create_ticket_api.php

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-10 15:15:40 -04:00
co-authored by Claude Opus 4.8
parent 113b7f9d3f
commit 27a5db8c85
9 changed files with 76 additions and 79 deletions
+13 -1
View File
@@ -43,11 +43,23 @@ include __DIR__ . '/../../views/layout_header.php';
<!-- Summary stats -->
<?php if (!empty($userStats)) : ?>
<?php
// "Active" = users with >=1 tracked action within the selected date range.
// The query LEFT JOINs from all users, so $userStats includes zero-activity users.
$activeUsers = 0;
foreach ($userStats as $_u) {
$_activity = ($_u['tickets_created'] ?? 0) + ($_u['tickets_resolved'] ?? 0)
+ ($_u['comments_added'] ?? 0) + ($_u['tickets_assigned'] ?? 0);
if ($_activity > 0) {
$activeUsers++;
}
}
?>
<div class="lt-stats-grid lt-mb-md">
<div class="lt-stat-card">
<div class="lt-stat-icon lt-text-cyan">[ # ]</div>
<div class="lt-stat-info">
<div class="lt-stat-value"><?= count($userStats) ?></div>
<div class="lt-stat-value"><?= (int)$activeUsers ?></div>
<div class="lt-stat-label">Active Users</div>
</div>
</div>