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:
@@ -827,7 +827,7 @@ function renderAttachments(attachments) {
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="attachment-meta">
|
<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>
|
</div>
|
||||||
<div class="attachment-actions">
|
<div class="attachment-actions">
|
||||||
@@ -841,17 +841,6 @@ function renderAttachments(attachments) {
|
|||||||
container.innerHTML = html;
|
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) {
|
function deleteAttachment(attachmentId) {
|
||||||
showConfirmModal(
|
showConfirmModal(
|
||||||
|
|||||||
@@ -183,14 +183,14 @@ $nonce = SecurityHeadersMiddleware::getNonce();
|
|||||||
<?php if (isset($stats)): ?>
|
<?php if (isset($stats)): ?>
|
||||||
<div class="stats-widgets">
|
<div class="stats-widgets">
|
||||||
<div class="stats-row">
|
<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-icon">[ # ]</div>
|
||||||
<div class="stat-content">
|
<div class="stat-content">
|
||||||
<div class="stat-value"><?php echo $stats['open_tickets']; ?></div>
|
<div class="stat-value"><?php echo $stats['open_tickets']; ?></div>
|
||||||
<div class="stat-label">Open Tickets</div>
|
<div class="stat-label">Open Tickets</div>
|
||||||
</div>
|
</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-icon">[ ! ]</div>
|
||||||
<div class="stat-content">
|
<div class="stat-content">
|
||||||
<div class="stat-value"><?php echo $stats['critical']; ?></div>
|
<div class="stat-value"><?php echo $stats['critical']; ?></div>
|
||||||
@@ -211,7 +211,7 @@ $nonce = SecurityHeadersMiddleware::getNonce();
|
|||||||
<div class="stat-label">Created Today</div>
|
<div class="stat-label">Created Today</div>
|
||||||
</div>
|
</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-icon">[ OK ]</div>
|
||||||
<div class="stat-content">
|
<div class="stat-content">
|
||||||
<div class="stat-value"><?php echo $stats['closed_today']; ?></div>
|
<div class="stat-value"><?php echo $stats['closed_today']; ?></div>
|
||||||
@@ -385,7 +385,7 @@ $nonce = SecurityHeadersMiddleware::getNonce();
|
|||||||
|
|
||||||
<!-- Table -->
|
<!-- Table -->
|
||||||
<div class="table-wrapper">
|
<div class="table-wrapper">
|
||||||
<table>
|
<table id="tickets-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<?php if ($GLOBALS['currentUser']['is_admin'] ?? false): ?>
|
<?php if ($GLOBALS['currentUser']['is_admin'] ?? false): ?>
|
||||||
@@ -838,6 +838,29 @@ $nonce = SecurityHeadersMiddleware::getNonce();
|
|||||||
<script nonce="<?php echo $nonce; ?>">
|
<script nonce="<?php echo $nonce; ?>">
|
||||||
// Initialize lt keyboard defaults (ESC closes modals, Ctrl+K focuses search, ? shows help)
|
// Initialize lt keyboard defaults (ESC closes modals, Ctrl+K focuses search, ? shows help)
|
||||||
if (window.lt) lt.keys.initDefaults();
|
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
|
// Event delegation for all data-action handlers
|
||||||
document.addEventListener('click', function(event) {
|
document.addEventListener('click', function(event) {
|
||||||
const target = event.target.closest('[data-action]');
|
const target = event.target.closest('[data-action]');
|
||||||
|
|||||||
Reference in New Issue
Block a user