Use dyntmpl for the analytics panes.

Localised a few more things on the dashboard.
Use questions marks instead of numbers for placeholders on the dashboard.

Added the panel_dashboard_cpu phrase.
Added the panel_dashboard_ram phrase.
This commit is contained in:
Azareal 2019-04-29 16:11:26 +10:00
parent d14a7f028f
commit 6bed36b8c6
22 changed files with 82 additions and 183 deletions

View File

@ -283,9 +283,23 @@ type ResetPage struct {
type Panel struct { type Panel struct {
*BasePanelPage *BasePanelPage
HTMLID string HTMLID string
ClassNames string
TmplName string TmplName string
Inner nobreak Inner nobreak
} }
type PanelAnalytics struct {
*BasePanelPage
FormAction string
TmplName string
Inner nobreak
}
type PanelAnalyticsStd struct{
Graph PanelTimeGraph
ViewItems []PanelAnalyticsItem
TimeRange string
Unit string
TimeType string
}
type PanelStats struct { type PanelStats struct {
Users int Users int

View File

@ -301,7 +301,8 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string
tmpls.AddStd("account", "common.Account", accountPage) tmpls.AddStd("account", "common.Account", accountPage)
basePage := &BasePanelPage{header, PanelStats{}, "dashboard", ReportForumID} basePage := &BasePanelPage{header, PanelStats{}, "dashboard", ReportForumID}
tmpls.AddStd("panel", "common.Panel", Panel{basePage, "panel_dashboard_right","panel_dashboard", inter}) tmpls.AddStd("panel", "common.Panel", Panel{basePage, "panel_dashboard_right","","panel_dashboard", inter})
//tmpls.AddStd("panel_analytics", "common.PanelAnalytics", Panel{basePage, "panel_dashboard_right","panel_dashboard", inter})
var writeTemplate = func(name string, content interface{}) { var writeTemplate = func(name string, content interface{}) {
log.Print("Writing template '" + name + "'") log.Print("Writing template '" + name + "'")

View File

@ -3,7 +3,7 @@
/* /*
* *
* Gosora WebSocket Subsystem * Gosora WebSocket Subsystem
* Copyright Azareal 2017 - 2019 * Copyright Azareal 2017 - 2020
* *
*/ */
package common package common
@ -19,7 +19,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/Azareal/Gosora/common/phrases" p "github.com/Azareal/Gosora/common/phrases"
"github.com/Azareal/gopsutil/cpu" "github.com/Azareal/gopsutil/cpu"
"github.com/Azareal/gopsutil/mem" "github.com/Azareal/gopsutil/mem"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
@ -375,9 +375,9 @@ AdminStatLoop:
// nolint // nolint
// TODO: Use JSON for this to make things more portable and easier to convert to MessagePack, if need be? // TODO: Use JSON for this to make things more portable and easier to convert to MessagePack, if need be?
if !noStatUpdates { if !noStatUpdates {
w.Write([]byte("set #dash-totonline <span>" + phrases.GetTmplPhrasef("panel_dashboard_online", totonline, totunit) + "</span>\r")) w.Write([]byte("set #dash-totonline <span>" + p.GetTmplPhrasef("panel_dashboard_online", totonline, totunit) + "</span>\r"))
w.Write([]byte("set #dash-gonline <span>" + phrases.GetTmplPhrasef("panel_dashboard_guests_online", gonline, gunit) + "</span>\r")) w.Write([]byte("set #dash-gonline <span>" + p.GetTmplPhrasef("panel_dashboard_guests_online", gonline, gunit) + "</span>\r"))
w.Write([]byte("set #dash-uonline <span>" + phrases.GetTmplPhrasef("panel_dashboard_users_online", uonline, uunit) + "</span>\r")) w.Write([]byte("set #dash-uonline <span>" + p.GetTmplPhrasef("panel_dashboard_users_online", uonline, uunit) + "</span>\r"))
w.Write([]byte("set #dash-reqs <span>" + strconv.Itoa(reqCount) + " reqs / second</span>\r")) w.Write([]byte("set #dash-reqs <span>" + strconv.Itoa(reqCount) + " reqs / second</span>\r"))
w.Write([]byte("set-class #dash-totonline grid_item grid_stat " + onlineColour + "\r")) w.Write([]byte("set-class #dash-totonline grid_item grid_stat " + onlineColour + "\r"))
@ -386,11 +386,11 @@ AdminStatLoop:
//w.Write([]byte("set-class #dash-reqs grid_item grid_stat grid_end_group \r")) //w.Write([]byte("set-class #dash-reqs grid_item grid_stat grid_end_group \r"))
} }
w.Write([]byte("set #dash-cpu <span>CPU: " + cpustr + "%</span>\r")) w.Write([]byte("set #dash-cpu <span>" + p.GetTmplPhrasef("panel_dashboard_cpu",cpustr) + "%</span>\r"))
w.Write([]byte("set-class #dash-cpu grid_item grid_istat " + cpuColour + "\r")) w.Write([]byte("set-class #dash-cpu grid_item grid_istat " + cpuColour + "\r"))
if !noRAMUpdates { if !noRAMUpdates {
w.Write([]byte("set #dash-ram <span>RAM: " + ramstr + "</span>\r")) w.Write([]byte("set #dash-ram <span>" + p.GetTmplPhrasef("panel_dashboard_ram",ramstr) + "</span>\r"))
w.Write([]byte("set-class #dash-ram grid_item grid_istat " + ramColour + "\r")) w.Write([]byte("set-class #dash-ram grid_item grid_istat " + ramColour + "\r"))
} }

View File

@ -751,7 +751,9 @@
"panel_menu_debug":"Debug", "panel_menu_debug":"Debug",
"panel_dashboard_head":"Dashboard", "panel_dashboard_head":"Dashboard",
"panel_dashboard_cpu":"CPU: %s",
"panel_dashboard_cpu_desc":"The global CPU usage of this server", "panel_dashboard_cpu_desc":"The global CPU usage of this server",
"panel_dashboard_ram":"RAM: %s",
"panel_dashboard_ram_desc":"The global RAM usage of this server", "panel_dashboard_ram_desc":"The global RAM usage of this server",
"panel_dashboard_online": "%d%s online", "panel_dashboard_online": "%d%s online",
"panel_dashboard_online_desc":"The number of people who are currently online", "panel_dashboard_online_desc":"The number of people who are currently online",

View File

@ -164,8 +164,9 @@ func AnalyticsViews(w http.ResponseWriter, r *http.Request, user c.User) c.Route
if timeRange.Range == "six-hours" || timeRange.Range == "twelve-hours" || timeRange.Range == "one-day" { if timeRange.Range == "six-hours" || timeRange.Range == "twelve-hours" || timeRange.Range == "one-day" {
ttime = "time" ttime = "time"
} }
pi := c.PanelAnalyticsPage{basePage, graph, viewItems, timeRange.Range, timeRange.Unit, ttime}
return renderTemplate("panel_analytics_views", w, r, basePage.Header, &pi) pi := c.PanelAnalyticsStd{graph, viewItems, timeRange.Range, timeRange.Unit, ttime}
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_views", pi})
} }
func AnalyticsRouteViews(w http.ResponseWriter, r *http.Request, user c.User, route string) c.RouteError { func AnalyticsRouteViews(w http.ResponseWriter, r *http.Request, user c.User, route string) c.RouteError {
@ -200,7 +201,7 @@ func AnalyticsRouteViews(w http.ResponseWriter, r *http.Request, user c.User, ro
c.DebugLogf("graph: %+v\n", graph) c.DebugLogf("graph: %+v\n", graph)
pi := c.PanelAnalyticsRoutePage{basePage, c.SanitiseSingleLine(route), graph, viewItems, timeRange.Range} pi := c.PanelAnalyticsRoutePage{basePage, c.SanitiseSingleLine(route), graph, viewItems, timeRange.Range}
return renderTemplate("panel_analytics_route_views", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_route_views", pi})
} }
func AnalyticsAgentViews(w http.ResponseWriter, r *http.Request, user c.User, agent string) c.RouteError { func AnalyticsAgentViews(w http.ResponseWriter, r *http.Request, user c.User, agent string) c.RouteError {
@ -240,7 +241,7 @@ func AnalyticsAgentViews(w http.ResponseWriter, r *http.Request, user c.User, ag
} }
pi := c.PanelAnalyticsAgentPage{basePage, agent, friendlyAgent, graph, timeRange.Range} pi := c.PanelAnalyticsAgentPage{basePage, agent, friendlyAgent, graph, timeRange.Range}
return renderTemplate("panel_analytics_agent_views", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_agent_views", pi})
} }
func AnalyticsForumViews(w http.ResponseWriter, r *http.Request, user c.User, sfid string) c.RouteError { func AnalyticsForumViews(w http.ResponseWriter, r *http.Request, user c.User, sfid string) c.RouteError {
@ -283,7 +284,7 @@ func AnalyticsForumViews(w http.ResponseWriter, r *http.Request, user c.User, sf
} }
pi := c.PanelAnalyticsAgentPage{basePage, sfid, forum.Name, graph, timeRange.Range} pi := c.PanelAnalyticsAgentPage{basePage, sfid, forum.Name, graph, timeRange.Range}
return renderTemplate("panel_analytics_forum_views", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_forum_views", pi})
} }
func AnalyticsSystemViews(w http.ResponseWriter, r *http.Request, user c.User, system string) c.RouteError { func AnalyticsSystemViews(w http.ResponseWriter, r *http.Request, user c.User, system string) c.RouteError {
@ -322,7 +323,7 @@ func AnalyticsSystemViews(w http.ResponseWriter, r *http.Request, user c.User, s
} }
pi := c.PanelAnalyticsAgentPage{basePage, system, friendlySystem, graph, timeRange.Range} pi := c.PanelAnalyticsAgentPage{basePage, system, friendlySystem, graph, timeRange.Range}
return renderTemplate("panel_analytics_system_views", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_system_views", pi})
} }
func AnalyticsLanguageViews(w http.ResponseWriter, r *http.Request, user c.User, lang string) c.RouteError { func AnalyticsLanguageViews(w http.ResponseWriter, r *http.Request, user c.User, lang string) c.RouteError {
@ -362,7 +363,7 @@ func AnalyticsLanguageViews(w http.ResponseWriter, r *http.Request, user c.User,
} }
pi := c.PanelAnalyticsAgentPage{basePage, lang, friendlyLang, graph, timeRange.Range} pi := c.PanelAnalyticsAgentPage{basePage, lang, friendlyLang, graph, timeRange.Range}
return renderTemplate("panel_analytics_lang_views", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_lang_views", pi})
} }
func AnalyticsReferrerViews(w http.ResponseWriter, r *http.Request, user c.User, domain string) c.RouteError { func AnalyticsReferrerViews(w http.ResponseWriter, r *http.Request, user c.User, domain string) c.RouteError {
@ -394,7 +395,7 @@ func AnalyticsReferrerViews(w http.ResponseWriter, r *http.Request, user c.User,
graph := c.PanelTimeGraph{Series: [][]int64{viewList}, Labels: labelList} graph := c.PanelTimeGraph{Series: [][]int64{viewList}, Labels: labelList}
c.DebugLogf("graph: %+v\n", graph) c.DebugLogf("graph: %+v\n", graph)
pi := c.PanelAnalyticsAgentPage{basePage, c.SanitiseSingleLine(domain), "", graph, timeRange.Range} pi := c.PanelAnalyticsAgentPage{basePage, c.SanitiseSingleLine(domain), "", graph, timeRange.Range}
return renderTemplate("panel_analytics_referrer_views", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_referrer_views", pi})
} }
func AnalyticsTopics(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { func AnalyticsTopics(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
@ -426,8 +427,8 @@ func AnalyticsTopics(w http.ResponseWriter, r *http.Request, user c.User) c.Rout
} }
graph := c.PanelTimeGraph{Series: [][]int64{viewList}, Labels: labelList} graph := c.PanelTimeGraph{Series: [][]int64{viewList}, Labels: labelList}
c.DebugLogf("graph: %+v\n", graph) c.DebugLogf("graph: %+v\n", graph)
pi := c.PanelAnalyticsPage{basePage, graph, viewItems, timeRange.Range, timeRange.Unit, "time"} pi := c.PanelAnalyticsStd{graph, viewItems, timeRange.Range, timeRange.Unit, "time"}
return renderTemplate("panel_analytics_topics", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_topics", pi})
} }
func AnalyticsPosts(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { func AnalyticsPosts(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
@ -459,8 +460,8 @@ func AnalyticsPosts(w http.ResponseWriter, r *http.Request, user c.User) c.Route
} }
graph := c.PanelTimeGraph{Series: [][]int64{viewList}, Labels: labelList} graph := c.PanelTimeGraph{Series: [][]int64{viewList}, Labels: labelList}
c.DebugLogf("graph: %+v\n", graph) c.DebugLogf("graph: %+v\n", graph)
pi := c.PanelAnalyticsPage{basePage, graph, viewItems, timeRange.Range, timeRange.Unit, "time"} pi := c.PanelAnalyticsStd{graph, viewItems, timeRange.Range, timeRange.Unit, "time"}
return renderTemplate("panel_analytics_posts", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_posts", pi})
} }
func analyticsRowsToNameMap(rows *sql.Rows) (map[string]int, error) { func analyticsRowsToNameMap(rows *sql.Rows) (map[string]int, error) {
@ -504,6 +505,7 @@ func analyticsRowsToDuoMap(rows *sql.Rows, labelList []int64, viewMap map[int64]
log.Print("createdAt: ", createdAt) log.Print("createdAt: ", createdAt)
log.Print("unixCreatedAt: ", unixCreatedAt) log.Print("unixCreatedAt: ", unixCreatedAt)
} }
vvMap, ok := vMap[name] vvMap, ok := vMap[name]
if !ok { if !ok {
vvMap = make(map[int64]int64) vvMap = make(map[int64]int64)
@ -639,7 +641,7 @@ func AnalyticsForums(w http.ResponseWriter, r *http.Request, user c.User) c.Rout
} }
pi := c.PanelAnalyticsDuoPage{basePage, forumItems, graph, timeRange.Range} pi := c.PanelAnalyticsDuoPage{basePage, forumItems, graph, timeRange.Range}
return renderTemplate("panel_analytics_forums", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_forums", pi})
} }
func AnalyticsRoutes(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { func AnalyticsRoutes(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
@ -694,7 +696,7 @@ func AnalyticsRoutes(w http.ResponseWriter, r *http.Request, user c.User) c.Rout
} }
pi := c.PanelAnalyticsRoutesPage{basePage, routeItems, graph, timeRange.Range} pi := c.PanelAnalyticsRoutesPage{basePage, routeItems, graph, timeRange.Range}
return renderTemplate("panel_analytics_routes", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_routes", pi})
} }
// Trialling multi-series charts // Trialling multi-series charts
@ -759,7 +761,7 @@ func AnalyticsAgents(w http.ResponseWriter, r *http.Request, user c.User) c.Rout
} }
pi := c.PanelAnalyticsDuoPage{basePage, agentItems, graph, timeRange.Range} pi := c.PanelAnalyticsDuoPage{basePage, agentItems, graph, timeRange.Range}
return renderTemplate("panel_analytics_agents", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_agents", pi})
} }
func AnalyticsSystems(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { func AnalyticsSystems(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
@ -823,7 +825,7 @@ func AnalyticsSystems(w http.ResponseWriter, r *http.Request, user c.User) c.Rou
} }
pi := c.PanelAnalyticsDuoPage{basePage, systemItems, graph, timeRange.Range} pi := c.PanelAnalyticsDuoPage{basePage, systemItems, graph, timeRange.Range}
return renderTemplate("panel_analytics_systems", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_systems", pi})
} }
func AnalyticsLanguages(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { func AnalyticsLanguages(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
@ -888,7 +890,7 @@ func AnalyticsLanguages(w http.ResponseWriter, r *http.Request, user c.User) c.R
} }
pi := c.PanelAnalyticsDuoPage{basePage, langItems, graph, timeRange.Range} pi := c.PanelAnalyticsDuoPage{basePage, langItems, graph, timeRange.Range}
return renderTemplate("panel_analytics_langs", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_langs", pi})
} }
func AnalyticsReferrers(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { func AnalyticsReferrers(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
@ -920,5 +922,5 @@ func AnalyticsReferrers(w http.ResponseWriter, r *http.Request, user c.User) c.R
} }
pi := c.PanelAnalyticsAgentsPage{basePage, refItems, timeRange.Range} pi := c.PanelAnalyticsAgentsPage{basePage, refItems, timeRange.Range}
return renderTemplate("panel_analytics_referrers", w, r, basePage.Header, &pi) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right","analytics","panel_analytics_referrers", pi})
} }

View File

@ -172,8 +172,8 @@ func Dashboard(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError
//GE{"dash-version", "v" + version.String(), 0, "grid_istat stat_green", "", "", "Gosora is up-to-date :)"}, //GE{"dash-version", "v" + version.String(), 0, "grid_istat stat_green", "", "", "Gosora is up-to-date :)"},
GE{"dash-version", "v" + c.SoftwareVersion.String(), 0, "grid_istat", "", "", ""}, GE{"dash-version", "v" + c.SoftwareVersion.String(), 0, "grid_istat", "", "", ""},
GE{"dash-cpu", "CPU: " + cpustr, 1, "grid_istat " + cpuColour, "", "", p.GetTmplPhrase("panel_dashboard_cpu_desc")}, GE{"dash-cpu", p.GetTmplPhrasef("panel_dashboard_cpu",cpustr), 1, "grid_istat " + cpuColour, "", "", p.GetTmplPhrase("panel_dashboard_cpu_desc")},
GE{"dash-ram", "RAM: " + ramstr, 2, "grid_istat " + ramColour, "", "", p.GetTmplPhrase("panel_dashboard_ram_desc")}, GE{"dash-ram", p.GetTmplPhrasef("panel_dashboard_ram",ramstr), 2, "grid_istat " + ramColour, "", "", p.GetTmplPhrase("panel_dashboard_ram_desc")},
} }
var addElement = func(element GE) { var addElement = func(element GE) {
gridElements = append(gridElements, element) gridElements = append(gridElements, element)
@ -208,10 +208,10 @@ func Dashboard(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError
addElement(GE{"dash-reports", strconv.Itoa(reportCount) + " reports" + reportInterval, 11, "grid_stat", "", "", "The number of reports over the last 7 days"}) addElement(GE{"dash-reports", strconv.Itoa(reportCount) + " reports" + reportInterval, 11, "grid_stat", "", "", "The number of reports over the last 7 days"})
if false { if false {
addElement(GE{"dash-minperuser", "2 minutes / user / week", 12, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The average number of number of minutes spent by each active user over the last 7 days"*/}) addElement(GE{"dash-minperuser", "?? minutes / user / week", 12, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The average number of number of minutes spent by each active user over the last 7 days"*/})
addElement(GE{"dash-visitorsperweek", "2 visitors / week", 13, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The number of unique visitors we've had over the last 7 days"*/}) addElement(GE{"dash-visitorsperweek", "?? visitors / week", 13, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The number of unique visitors we've had over the last 7 days"*/})
addElement(GE{"dash-postsperuser", "5 posts / user / week", 14, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The average number of posts made by each active user over the past week"*/}) addElement(GE{"dash-postsperuser", "?? posts / user / week", 14, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The average number of posts made by each active user over the past week"*/})
} }
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_dashboard_right","panel_dashboard", gridElements}) return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_dashboard_right","","panel_dashboard", gridElements})
} }

View File

@ -1,7 +1,7 @@
{{template "header.html" . }} {{template "header.html" . }}
<div class="colstack panel_stack"> <div class="colstack panel_stack">
{{template "panel_menu.html" . }} {{template "panel_menu.html" . }}
<main id="{{.HTMLID}}" class="colstack_right"> <main id="{{.HTMLID}}" class="colstack_right {{.ClassNames}}">
{{template "panel_before_head.html" . }} {{template "panel_before_head.html" . }}
{{dyntmpl .TmplName .Inner .Header}} {{dyntmpl .TmplName .Inner .Header}}
</main> </main>

View File

@ -1,19 +1,11 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/agent/{{.Agent}}" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{.FriendlyAgent}}{{lang "panel_statistics_views_head_suffix"}}</h1> <h1>{{.FriendlyAgent}}{{lang "panel_statistics_views_head_suffix"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/agent/{{.Agent}}" method="get"></form>
<div id="panel_analytics_views" class="colstack_graph_holder"> <div id="panel_analytics_views" class="colstack_graph_holder">
<div class="ct_chart"></div> <div class="ct_chart"></div>
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,15 +1,10 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/agents/" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{lang "panel_statistics_user_agents_head"}}</h1> <h1>{{lang "panel_statistics_user_agents_head"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/agents/" method="get"></form>
<div id="panel_analytics_agents_chart" class="colstack_graph_holder"> <div id="panel_analytics_agents_chart" class="colstack_graph_holder">
<div class="ct_chart"></div> <div class="ct_chart"></div>
</div> </div>
@ -21,7 +16,4 @@
</div> </div>
{{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_user_agents_no_user_agents"}}</div>{{end}} {{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_user_agents_no_user_agents"}}</div>{{end}}
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,19 +1,11 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/forum/{{.Agent}}" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{.FriendlyAgent}}{{lang "panel_statistics_views_head_suffix"}}</h1> <h1>{{.FriendlyAgent}}{{lang "panel_statistics_views_head_suffix"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/forum/{{.Agent}}" method="get"></form>
<div id="panel_analytics_views" class="colstack_graph_holder"> <div id="panel_analytics_views" class="colstack_graph_holder">
<div class="ct_chart"></div> <div class="ct_chart"></div>
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,15 +1,10 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/forums/" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{lang "panel_statistics_forums_head"}}</h1> <h1>{{lang "panel_statistics_forums_head"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/forums/" method="get"></form>
<div id="panel_analytics_forums_chart" class="colstack_graph_holder"> <div id="panel_analytics_forums_chart" class="colstack_graph_holder">
<div class="ct_chart"></div> <div class="ct_chart"></div>
</div> </div>
@ -21,7 +16,4 @@
</div> </div>
{{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_forums_no_forums"}}</div>{{end}} {{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_forums_no_forums"}}</div>{{end}}
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,19 +1,11 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/lang/{{.Agent}}" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{.FriendlyAgent}}{{lang "panel_statistics_views_head_suffix"}}</h1> <h1>{{.FriendlyAgent}}{{lang "panel_statistics_views_head_suffix"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/lang/{{.Agent}}" method="get"></form>
<div id="panel_analytics_langs" class="colstack_graph_holder"> <div id="panel_analytics_langs" class="colstack_graph_holder">
<div class="ct_chart"></div> <div class="ct_chart"></div>
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,15 +1,10 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/langs/" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{lang "panel_statistics_languages_head"}}</h1> <h1>{{lang "panel_statistics_languages_head"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/langs/" method="get"></form>
<div id="panel_analytics_langs_chart" class="colstack_graph_holder"> <div id="panel_analytics_langs_chart" class="colstack_graph_holder">
<div class="ct_chart"></div> <div class="ct_chart"></div>
</div> </div>
@ -21,7 +16,4 @@
</div> </div>
{{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_languages_no_languages"}}</div>{{end}} {{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_languages_no_languages"}}</div>{{end}}
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,15 +1,10 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/posts/" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{lang "panel_statistics_post_counts_head"}}</h1> <h1>{{lang "panel_statistics_post_counts_head"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/posts/" method="get"></form>
<div id="panel_analytics_posts" class="colstack_graph_holder"> <div id="panel_analytics_posts" class="colstack_graph_holder">
<div class="ct_chart" aria-label="{{lang "panel_statistics_post_counts_chart_aria"}}"></div> <div class="ct_chart" aria-label="{{lang "panel_statistics_post_counts_chart_aria"}}"></div>
</div> </div>
@ -24,7 +19,4 @@
</div> </div>
{{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_post_counts_no_post_counts"}}</div>{{end}} {{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_post_counts_no_post_counts"}}</div>{{end}}
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,19 +1,11 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/referrer/{{.Agent}}" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{.Agent}}{{lang "panel_statistics_views_head_suffix"}}</h1> <h1>{{.Agent}}{{lang "panel_statistics_views_head_suffix"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/referrer/{{.Agent}}" method="get"></form>
<div id="panel_analytics_referrers" class="colstack_graph_holder"> <div id="panel_analytics_referrers" class="colstack_graph_holder">
<div class="ct_chart"></div> <div class="ct_chart"></div>
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,15 +1,10 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/referrers/" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{lang "panel_statistics_referrers_head"}}</h1> <h1>{{lang "panel_statistics_referrers_head"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/referrers/" method="get"></form>
<div id="panel_analytics_referrers" class="colstack_item rowlist"> <div id="panel_analytics_referrers" class="colstack_item rowlist">
{{range .ItemList}} {{range .ItemList}}
<div class="rowitem panel_compactrow editable_parent"> <div class="rowitem panel_compactrow editable_parent">
@ -17,7 +12,4 @@
<span class="panel_compacttext to_right">{{.Count}}{{lang "panel_statistics_views_suffix"}}</span> <span class="panel_compacttext to_right">{{.Count}}{{lang "panel_statistics_views_suffix"}}</span>
</div> </div>
{{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_referrers_no_referrers"}}</div>{{end}} {{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_referrers_no_referrers"}}</div>{{end}}
</div> </div>
</main>
</div>
{{template "footer.html" . }}

View File

@ -1,15 +1,10 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/route/{{.Route}}" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{.Route}}{{lang "panel_statistics_views_head_suffix"}}</h1> <h1>{{.Route}}{{lang "panel_statistics_views_head_suffix"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/route/{{.Route}}" method="get"></form>
<div id="panel_analytics_views" class="colstack_graph_holder"> <div id="panel_analytics_views" class="colstack_graph_holder">
<div class="ct_chart"></div> <div class="ct_chart"></div>
</div> </div>
@ -24,7 +19,4 @@
</div> </div>
{{end}} {{end}}
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,15 +1,10 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/routes/" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{lang "panel_statistics_routes_head"}}</h1> <h1>{{lang "panel_statistics_routes_head"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/routes/" method="get"></form>
<div id="panel_analytics_routes_chart" class="colstack_graph_holder"> <div id="panel_analytics_routes_chart" class="colstack_graph_holder">
<div class="ct_chart"></div> <div class="ct_chart"></div>
</div> </div>
@ -21,7 +16,4 @@
</div> </div>
{{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_routes_no_routes"}}</div>{{end}} {{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_routes_no_routes"}}</div>{{end}}
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,19 +1,11 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/system/{{.Agent}}" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{.FriendlyAgent}}{{lang "panel_statistics_views_head_suffix"}}</h1> <h1>{{.FriendlyAgent}}{{lang "panel_statistics_views_head_suffix"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/system/{{.Agent}}" method="get"></form>
<div id="panel_analytics_systems" class="colstack_graph_holder"> <div id="panel_analytics_systems" class="colstack_graph_holder">
<div class="ct_chart"></div> <div class="ct_chart"></div>
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,15 +1,10 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/systems/" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{lang "panel_statistics_operating_systems_head"}}</h1> <h1>{{lang "panel_statistics_operating_systems_head"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/systems/" method="get"></form>
<div id="panel_analytics_systems_chart" class="colstack_graph_holder"> <div id="panel_analytics_systems_chart" class="colstack_graph_holder">
<div class="ct_chart"></div> <div class="ct_chart"></div>
</div> </div>
@ -21,7 +16,4 @@
</div> </div>
{{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_operating_systems_no_operating_systems"}}</div>{{end}} {{else}}<div class="rowitem passive rowmsg">{{lang "panel_statistics_operating_systems_no_operating_systems"}}</div>{{end}}
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,15 +1,10 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/topics/" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{lang "panel_statistics_topic_counts_head"}}</h1> <h1>{{lang "panel_statistics_topic_counts_head"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/topics/" method="get"></form>
<div id="panel_analytics_topics" class="colstack_graph_holder"> <div id="panel_analytics_topics" class="colstack_graph_holder">
<div class="ct_chart" aria-label="{{lang "panel_statistics_topic_counts_chart_aria"}}"></div> <div class="ct_chart" aria-label="{{lang "panel_statistics_topic_counts_chart_aria"}}"></div>
</div> </div>
@ -24,7 +19,4 @@
</div> </div>
{{end}} {{end}}
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}

View File

@ -1,15 +1,10 @@
{{template "header.html" . }}
<div class="colstack panel_stack">
{{template "panel_menu.html" . }}
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/views/" method="get"></form>
<main id="panel_analytics_right" class="colstack_right analytics">
{{template "panel_before_head.html" . }}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"> <div class="rowitem">
<h1>{{lang "panel_statistics_requests_head"}}</h1> <h1>{{lang "panel_statistics_requests_head"}}</h1>
{{template "panel_analytics_time_range.html" . }} {{template "panel_analytics_time_range.html" . }}
</div> </div>
</div> </div>
<form id="timeRangeForm" name="timeRangeForm" action="/panel/analytics/views/" method="get"></form>
<div id="panel_analytics_views" class="colstack_graph_holder"> <div id="panel_analytics_views" class="colstack_graph_holder">
<div class="ct_chart" aria-label="{{lang "panel_statistics_requests_chart_aria"}}"></div> <div class="ct_chart" aria-label="{{lang "panel_statistics_requests_chart_aria"}}"></div>
</div> </div>
@ -24,7 +19,4 @@
</div> </div>
{{end}} {{end}}
</div> </div>
</main> {{template "panel_analytics_script.html" . }}
</div>
{{template "panel_analytics_script.html" . }}
{{template "footer.html" . }}