Moved the tree counter node into it's own experimental area.

Added ItemList microdata to /forum/, /forums/, and /topics.
Moved the meta description for /forums/ to the right place.

Began revamping the Control Panel menu.
This commit is contained in:
Azareal 2017-12-27 23:38:37 +00:00
parent 21999cd7c6
commit ac9623ab6b
28 changed files with 237 additions and 190 deletions

View File

@ -245,20 +245,3 @@ func (counter *DefaultTopicViewCounter) Bump(topicID int) {
counter.oddLock.Unlock() counter.oddLock.Unlock()
} }
} }
type TreeCounterNode struct {
Value int64
Zero *TreeCounterNode
One *TreeCounterNode
Parent *TreeCounterNode
}
// MEGA EXPERIMENTAL. Start from the right-most bits in the integer and move leftwards
type TreeTopicViewCounter struct {
zero *TreeCounterNode
one *TreeCounterNode
}
func (counter *TreeTopicViewCounter) Bump(topicID int64) {
}

View File

@ -125,6 +125,7 @@ type PanelPage struct {
CurrentUser User CurrentUser User
Header *HeaderVars Header *HeaderVars
Stats PanelStats Stats PanelStats
Zone string
ItemList []interface{} ItemList []interface{}
Something interface{} Something interface{}
} }
@ -144,6 +145,7 @@ type PanelDashboardPage struct {
CurrentUser User CurrentUser User
Header *HeaderVars Header *HeaderVars
Stats PanelStats Stats PanelStats
Zone string
GridItems []GridElement GridItems []GridElement
} }
@ -152,6 +154,7 @@ type PanelThemesPage struct {
CurrentUser User CurrentUser User
Header *HeaderVars Header *HeaderVars
Stats PanelStats Stats PanelStats
Zone string
PrimaryThemes []*Theme PrimaryThemes []*Theme
VariantThemes []*Theme VariantThemes []*Theme
} }
@ -161,6 +164,7 @@ type PanelUserPage struct {
CurrentUser User CurrentUser User
Header *HeaderVars Header *HeaderVars
Stats PanelStats Stats PanelStats
Zone string
ItemList []User ItemList []User
PageList []int PageList []int
Page int Page int
@ -172,6 +176,7 @@ type PanelGroupPage struct {
CurrentUser User CurrentUser User
Header *HeaderVars Header *HeaderVars
Stats PanelStats Stats PanelStats
Zone string
ItemList []GroupAdmin ItemList []GroupAdmin
PageList []int PageList []int
Page int Page int
@ -183,6 +188,7 @@ type PanelEditGroupPage struct {
CurrentUser User CurrentUser User
Header *HeaderVars Header *HeaderVars
Stats PanelStats Stats PanelStats
Zone string
ID int ID int
Name string Name string
Tag string Tag string
@ -200,6 +206,7 @@ type PanelEditForumPage struct {
CurrentUser User CurrentUser User
Header *HeaderVars Header *HeaderVars
Stats PanelStats Stats PanelStats
Zone string
ID int ID int
Name string Name string
Desc string Desc string
@ -208,11 +215,6 @@ type PanelEditForumPage struct {
Groups []GroupForumPermPreset Groups []GroupForumPermPreset
} }
/*type NameLangPair struct {
Name string
LangStr string
}*/
type NameLangToggle struct { type NameLangToggle struct {
Name string Name string
LangStr string LangStr string
@ -224,6 +226,7 @@ type PanelEditGroupPermsPage struct {
CurrentUser User CurrentUser User
Header *HeaderVars Header *HeaderVars
Stats PanelStats Stats PanelStats
Zone string
ID int ID int
Name string Name string
LocalPerms []NameLangToggle LocalPerms []NameLangToggle
@ -243,6 +246,7 @@ type PanelBackupPage struct {
CurrentUser User CurrentUser User
Header *HeaderVars Header *HeaderVars
Stats PanelStats Stats PanelStats
Zone string
Backups []BackupItem Backups []BackupItem
} }
@ -257,6 +261,7 @@ type PanelLogsPage struct {
CurrentUser User CurrentUser User
Header *HeaderVars Header *HeaderVars
Stats PanelStats Stats PanelStats
Zone string
Logs []LogItem Logs []LogItem
PageList []int PageList []int
Page int Page int
@ -268,6 +273,7 @@ type PanelDebugPage struct {
CurrentUser User CurrentUser User
Header *HeaderVars Header *HeaderVars
Stats PanelStats Stats PanelStats
Zone string
Uptime string Uptime string
OpenConns int OpenConns int
DBAdapter string DBAdapter string

View File

@ -25,6 +25,7 @@ var ShutdownTasks []func() error
var taskStmts TaskStmts var taskStmts TaskStmts
var lastSync time.Time var lastSync time.Time
// TODO: Add a TaskInits.Add
func init() { func init() {
lastSync = time.Now() lastSync = time.Now()
DbInits.Add(func(acc *qgen.Accumulator) error { DbInits.Add(func(acc *qgen.Accumulator) error {

View File

@ -141,7 +141,7 @@ func routePanel(w http.ResponseWriter, r *http.Request, user common.User) common
gridElements = append(gridElements, common.GridElement{"dash-visitorsperweek", "2 visitors / week", 13, "grid_stat stat_disabled", "", "", "Coming Soon!" /*"The number of unique visitors we've had over the last 7 days"*/}) gridElements = append(gridElements, common.GridElement{"dash-visitorsperweek", "2 visitors / week", 13, "grid_stat stat_disabled", "", "", "Coming Soon!" /*"The number of unique visitors we've had over the last 7 days"*/})
gridElements = append(gridElements, common.GridElement{"dash-postsperuser", "5 posts / user / week", 14, "grid_stat stat_disabled", "", "", "Coming Soon!" /*"The average number of posts made by each active user over the past week"*/}) gridElements = append(gridElements, common.GridElement{"dash-postsperuser", "5 posts / user / week", 14, "grid_stat stat_disabled", "", "", "Coming Soon!" /*"The average number of posts made by each active user over the past week"*/})
pi := common.PanelDashboardPage{common.GetTitlePhrase("panel-dashboard"), user, headerVars, stats, gridElements} pi := common.PanelDashboardPage{common.GetTitlePhrase("panel-dashboard"), user, headerVars, stats, "dashboard", gridElements}
if common.PreRenderHooks["pre_render_panel_dashboard"] != nil { if common.PreRenderHooks["pre_render_panel_dashboard"] != nil {
if common.RunPreRenderHook("pre_render_panel_dashboard", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_dashboard", w, r, &user, &pi) {
return nil return nil
@ -180,7 +180,7 @@ func routePanelForums(w http.ResponseWriter, r *http.Request, user common.User)
forumList = append(forumList, fadmin) forumList = append(forumList, fadmin)
} }
} }
pi := common.PanelPage{common.GetTitlePhrase("panel-forums"), user, headerVars, stats, forumList, nil} pi := common.PanelPage{common.GetTitlePhrase("panel-forums"), user, headerVars, stats, "forums", forumList, nil}
if common.PreRenderHooks["pre_render_panel_forums"] != nil { if common.PreRenderHooks["pre_render_panel_forums"] != nil {
if common.RunPreRenderHook("pre_render_panel_forums", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_forums", w, r, &user, &pi) {
return nil return nil
@ -244,7 +244,7 @@ func routePanelForumsDelete(w http.ResponseWriter, r *http.Request, user common.
confirmMsg := "Are you sure you want to delete the '" + forum.Name + "' forum?" confirmMsg := "Are you sure you want to delete the '" + forum.Name + "' forum?"
yousure := common.AreYouSure{"/panel/forums/delete/submit/" + strconv.Itoa(fid), confirmMsg} yousure := common.AreYouSure{"/panel/forums/delete/submit/" + strconv.Itoa(fid), confirmMsg}
pi := common.PanelPage{common.GetTitlePhrase("panel-delete-forum"), user, headerVars, stats, tList, yousure} pi := common.PanelPage{common.GetTitlePhrase("panel-delete-forum"), user, headerVars, stats, "forums", tList, yousure}
if common.PreRenderHooks["pre_render_panel_delete_forum"] != nil { if common.PreRenderHooks["pre_render_panel_delete_forum"] != nil {
if common.RunPreRenderHook("pre_render_panel_delete_forum", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_delete_forum", w, r, &user, &pi) {
return nil return nil
@ -320,7 +320,7 @@ func routePanelForumsEdit(w http.ResponseWriter, r *http.Request, user common.Us
gplist = append(gplist, common.GroupForumPermPreset{group, common.ForumPermsToGroupForumPreset(group.Forums[fid])}) gplist = append(gplist, common.GroupForumPermPreset{group, common.ForumPermsToGroupForumPreset(group.Forums[fid])})
} }
pi := common.PanelEditForumPage{common.GetTitlePhrase("panel-edit-forum"), user, headerVars, stats, forum.ID, forum.Name, forum.Desc, forum.Active, forum.Preset, gplist} pi := common.PanelEditForumPage{common.GetTitlePhrase("panel-edit-forum"), user, headerVars, stats, "forums", forum.ID, forum.Name, forum.Desc, forum.Active, forum.Preset, gplist}
if common.PreRenderHooks["pre_render_panel_edit_forum"] != nil { if common.PreRenderHooks["pre_render_panel_edit_forum"] != nil {
if common.RunPreRenderHook("pre_render_panel_edit_forum", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_edit_forum", w, r, &user, &pi) {
return nil return nil
@ -458,7 +458,7 @@ func routePanelSettings(w http.ResponseWriter, r *http.Request, user common.User
settingList[setting.Name] = setting.Content settingList[setting.Name] = setting.Content
} }
pi := common.PanelPage{common.GetTitlePhrase("panel-settings"), user, headerVars, stats, tList, settingList} pi := common.PanelPage{common.GetTitlePhrase("panel-settings"), user, headerVars, stats, "settings", tList, settingList}
if common.PreRenderHooks["pre_render_panel_settings"] != nil { if common.PreRenderHooks["pre_render_panel_settings"] != nil {
if common.RunPreRenderHook("pre_render_panel_settings", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_settings", w, r, &user, &pi) {
return nil return nil
@ -504,7 +504,7 @@ func routePanelSettingEdit(w http.ResponseWriter, r *http.Request, user common.U
} }
} }
pi := common.PanelPage{common.GetTitlePhrase("panel-edit-setting"), user, headerVars, stats, itemList, setting} pi := common.PanelPage{common.GetTitlePhrase("panel-edit-setting"), user, headerVars, stats, "settings", itemList, setting}
if common.PreRenderHooks["pre_render_panel_setting"] != nil { if common.PreRenderHooks["pre_render_panel_setting"] != nil {
if common.RunPreRenderHook("pre_render_panel_setting", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_setting", w, r, &user, &pi) {
return nil return nil
@ -549,7 +549,7 @@ func routePanelWordFilters(w http.ResponseWriter, r *http.Request, user common.U
} }
var filterList = common.WordFilterBox.Load().(common.WordFilterMap) var filterList = common.WordFilterBox.Load().(common.WordFilterMap)
pi := common.PanelPage{common.GetTitlePhrase("panel-word-filters"), user, headerVars, stats, tList, filterList} pi := common.PanelPage{common.GetTitlePhrase("panel-word-filters"), user, headerVars, stats, "word-filters", tList, filterList}
if common.PreRenderHooks["pre_render_panel_word_filters"] != nil { if common.PreRenderHooks["pre_render_panel_word_filters"] != nil {
if common.RunPreRenderHook("pre_render_panel_word_filters", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_word_filters", w, r, &user, &pi) {
return nil return nil
@ -610,7 +610,7 @@ func routePanelWordFiltersEdit(w http.ResponseWriter, r *http.Request, user comm
_ = wfid _ = wfid
pi := common.PanelPage{common.GetTitlePhrase("panel-edit-word-filter"), user, headerVars, stats, tList, nil} pi := common.PanelPage{common.GetTitlePhrase("panel-edit-word-filter"), user, headerVars, stats, "word-filters", tList, nil}
if common.PreRenderHooks["pre_render_panel_word_filters_edit"] != nil { if common.PreRenderHooks["pre_render_panel_word_filters_edit"] != nil {
if common.RunPreRenderHook("pre_render_panel_word_filters_edit", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_word_filters_edit", w, r, &user, &pi) {
return nil return nil
@ -703,7 +703,7 @@ func routePanelPlugins(w http.ResponseWriter, r *http.Request, user common.User)
pluginList = append(pluginList, plugin) pluginList = append(pluginList, plugin)
} }
pi := common.PanelPage{common.GetTitlePhrase("panel-plugins"), user, headerVars, stats, pluginList, nil} pi := common.PanelPage{common.GetTitlePhrase("panel-plugins"), user, headerVars, stats, "plugins", pluginList, nil}
if common.PreRenderHooks["pre_render_panel_plugins"] != nil { if common.PreRenderHooks["pre_render_panel_plugins"] != nil {
if common.RunPreRenderHook("pre_render_panel_plugins", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_plugins", w, r, &user, &pi) {
return nil return nil
@ -924,7 +924,7 @@ func routePanelUsers(w http.ResponseWriter, r *http.Request, user common.User) c
} }
pageList := common.Paginate(stats.Users, perPage, 5) pageList := common.Paginate(stats.Users, perPage, 5)
pi := common.PanelUserPage{common.GetTitlePhrase("panel-users"), user, headerVars, stats, userList, pageList, page, lastPage} pi := common.PanelUserPage{common.GetTitlePhrase("panel-users"), user, headerVars, stats, "users", userList, pageList, page, lastPage}
if common.PreRenderHooks["pre_render_panel_users"] != nil { if common.PreRenderHooks["pre_render_panel_users"] != nil {
if common.RunPreRenderHook("pre_render_panel_users", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_users", w, r, &user, &pi) {
return nil return nil
@ -979,7 +979,7 @@ func routePanelUsersEdit(w http.ResponseWriter, r *http.Request, user common.Use
groupList = append(groupList, group) groupList = append(groupList, group)
} }
pi := common.PanelPage{common.GetTitlePhrase("panel-edit-user"), user, headerVars, stats, groupList, targetUser} pi := common.PanelPage{common.GetTitlePhrase("panel-edit-user"), user, headerVars, stats, "users", groupList, targetUser}
if common.PreRenderHooks["pre_render_panel_edit_user"] != nil { if common.PreRenderHooks["pre_render_panel_edit_user"] != nil {
if common.RunPreRenderHook("pre_render_panel_edit_user", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_edit_user", w, r, &user, &pi) {
return nil return nil
@ -1120,7 +1120,7 @@ func routePanelGroups(w http.ResponseWriter, r *http.Request, user common.User)
//log.Printf("groupList: %+v\n", groupList) //log.Printf("groupList: %+v\n", groupList)
pageList := common.Paginate(stats.Groups, perPage, 5) pageList := common.Paginate(stats.Groups, perPage, 5)
pi := common.PanelGroupPage{common.GetTitlePhrase("panel-groups"), user, headerVars, stats, groupList, pageList, page, lastPage} pi := common.PanelGroupPage{common.GetTitlePhrase("panel-groups"), user, headerVars, stats, "groups", groupList, pageList, page, lastPage}
if common.PreRenderHooks["pre_render_panel_groups"] != nil { if common.PreRenderHooks["pre_render_panel_groups"] != nil {
if common.RunPreRenderHook("pre_render_panel_groups", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_groups", w, r, &user, &pi) {
return nil return nil
@ -1179,7 +1179,7 @@ func routePanelGroupsEdit(w http.ResponseWriter, r *http.Request, user common.Us
disableRank := !user.Perms.EditGroupGlobalPerms || (group.ID == 6) disableRank := !user.Perms.EditGroupGlobalPerms || (group.ID == 6)
pi := common.PanelEditGroupPage{common.GetTitlePhrase("panel-edit-group"), user, headerVars, stats, group.ID, group.Name, group.Tag, rank, disableRank} pi := common.PanelEditGroupPage{common.GetTitlePhrase("panel-edit-group"), user, headerVars, stats, "groups", group.ID, group.Name, group.Tag, rank, disableRank}
if common.PreRenderHooks["pre_render_panel_edit_group"] != nil { if common.PreRenderHooks["pre_render_panel_edit_group"] != nil {
if common.RunPreRenderHook("pre_render_panel_edit_group", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_edit_group", w, r, &user, &pi) {
return nil return nil
@ -1257,7 +1257,7 @@ func routePanelGroupsEditPerms(w http.ResponseWriter, r *http.Request, user comm
globalPerms = append(globalPerms, common.NameLangToggle{"ViewIPs", common.GetGlobalPermPhrase("ViewIPs"), group.Perms.ViewIPs}) globalPerms = append(globalPerms, common.NameLangToggle{"ViewIPs", common.GetGlobalPermPhrase("ViewIPs"), group.Perms.ViewIPs})
globalPerms = append(globalPerms, common.NameLangToggle{"UploadFiles", common.GetGlobalPermPhrase("UploadFiles"), group.Perms.UploadFiles}) globalPerms = append(globalPerms, common.NameLangToggle{"UploadFiles", common.GetGlobalPermPhrase("UploadFiles"), group.Perms.UploadFiles})
pi := common.PanelEditGroupPermsPage{common.GetTitlePhrase("panel-edit-group"), user, headerVars, stats, group.ID, group.Name, localPerms, globalPerms} pi := common.PanelEditGroupPermsPage{common.GetTitlePhrase("panel-edit-group"), user, headerVars, stats, "groups", group.ID, group.Name, localPerms, globalPerms}
if common.PreRenderHooks["pre_render_panel_edit_group_perms"] != nil { if common.PreRenderHooks["pre_render_panel_edit_group_perms"] != nil {
if common.RunPreRenderHook("pre_render_panel_edit_group_perms", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_edit_group_perms", w, r, &user, &pi) {
return nil return nil
@ -1486,7 +1486,7 @@ func routePanelThemes(w http.ResponseWriter, r *http.Request, user common.User)
} }
pi := common.PanelThemesPage{common.GetTitlePhrase("panel-themes"), user, headerVars, stats, pThemeList, vThemeList} pi := common.PanelThemesPage{common.GetTitlePhrase("panel-themes"), user, headerVars, stats, "themes", pThemeList, vThemeList}
if common.PreRenderHooks["pre_render_panel_themes"] != nil { if common.PreRenderHooks["pre_render_panel_themes"] != nil {
if common.RunPreRenderHook("pre_render_panel_themes", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_themes", w, r, &user, &pi) {
return nil return nil
@ -1603,7 +1603,7 @@ func routePanelBackups(w http.ResponseWriter, r *http.Request, user common.User,
backupList = append(backupList, common.BackupItem{backupFile.Name(), backupFile.ModTime()}) backupList = append(backupList, common.BackupItem{backupFile.Name(), backupFile.ModTime()})
} }
pi := common.PanelBackupPage{common.GetTitlePhrase("panel-backups"), user, headerVars, stats, backupList} pi := common.PanelBackupPage{common.GetTitlePhrase("panel-backups"), user, headerVars, stats, "backups", backupList}
err = common.Templates.ExecuteTemplate(w, "panel-backups.html", pi) err = common.Templates.ExecuteTemplate(w, "panel-backups.html", pi)
if err != nil { if err != nil {
return common.InternalError(err, w, r) return common.InternalError(err, w, r)
@ -1701,7 +1701,7 @@ func routePanelLogsMod(w http.ResponseWriter, r *http.Request, user common.User)
} }
pageList := common.Paginate(logCount, perPage, 5) pageList := common.Paginate(logCount, perPage, 5)
pi := common.PanelLogsPage{common.GetTitlePhrase("panel-mod-logs"), user, headerVars, stats, logs, pageList, page, lastPage} pi := common.PanelLogsPage{common.GetTitlePhrase("panel-mod-logs"), user, headerVars, stats, "logs", logs, pageList, page, lastPage}
if common.PreRenderHooks["pre_render_panel_mod_log"] != nil { if common.PreRenderHooks["pre_render_panel_mod_log"] != nil {
if common.RunPreRenderHook("pre_render_panel_mod_log", w, r, &user, &pi) { if common.RunPreRenderHook("pre_render_panel_mod_log", w, r, &user, &pi) {
return nil return nil
@ -1725,7 +1725,7 @@ func routePanelDebug(w http.ResponseWriter, r *http.Request, user common.User) c
openConnCount := dbStats.OpenConnections openConnCount := dbStats.OpenConnections
// Disk I/O? // Disk I/O?
pi := common.PanelDebugPage{common.GetTitlePhrase("panel-debug"), user, headerVars, stats, uptime, openConnCount, dbAdapter} pi := common.PanelDebugPage{common.GetTitlePhrase("panel-debug"), user, headerVars, stats, "debug", uptime, openConnCount, dbAdapter}
err := common.Templates.ExecuteTemplate(w, "panel-debug.html", pi) err := common.Templates.ExecuteTemplate(w, "panel-debug.html", pi)
if err != nil { if err != nil {
return common.InternalError(err, w, r) return common.InternalError(err, w, r)

View File

@ -303,7 +303,6 @@ func routeForum(w http.ResponseWriter, r *http.Request, user common.User, sfid s
return common.InternalError(err, w, r) return common.InternalError(err, w, r)
} }
headerVars.Zone = "view_forum" headerVars.Zone = "view_forum"
headerVars.MetaDesc = headerVars.Settings["meta_desc"].(string)
// Calculate the offset // Calculate the offset
var offset int var offset int
@ -390,6 +389,7 @@ func routeForums(w http.ResponseWriter, r *http.Request, user common.User) commo
return ferr return ferr
} }
headerVars.Zone = "forums" headerVars.Zone = "forums"
headerVars.MetaDesc = headerVars.Settings["meta_desc"].(string)
var err error var err error
var forumList []common.Forum var forumList []common.Forum

View File

@ -4,10 +4,10 @@
{{if ne .LastPage .Page}}<link rel="prerender" href="/forum/{{.Forum.ID}}?page={{add .Page 1}}" /> {{if ne .LastPage .Page}}<link rel="prerender" href="/forum/{{.Forum.ID}}?page={{add .Page 1}}" />
<div id="nextFloat" class="next_button"><a class="next_link" aria-label="Go to the next page" rel="next" href="/forum/{{.Forum.ID}}?page={{add .Page 1}}">&gt;</a></div>{{end}} <div id="nextFloat" class="next_button"><a class="next_link" aria-label="Go to the next page" rel="next" href="/forum/{{.Forum.ID}}?page={{add .Page 1}}">&gt;</a></div>{{end}}
<main> <main itemscope itemtype="http://schema.org/ItemList">
<div id="forum_head_block" class="rowblock rowhead topic_list_title_block"> <div id="forum_head_block" class="rowblock rowhead topic_list_title_block">
<div class="rowitem forum_title{{if ne .CurrentUser.ID 0}} has_opt{{end}}"> <div class="rowitem forum_title{{if ne .CurrentUser.ID 0}} has_opt{{end}}">
<h1>{{.Title}}</h1> <h1 itemprop="name">{{.Title}}</h1>
</div> </div>
{{if ne .CurrentUser.ID 0}} {{if ne .CurrentUser.ID 0}}
{{if .CurrentUser.Perms.CreateTopic}} {{if .CurrentUser.Perms.CreateTopic}}
@ -74,7 +74,7 @@
<span class="selector"></span> <span class="selector"></span>
<a href="{{.Creator.Link}}"><img src="{{.Creator.Avatar}}" height="64" alt="{{.Creator.Name}}'s Avatar" title="{{.Creator.Name}}'s Avatar" /></a> <a href="{{.Creator.Link}}"><img src="{{.Creator.Avatar}}" height="64" alt="{{.Creator.Name}}'s Avatar" title="{{.Creator.Name}}'s Avatar" /></a>
<span class="topic_inner_left"> <span class="topic_inner_left">
<a class="rowtopic" href="{{.Link}}"><span>{{.Title}}</span></a> <a class="rowtopic" href="{{.Link}}" itemprop="itemListElement"><span>{{.Title}}</span></a>
<br /><a class="rowsmall starter" href="{{.Creator.Link}}">{{.Creator.Name}}</a> <br /><a class="rowsmall starter" href="{{.Creator.Link}}">{{.Creator.Name}}</a>
{{/** TODO: Avoid the double '|' when both .IsClosed and .Sticky are set to true. We could probably do this with CSS **/}} {{/** TODO: Avoid the double '|' when both .IsClosed and .Sticky are set to true. We could probably do this with CSS **/}}
{{if .IsClosed}}<span class="rowsmall topic_status_e topic_status_closed" title="Status: Closed"> | &#x1F512;&#xFE0E</span>{{end}} {{if .IsClosed}}<span class="rowsmall topic_status_e topic_status_closed" title="Status: Closed"> | &#x1F512;&#xFE0E</span>{{end}}

View File

@ -1,15 +1,16 @@
{{template "header.html" . }} {{template "header.html" . }}
<main> <main itemscope itemtype="http://schema.org/ItemList">
<div class="rowblock opthead"> <div class="rowblock opthead">
<div class="rowitem"><h1>Forums</h1></div> <div class="rowitem"><h1 itemprop="name">Forums</h1></div>
</div> </div>
<div class="rowblock forum_list"> <div class="rowblock forum_list">
{{range .ItemList}}<div class="rowitem {{if (.Desc) or (.LastTopic.Title)}}datarow{{end}}"> {{range .ItemList}}<div class="rowitem {{if (.Desc) or (.LastTopic.Title)}}datarow {{end}}"itemprop="itemListElement" itemscope
itemtype="http://schema.org/ListItem">
<span class="forum_left shift_left"> <span class="forum_left shift_left">
<a href="{{.Link}}">{{.Name}}</a> <a href="{{.Link}}" itemprop="item">{{.Name}}</a>
{{if .Desc}} {{if .Desc}}
<br /><span class="rowsmall">{{.Desc}}</span> <br /><span class="rowsmall" itemprop="description">{{.Desc}}</span>
{{else}} {{else}}
<br /><span class="rowsmall" style="font-style: italic;">No description</span> <br /><span class="rowsmall" style="font-style: italic;">No description</span>
{{end}} {{end}}

View File

@ -1,43 +1,42 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
<nav class="colstack_left" aria-label="The control panel menu"> <nav class="colstack_left" aria-label="The control panel menu">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head submenu_fallback">
<div class="rowitem"><a href="/panel/logs/mod/">Logs</a></div> <div class="rowitem"><a href="/panel/logs/mod/">Logs</a></div>
</div> </div>
<div class="colstack_item rowmenu"> <div class="colstack_item rowmenu submenu_fallback">
<div class="rowitem passive"><a href="/panel/logs/mod/">Moderation Logs</a></div> <div class="rowitem passive"><a href="/panel/logs/mod/">Moderation Logs</a></div>
{{if .CurrentUser.Perms.ViewAdminLogs}}<div class="rowitem passive"><a>Administration Logs</a></div>{{end}} {{if .CurrentUser.Perms.ViewAdminLogs}}<div class="rowitem passive"><a>Administration Logs</a></div>{{end}}
</div> </div>
{{template "panel-inner-menu.html" . }} {{template "panel-inner-menu.html" . }}
</nav> </nav>
<main class="colstack_right"> <main class="colstack_right">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><h1>Administration Logs</h1></div> <div class="rowitem"><h1>Administration Logs</h1></div>
</div> </div>
<div id="panel_adminlogs" class="colstack_item rowlist"> <div id="panel_adminlogs" class="colstack_item rowlist">
{{range .Logs}} {{range .Logs}}
<div class="rowitem panel_compactrow"> <div class="rowitem panel_compactrow">
<span style="float: left;"> <span style="float: left;">
<span>{{.Action}}</span><br /> <span>{{.Action}}</span><br />
<small style="margin-left: 2px;font-size: 12px;">{{.IPAddress}}</small> <small style="margin-left: 2px;font-size: 12px;">{{.IPAddress}}</small>
</span> </span>
<span class="to_right"> <span class="to_right">
<span style="font-size: 14px;">{{.DoneAt}}</span> <span style="font-size: 14px;">{{.DoneAt}}</span>
</span> </span>
<div style="clear: both;"></div> <div style="clear: both;"></div>
</div>
{{end}}
</div>
{{if gt .LastPage 1}}
<div class="pageset">
{{if gt .Page 1}}<div class="pageitem"><a href="?page={{subtract .Page 1}}" aria-label="Previous Page">Prev</a></div>{{end}}
{{range .PageList}}
<div class="pageitem"><a href="?page={{.}}" aria-label="Page {{.}}">{{.}}</a></div>
{{end}}
{{if ne .LastPage .Page}}<div class="pageitem"><a href="?page={{add .Page 1}}" aria-label="Next Page">Next</a></div>{{end}}
</div> </div>
{{end}} {{end}}
</div> </main>
{{if gt .LastPage 1}}
<div class="pageset">
{{if gt .Page 1}}<div class="pageitem"><a href="?page={{subtract .Page 1}}" aria-label="Previous Page">Prev</a></div>{{end}}
{{range .PageList}}
<div class="pageitem"><a href="?page={{.}}" aria-label="Page {{.}}">{{.}}</a></div>
{{end}}
{{if ne .LastPage .Page}}<div class="pageitem"><a href="?page={{add .Page 1}}" aria-label="Next Page">Next</a></div>{{end}}
</div>
{{end}}
</main>
</div> </div>
{{template "footer.html" . }} {{template "footer.html" . }}

View File

@ -1,22 +1,22 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<main class="colstack_right"> <main class="colstack_right">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><h1>Backups</h1></div> <div class="rowitem"><h1>Backups</h1></div>
</div>
<div id="panel_backups" class="colstack_item rowlist">
{{range .Backups}}
<div class="rowitem panel_compactrow">
<span>{{.SQLURL}}</span>
<span class="panel_floater">
<a href="/panel/backups/{{.SQLURL}}" class="panel_tag panel_right_button">Download</a>
</span>
</div> </div>
{{else}} <div id="panel_backups" class="colstack_item rowlist">
<div class="rowitem">There aren't any backups available at this time.</div> {{range .Backups}}
{{end}} <div class="rowitem panel_compactrow">
</div> <span>{{.SQLURL}}</span>
</main> <span class="panel_floater">
<a href="/panel/backups/{{.SQLURL}}" class="panel_tag panel_right_button">Download</a>
</span>
</div>
{{else}}
<div class="rowitem">There aren't any backups available at this time.</div>
{{end}}
</div>
</main>
</div> </div>
{{template "footer.html" . }} {{template "footer.html" . }}

View File

@ -1,5 +1,5 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<main id="panel_dashboard_right" class="colstack_right"> <main id="panel_dashboard_right" class="colstack_right">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">

View File

@ -1,19 +1,19 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<main id="panel_dashboard_right" class="colstack_right"> <main id="panel_dashboard_right" class="colstack_right">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><a>Debug</a></div> <div class="rowitem"><a>Debug</a></div>
</div> </div>
<div id="panel_debug" class="colstack_grid"> <div id="panel_debug" class="colstack_grid">
<div class="grid_item grid_stat"><span>Uptime</span></div> <div class="grid_item grid_stat"><span>Uptime</span></div>
<div class="grid_item grid_stat"><span>Open DB Conns</span></div> <div class="grid_item grid_stat"><span>Open DB Conns</span></div>
<div class="grid_item grid_stat"><span>Adapter</span></div> <div class="grid_item grid_stat"><span>Adapter</span></div>
<div class="grid_item grid_stat"><span>{{.Uptime}}</span></div> <div class="grid_item grid_stat"><span>{{.Uptime}}</span></div>
<div class="grid_item grid_stat"><span>{{.OpenConns}}</span></div> <div class="grid_item grid_stat"><span>{{.OpenConns}}</span></div>
<div class="grid_item grid_stat"><span>{{.DBAdapter}}</span></div> <div class="grid_item grid_stat"><span>{{.DBAdapter}}</span></div>
</div> </div>
</main> </main>
</div> </div>
{{template "footer.html" . }} {{template "footer.html" . }}

View File

@ -1,6 +1,6 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<script> <script>
var form_vars = {'perm_preset': ['can_moderate','can_post','read_only','no_access','default','custom']}; var form_vars = {'perm_preset': ['can_moderate','can_post','read_only','no_access','default','custom']};

View File

@ -1,6 +1,6 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<script>var form_vars = { <script>var form_vars = {
'forum_active': ['Hide','Show'], 'forum_active': ['Hide','Show'],

View File

@ -1,5 +1,5 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
<nav class="colstack_left" aria-label="The control panel menu"> <nav class="colstack_left" aria-label="The control panel menu">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><a href="/panel/groups/edit/{{.ID}}">Group Editor</a></div> <div class="rowitem"><a href="/panel/groups/edit/{{.ID}}">Group Editor</a></div>

View File

@ -1,5 +1,5 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
<nav class="colstack_left" aria-label="The control panel menu"> <nav class="colstack_left" aria-label="The control panel menu">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><a href="/panel/groups/edit/{{.ID}}">Group Editor</a></div> <div class="rowitem"><a href="/panel/groups/edit/{{.ID}}">Group Editor</a></div>

View File

@ -1,5 +1,5 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<main class="colstack_right"> <main class="colstack_right">

View File

@ -20,9 +20,32 @@
{{if .CurrentUser.Perms.ManageThemes}}<div class="rowitem passive"> {{if .CurrentUser.Perms.ManageThemes}}<div class="rowitem passive">
<a href="/panel/themes/">Themes</a> <a class="menu_stats" href="#">({{.Stats.Themes}})</a> <a href="/panel/themes/">Themes</a> <a class="menu_stats" href="#">({{.Stats.Themes}})</a>
</div>{{end}} </div>{{end}}
</div>
<div class="colstack_item colstack_head">
<div class="rowitem"><a href="#">Events</a></div>
</div>
<div class="colstack_item rowmenu">
<div class="rowitem passive">
<a href="/panel/analytics/views/">Statistics</a>
</div>
{{if eq .Zone "analytics"}}
<div class="rowitem passive submenu">
<a href="/panel/analytics/posts/">Posts</a>
</div>
<div class="rowitem passive submenu">
<a href="/panel/analytics/crawlers/">Crawlers</a>
</div>
{{end}}
<div class="rowitem passive"> <div class="rowitem passive">
<a href="/forum/1">Reports</a> <a class="menu_stats" href="#">({{.Stats.Reports}})</a> <a href="/forum/1">Reports</a> <a class="menu_stats" href="#">({{.Stats.Reports}})</a>
</div> </div>
<div class="rowitem passive">
<a href="/panel/logs/mod/">Logs</a>
</div>
{{if eq .Zone "logs"}}
<div class="rowitem passive submenu"><a href="/panel/logs/mod/">Moderators</a></div>
{{if .CurrentUser.Perms.ViewAdminLogs}}<div class="rowitem passive submenu"><a>Administrators</a></div>{{end}}
{{end}}
</div> </div>
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><a href="#">System</a></div> <div class="rowitem"><a href="#">System</a></div>
@ -34,9 +57,6 @@
{{if .CurrentUser.IsSuperAdmin}}<div class="rowitem passive"> {{if .CurrentUser.IsSuperAdmin}}<div class="rowitem passive">
<a href="/panel/backups/">Backups</a> <a href="/panel/backups/">Backups</a>
</div>{{end}} </div>{{end}}
<div class="rowitem passive">
<a href="/panel/logs/mod/">Logs</a>
</div>
{{if .CurrentUser.IsAdmin}}<div class="rowitem passive"> {{if .CurrentUser.IsAdmin}}<div class="rowitem passive">
<a href="/panel/debug/">Debug</a> <a href="/panel/debug/">Debug</a>
</div>{{end}} </div>{{end}}

View File

@ -1,44 +1,42 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
<nav class="colstack_left" aria-label="The control panel menu">
<nav class="colstack_left" aria-label="The control panel menu"> <div class="colstack_item colstack_head submenu_fallback">
<div class="colstack_item colstack_head"> <div class="rowitem"><a href="/panel/logs/mod/">Logs</a></div>
<div class="rowitem"><a href="/panel/logs/mod/">Logs</a></div> </div>
</div> <div class="colstack_item rowmenu submenu_fallback">
<div class="colstack_item rowmenu"> <div class="rowitem passive"><a href="/panel/logs/mod/">Moderation Logs</a></div>
<div class="rowitem passive"><a href="/panel/logs/mod/">Moderation Logs</a></div> {{if .CurrentUser.Perms.ViewAdminLogs}}<div class="rowitem passive"><a>Administration Logs</a></div>{{end}}
{{if .CurrentUser.Perms.ViewAdminLogs}}<div class="rowitem passive"><a>Administration Logs</a></div>{{end}} </div>
</div>
{{template "panel-inner-menu.html" . }} {{template "panel-inner-menu.html" . }}
</nav> </nav>
<main class="colstack_right"> <main class="colstack_right">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><h1>Moderation Logs</h1></div> <div class="rowitem"><h1>Moderation Logs</h1></div>
</div> </div>
<div id="panel_modlogs" class="colstack_item rowlist"> <div id="panel_modlogs" class="colstack_item rowlist">
{{range .Logs}} {{range .Logs}}
<div class="rowitem panel_compactrow"> <div class="rowitem panel_compactrow">
<span style="float: left;"> <span style="float: left;">
<span>{{.Action}}</span><br /> <span>{{.Action}}</span><br />
<small style="margin-left: 2px;font-size: 12px;">{{.IPAddress}}</small> <small style="margin-left: 2px;font-size: 12px;">{{.IPAddress}}</small>
</span> </span>
<span class="to_right"> <span class="to_right">
<span style="font-size: 14px;">{{.DoneAt}}</span> <span style="font-size: 14px;">{{.DoneAt}}</span>
</span> </span>
<div style="clear: both;"></div> <div style="clear: both;"></div>
</div>
{{end}}
</div>
{{if gt .LastPage 1}}
<div class="pageset">
{{if gt .Page 1}}<div class="pageitem"><a href="?page={{subtract .Page 1}}" aria-label="Previous Page">Prev</a></div>{{end}}
{{range .PageList}}
<div class="pageitem"><a href="?page={{.}}" aria-label="Page {{.}}">{{.}}</a></div>
{{end}}
{{if ne .LastPage .Page}}<div class="pageitem"><a href="?page={{add .Page 1}}" aria-label="Next Page">Next</a></div>{{end}}
</div> </div>
{{end}} {{end}}
</div> </main>
{{if gt .LastPage 1}}
<div class="pageset">
{{if gt .Page 1}}<div class="pageitem"><a href="?page={{subtract .Page 1}}" aria-label="Previous Page">Prev</a></div>{{end}}
{{range .PageList}}
<div class="pageitem"><a href="?page={{.}}" aria-label="Page {{.}}">{{.}}</a></div>
{{end}}
{{if ne .LastPage .Page}}<div class="pageitem"><a href="?page={{add .Page 1}}" aria-label="Next Page">Next</a></div>{{end}}
</div>
{{end}}
</main>
</div> </div>
{{template "footer.html" . }} {{template "footer.html" . }}

View File

@ -1,5 +1,5 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<main class="colstack_right"> <main class="colstack_right">

View File

@ -1,5 +1,5 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<main class="colstack_right"> <main class="colstack_right">

View File

@ -1,20 +1,18 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<main class="colstack_right"> <main class="colstack_right">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><h1>Settings</h1></div> <div class="rowitem"><h1>Settings</h1></div>
</div>
<div id="panel_settings" class="colstack_item rowlist">
{{range $key, $value := .Something}}
<div class="rowitem panel_compactrow editable_parent">
<a href="/panel/settings/edit/{{$key}}" class="editable_block panel_upshift">{{$key}}</a>
<a class="panel_compacttext to_right">{{$value}}</a>
</div> </div>
{{end}} <div id="panel_settings" class="colstack_item rowlist">
</div> {{range $key, $value := .Something}}
</main> <div class="rowitem panel_compactrow editable_parent">
<a href="/panel/settings/edit/{{$key}}" class="editable_block panel_upshift">{{$key}}</a>
<a class="panel_compacttext to_right">{{$value}}</a>
</div>
{{end}}
</div>
</main>
</div> </div>
{{template "footer.html" . }} {{template "footer.html" . }}

View File

@ -1,5 +1,5 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
<nav class="colstack_left" aria-label="The control panel menu"> <nav class="colstack_left" aria-label="The control panel menu">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">

View File

@ -1,5 +1,5 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<main class="colstack_right"> <main class="colstack_right">

View File

@ -1,5 +1,5 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<main class="colstack_right"> <main class="colstack_right">

View File

@ -1,5 +1,5 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack"> <div class="colstack panel_stack">
{{template "panel-menu.html" . }} {{template "panel-menu.html" . }}
<main class="colstack_right"> <main class="colstack_right">

View File

@ -1,8 +1,8 @@
{{template "header.html" . }} {{template "header.html" . }}
<main> <main itemscope itemtype="http://schema.org/ItemList">
<div class="rowblock rowhead topic_list_title_block"> <div class="rowblock rowhead topic_list_title_block">
<div class="rowitem topic_list_title{{if ne .CurrentUser.ID 0}} has_opt{{end}}"><h1>All Topics</h1></div> <div class="rowitem topic_list_title{{if ne .CurrentUser.ID 0}} has_opt{{end}}"><h1 itemprop="name">All Topics</h1></div>
{{if ne .CurrentUser.ID 0}} {{if ne .CurrentUser.ID 0}}
{{if .ForumList}} {{if .ForumList}}
<div class="pre_opt auto_hide"></div> <div class="pre_opt auto_hide"></div>
@ -74,7 +74,7 @@
<span class="selector"></span> <span class="selector"></span>
<a href="{{.Creator.Link}}"><img src="{{.Creator.Avatar}}" height="64" alt="{{.Creator.Name}}'s Avatar" title="{{.Creator.Name}}'s Avatar" /></a> <a href="{{.Creator.Link}}"><img src="{{.Creator.Avatar}}" height="64" alt="{{.Creator.Name}}'s Avatar" title="{{.Creator.Name}}'s Avatar" /></a>
<span class="topic_inner_left"> <span class="topic_inner_left">
<a class="rowtopic" href="{{.Link}}"><span>{{.Title}}</span></a> {{if .ForumName}}<a class="rowsmall parent_forum" href="{{.ForumLink}}">{{.ForumName}}</a>{{end}} <a class="rowtopic" href="{{.Link}}" itemprop="itemListElement"><span>{{.Title}}</span></a> {{if .ForumName}}<a class="rowsmall parent_forum" href="{{.ForumLink}}">{{.ForumName}}</a>{{end}}
<br /><a class="rowsmall starter" href="{{.Creator.Link}}">{{.Creator.Name}}</a> <br /><a class="rowsmall starter" href="{{.Creator.Link}}">{{.Creator.Name}}</a>
{{/** TODO: Avoid the double '|' when both .IsClosed and .Sticky are set to true. We could probably do this with CSS **/}} {{/** TODO: Avoid the double '|' when both .IsClosed and .Sticky are set to true. We could probably do this with CSS **/}}
{{if .IsClosed}}<span class="rowsmall topic_status_e topic_status_closed" title="Status: Closed"> | &#x1F512;&#xFE0E</span>{{end}} {{if .IsClosed}}<span class="rowsmall topic_status_e topic_status_closed" title="Status: Closed"> | &#x1F512;&#xFE0E</span>{{end}}

View File

@ -68,7 +68,7 @@ body, #back {
} }
.nav { .nav {
padding-top: 16px; padding-top: 16px;
border-bottom: 2px solid var(--header-border-color); border-bottom: 1.5px solid var(--header-border-color);
} }
li { li {

View File

@ -1,3 +1,44 @@
#back {
padding-top: 0px;
}
#main {
padding-left: 0px;
}
.colstack_left {
background-color: hsl(0,0%,90%);
}
.colstack_left .colstack_head {
margin-top: -1px;
margin-bottom: 0px;
margin-left: 0px;
padding-bottom: 12px;
padding-top: 12px;
border-bottom: 1.5px solid var(--element-border-color);
}
.colstack_left .rowmenu .passive:first-child {
border-top: none;
}
.colstack_left .rowmenu .passive:last-child {
border-bottom: 0.5px solid var(--element-border-color) !important;
}
/*.colstack_left > *:not(.colstack_head):last-child {
border-bottom: 0.5px solid var(--element-border-color) !important;
}*/
.submenu {
margin-left: 12px;
}
.submenu_fallback {
display: none;
}
.colstack_right {
margin-right: 14px;
margin-top: 14px;
margin-bottom: 14px;
}
.footer {
margin-top: 0px;
}
.complex_rowlist { .complex_rowlist {
background-color: inherit !important; background-color: inherit !important;
border: none !important; border: none !important;