Improve web_template compliance: lt.bytes.format, lt.tableNav, lt.statsFilter

- ticket.js: replace custom formatFileSize() with lt.bytes.format() from web_template base.js; remove the now-redundant local function
- DashboardView.php: add id="tickets-table" and wire lt.tableNav.init() for j/k/Enter keyboard row navigation
- DashboardView.php: add lt-stat-card class + data-filter-key/data-filter-val to open/critical/closed stat cards; wire lt.statsFilter.init() + window.lt_onStatFilter so clicking a stat card filters the ticket list

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-20 22:07:49 -04:00
parent e7d01ef576
commit 0a2214bfaf
2 changed files with 28 additions and 16 deletions

View File

@@ -827,7 +827,7 @@ function renderAttachments(attachments) {
</a>
</div>
<div class="attachment-meta">
${lt.escHtml(att.file_size_formatted || formatFileSize(att.file_size))}${lt.escHtml(uploaderName)}${uploadDate}
${lt.escHtml(att.file_size_formatted || lt.bytes.format(att.file_size))}${lt.escHtml(uploaderName)}${uploadDate}
</div>
</div>
<div class="attachment-actions">
@@ -841,17 +841,6 @@ function renderAttachments(attachments) {
container.innerHTML = html;
}
function formatFileSize(bytes) {
if (bytes >= 1073741824) {
return (bytes / 1073741824).toFixed(2) + ' GB';
} else if (bytes >= 1048576) {
return (bytes / 1048576).toFixed(2) + ' MB';
} else if (bytes >= 1024) {
return (bytes / 1024).toFixed(2) + ' KB';
} else {
return bytes + ' bytes';
}
}
function deleteAttachment(attachmentId) {
showConfirmModal(

View File

@@ -183,14 +183,14 @@ $nonce = SecurityHeadersMiddleware::getNonce();
<?php if (isset($stats)): ?>
<div class="stats-widgets">
<div class="stats-row">
<div class="stat-card stat-open">
<div class="stat-card lt-stat-card stat-open" data-filter-key="status" data-filter-val="Open,Pending,In Progress" title="Click to filter by open tickets">
<div class="stat-icon">[ # ]</div>
<div class="stat-content">
<div class="stat-value"><?php echo $stats['open_tickets']; ?></div>
<div class="stat-label">Open Tickets</div>
</div>
</div>
<div class="stat-card stat-critical">
<div class="stat-card lt-stat-card stat-critical" data-filter-key="priority" data-filter-val="1" title="Click to filter critical tickets">
<div class="stat-icon">[ ! ]</div>
<div class="stat-content">
<div class="stat-value"><?php echo $stats['critical']; ?></div>
@@ -211,7 +211,7 @@ $nonce = SecurityHeadersMiddleware::getNonce();
<div class="stat-label">Created Today</div>
</div>
</div>
<div class="stat-card stat-resolved">
<div class="stat-card lt-stat-card stat-resolved" data-filter-key="status" data-filter-val="Closed" title="Click to filter closed tickets">
<div class="stat-icon">[ OK ]</div>
<div class="stat-content">
<div class="stat-value"><?php echo $stats['closed_today']; ?></div>
@@ -385,7 +385,7 @@ $nonce = SecurityHeadersMiddleware::getNonce();
<!-- Table -->
<div class="table-wrapper">
<table>
<table id="tickets-table">
<thead>
<tr>
<?php if ($GLOBALS['currentUser']['is_admin'] ?? false): ?>
@@ -838,6 +838,29 @@ $nonce = SecurityHeadersMiddleware::getNonce();
<script nonce="<?php echo $nonce; ?>">
// Initialize lt keyboard defaults (ESC closes modals, Ctrl+K focuses search, ? shows help)
if (window.lt) lt.keys.initDefaults();
// Enable j/k/Enter keyboard row navigation on the ticket table
if (window.lt) lt.tableNav.init('tickets-table');
// Enable stat card click-to-filter using lt.statsFilter
if (window.lt) lt.statsFilter.init();
window.lt_onStatFilter = function(key, val) {
const url = new URL(window.location.href);
if (key === null) {
// Toggle off — clear filter params
url.searchParams.delete('status');
url.searchParams.delete('priority_min');
url.searchParams.delete('priority_max');
} else if (key === 'status') {
url.searchParams.set('status', val);
url.searchParams.delete('priority_min');
url.searchParams.delete('priority_max');
} else if (key === 'priority') {
url.searchParams.set('priority_min', val);
url.searchParams.set('priority_max', val);
url.searchParams.delete('status');
}
url.searchParams.delete('page');
window.location.href = url.toString();
};
// Event delegation for all data-action handlers
document.addEventListener('click', function(event) {
const target = event.target.closest('[data-action]');