Admin view for User Notes page
This commit is contained in:
parent
483e5a2db3
commit
13775b9722
|
@ -177,9 +177,10 @@ func MyNotes() http.HandlerFunc {
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
// Filter parameters.
|
// Filter parameters.
|
||||||
var (
|
var (
|
||||||
search = r.FormValue("search")
|
search = r.FormValue("search")
|
||||||
sort = r.FormValue("sort")
|
sort = r.FormValue("sort")
|
||||||
sortOK bool
|
adminNotes = r.FormValue("admin_notes") == "true"
|
||||||
|
sortOK bool
|
||||||
)
|
)
|
||||||
|
|
||||||
// Sort options.
|
// Sort options.
|
||||||
|
@ -206,6 +207,11 @@ func MyNotes() http.HandlerFunc {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Admin notes?
|
||||||
|
if adminNotes && !currentUser.IsAdmin {
|
||||||
|
adminNotes = false
|
||||||
|
}
|
||||||
|
|
||||||
// Are we deleting a note?
|
// Are we deleting a note?
|
||||||
if r.Method == http.MethodPost {
|
if r.Method == http.MethodPost {
|
||||||
var (
|
var (
|
||||||
|
@ -253,11 +259,21 @@ func MyNotes() http.HandlerFunc {
|
||||||
PerPage: config.PageSizeAdminUserNotes,
|
PerPage: config.PageSizeAdminUserNotes,
|
||||||
Sort: sort,
|
Sort: sort,
|
||||||
}
|
}
|
||||||
userIDs = []uint64{}
|
userIDs = []uint64{}
|
||||||
|
notes []*models.UserNote
|
||||||
|
adminUserMap models.UserMap
|
||||||
)
|
)
|
||||||
pager.ParsePage(r)
|
pager.ParsePage(r)
|
||||||
|
|
||||||
notes, err := models.PaginateMyUserNotes(currentUser, search, pager)
|
if adminNotes {
|
||||||
|
notes, err = models.PaginateAdminUserNotes(search, pager)
|
||||||
|
if userMap, err := models.MapAdminUsers(currentUser); err == nil {
|
||||||
|
adminUserMap = userMap
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
notes, err = models.PaginateMyUserNotes(currentUser, search, pager)
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.FlashError(w, r, "Error getting your user notes: %s", err)
|
session.FlashError(w, r, "Error getting your user notes: %s", err)
|
||||||
templates.Redirect(w, "/")
|
templates.Redirect(w, "/")
|
||||||
|
@ -274,13 +290,15 @@ func MyNotes() http.HandlerFunc {
|
||||||
}
|
}
|
||||||
|
|
||||||
vars := map[string]interface{}{
|
vars := map[string]interface{}{
|
||||||
"Notes": notes,
|
"Notes": notes,
|
||||||
"Pager": pager,
|
"Pager": pager,
|
||||||
"UserMap": userMap,
|
"UserMap": userMap, // users talked about on this page
|
||||||
|
"AdminUserMap": adminUserMap, // other admin note authors for AdminNotes view
|
||||||
|
|
||||||
// Search filters
|
// Search filters
|
||||||
"Search": search,
|
"Search": search,
|
||||||
"Sort": sort,
|
"Sort": sort,
|
||||||
|
"AdminNotes": adminNotes,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := tmpl.Execute(w, r, vars); err != nil {
|
if err := tmpl.Execute(w, r, vars); err != nil {
|
||||||
|
|
|
@ -451,6 +451,20 @@ func MapUsers(user *User, userIDs []uint64) (UserMap, error) {
|
||||||
return usermap, result.Error
|
return usermap, result.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MapAdminUsers returns a MapUsers result for all admin user accounts on the site.
|
||||||
|
func MapAdminUsers(user *User) (UserMap, error) {
|
||||||
|
adminUsers, err := ListAdminUsers()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var userIDs = []uint64{}
|
||||||
|
for _, user := range adminUsers {
|
||||||
|
userIDs = append(userIDs, user.ID)
|
||||||
|
}
|
||||||
|
return MapUsers(user, userIDs)
|
||||||
|
}
|
||||||
|
|
||||||
// Has a user ID in the map?
|
// Has a user ID in the map?
|
||||||
func (um UserMap) Has(id uint64) bool {
|
func (um UserMap) Has(id uint64) bool {
|
||||||
_, ok := um[id]
|
_, ok := um[id]
|
||||||
|
|
|
@ -2,6 +2,7 @@ package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -134,6 +135,52 @@ func PaginateMyUserNotes(currentUser *User, search string, pager *Pagination) ([
|
||||||
return notes, result.Error
|
return notes, result.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PaginateAdminUserNotes shows all notes written by any admin user account on nonshy.
|
||||||
|
func PaginateAdminUserNotes(search string, pager *Pagination) ([]*UserNote, error) {
|
||||||
|
var (
|
||||||
|
adminUserIDs = []uint64{}
|
||||||
|
notes = []*UserNote{}
|
||||||
|
wheres = []string{}
|
||||||
|
placeholders = []interface{}{}
|
||||||
|
ilike = "%" + search + "%"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Get all the admin users.
|
||||||
|
adminUsers, err := ListAdminUsers()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("couldn't get admin users: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, user := range adminUsers {
|
||||||
|
adminUserIDs = append(adminUserIDs, user.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter to notes written by admin users.
|
||||||
|
wheres = append(wheres, "user_notes.user_id IN ?")
|
||||||
|
placeholders = append(placeholders, adminUserIDs)
|
||||||
|
|
||||||
|
// Searching?
|
||||||
|
if search != "" {
|
||||||
|
wheres = append(wheres, "(users.username ILIKE ? OR user_notes.message ILIKE ?)")
|
||||||
|
placeholders = append(placeholders, ilike, ilike)
|
||||||
|
}
|
||||||
|
|
||||||
|
query := DB.Joins("JOIN users ON users.id = user_notes.about_user_id").Where(
|
||||||
|
strings.Join(wheres, " AND "),
|
||||||
|
placeholders...,
|
||||||
|
).Order(
|
||||||
|
pager.Sort,
|
||||||
|
)
|
||||||
|
|
||||||
|
query.Model(&UserNote{}).Count(&pager.Total)
|
||||||
|
|
||||||
|
result := query.Offset(
|
||||||
|
pager.GetOffset(),
|
||||||
|
).Limit(pager.PerPage).Find(¬es)
|
||||||
|
|
||||||
|
return notes, result.Error
|
||||||
|
}
|
||||||
|
|
||||||
// Save the note.
|
// Save the note.
|
||||||
func (p *UserNote) Save() error {
|
func (p *UserNote) Save() error {
|
||||||
if p.ID == 0 {
|
if p.ID == 0 {
|
||||||
|
|
|
@ -51,6 +51,22 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Admin Notes filter -->
|
||||||
|
{{if .CurrentUser.IsAdmin}}
|
||||||
|
<div class="column">
|
||||||
|
<div class="field">
|
||||||
|
<label class="label has-text-danger" for="admin_notes"><i class="fa fa-peace mr-1"></i> Admin Notes:</label>
|
||||||
|
<label class="checkbox">
|
||||||
|
<input type="checkbox" id="admin_notes"
|
||||||
|
name="admin_notes"
|
||||||
|
value="true"
|
||||||
|
{{if .AdminNotes}}checked{{end}}>
|
||||||
|
Show all notes by admin users
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label class="label" for="sort">Sort by:</label>
|
<label class="label" for="sort">Sort by:</label>
|
||||||
|
@ -113,6 +129,15 @@
|
||||||
</span>
|
</span>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
|
<!-- Admin Notes view? Say which admin wrote this note. -->
|
||||||
|
{{if $Root.AdminNotes}}
|
||||||
|
<span class="ml-4">
|
||||||
|
<strong>Written by:</strong>
|
||||||
|
{{$AdminUser := $Root.AdminUserMap.Get .UserID}}
|
||||||
|
<a href="/u/{{$AdminUser.Username}}">{{$AdminUser.Username}}</a>
|
||||||
|
</span>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
<div class="my-2" style="white-space: pre-wrap; word-break: break-word; overflow: auto">{{.Message}}</div>
|
<div class="my-2" style="white-space: pre-wrap; word-break: break-word; overflow: auto">{{.Message}}</div>
|
||||||
|
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
|
@ -126,11 +151,13 @@
|
||||||
</em>
|
</em>
|
||||||
|
|
||||||
<!-- Delete button -->
|
<!-- Delete button -->
|
||||||
|
{{if eq $Root.CurrentUser.ID .UserID}}
|
||||||
<button type="submit" class="button is-small is-outlined is-danger"
|
<button type="submit" class="button is-small is-outlined is-danger"
|
||||||
onclick="return confirm('Do you want to delete this note?')">
|
onclick="return confirm('Do you want to delete this note?')">
|
||||||
<i class="fa fa-trash mr-1"></i>
|
<i class="fa fa-trash mr-1"></i>
|
||||||
Delete
|
Delete
|
||||||
</button>
|
</button>
|
||||||
|
{{end}}
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -138,6 +165,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
|
{{SimplePager .Pager}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -181,6 +181,10 @@
|
||||||
<span class="icon"><i class="fa fa-eye"></i></span>
|
<span class="icon"><i class="fa fa-eye"></i></span>
|
||||||
<span>Private Photos</span>
|
<span>Private Photos</span>
|
||||||
</a>
|
</a>
|
||||||
|
<a class="navbar-item" href="/notes/me">
|
||||||
|
<span class="icon"><i class="fa fa-pen-to-square"></i></span>
|
||||||
|
<span>My User Notes</span>
|
||||||
|
</a>
|
||||||
{{if .CurrentUser.IsInnerCircle}}
|
{{if .CurrentUser.IsInnerCircle}}
|
||||||
<a class="navbar-item" href="/inner-circle">
|
<a class="navbar-item" href="/inner-circle">
|
||||||
<span class="icon"><img src="/static/img/circle-16.png"></span>
|
<span class="icon"><img src="/static/img/circle-16.png"></span>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user