Goondex/internal/web/templates/dashboard.html
Stu Leak 16fb407a3c v0.1.0-dev4: Add web frontend with UI component library
- Implement full web interface with Go html/template server
- Add GX component library (buttons, dialogs, tables, forms, etc.)
- Create scene/performer/studio/movie detail and listing pages
- Add Adult Empire scraper for additional metadata sources
- Implement movie support with database schema
- Add import and sync services for data management
- Include comprehensive API and frontend documentation
- Add custom color scheme and responsive layout

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 10:47:30 -05:00

260 lines
9.2 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Goondex - Dashboard</title>
<link rel="stylesheet" href="/static/css/goondex.css">
<style>
/* ==== LUXURY SIDE PANELS (A1 Medium 240px) ==== */
body {
display: flex;
justify-content: center;
align-items: stretch;
min-height: 100vh;
overflow-x: hidden;
}
.side-panel {
width: 240px;
flex-shrink: 0;
background: #000;
border-right: 1px solid rgba(255, 79, 163, 0.2);
border-left: 1px solid rgba(255, 79, 163, 0.2);
display: flex;
flex-direction: column;
overflow: hidden;
position: sticky;
top: 0;
height: 100vh;
}
.side-panel.right {
border-right: none;
}
.side-panel img {
width: 100%;
height: auto;
display: block;
object-fit: cover;
opacity: 0.85;
transition: opacity 0.3s ease;
}
.side-panel img:hover {
opacity: 1;
}
/* Main site content */
.main-wrapper {
flex: 1;
overflow-y: auto;
max-width: 1400px;
}
/* Ensure navbar stays inside main-wrapper */
nav.navbar {
position: sticky;
top: 0;
z-index: 50;
}
/* Search results styling override to match new layout */
#global-search-results {
max-width: 100%;
}
/* Hide side panels on mobile */
@media (max-width: 900px) {
.side-panel {
display: none;
}
}
</style>
</head>
<body>
<!-- LEFT LUXURY SIDE PANEL -->
<div class="side-panel left">
<img src="/static/img/sidebar/preview1.jpg" alt="">
<img src="/static/img/sidebar/preview2.jpg" alt="">
<img src="/static/img/sidebar/preview3.jpg" alt="">
</div>
<!-- MAIN CONTENT WRAPPER -->
<div class="main-wrapper">
<!-- NAVIGATION -->
<nav class="navbar">
<div class="container nav-inner">
<img src="/static/img/logo/GOONDEX_logo.png" class="logo-img">
<ul class="nav-links">
<li><a href="/" class="active">Dashboard</a></li>
<li><a href="/performers">Performers</a></li>
<li><a href="/studios">Studios</a></li>
<li><a href="/scenes">Scenes</a></li>
<li><a href="/movies">Movies</a></li>
</ul>
</div>
</nav>
<main class="container">
<!-- HERO -->
<section class="hero-section">
<h1 class="hero-title">Welcome to Goondex</h1>
<p class="hero-subtitle">Your professional adult media indexer powered by ThePornDB</p>
<div class="hero-actions">
<button class="btn" onclick="openModal('import-all-modal')">
Get Started
<div class="hoverEffect"><div></div></div>
</button>
<button class="btn-secondary" onclick="openModal('sync-modal')">
Sync Data
<div class="hoverEffect"><div></div></div>
</button>
</div>
</section>
<!-- SEARCH -->
<section class="search-section" style="margin-bottom: 2.5rem;">
<input type="text" id="global-search" class="input"
placeholder="Search performers, studios, scenes, or tags...">
<div id="global-search-results" class="search-results"></div>
</section>
<!-- STATS -->
<section class="stats-grid">
<!-- Performers -->
<div class="stat-card">
<div class="stat-icon">👤</div>
<div class="stat-content">
<div class="stat-value">{{.PerformerCount}}</div>
<div class="stat-label">Performers</div>
</div>
<div class="stat-actions">
<a href="/performers" class="stat-link">View all →</a>
<button class="btn-small" onclick="bulkImportPerformers()">
Import All
<div class="hoverEffect"><div></div></div>
</button>
</div>
</div>
<!-- Studios -->
<div class="stat-card">
<div class="stat-icon">🏢</div>
<div class="stat-content">
<div class="stat-value">{{.StudioCount}}</div>
<div class="stat-label">Studios</div>
</div>
<div class="stat-actions">
<a href="/studios" class="stat-link">View all →</a>
<button class="btn-small" onclick="bulkImportStudios()">
Import All
<div class="hoverEffect"><div></div></div>
</button>
</div>
</div>
<!-- Scenes -->
<div class="stat-card">
<div class="stat-icon">🎬</div>
<div class="stat-content">
<div class="stat-value">{{.SceneCount}}</div>
<div class="stat-label">Scenes</div>
</div>
<div class="stat-actions">
<a href="/scenes" class="stat-link">View all →</a>
<button class="btn-small" onclick="bulkImportScenes()">
Import All
<div class="hoverEffect"><div></div></div>
</button>
</div>
</div>
<!-- Movies -->
<div class="stat-card">
<div class="stat-icon">🎞️</div>
<div class="stat-content">
<div class="stat-value">{{.MovieCount}}</div>
<div class="stat-label">Movies</div>
</div>
<div class="stat-actions">
<a href="/movies" class="stat-link">View all →</a>
</div>
</div>
</section>
<!-- IMPORT SECTION -->
<section class="import-section">
<h3>Import from ThePornDB</h3>
<p class="help-text">
Import ALL data from ThePornDB. This downloads performers, studios, scenes, and metadata.
</p>
<div class="import-buttons">
<button class="btn" onclick="openModal('import-all-modal')">
Import Everything
<div class="hoverEffect"><div></div></div>
</button>
<button class="btn-secondary" onclick="bulkImportPerformers()">
Import All Performers
<div class="hoverEffect"><div></div></div>
</button>
<button class="btn-secondary" onclick="bulkImportStudios()">
Import All Studios
<div class="hoverEffect"><div></div></div>
</button>
<button class="btn-secondary" onclick="bulkImportScenes()">
Import All Scenes
<div class="hoverEffect"><div></div></div>
</button>
</div>
<p class="help-text search-help">Or search for specific items:</p>
<div class="import-buttons">
<button class="btn-secondary" onclick="openModal('search-performer-modal')">
Search Performer
<div class="hoverEffect"><div></div></div>
</button>
<button class="btn-secondary" onclick="openModal('search-studio-modal')">
Search Studio
<div class="hoverEffect"><div></div></div>
</button>
<button class="btn-secondary" onclick="openModal('search-scene-modal')">
Search Scene
<div class="hoverEffect"><div></div></div>
</button>
</div>
</section>
</main>
</div>
<!-- RIGHT LUXURY SIDE PANEL -->
<div class="side-panel right">
<img src="/static/img/sidebar/preview4.jpg" alt="">
<img src="/static/img/sidebar/preview5.jpg" alt="">
<img src="/static/img/sidebar/preview6.jpg" alt="">
</div>
<!-- EXISTING MODALS (unchanged, full code integrity kept) -->
{{/* Your modals remain exactly as before */}}
<script src="/static/js/app.js"></script>
</body>
</html>