mirror of
https://github.com/Alexander-D-Karpov/webring.git
synced 2026-03-16 22:07:41 +03:00
215 lines
7.6 KiB
HTML
215 lines
7.6 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>User Dashboard - Webring</title>
|
|
<link rel="stylesheet" href="/static/dashboard.css">
|
|
<link rel="preconnect" href="https://rsms.me/">
|
|
<link rel="stylesheet" href="https://rsms.me/inter/inter.css">
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/remixicon@4.3.0/fonts/remixicon.css">
|
|
</head>
|
|
<body>
|
|
<header class="admin-header">
|
|
<div class="header-content">
|
|
<div class="header-left">
|
|
<a href="/" class="logo-link">
|
|
<div class="logo">
|
|
<i class="ri-bubble-chart-fill"></i>
|
|
<span class="logo-text">Webring</span>
|
|
</div>
|
|
</a>
|
|
<div class="page-info">
|
|
<h1>Dashboard</h1>
|
|
</div>
|
|
</div>
|
|
<div class="header-right">
|
|
<nav class="header-nav">
|
|
<a href="/user" class="nav-item active">
|
|
<i class="ri-dashboard-line"></i>
|
|
<span>Dashboard</span>
|
|
</a>
|
|
<div class="nav-divider"></div>
|
|
<a href="/" class="nav-item secondary">
|
|
<i class="ri-global-line"></i>
|
|
<span>Public</span>
|
|
</a>
|
|
<form action="/logout" method="POST" style="display: inline;">
|
|
{{csrfField .Request}}
|
|
<button type="submit" class="nav-item logout-btn">
|
|
<i class="ri-logout-circle-line"></i>
|
|
<span>Logout</span>
|
|
</button>
|
|
</form>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
<main>
|
|
{{if .Error}}
|
|
<div class="error-banner">
|
|
<div class="error-banner-icon">
|
|
<i class="ri-error-warning-line"></i>
|
|
</div>
|
|
<div class="error-banner-content">
|
|
<span class="error-banner-text">{{.Error}}</span>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
|
|
<div class="content-header">
|
|
<div class="content-title">
|
|
<h2>Your Sites</h2>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="table-wrapper">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>SLUG</th>
|
|
<th>NAME</th>
|
|
<th>URL</th>
|
|
<th>STATUS</th>
|
|
<th>ACTIONS</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="row-add-new">
|
|
<td>
|
|
<input type="text" name="slug" placeholder="site-slug" form="form-new" pattern="[a-z0-9\-]+" required>
|
|
</td>
|
|
<td>
|
|
<input type="text" name="name" placeholder="Site Name" form="form-new" required>
|
|
</td>
|
|
<td>
|
|
<input type="url" name="url" placeholder="https://example.com" form="form-new" required>
|
|
</td>
|
|
<td>
|
|
<span class="status-badge new">New</span>
|
|
</td>
|
|
<td>
|
|
<div class="actions">
|
|
<button type="submit" form="form-new" class="btn btn-primary btn-sm">
|
|
<i class="ri-check-line"></i>
|
|
</button>
|
|
</div>
|
|
<form action="/user/sites/create" method="POST" style="display: none" id="form-new">
|
|
{{csrfField .Request}}
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
{{range .Sites}}
|
|
<tr class="row-site">
|
|
<td>
|
|
<input type="text" name="slug" value="{{.Slug}}" form="form-{{.ID}}" pattern="[a-z0-9\-]+" required>
|
|
</td>
|
|
<td>
|
|
<div class="cell name-cell">
|
|
{{if .Favicon}}
|
|
<img src="/media/{{.Favicon}}" alt="{{.Name}}" class="favicon">
|
|
{{else}}
|
|
<div class="favicon-placeholder">
|
|
<i class="ri-global-line"></i>
|
|
</div>
|
|
{{end}}
|
|
<input type="text" name="name" value="{{.Name}}" form="form-{{.ID}}" required>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="cell url-cell">
|
|
<input type="url" name="url" value="{{.URL}}" form="form-{{.ID}}" required>
|
|
<a href="{{.URL}}" target="_blank" class="external-link">
|
|
<i class="ri-arrow-right-up-line"></i>
|
|
</a>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
{{if .IsUp}}
|
|
<span class="status-badge up">UP</span>
|
|
{{else}}
|
|
<span class="status-badge down">DOWN</span>
|
|
{{end}}
|
|
</td>
|
|
<td>
|
|
<div class="actions">
|
|
<button type="submit" form="form-{{.ID}}" class="btn btn-primary btn-sm">
|
|
<i class="ri-save-3-line"></i>
|
|
</button>
|
|
</div>
|
|
<form action="/user/sites/{{.ID}}/update" method="POST" id="form-{{.ID}}">
|
|
{{csrfField $.Request}}
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
{{if .Requests}}
|
|
<div class="content-header" style="margin-top: 3rem;">
|
|
<div class="content-title">
|
|
<h2>Pending Requests</h2>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="requests-grid">
|
|
{{range .Requests}}
|
|
<div class="request-card {{.RequestType}}">
|
|
<div class="request-header">
|
|
<div class="request-type">
|
|
{{if eq .RequestType "create"}}
|
|
<span class="type-badge create">
|
|
<i class="ri-add-circle-line"></i>
|
|
New Site
|
|
</span>
|
|
{{else}}
|
|
<span class="type-badge update">
|
|
<i class="ri-edit-line"></i>
|
|
Update Site
|
|
</span>
|
|
{{end}}
|
|
</div>
|
|
<div class="request-time">
|
|
<i class="ri-time-line"></i>
|
|
{{.CreatedAt.Format "Jan 2, 15:04"}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="request-body">
|
|
{{if .Site}}
|
|
<div class="request-site">
|
|
<div class="site-label">Current Site:</div>
|
|
<div class="site-name">{{.Site.Name}}</div>
|
|
<div class="site-slug">{{.Site.Slug}}</div>
|
|
</div>
|
|
{{end}}
|
|
|
|
<div class="request-changes">
|
|
<div class="changes-label">Requested Changes:</div>
|
|
<div class="changes-list">
|
|
{{range $key, $value := .ChangedFields}}
|
|
<div class="change-item">
|
|
<span class="change-key">{{$key}}:</span>
|
|
<span class="change-value">{{$value}}</span>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="request-status">
|
|
<span class="status-indicator pending">
|
|
<i class="ri-time-line"></i>
|
|
Pending Review
|
|
</span>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
</main>
|
|
</body>
|
|
</html> |