2026-03-27 19:05:42 -04:00
|
|
|
|
<?php
|
|
|
|
|
|
/**
|
|
|
|
|
|
* layout_footer.php — Shared bottom-of-page partial for all views.
|
|
|
|
|
|
*
|
|
|
|
|
|
* Expected variables available from the including view (set before require):
|
|
|
|
|
|
* string $nonce CSP nonce from SecurityHeadersMiddleware::getNonce()
|
|
|
|
|
|
* array|null $pageScripts Optional array of extra JS paths to load after base.js
|
|
|
|
|
|
* string|null $pageInlineScript Optional raw JS string to run after all scripts load
|
|
|
|
|
|
*
|
|
|
|
|
|
* Globals used:
|
|
|
|
|
|
* $GLOBALS['currentUser'] — user array (user_id, username, is_admin)
|
|
|
|
|
|
* $GLOBALS['config'] — app config array (TIMEZONE, TIMEZONE_ABBREV)
|
|
|
|
|
|
* CsrfMiddleware::getToken() — returns current CSRF token string
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
// layout_footer.php — JS globals + runtime scripts are loaded here
|
|
|
|
|
|
?>
|
|
|
|
|
|
|
|
|
|
|
|
</main><!-- /#main-content / .lt-main -->
|
|
|
|
|
|
|
2026-03-27 20:16:05 -04:00
|
|
|
|
<!-- ================================================================
|
|
|
|
|
|
FOOTER — keyboard hint bar + version
|
|
|
|
|
|
================================================================ -->
|
|
|
|
|
|
<?php
|
|
|
|
|
|
// Context-sensitive keyboard hints based on active nav
|
|
|
|
|
|
$_ltf_nav = $activeNav ?? 'dashboard';
|
|
|
|
|
|
$_ltf_isTicket = str_starts_with($pageTitle ?? '', 'Ticket #');
|
|
|
|
|
|
?>
|
|
|
|
|
|
<footer class="lt-footer" role="contentinfo" aria-label="Keyboard shortcuts and app info">
|
|
|
|
|
|
<nav class="lt-footer-hints" aria-label="Keyboard shortcuts">
|
|
|
|
|
|
<?php if ($_ltf_isTicket): ?>
|
|
|
|
|
|
<a href="/" class="lt-footer-hint" title="Go to dashboard"><span class="lt-footer-key">[ ← ]</span> BACK</a>
|
|
|
|
|
|
<span class="lt-footer-sep">|</span>
|
|
|
|
|
|
<span class="lt-footer-hint" title="Press 1–4 to change status"><span class="lt-footer-key">[ 1-4 ]</span> STATUS</span>
|
|
|
|
|
|
<span class="lt-footer-sep">|</span>
|
|
|
|
|
|
<span class="lt-footer-hint" title="Press C to jump to comment box"><span class="lt-footer-key">[ C ]</span> COMMENT</span>
|
|
|
|
|
|
<span class="lt-footer-sep">|</span>
|
|
|
|
|
|
<button type="button" class="lt-footer-hint" data-action="open-settings" title="Open settings"><span class="lt-footer-key">[ * ]</span> CFG</button>
|
|
|
|
|
|
<?php elseif (str_starts_with($_ltf_nav, 'admin')): ?>
|
|
|
|
|
|
<a href="/" class="lt-footer-hint" title="Go to dashboard"><span class="lt-footer-key">[ ~ ]</span> HOME</a>
|
|
|
|
|
|
<span class="lt-footer-sep">|</span>
|
|
|
|
|
|
<button type="button" class="lt-footer-hint" data-action="open-settings" title="Open settings"><span class="lt-footer-key">[ * ]</span> CFG</button>
|
|
|
|
|
|
<?php else: ?>
|
|
|
|
|
|
<a href="/" class="lt-footer-hint" title="Go to dashboard (G then D)"><span class="lt-footer-key">[ ~ ]</span> HOME</a>
|
|
|
|
|
|
<span class="lt-footer-sep">|</span>
|
|
|
|
|
|
<span class="lt-footer-hint" title="Press / or Ctrl+K to search"><span class="lt-footer-key">[ / ]</span> SEARCH</span>
|
|
|
|
|
|
<span class="lt-footer-sep">|</span>
|
|
|
|
|
|
<a href="/ticket/create" class="lt-footer-hint" title="Create new ticket (N)"><span class="lt-footer-key">[ + ]</span> NEW</a>
|
|
|
|
|
|
<span class="lt-footer-sep">|</span>
|
|
|
|
|
|
<button type="button" class="lt-footer-hint" data-action="open-settings" title="Open settings"><span class="lt-footer-key">[ * ]</span> CFG</button>
|
|
|
|
|
|
<?php endif ?>
|
|
|
|
|
|
<span class="lt-footer-sep">|</span>
|
|
|
|
|
|
<button type="button" class="lt-footer-hint" data-action="show-keyboard-help" title="Show keyboard shortcuts (?)"><span class="lt-footer-key">[ ? ]</span> HELP</button>
|
|
|
|
|
|
</nav>
|
|
|
|
|
|
<span aria-label="Application version">TINKER TICKETS — TDS v1.2</span>
|
|
|
|
|
|
</footer>
|
|
|
|
|
|
|
2026-03-27 19:05:42 -04:00
|
|
|
|
<!-- base.js + utils.js + globals already loaded in <head> via layout_header.php -->
|
|
|
|
|
|
|
|
|
|
|
|
<?php if (!empty($pageScripts)): ?>
|
|
|
|
|
|
<!-- PAGE-SPECIFIC SCRIPTS -->
|
|
|
|
|
|
<?php foreach ($pageScripts as $_ltf_script): ?>
|
|
|
|
|
|
<script nonce="<?= htmlspecialchars($nonce, ENT_QUOTES, 'UTF-8') ?>" src="<?= htmlspecialchars($_ltf_script, ENT_QUOTES, 'UTF-8') ?>"></script>
|
|
|
|
|
|
<?php endforeach; ?>
|
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
|
|
|
|
|
|
|
<?php if (!empty($pageInlineScript)): ?>
|
|
|
|
|
|
<!-- PAGE INLINE SCRIPT -->
|
|
|
|
|
|
<script nonce="<?= htmlspecialchars($nonce, ENT_QUOTES, 'UTF-8') ?>">
|
|
|
|
|
|
<?= $pageInlineScript ?>
|
|
|
|
|
|
</script>
|
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
|
|
2026-03-27 20:16:05 -04:00
|
|
|
|
<!-- LT INIT — boot animation + global UI init (base.js handles keys/nav automatically) -->
|
2026-03-27 19:05:42 -04:00
|
|
|
|
<script nonce="<?= htmlspecialchars($nonce, ENT_QUOTES, 'UTF-8') ?>">
|
|
|
|
|
|
if (window.lt) {
|
2026-03-27 20:16:05 -04:00
|
|
|
|
lt.init({ bootName: 'TINKER TICKETS' });
|
2026-03-27 19:05:42 -04:00
|
|
|
|
}
|
2026-03-27 20:16:05 -04:00
|
|
|
|
|
|
|
|
|
|
// Footer hint bar actions (keyboard help + settings — work on all pages)
|
|
|
|
|
|
document.addEventListener('click', function(e) {
|
|
|
|
|
|
var btn = e.target.closest('[data-action]');
|
|
|
|
|
|
if (!btn) return;
|
|
|
|
|
|
var action = btn.getAttribute('data-action');
|
|
|
|
|
|
if (action === 'show-keyboard-help') {
|
|
|
|
|
|
if (typeof showKeyboardHelp === 'function') {
|
|
|
|
|
|
showKeyboardHelp();
|
|
|
|
|
|
} else if (window.lt) {
|
|
|
|
|
|
var h = document.getElementById('lt-keys-help');
|
|
|
|
|
|
if (h) lt.modal.open('lt-keys-help');
|
|
|
|
|
|
else lt.toast.info('Keyboard shortcuts: ESC=close Ctrl+K=search ?=this help');
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (action === 'open-settings' || action === 'open-settings-modal') {
|
|
|
|
|
|
if (typeof openSettingsModal === 'function') {
|
|
|
|
|
|
openSettingsModal();
|
|
|
|
|
|
} else if (window.lt) {
|
|
|
|
|
|
lt.toast.info('Settings available on the Dashboard');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2026-03-27 19:05:42 -04:00
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
</body>
|
|
|
|
|
|
</html>
|