Files
delphi-database/templates/base.html
HotSwapp c30c1b1653 fix: Update all navigation links to point to new admin import system
PROBLEM FIXED:
- Main menu "Import" was still pointing to old unified-import system
- Dashboard quick actions pointed to broken import routes
- Keyboard shortcut Alt+I was routing to old system

NAVIGATION UPDATES:
 Desktop/Mobile nav menu: /import → /admin/import
 Dashboard quick action button: /import → /admin/import
 Dashboard "Open Import" link: /import → /admin/import
 Keyboard shortcut Alt+I: /import → /admin/import
 Support modal page mapping: /import → /admin/import
 Base template page names: /import → /admin/import

ADMIN PERMISSIONS:
- Import menu items now properly hidden by default
- Shown only to admin users via JavaScript permission check
- Maintains security for admin-only functionality

REMOVED REFERENCES:
- All /flexible route references (old flexible import system)
- Cleaned up navigation menu from removed functionality

NOW WORKING:
- Clicking "Import" in main menu → new /admin/import interface
- Alt+I keyboard shortcut → new /admin/import interface
- Dashboard import button → new /admin/import interface
- All navigation properly secured for admin users only

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 21:01:26 -05:00

460 lines
29 KiB
HTML

<!DOCTYPE html>
<html lang="en" data-theme="light">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}{{ title }}{% endblock %}</title>
<!-- Icons (Font Awesome) -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<!-- Tailwind CSS -->
<!-- Custom Tailwind CSS -->
<link href="/static/css/main.css" rel="stylesheet">
{% block bridge_css %}{% endblock %}
{% block extra_head %}{% endblock %}
</head>
<body class="flex flex-col min-h-screen bg-neutral-50 dark:bg-neutral-900 text-neutral-900 dark:text-neutral-50 antialiased">
<!-- Navigation -->
<nav class="bg-primary-600 border-b border-primary-700 shadow-sm">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between items-center h-16">
<!-- Brand -->
<div class="flex items-center">
<a href="/" class="text-white font-semibold text-xl hover:text-primary-100 transition-colors">
Delphi Database System
</a>
</div>
<!-- Desktop Navigation -->
<div class="hidden md:flex items-center space-x-1">
<a href="/customers" data-shortcut="Alt+C" class="flex items-center gap-2 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-users"></i>
<span>Customers</span>
</a>
<a href="/files" data-shortcut="Alt+F" class="flex items-center gap-2 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-folder"></i>
<span>Files</span>
</a>
<a href="/financial" data-shortcut="Alt+L" class="flex items-center gap-2 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-calculator"></i>
<span>Ledger</span>
</a>
<a href="/billing" class="flex items-center gap-2 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-file-invoice-dollar"></i>
<span>Billing</span>
</a>
<a href="/documents" data-shortcut="Alt+D" class="flex items-center gap-2 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-file-lines"></i>
<span>Documents</span>
</a>
<a href="/search" data-shortcut="Ctrl+F" class="flex items-center gap-2 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-magnifying-glass"></i>
<span>Search</span>
</a>
<a id="nav-import-desktop" href="/admin/import" data-shortcut="Alt+I" class="hidden flex items-center gap-2 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-cloud-arrow-up"></i>
<span>Import</span>
</a>
<!-- Flexible import removed -->
<i class="fa-solid fa-table-columns"></i>
<span>Flexible</span>
</a>
</div>
<!-- Right side items -->
<div class="flex items-center space-x-3">
<!-- Theme Toggle -->
<button onclick="toggleTheme()" title="Toggle dark mode" class="flex items-center justify-center w-10 h-10 bg-primary-700 hover:bg-primary-800 text-white rounded-lg transition-colors duration-200">
<i class="fas fa-sun dark:hidden text-sm"></i>
<i class="fas fa-moon hidden dark:block text-sm"></i>
</button>
<!-- User Dropdown -->
<div class="relative" id="userDropdown">
<button onclick="toggleUserMenu()" class="flex items-center gap-2 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-circle-user"></i>
<span>User</span>
<i class="fa-solid fa-chevron-down text-xs"></i>
</button>
<div id="userMenu" class="hidden absolute right-0 mt-2 w-48 bg-white dark:bg-neutral-800 rounded-lg shadow-lg border border-neutral-200 dark:border-neutral-700 z-50">
<div class="py-1">
<a id="admin-menu-item" href="/admin" class="hidden flex items-center gap-2 px-4 py-2 text-sm text-neutral-700 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-700 transition-colors">
<i class="fa-solid fa-gear"></i>
<span>Admin</span>
</a>
<div id="admin-menu-divider" class="hidden border-t border-neutral-200 dark:border-neutral-700 my-1"></div>
<a href="#" onclick="logout()" class="flex items-center gap-2 px-4 py-2 text-sm text-neutral-700 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-700 transition-colors">
<i class="fa-solid fa-right-from-bracket"></i>
<span>Logout</span>
</a>
</div>
</div>
</div>
<!-- Mobile menu button -->
<button onclick="toggleMobileMenu()" class="md:hidden flex items-center justify-center w-10 h-10 bg-primary-700 hover:bg-primary-800 text-white rounded-lg transition-colors">
<i id="mobileMenuIcon" class="fa-solid fa-bars"></i>
</button>
</div>
</div>
<!-- Mobile Navigation -->
<div id="mobileMenu" class="hidden md:hidden border-t border-primary-700 pt-4 pb-4">
<div class="space-y-1">
<a href="/customers" class="flex items-center gap-3 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-users"></i>
<span>Customers</span>
</a>
<a href="/files" class="flex items-center gap-3 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-folder"></i>
<span>Files</span>
</a>
<a href="/financial" class="flex items-center gap-3 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-calculator"></i>
<span>Ledger</span>
</a>
<a href="/billing" class="flex items-center gap-3 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-file-invoice-dollar"></i>
<span>Billing</span>
</a>
<a href="/documents" class="flex items-center gap-3 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-file-lines"></i>
<span>Documents</span>
</a>
<a href="/search" class="flex items-center gap-3 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-magnifying-glass"></i>
<span>Search</span>
</a>
<a id="nav-import-mobile" href="/admin/import" class="hidden flex items-center gap-3 px-3 py-2 rounded-lg text-primary-100 hover:text-white hover:bg-primary-700 transition-all duration-200">
<i class="fa-solid fa-cloud-arrow-up"></i>
<span>Import</span>
</a>
<!-- Flexible import removed -->
<i class="fa-solid fa-table-columns"></i>
<span>Flexible</span>
</a>
</div>
</div>
</div>
</nav>
<!-- Main Content -->
<main class="flex-grow">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
{% block content %}{% endblock %}
</div>
</main>
<!-- Footer -->
<footer class="mt-auto border-t border-neutral-200 dark:border-neutral-700 bg-white dark:bg-neutral-800">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
<div class="flex flex-col sm:flex-row items-center justify-between gap-4">
<div class="text-sm text-neutral-500 dark:text-neutral-400">
&copy; <span id="currentYear"></span> Delphi Consulting Group Database System
<span class="mx-2">|</span>
<span id="currentPageDisplay">Loading...</span>
</div>
<div class="flex items-center gap-4">
<button type="button" onclick="openSupportModal()" class="bg-primary-600 text-white hover:bg-primary-700 px-3 py-1.5 rounded-lg text-xs font-medium transition-colors duration-200 flex items-center gap-2">
<i class="fas fa-bug"></i>
<span>Report Issue</span>
</button>
<div class="text-sm text-neutral-500 dark:text-neutral-400">
Found a bug?
<button onclick="openSupportModal()" class="text-primary-600 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300 transition-colors duration-200 underline">
Report Issue
</button>
</div>
</div>
</div>
</div>
</footer>
<!-- Include Support Modal -->
{% include 'support_modal.html' %}
<!-- Keyboard Shortcuts Help Modal -->
<div id="shortcutsModal" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4">
<div class="bg-white dark:bg-neutral-800 rounded-xl shadow-xl max-w-4xl w-full max-h-screen overflow-hidden">
<div class="flex items-center justify-between px-6 py-4 border-b border-neutral-200 dark:border-neutral-700">
<h2 class="text-lg font-semibold text-neutral-900 dark:text-neutral-100 flex items-center gap-2">
<i class="fa-solid fa-keyboard"></i>
<span>Keyboard Shortcuts</span>
</h2>
<button onclick="closeShortcutsModal()" class="text-neutral-400 hover:text-neutral-600 dark:text-neutral-500 dark:hover:text-neutral-300 transition-colors">
<i class="fa-solid fa-xmark text-xl"></i>
</button>
</div>
<div class="px-6 py-4 max-h-96 overflow-y-auto scrollbar-thin">
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<div class="space-y-6">
<div>
<h3 class="flex items-center gap-2 text-sm font-semibold text-neutral-700 dark:text-neutral-300 mb-3">
<i class="fa-solid fa-house"></i>
<span>Navigation</span>
</h3>
<ul class="space-y-2 text-sm">
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Customers/Rolodex</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Alt+C</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">File Cabinet</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Alt+F</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Ledger/Financial</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Alt+L</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Documents/QDROs</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Alt+D</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Data Import</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Alt+I</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Admin Panel</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Alt+A</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Global Search</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Ctrl+F</kbd>
</li>
</ul>
</div>
<div>
<h3 class="flex items-center gap-2 text-sm font-semibold text-neutral-700 dark:text-neutral-300 mb-3">
<i class="fa-solid fa-pencil"></i>
<span>Forms</span>
</h3>
<ul class="space-y-2 text-sm">
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">New Record</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Ctrl+N</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Save</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Ctrl+S</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Edit Mode</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">F9</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Complete/Save</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">F2</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Clear/Cancel</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">F8</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Delete Record</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Del</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Cancel/Close</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Esc</kbd>
</li>
</ul>
</div>
</div>
<div class="space-y-6">
<div>
<h3 class="flex items-center gap-2 text-sm font-semibold text-neutral-700 dark:text-neutral-300 mb-3">
<i class="fa-solid fa-list"></i>
<span>Lists/Tables</span>
</h3>
<ul class="space-y-2 text-sm">
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Navigate records</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">↑/↓</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Page navigation</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Page Up/Down</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">First/Last record</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Home/End</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Open/Edit record</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Enter</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Change dates</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">+/-</kbd>
</li>
</ul>
</div>
<div>
<h3 class="flex items-center gap-2 text-sm font-semibold text-neutral-700 dark:text-neutral-300 mb-3">
<i class="fa-solid fa-screwdriver-wrench"></i>
<span>System</span>
</h3>
<ul class="space-y-2 text-sm">
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Help (this dialog)</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">F1</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Menu</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">F10</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Memo/Notes</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Alt+M</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Time Tracker</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Alt+T</kbd>
</li>
<li class="flex items-center justify-between">
<span class="text-neutral-600 dark:text-neutral-400">Balance Summary</span>
<kbd class="px-2 py-1 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded text-xs font-mono">Alt+B</kbd>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="flex items-center justify-end gap-3 px-6 py-4 border-t border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-800/50">
<button onclick="closeShortcutsModal()" class="px-4 py-2 bg-neutral-100 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-600 rounded-lg transition-colors duration-200">
Close
</button>
</div>
</div>
</div>
<!-- Custom Navigation JS -->
<script>
function toggleUserMenu() {
const menu = document.getElementById('userMenu');
menu.classList.toggle('hidden');
}
function toggleMobileMenu() {
const menu = document.getElementById('mobileMenu');
const icon = document.getElementById('mobileMenuIcon');
menu.classList.toggle('hidden');
icon.classList.toggle('fa-bars');
icon.classList.toggle('fa-xmark');
}
function openShortcutsModal() {
document.getElementById('shortcutsModal').classList.remove('hidden');
}
function closeShortcutsModal() {
document.getElementById('shortcutsModal').classList.add('hidden');
}
// Close menus when clicking outside
document.addEventListener('click', function(event) {
const dropdown = document.getElementById('userDropdown');
const menu = document.getElementById('userMenu');
const shortcutsModal = document.getElementById('shortcutsModal');
if (!dropdown.contains(event.target)) {
menu.classList.add('hidden');
}
// Close shortcuts modal when clicking outside
if (event.target === shortcutsModal) {
closeShortcutsModal();
}
});
// Escape handling is centralized in keyboard-shortcuts.js
</script>
<script>
// Global modal helpers for Tailwind-based modals
function openModal(id) {
const el = document.getElementById(id);
if (el) el.classList.remove('hidden');
}
function closeModal(id) {
const el = document.getElementById(id);
if (el) el.classList.add('hidden');
}
// Lightweight shake animation utility class
(function(){
const styleId = 'inline-shake-style';
if (!document.getElementById(styleId)) {
const css = '@keyframes _shake_kf{0%,100%{transform:translateX(0)}20%{transform:translateX(-4px)}40%{transform:translateX(4px)}60%{transform:translateX(-3px)}80%{transform:translateX(3px)}}.animate-shake{animation:_shake_kf .4s ease-in-out;}';
const tag = document.createElement('style');
tag.id = styleId;
tag.type = 'text/css';
tag.appendChild(document.createTextNode(css));
document.head.appendChild(tag);
}
})();
</script>
<!-- Custom JavaScript -->
<!-- Fetch wrapper should be loaded early. It exposes window.http.wrappedFetch and also wraps global fetch for compatibility. -->
<script src="/static/js/fetch-wrapper.js"></script>
<script src="/static/js/sanitizer.js"></script>
<script src="/static/js/highlight.js"></script>
<!-- Load main.js first so global handlers are registered before other scripts -->
<script src="/static/js/main.js"></script>
<script src="/static/js/alerts.js"></script>
<script src="/static/js/upload-helper.js"></script>
<script src="/static/js/keyboard-shortcuts.js"></script>
<script src="/static/js/notifications.js"></script>
<script src="/static/js/batch-progress.js"></script>
{% block extra_scripts %}{% endblock %}
<script>
// Initialize page meta on load (keyboard shortcuts initialized centrally in main.js)
document.addEventListener('DOMContentLoaded', function() {
updateCurrentPageDisplay();
updateCurrentYear();
});
// Update current page display in footer
function updateCurrentPageDisplay() {
const path = window.location.pathname;
const pageNames = {
'/': 'Dashboard',
'/login': 'Login',
'/customers': 'Customer Management',
'/files': 'File Cabinet',
'/financial': 'Financial/Ledger',
'/documents': 'Document Management',
'/admin/import': 'Data Import',
'/search': 'Advanced Search',
'/admin': 'System Administration',
};
const currentPage = pageNames[path] || `Page: ${path}`;
const displayElement = document.getElementById('currentPageDisplay');
if (displayElement) {
displayElement.textContent = `Current: ${currentPage}`;
}
}
// Update current year in footer
function updateCurrentYear() {
const currentYear = new Date().getFullYear();
const yearElement = document.getElementById('currentYear');
if (yearElement) {
yearElement.textContent = currentYear;
}
}
// Auth helpers and theme management are centralized in /static/js/main.js
</script>
</body>
</html>