release edit page! + a lot of other stuff oml

Signed-off-by: ari melody <ari@arimelody.me>
This commit is contained in:
ari melody 2024-08-05 01:23:17 +01:00
parent f276ef1ff2
commit 10f19d46db
23 changed files with 981 additions and 347 deletions

View file

@ -0,0 +1,143 @@
{{define "head"}}
<title>editing {{.Title}} - ari melody 💫</title>
<link rel="shortcut icon" href="{{.GetArtwork}}" type="image/x-icon">
<link rel="stylesheet" href="/admin/static/release.css">
{{end}}
{{define "content"}}
<main>
<div id="release" data-id="{{.ID}}">
<div class="release-artwork">
<img src="{{.Artwork}}" alt="" width="256" loading="lazy" id="artwork">
</div>
<div class="release-info">
<h1 class="release-title">
<!-- <input type="text" name="Title" value="{{.Title}}"> -->
<span id="title" editable="true">{{.Title}}</span>
<small>{{.GetReleaseYear}}</small>
</h1>
<table>
<tr>
<td>Artists</td>
<td>{{.PrintArtists true true}}</td>
</tr>
<tr>
<td>Type</td>
<td>
{{$t := .ReleaseType}}
<select name="Type" id="type">
<option value="single" {{if eq $t "single"}}selected{{end}}>
Single
</option>
<option value="album" {{if eq $t "album"}}selected{{end}}>
Album
</option>
<option value="ep" {{if eq $t "ep"}}selected{{end}}>
EP
</option>
<option value="compilation" {{if eq $t "compilation"}}selected{{end}}>
Compilation
</option>
</select>
</td>
</tr>
<tr>
<td>Description</td>
<td>
<textarea
name="Description"
value="{{.Description}}"
placeholder="No description provided."
rows="3"
id="description"
>{{.Description}}</textarea>
</td>
</tr>
<tr>
<td>Release Date</td>
<td>
<input type="datetime-local" name="Release Date" id="release-date" value="{{.TextReleaseDate}}">
</td>
</tr>
<tr>
<td>Buy Name</td>
<td>
<input type="text" name="Buy Name" id="buyname" value="{{.Buyname}}">
</td>
</tr>
<tr>
<td>Buy Link</td>
<td>
<input type="text" name="Buy Link" id="buylink" value="{{.Buylink}}">
</td>
</tr>
<tr>
<td>Visible</td>
<td>
<select name="Visibility" id="visibility">
<option value="true" {{if .Visible}}selected{{end}}>True</option>
<option value="false" {{if not .Visible}}selected{{end}}>False</option>
</select>
</td>
</tr>
</table>
<div class="release-actions">
<a href="/music/{{.ID}}" class="button">Gateway</a>
<button type="submit" class="save" id="save" disabled>Save</button>
</div>
</div>
</div>
<div class="card-title">
<h2>Credits ({{len .Credits}})</h2>
<button id="update-credits" class="edit">Edit</button>
</div>
<div class="card credits">
{{range $Credit := .Credits}}
<div class="credit">
<img src="{{$Credit.Artist.GetAvatar}}" alt="" width="64" loading="lazy" class="artist-avatar">
<div class="credit-info">
<p class="artist-name"><a href="/admin/artists/{{$Credit.Artist.ID}}">{{$Credit.Artist.Name}}</a></p>
<p class="artist-role">
{{$Credit.Role}}
{{if $Credit.Primary}}
<small>(Primary)</small>
{{end}}
</p>
</div>
</div>
{{end}}
{{if not .Credits}}
<p>There are no credits.</p>
{{end}}
</div>
<div class="card-title">
<h2>Tracklist ({{len .Tracks}})</h2>
<button id="update-tracks" class="edit">Edit</button>
</div>
<div class="card tracks">
{{range $Track := .Tracks}}
<div class="track" data-id="{{$Track.ID}}">
<h2 class="track-title">{{$Track.Number}}. {{$Track.Title}}</h2>
<p class="track-id">{{$Track.ID}}</p>
{{if $Track.Description}}
<p class="track-description">{{$Track.Description}}</p>
{{else}}
<p class="track-description empty">No description provided.</p>
{{end}}
{{if $Track.Lyrics}}
<p class="track-lyrics">{{$Track.Lyrics}}</p>
{{else}}
<p class="track-lyrics empty">There are no lyrics.</p>
{{end}}
</div>
{{end}}
</div>
</main>
<script type="module" src="/admin/static/edit-release.js" defer></script>
{{end}}

97
admin/views/index.html Normal file
View file

