180 lines
6.7 KiB
HTML
180 lines
6.7 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<title>WC Member Console</title>
|
|
<meta name="description" content="Console for Wiki Cafe members">
|
|
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
|
<meta property="og:title" content="WC Member Console">
|
|
<meta property="og:description" content="Console for Wiki Cafe members">
|
|
<meta property="og:image" content="/static/apple-touch-icon.png">
|
|
<meta property="og:url" content="/index.html">
|
|
<meta property="og:site_name" content="Wiki Cafe Member Console">
|
|
|
|
<link href="/static/bootstrap.css" rel="stylesheet">
|
|
<script defer src="/static/bootstrap.bundle.js"></script>
|
|
<script defer src="/static/htmx.min.js"></script>
|
|
<script defer src="/static/error-handler.js"></script>
|
|
|
|
<link rel="apple-touch-icon" sizes="180x180" href="/static/apple-touch-icon.png">
|
|
<link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png">
|
|
<link rel="icon" type="image/png" sizes="16x16" href="/static/favicon-16x16.png">
|
|
<link rel="manifest" href="/static/site.webmanifest">
|
|
|
|
<style>
|
|
.htmx-indicator {
|
|
display: none;
|
|
}
|
|
.htmx-request .htmx-indicator {
|
|
display: inline-block;
|
|
}
|
|
.htmx-request.htmx-indicator {
|
|
display: inline-block;
|
|
}
|
|
.quota-bar {
|
|
height: 8px;
|
|
border-radius: 4px;
|
|
}
|
|
.toast-container {
|
|
position: fixed;
|
|
top: 1rem;
|
|
right: 1rem;
|
|
z-index: 1100;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body class="d-flex flex-column vh-100" hx-headers='{"X-CSRF-Token": "{{ .CSRFToken }}"}'>
|
|
<!-- Navbar -->
|
|
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
|
|
<div class="container-fluid">
|
|
<a class="navbar-brand" href="#">Wiki Cafe Member Console</a>
|
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
|
|
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
<div class="collapse navbar-collapse" id="navbarNav">
|
|
<ul class="navbar-nav ms-auto d-lg-none">
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="/">Dashboard</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="#fedwiki-sites">FedWiki Sites</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="{{ .KeycloakAccountURL }}" target="_blank">Identity and Access</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link text-danger" href="/logout">Logout</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<div class="d-flex flex-column flex-lg-row flex-grow-1">
|
|
<!-- Sidebar - only visible on lg screens and up -->
|
|
<div class="bg-light d-none d-lg-flex flex-column flex-shrink-0 h-lg-100 border-end">
|
|
<ul class="nav flex-column p-3">
|
|
<li class="nav-item"><a class="nav-link active" href="/"><strong>Dashboard</strong></a></li>
|
|
<li class="nav-item"><a class="nav-link" href="#fedwiki-sites">FedWiki Sites</a></li>
|
|
<li class="nav-item"><a class="nav-link" href="{{ .KeycloakAccountURL }}" target="_blank">Identity and Access</a>
|
|
</li>
|
|
<li class="nav-item"><a class="nav-link text-danger" href="/logout">Logout</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Main Content -->
|
|
<div class="flex-fill p-4">
|
|
<h1>Dashboard</h1>
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card mt-3">
|
|
<div class="card-header">Account Overview</div>
|
|
<div class="card-body">
|
|
<p><strong>Name:</strong> {{ .Name }}</p>
|
|
<p><strong>Username:</strong> {{ .Username }}</p>
|
|
<p><strong>Email:</strong> {{ .Email }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- FedWiki Sites Section -->
|
|
<div class="row mt-4" id="fedwiki-sites">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<span>FedWiki Sites</span>
|
|
</div>
|
|
<div class="card-body">
|
|
<!-- Quota and Sites List - loaded via HTMX -->
|
|
<div hx-get="/partials/fedwiki/sites" hx-trigger="load, refreshSites from:body" hx-swap="innerHTML">
|
|
<div class="text-center py-4">
|
|
<div class="spinner-border text-primary" role="status">
|
|
<span class="visually-hidden">Loading...</span>
|
|
</div>
|
|
<p class="mt-2 text-muted">Loading your sites...</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Create Site Modal -->
|
|
<div class="modal fade" id="createSiteModal" tabindex="-1" aria-labelledby="createSiteModalLabel" aria-hidden="true"
|
|
hx-on:hidden-bs-modal="this.querySelector('#createSiteModalBody').innerHTML = '<div class=\'modal-body text-center py-4\'><div class=\'spinner-border text-primary\' role=\'status\'><span class=\'visually-hidden\'>Loading...</span></div></div>'">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="createSiteModalLabel">Create New FedWiki Site</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<div id="createSiteModalBody">
|
|
<!-- Form loaded via HTMX -->
|
|
<div class="modal-body text-center py-4">
|
|
<div class="spinner-border text-primary" role="status">
|
|
<span class="visually-hidden">Loading...</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Delete Site Confirmation Modal -->
|
|
<div class="modal fade" id="deleteSiteModal" tabindex="-1" aria-labelledby="deleteSiteModalLabel" aria-hidden="true">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="deleteSiteModalLabel">Delete Site</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<div id="deleteSiteModalBody">
|
|
<!-- Content loaded via HTMX -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Error Toast Container -->
|
|
<div class="toast-container">
|
|
<div id="errorToast" class="toast align-items-center text-bg-danger border-0" role="alert" aria-live="assertive" aria-atomic="true">
|
|
<div class="d-flex">
|
|
<div class="toast-body" id="errorToastBody">
|
|
An error occurred. Please try again.
|
|
</div>
|
|
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
|
|
</html> |