graph changes

This commit is contained in:
Barış Soner Uşaklı
2026-02-27 14:14:02 -05:00
parent 415602d89e
commit ecc740aa25
8 changed files with 79 additions and 67 deletions

View File

@@ -32,6 +32,7 @@ dashboardController.get = async function (req, res) {
const latestValidVersion = semver.valid(latestVersion);
res.render('admin/dashboard', {
graphTitle: '[[admin/dashboard:forum-traffic]]',
version: version,
lookupFailed: latestValidVersion === null,
latestVersion: latestValidVersion,
@@ -131,6 +132,7 @@ async function getStats() {
}
let results = (await Promise.all([
getStatsFromAnalytics('pageviews', ''),
getStatsFromAnalytics('uniquevisitors', ''),
getStatsFromAnalytics('logins', 'loginCount'),
getStatsForSet('users:joindate', 'userCount'),
@@ -140,24 +142,25 @@ async function getStats() {
meta.config.activitypubEnabled ? getStatsForSet('topicsRemote:tid', '') : null,
])).filter(Boolean);
results[0].name = '[[admin/dashboard:unique-visitors]]';
results[0].name = '[[admin/dashboard:graphs.page-views]]';
results[1].name = '[[admin/dashboard:unique-visitors]]';
results[1].name = '[[admin/dashboard:logins]]';
results[1].href = `${nconf.get('relative_path')}/admin/dashboard/logins`;
results[2].name = '[[admin/dashboard:logins]]';
results[2].href = `${nconf.get('relative_path')}/admin/dashboard/logins`;
results[2].name = '[[admin/dashboard:new-users]]';
results[2].href = `${nconf.get('relative_path')}/admin/dashboard/users`;
results[3].name = '[[admin/dashboard:new-users]]';
results[3].href = `${nconf.get('relative_path')}/admin/dashboard/users`;
results[3].name = '[[admin/dashboard:posts]]';
results[4].name = '[[admin/dashboard:posts]]';
results[4].name = '[[admin/dashboard:topics]]';
results[4].href = `${nconf.get('relative_path')}/admin/dashboard/topics`;
results[5].name = '[[admin/dashboard:topics]]';
results[5].href = `${nconf.get('relative_path')}/admin/dashboard/topics`;
if (results[5]) {
results[5].name = '[[admin/dashboard:remote-posts]]';
}
if (results[6]) {
results[6].name = '[[admin/dashboard:remote-topics]]';
results[6].name = '[[admin/dashboard:remote-posts]]';
}
if (results[7]) {
results[7].name = '[[admin/dashboard:remote-topics]]';
}
({ results } = await plugins.hooks.fire('filter:admin.getStats', {
@@ -287,6 +290,7 @@ dashboardController.getLogins = async (req, res) => {
sessions = _.flatten(sessions).sort((a, b) => b.datetime - a.datetime);
res.render('admin/dashboard/logins', {
graphTitle: '[[admin/dashboard:logins]]',
set: 'logins',
query: _.pick(req.query, ['units', 'until', 'count']),
stats,
@@ -315,6 +319,7 @@ dashboardController.getUsers = async (req, res) => {
const users = await user.getUsersData(uids);
res.render('admin/dashboard/users', {
graphTitle: '[[admin/dashboard:new-users]]',
set: 'registrations',
query: _.pick(req.query, ['units', 'until', 'count']),
stats,
@@ -342,6 +347,7 @@ dashboardController.getTopics = async (req, res) => {
const topicData = await topics.getTopicsByTids(tids);
res.render('admin/dashboard/topics', {
graphTitle: '[[admin/dashboard:topics]]',
set: 'topics',
query: _.pick(req.query, ['units', 'until', 'count']),
stats,

View File

@@ -1,36 +1,24 @@
<div class="card mb-3" id="analytics-panel">
<div class="card shadow-none mb-3" id="analytics-panel">
<div class="card-header">
<div class="d-flex justify-content-between">
[[admin/dashboard:forum-traffic]]
<div class="d-flex justify-content-between align-items-center">
{graphTitle}
<div class="d-flex gap-1">
<select data-action="updateGraph" class="form-select form-select-sm">
<option value="1">[[admin/dashboard:page-views-last-day]]</option>
<option value="7">[[admin/dashboard:page-views-seven]]</option>
<option value="30">[[admin/dashboard:page-views-thirty]]</option>
<option value="custom">[[admin/dashboard:page-views-custom]]</option>
<option value="range" class="hidden">[[admin/dashboard:page-views-custom]]</option>
</select>
<a class="btn btn-sm btn-light lh-sm" target="_blank" id="view-as-json" href="{config.relative_path}/api/v3/admin/analytics/{set}?type=hourly" data-bs-toggle="tooltip" data-bs-placement="bottom" title="[[admin/dashboard:view-as-json]]"><i class="fa fa-fw fa-xs fa-terminal text-primary"></i></a>
<a class="btn btn-sm btn-light lh-sm" id="expand-analytics" href="#" data-bs-toggle="tooltip" data-bs-placement="bottom" title="[[admin/dashboard:expand-analytics]]"><i class="fa fa-fw fa-xs fa-expand text-primary"></i></a>
</div>
</div>
</div>
<div class="card-body">
<div class="graph-container position-relative" id="analytics-traffic-container" style="height: 40vh; min-height: 300px; ">
<canvas id="analytics-traffic" ></canvas>
</div>
<hr/>
<div class="row">
<div class="col-sm-3 hidden-xs text-center pageview-stats">
<div><strong id="pageViewsThirty">{{{ if summary.month }}}{./summary.month}{{{ else }}}0{{{ end }}}</strong></div>
<div><a href="#" class="updatePageviewsGraph text-sm" data-action="updateGraph" data-units="days" data-amount="30">[[admin/dashboard:page-views-thirty]]</a></div>
</div>
<div class="col-sm-3 text-center pageview-stats">
<div><strong id="pageViewsSeven">{{{ if summary.week }}}{./summary.week}{{{ else }}}0{{{ end }}}</strong></div>
<div><a href="#" class="updatePageviewsGraph text-sm" data-action="updateGraph" data-units="days" data-amount="7">[[admin/dashboard:page-views-seven]]</a></div>
</div>
<div class="col-sm-3 hidden-xs text-center pageview-stats">
<div><strong id="pageViewsPastDay">{{{ if summary.day }}}{./summary.day}{{{ else }}}0{{{ end }}}</strong></div>
<div><a href="#" class="updatePageviewsGraph text-sm" data-action="updateGraph" data-units="hours" data-amount="24">[[admin/dashboard:page-views-last-day]]</a></div>
</div>
<div class="col-sm-3 text-center pageview-stats">
<div><strong><i class="fa fa-clock-o"></i></strong></div>
<div><a href="#" class="updatePageviewsGraph text-sm" data-action="updateGraph" data-units="custom">[[admin/dashboard:page-views-custom]]</a></div>
</div>
<div class="card-body p-0">
<div class="graph-container position-relative" id="analytics-traffic-container" style="width: 100%; {{{ if template.admin/dashboard }}}min-height: 300px;{{{ end }}}">
<canvas id="analytics-traffic"></canvas>
</div>
</div>
</div>