@ -0,0 +1,97 @@
{{define "head"}}
<title>admin - ari melody 💫</title>
<link rel="shortcut icon" href="/img/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/admin/static/index.css">
{{end}}
{{define "content"}}
<main>
<div class="card-title">
<h1>Releases</h1>
<a href="/admin/createrelease" class="create-btn">Create New</a>
</div>
<div class="card releases">
{{range $Release := .Releases}}
<div class="release">
<div class="release-artwork">
<img src="{{$Release.Artwork}}" alt="" width="128" loading="lazy">
</div>
<div class="release-info">
<h3 class="release-title">
{{$Release.Title}}
<small>
{{$Release.GetReleaseYear}}
{{if not $Release.Visible}}(hidden){{end}}
</small>
</h3>
<p class="release-artists">{{$Release.PrintArtists true true}}</p>
<p class="release-type-single">{{$Release.ReleaseType}}
({{len $Release.Tracks}} track{{if not (eq (len $Release.Tracks) 1)}}s{{end}})</p>
<div class="release-actions">
<a href="/admin/release/{{$Release.ID}}">Edit</a>
<a href="/music/{{$Release.ID}}" target="_blank">Gateway</a>
</div>
</div>
</div>
{{end}}
{{if not .Releases}}
<p>There are no releases.</p>
{{end}}
</div>
<div class="card-title">
<h1>Artists</h1>
<a href="/admin/createartist" class="create-btn">Create New</a>
</div>
<div class="card artists">
{{range $Artist := .Artists}}
<div class="artist">
<img src="{{$Artist.GetAvatar}}" alt="" width="64" loading="lazy" class="artist-avatar">
<a href="/admin/artists/{{$Artist.ID}}" class="artist-name">{{$Artist.Name}}</a>
</div>
{{end}}
{{if not .Artists}}
<p>There are no artists.</p>
{{end}}
</div>
<div class="card-title">
<h1>Tracks</h1>
<a href="/admin/createtrack" class="create-btn">Create New</a>
</div>
<div class="card tracks">
<p><em>"Orphaned" tracks that have not yet been bound to a release.</em></p>
<br>
{{range $Track := .Tracks}}
<div class="track">
<h2 class="track-title">
{{$Track.Title}}
{{if $Track.Release}}
<small class="track-album">{{$Track.Release.Title}}</small>
{{else}}
<small class="track-album empty">(no release)</small>
{{end}}
</h2>
<p class="track-id">{{$Track.ID}}</p>
{{if $Track.Description}}
<p class="track-description">{{$Track.Description}}</p>
{{else}}
<p class="track-description empty">No description provided.</p>
{{end}}
{{if $Track.Lyrics}}
<p class="track-lyrics">{{$Track.Lyrics}}</p>
{{else}}
<p class="track-lyrics empty">There are no lyrics.</p>
{{end}}
</div>
{{end}}
{{if not .Artists}}
<p>There are no artists.</p>
{{end}}
</div>
</main>
<script type="module" src="/admin/static/admin.js" defer></script>
{{end}}

29
admin/views/layout.html Normal file
View file

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{{block "head" .}}{{end}}
<link rel="stylesheet" href="/admin/static/admin.css">
</head>
<body>
<header>
<img src="/img/favicon.png" alt="" class="icon">
<a href="/">arimelody.me</a>
<a href="/admin">home</a>
<a href="/admin/logout" id="logout">log out</a>
</header>
{{block "content" .}}
{{end}}
{{template "prideflag"}}
</body>
</html>

35
admin/views/login.html Normal file
View file

@ -0,0 +1,35 @@
{{define "head"}}
<title>login - ari melody 💫</title>
<link rel="shortcut icon" href="/img/favicon.png" type="image/x-icon">
<style>
p a {
color: #2a67c8;
}
a.discord {
color: #5865F2;
}
</style>
{{end}}
{{define "content"}}
<main>
{{if .Token}}
<meta http-equiv="refresh" content="5;url=/admin/" />
<meta name="token" content="{{.Token}}" />
<p>
Logged in successfully.
You should be redirected to <a href="/admin">/admin</a> in 5 seconds.
<script>
const token = document.querySelector("meta[name=token]").content;
localStorage.setItem("arime-token", btoa(token));
</script>
</p>
{{else}}
<p>Log in with <a href="{{.DiscordURI}}" class="discord">Discord</a>.</p>
{{end}}
</main>
{{end}}

25
admin/views/logout.html Normal file
View file

@ -0,0 +1,25 @@
{{define "head"}}
<title>admin - ari melody 💫</title>
<link rel="shortcut icon" href="/img/favicon.png" type="image/x-icon">
<style>
p a {
color: #2a67c8;
}
</style>
{{end}}
{{define "content"}}
<main>
<meta http-equiv="refresh" content="5;url=/" />
<p>
Logged out successfully.
You should be redirected to <a href="/">/</a> in 5 seconds.
<script>
localStorage.removeItem("arime-token");
</script>
</p>
</main>
{{end}}