All checks were successful
Build & push Docker image / build (push) Successful in 2m22s
123 lines
5.1 KiB
HTML
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> → {{.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}}
|