{{define "title"}}Admin - Certification Photos{{end}} {{define "content"}} {{$Root := .}} <div class="container"> <section class="hero is-danger is-bold"> <div class="hero-body"> <div class="container"> <h1 class="title"> Admin / Certification Photos </h1> </div> </div> </section> <div class="block p-4"> <div class="columns"> <div class="column"> {{if .Pager}} There {{Pluralize64 .Pager.Total "is" "are"}} <strong>{{.Pager.Total}}</strong> Certification Photo{{Pluralize64 .Pager.Total}} {{if eq .View "pending"}} needing approval. {{else}} at status "{{.View}}." {{end}} {{else if .FoundUser}} Found user <strong><a href="/u/{{.FoundUser.Username}}" class="has-text-dark">{{.FoundUser.Username}}</a></strong> (<a href="mailto:{{.FoundUser.Email}}">{{.FoundUser.Email}}</a>) {{end}} </div> <div class="column is-narrow"> <div class="tabs is-toggle"> <ul> <li{{if eq .View "pending"}} class="is-active"{{end}}> <a href="{{.Request.URL.Path}}?view=pending">Needing Approval</a> </li> <li{{if eq .View "approved"}} class="is-active"{{end}}> <a href="{{.Request.URL.Path}}?view=approved">Approved</a> </li> <li{{if eq .View "rejected"}} class="is-active"{{end}}> <a href="{{.Request.URL.Path}}?view=rejected">Rejected</a> </li> </ul> </div> </div> </div> <div class="block"> <form method="GET" action="{{.Request.URL.Path}}"> <div class="field block"> <div class="label" for="username">Search username or email:</div> <input type="text" class="input" name="username" id="username" placeholder="Press Enter to search"> </div> </form> </div> {{if .Pager}} {{SimplePager .Pager}} {{end}} <div class="columns is-multiline"> {{range .Photos}} <div class="column is-one-third"> {{$User := $Root.UserMap.Get .UserID}} <form action="{{$Root.Request.URL.Path}}" method="POST"> {{InputCSRF}} <input type="hidden" name="user_id" value="{{$User.ID}}"> <div class="card" style="max-width: 512px"> <header class="card-header has-background-link"> <p class="card-header-title has-text-light"> <span class="icon"><i class="fa fa-user"></i></span> <span>{{or $User.Username "[deleted]"}}</span> </p> </header> {{if .Filename}} <div class="card-image"> <figure class="image"> <img src="{{PhotoURL .Filename}}"> </figure> </div> {{end}} <div class="card-content"> <div class="media block"> <div class="media-left"> <figure class="image is-48x48"> {{if $User.ProfilePhoto.ID}} <img src="{{PhotoURL $User.ProfilePhoto.CroppedFilename}}"> {{else}} <img src="/static/img/shy.png"> {{end}} </figure> </div> <div class="media-content"> <p class="title is-4">{{$User.NameOrUsername}}</p> <p class="subtitle is-6"> <span class="icon"><i class="fa fa-user"></i></span> <a href="/u/{{$User.Username}}" target="_blank">{{$User.Username}}</a> </p> </div> </div> <div class="block"> <div class="columns"> <div class="column is-narrow"> <strong>Status:</strong> </div> <div class="column"> {{if eq .Status "pending"}} <strong class="has-text-warning">Pending Approval</strong> {{else if eq .Status "approved"}} <strong class="has-text-success">Approved</strong> {{else if eq .Status "rejected"}} <strong class="has-text-danger">Rejected</strong> {{else}} <strong>{{.Status}}</strong> {{end}} <!-- Secondary approved? --> {{if .SecondaryVerified}} <strong class="has-text-info"> <i class="fa fa-id-card ml-3 mr-1"></i> ID Verified </strong> {{end}} </div> </div> </div> <!-- Secondary photo ID attached? --> {{if .SecondaryFilename}} <div class="block"> <div class="mb-2"> <strong class="has-text-success"> <i class="fa fa-id-card"></i> Secondary Photo ID Attached </strong> </div> <img src="{{PhotoURL .SecondaryFilename}}"> </div> {{end}} <div class="block"> <strong><i class="fa fa-location-dot mr-1"></i> GeoIP Insights:</strong> <div> {{$Insights := $Root.InsightsMap.Get .IPAddress}} {{if $Insights.IsZero}} <span class="has-text-danger">No GeoIP insights available for this IP address!</span> {{else}} {{$Insights.Medium}} {{end}} </div> <div> IP: {{.IPAddress}} </div> </div> <!-- Secondary ID was needed in the past for this user --> {{if .SecondaryNeeded}} <div class="block is-size-7 has-text-warning"> <i class="fa fa-id-card"></i> A secondary form of ID was requested from this user once before. They will always be asked for a secondary ID if they replace their cert photo in the future. </div> {{end}} <div class="field"> <textarea class="textarea" name="comment" cols="60" rows="2" placeholder="Admin comment (for rejection)">{{.AdminComment}}</textarea> <div class="select is-fullwidth"> <select class="common-reasons"> <option value="">(Common Rejection Reasons)</option> <optgroup label="Common Rejection Reasons"> <option value="Your certification pic should depict you holding onto a sheet of paper with your username, site name, and current date written on it."> Didn't follow directions </option> <option value="The sheet of paper must also include the website name: nonshy">Website name not visible</option> <option value="Please take a clearer picture that shows your arm and hand holding onto the sheet of paper">Unclear picture (hand not visible enough)</option> <option value="This photo has been digitally altered, please take a new certification picture and upload it as it comes off your camera">Photoshopped or digitally altered</option> <option value="You had a previous account on nonshy which was suspended and you are not welcome with a new account.">User was previously banned from nonshy</option> <option value="This is not an acceptable certification photo.">Not acceptable</option> </optgroup> <optgroup label="Secondary Verification"> <option value="(secondary)"> User appears underage, ask for secondary ID </option> </optgroup> <optgroup label="Other Actions"> <option value="(ignore)">(Silently reject this photo without sending an e-mail)</option> </optgroup> </select> </div> </div> <div class="field"> <a href="/admin/changelog?table_name=certification_photos&about_user_id={{$User.ID}}" class="button is-small has-text-warning"> <span class="icon"><i class="fa fa-clipboard-list"></i></span> <span>Change Log</span> </a> </div> </div> <footer class="card-footer"> {{if not (eq .Status "rejected")}} <button type="submit" name="verdict" value="reject" class="card-footer-item button is-danger"> <span class="icon"><i class="fa fa-xmark"></i></span> <span>Reject</span> </button> {{end}} {{if not (eq .Status "approved")}} <button type="submit" name="verdict" value="approve" class="card-footer-item button is-success"> <span class="icon"><i class="fa fa-check"></i></span> <span>Approve</span> </button> {{end}} </footer> </div> </form> </div> {{end}} </div> </div> </div> {{end}} {{define "scripts"}} <script> window.addEventListener("DOMContentLoaded", (event) => { document.querySelectorAll("select.common-reasons").forEach(elem => { let textarea = elem.parentNode.parentNode.getElementsByTagName("textarea")[0], approveButton = elem.parentNode.parentNode.parentNode.parentNode.querySelector("button.is-success"); // Grey out the Approve button if a rejection reason is filled out. let setApproveState = () => { if (textarea.value.length > 0) { approveButton.disabled = "disabled"; } else { approveButton.disabled = null; } }; textarea.addEventListener("change", setApproveState); textarea.addEventListener("keyup", setApproveState); elem.addEventListener("change", (e) => { textarea.value = elem.value; setApproveState(); }); }) }); </script> {{end}}