{{define "title"}}Admin - Scopes & Permissions{{end}} {{define "content"}} {{$Root := .}} <div class="container"> <section class="hero is-danger is-bold"> <div class="hero-body"> <div class="container"> <h1 class="title"> Scopes & Permissions </h1> </div> </div> </section> {{if or (eq .Intent "new") (eq .Intent "edit")}} <!-- Create New/Edit a Group --> <div class="columns mt-2"> <div class="column is-three-quarters"> <h1 class="title"> {{if .EditGroupID}}Edit{{else}}New{{end}} Admin Group </h1> <form action="{{.Request.URL.Path}}" method="POST"> {{InputCSRF}} <input type="hidden" name="id" value="{{.EditGroupID}}"> <div class="field"> <label class="label" for="name">Group Name</label> <input type="text" class="input" name="name" id="name" autocomplete="off" value="{{.EditGroup.Name}}" placeholder="Forum Moderators" {{if .EditGroupID}}readonly{{end}}> </div> <div class="field"> <label class="label" for="scopes">Scopes</label> <textarea class="textarea" cols="80" rows="4" name="scopes" id="scopes" placeholder="one.scope.per.line">{{.EditGroup.ScopesString}}</textarea> <p class="help"> Enter scopes one per line. Wildcards (*) may be used, as in <code>social.moderator.*</code> </p> </div> <div class="field"> <label class="label">Admin Users</label> {{range .AdminUsers}} <div> <label class="checkbox"> <input type="checkbox" name="username" value="{{.Username}}" {{if $Root.EditGroup.HasAdmin .Username}}checked{{end}}> {{.Username}} </label> </div> {{end}} <p class="help"> Select the admin user(s) who should be a part of this group. </p> </div> <div class="field"> <button type="submit" class="button is-primary" name="intent" value="save"> Save Changes </button> {{if .EditGroupID}} <button type="submit" class="button is-danger" name="intent" value="delete" onclick="return window.confirm('Are you sure you want to delete this group?')"> <i class="fa fa-trash mr-1"></i> Delete </button> {{end}} <a href="{{.Request.URL.Path}}" class="button is-secondary"> Cancel </a> </div> </form> </div> <div class="column is-one-quarter"> <div class="card"> <div class="card-header has-background-info"> <p class="card-header-title has-text-light"> Admin Scopes </p> </div> <div class="card-content"> <p class="block"> The complete listing of available admin scopes on the website are as follows: </p> <ul> {{range .AdminScopes}} <li>{{.}}</li> {{end}} </ul> </div> </div> </div> </div> {{else}} <div class="p-4"> <p class="block"> This page allows you to manage the nuanced permissions for admin accounts on {{PrettyTitle}}. Permissions are managed by placing admins into groups, and in turn, assigning one or more scopes to each group. </p> <!-- Superusers group init? --> {{if .NeedSuperuserInit}} <div class="notification is-warning content"> <p> The <strong>Superusers</strong> group was not found! Click the button below to initialize the Superusers group and add yourself to it automatically. </p> <p> <form action="{{.Request.URL.Path}}" method="POST"> {{InputCSRF}} <button type="submit" name="intent" value="init-superusers" class="button is-danger"> Initialize the Superusers Group </button> </form> </p> </div> {{end}} <hr> <h1 class="title">Admin Users</h1> <p class="block"> Found <strong>{{len .AdminUsers}}</strong> admin user account{{Pluralize (len .AdminUsers)}}. </p> <table class="table is-striped is-fullwidth"> <thead> <tr> <th>ID</th> <th>Username</th> <th>Email</th> <th>Admin Groups</th> <th>Scopes</th> </tr> </thead> <tbody> {{range .AdminUsers}} <tr> <td>{{.ID}}</td> <td><a href="/u/{{.Username}}">{{.Username}}</a></td> <td><a href="mailto:{{.Email}}">{{.Email}}</a></td> <td> <ul> {{range .ListAdminGroups}} <li>{{.}}</li> {{end}} </ul> </td> <td> <ul> {{range .ListAdminScopes}} <li>{{.}}</li> {{end}} </ul> </td> </tr> {{end}} </tbody> </table> <hr> <h1 class="title">Admin Groups</h1> <p class="block"> Found <strong>{{len .AdminGroups}}</strong> admin group{{Pluralize (len .AdminUsers)}}. <a href="{{.Request.URL.Path}}?intent=new">Create new group.</a> </p> <table class="table is-striped is-fullwidth"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Scopes</th> <th>Users</th> <th>Edit</th> </tr> </thead> <tbody> {{range .AdminGroups}} <tr> <td>{{.ID}}</td> <td>{{.Name}}</td> <td> <ul> {{range .Scopes}} <li>{{.Scope}}</li> {{end}} </ul> </td> <td> <ul> {{range .Users}} <li> <a href="/u/{{.Username}}">{{.Username}}</a> </li> {{end}} </ul> </td> <td> <a href="{{$Root.Request.URL.Path}}?intent=edit&id={{.ID}}">Edit</a> </td> </tr> {{end}} </tbody> </table> </div> {{end}} </div> {{end}}