Files
bookhoard/templates/admin.html
T
john-okeefe a5e96ddb0b feat: restructure admin dashboard into separate pages
- Convert admin dashboard from single 2-column page to multi-page interface
- Create main admin dashboard (/admin) as overview with navigation sidebar
- Add separate profile settings page (/admin/profile) for user account management
- Add separate library management page (/admin/library) combining folder and scan settings
- Implement sidebar navigation pattern similar to Gitea, Jellyfin, Audiobookshelf
- Add dedicated templates: admin.html, admin_profile.html, admin_library.html
- Include quick actions and statistics on main dashboard
- Improve UI with better organization and visual hierarchy
- Maintain consistent navigation and theme across all admin pages
- Add folder management, scan settings, and library statistics to library page
2026-01-23 09:44:47 -05:00

143 lines
7.1 KiB
HTML

{{template "base.html" .}}
{{define "title"}}Admin Dashboard - Bookmann{{end}}
{{define "content"}}
<!-- Navigation Header -->
<nav class="border-b" style="border-color: var(--border); background-color: var(--bg-secondary)">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between items-center h-16">
<div class="flex items-center">
<h1 class="text-xl font-bold" style="color: var(--text-primary)">📚 Bookmann</h1>
</div>
<div class="flex items-center space-x-4">
<a href="/" class="px-3 py-2 text-sm hover:opacity-80" style="color: var(--text-secondary)">Library</a>
<span style="color: var(--text-secondary)">Welcome, {{.User.Username}}!</span>
<button onclick="logout()" class="btn-primary px-4 py-2 rounded text-sm">
Logout
</button>
</div>
</div>
</div>
</nav>
<div class="flex min-h-screen" style="background-color: var(--bg-primary)">
<!-- Sidebar -->
<aside class="w-64 border-r" style="background-color: var(--bg-secondary); border-color: var(--border)">
<div class="p-6">
<h2 class="text-lg font-semibold mb-6" style="color: var(--text-primary)">Admin Panel</h2>
<nav class="space-y-2">
<a href="/admin" class="block px-4 py-2 rounded-lg {{if eq .CurrentPage "dashboard"}}bg-accent text-bg-primary{{else}}hover:opacity-80{{end}}" style="color: var(--text-primary)">
🏠 Dashboard
</a>
<a href="/admin/profile" class="block px-4 py-2 rounded-lg {{if eq .CurrentPage "profile"}}bg-accent text-bg-primary{{else}}hover:opacity-80{{end}}" style="color: var(--text-primary)">
👤 Profile Settings
</a>
<a href="/admin/library" class="block px-4 py-2 rounded-lg {{if eq .CurrentPage "library"}}bg-accent text-bg-primary{{else}}hover:opacity-80{{end}}" style="color: var(--text-primary)">
📚 Library Management
</a>
<a href="/admin/scanner" class="block px-4 py-2 rounded-lg {{if eq .CurrentPage "scanner"}}bg-accent text-bg-primary{{else}}hover:opacity-80{{end}}" style="color: var(--text-primary)">
🔍 Scanner Settings
</a>
</nav>
</div>
</aside>
<!-- Main Content -->
<main class="flex-1 p-8">
<div class="max-w-4xl">
{{if eq .CurrentPage "dashboard"}}
<!-- Dashboard Overview -->
<div class="mb-8">
<h1 class="text-3xl font-bold mb-2" style="color: var(--text-primary)">Dashboard</h1>
<p style="color: var(--text-secondary)">Overview of your Bookmann library and settings</p>
</div>
<!-- Stats Cards -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
<div class="card p-6 rounded-lg border" style="background-color: var(--bg-secondary); border-color: var(--border)">
<div class="flex items-center space-x-3">
<div class="text-3xl">📖</div>
<div>
<h3 class="font-semibold" style="color: var(--text-primary)">Library</h3>
<p style="color: var(--text-secondary)" class="text-sm">Manage your ebook collection</p>
</div>
</div>
<a href="/" class="mt-4 inline-block text-sm btn-secondary px-3 py-1 rounded">View Library</a>
</div>
<div class="card p-6 rounded-lg border" style="background-color: var(--bg-secondary); border-color: var(--border)">
<div class="flex items-center space-x-3">
<div class="text-3xl">⚙️</div>
<div>
<h3 class="font-semibold" style="color: var(--text-primary)">Settings</h3>
<p style="color: var(--text-secondary)" class="text-sm">Configure your preferences</p>
</div>
</div>
<a href="/admin/profile" class="mt-4 inline-block text-sm btn-secondary px-3 py-1 rounded">Manage Settings</a>
</div>
<div class="card p-6 rounded-lg border" style="background-color: var(--bg-secondary); border-color: var(--border)">
<div class="flex items-center space-x-3">
<div class="text-3xl">🔍</div>
<div>
<h3 class="font-semibold" style="color: var(--text-primary)">Scanner</h3>
<p style="color: var(--text-secondary)" class="text-sm">Library scanning options</p>
</div>
</div>
<a href="/admin/scanner" class="mt-4 inline-block text-sm btn-secondary px-3 py-1 rounded">Configure Scanner</a>
</div>
</div>
<!-- Quick Actions -->
<div class="card p-6 rounded-lg border" style="background-color: var(--bg-secondary); border-color: var(--border)">
<h3 class="text-xl font-semibold mb-4" style="color: var(--text-primary)">Quick Actions</h3>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<button onclick="quickScan()" class="btn-primary p-4 rounded-lg text-left">
<div class="font-medium">Scan Library</div>
<div style="color: var(--text-secondary)" class="text-sm">Find new ebooks in your folders</div>
</button>
<a href="/admin/library" class="btn-secondary p-4 rounded-lg text-left block">
<div class="font-medium">Manage Folders</div>
<div style="color: var(--text-secondary)" class="text-sm">Add or remove scan directories</div>
</a>
</div>
</div>
{{end}}
</div>
</main>
</div>
<script>
// Quick scan from dashboard
function quickScan() {
fetch('/api/scanner/scan', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + localStorage.getItem('token')
},
body: JSON.stringify({
folder_paths: [] // Will scan all configured folders
})
}).then(res => res.json()).then(data => {
alert(data.message || 'Scan completed successfully!');
}).catch(err => {
console.error('Scan error:', err);
alert('Scan failed. Please check your folder configuration.');
});
}
// Logout
function logout() {
localStorage.removeItem('token');
localStorage.removeItem('user');
window.location.href = '/';
}
// Load theme on page load
document.addEventListener('DOMContentLoaded', function() {
loadTheme();
});
</script>
{{end}}