misaki/tmpl/admin.html
q 4512570a49
All checks were successful
Build & push Docker image / build (push) Successful in 2m22s
new features and style changes
2026-11-07 12:03:59 -05:00

123 lines
5.1 KiB
HTML

{{template "base.html" .}}
{{define "title"}}Admin{{end}}
{{define "page"}}wide{{end}}
{{define "content"}}
<nav class="nav">
<a href="/dashboard">Dashboard</a>
<a href="/admin">Admin</a>
<form method="POST" action="/logout">
<button>Log out</button>
</form>
</nav>
<h1>Admin</h1>
<h2>Applications ({{len .Pending}})</h2>
{{range .Pending}}
<section class="queue-item">
<div class="queue-head"><strong>{{.Username}}</strong> <span class="dim">{{.CreatedAt.Format "2006-01-02"}}</span></div>
{{if .Note}}<div class="bio-box">{{.Note}}</div>{{end}}
<div class="btn-row">
<form method="POST" action="/admin/action">
<input type="hidden" name="id" value="{{.ID}}">
<input type="hidden" name="action" value="approve">
<button class="go">approve</button>
</form>
<form method="POST" action="/admin/action" onsubmit="return confirm('reject {{.Username}}?')">
<input type="hidden" name="id" value="{{.ID}}">
<input type="hidden" name="action" value="reject">
<button>reject</button>
</form>
</div>
</section>
{{else}}<p class="muted">none waiting</p>{{end}}
<h2>Service requests ({{len .Requests}})</h2>
{{range .Requests}}
<section class="queue-item">
<div class="queue-row queue-head">
<span><strong>{{.User.Username}}</strong> &rarr; {{.Svc.Label}}</span>
<a href="/admin?open={{.User.ID}}#user-{{.User.ID}}">manage</a>
</div>
<div class="btn-row">
<form method="POST" action="/admin/user-service">
<input type="hidden" name="user_id" value="{{.User.ID}}">
<input type="hidden" name="service" value="{{.Svc.Service}}">
<input type="hidden" name="action" value="grant">
<button class="go">grant</button>
</form>
<form method="POST" action="/admin/user-service" class="deny">
<input type="hidden" name="user_id" value="{{.User.ID}}">
<input type="hidden" name="service" value="{{.Svc.Service}}">
<input type="hidden" name="action" value="deny">
<input type="text" name="reason" maxlength="280" placeholder="reason (optional, shown to them)">
<button class="no">deny</button>
</form>
</div>
</section>
{{else}}<p class="muted">none waiting</p>{{end}}
<h2>Members ({{len .Approved}})</h2>
{{range .Approved}}
{{$uid := .ID}}
{{$svcs := index $.UserServices .ID}}
<details class="user-card" id="user-{{.ID}}"{{if eq $.OpenID .ID}} open{{end}}>
<summary>{{.Username}}{{if .IsAdmin}} <span class="tag">admin</span>{{end}}{{with index $.Waiting .ID}} <span class="tag req">{{.}} waiting</span>{{end}}</summary>
<div class="card-body">
{{if .Note}}<div class="bio-box">{{.Note}}</div>{{end}}
{{range $svcs}}
{{$sv := .}}
<div class="svc-row">
<span class="svc-name">{{.Label}}</span>
{{if .Granted}}<span class="tag on">granted</span>{{else if .Applied}}<span class="tag req">requested</span>{{else if .Denied}}<span class="tag no" title="{{.DenyReason}}">denied</span>{{else}}<span class="tag">off</span>{{end}}
<form method="POST" action="/admin/user-service" class="svc-toggle">
<input type="hidden" name="user_id" value="{{$uid}}">
<input type="hidden" name="service" value="{{.Service}}">
{{if .Granted}}<input type="hidden" name="action" value="revoke"><button>revoke</button>
{{else}}<input type="hidden" name="action" value="grant"><button class="go">grant</button>{{end}}
</form>
{{with index $.DataHints .Service}}
<form method="POST" action="/admin/user-service" class="svc-data">
<input type="hidden" name="user_id" value="{{$uid}}">
<input type="hidden" name="service" value="{{$sv.Service}}">
<input type="hidden" name="action" value="setlink">
<input type="text" name="data" placeholder="{{.}}" value="{{$sv.Data}}">
<button>save</button>
</form>
{{end}}
</div>
{{else}}
<p class="muted">no service requests</p>
{{end}}
<form method="POST" action="/admin/action" class="danger" onsubmit="return confirm('remove {{.Username}}? they lose access to everything')">
<input type="hidden" name="id" value="{{.ID}}">
<input type="hidden" name="action" value="reject">
<button>remove member</button>
</form>
</div>
</details>
{{else}}<p class="muted">none</p>{{end}}
<h2>Services</h2>
<div class="chips">
{{range .Services}}
<form method="POST" action="/admin/service">
<input type="hidden" name="service" value="{{.Name}}">
<input type="hidden" name="enabled" value="{{if .Enabled}}0{{else}}1{{end}}">
<button class="chip{{if .Enabled}} on{{end}}" title="{{if .Enabled}}disable{{else}}enable{{end}}">{{.Label}}</button>
</form>
{{end}}
</div>
<p class="dim">Lit = offered on dashboards. Tap to toggle.</p>
<h2>Rejected ({{len .Rejected}})</h2>
{{range .Rejected}}
<section class="queue-item queue-row">
<span>{{.Username}} <span class="dim">{{.CreatedAt.Format "2006-01-02"}}</span></span>
<form method="POST" action="/admin/action">
<input type="hidden" name="id" value="{{.ID}}">
<input type="hidden" name="action" value="reinstate">
<button>reinstate</button>
</form>
</section>
{{else}}<p class="muted">none</p>{{end}}
{{end}}