mirror of
https://github.com/FreshRSS/FreshRSS.git
synced 2026-10-10 03:46:10 -04:00
* Little's optimisations and booleans in conditions * Apply strict type * Apply strict type * Apply strict type * Fix multiple bugs with PHP 8.2 and 8.3 * Many declares missing, more errors fixed * Apply strict type * Another approach * Stronger typing for Minz_Session * Fix case of SQLite --------- Co-authored-by: Luc <sanchezluc+freshrss@gmail.com> Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
135 lines
4.5 KiB
PHTML
135 lines
4.5 KiB
PHTML
<?php
|
||
declare(strict_types=1);
|
||
/** @var FreshRSS_ViewStats $this */
|
||
$this->partial('aside_subscription');
|
||
?>
|
||
<main class="post">
|
||
<div class="link-back-wrapper">
|
||
<a class="link-back" href="<?= _url('index', 'index') ?>"><?= _t('gen.action.back_to_rss_feeds') ?></a>
|
||
</div>
|
||
|
||
<h1><?= _t('admin.stats.main') ?></h1>
|
||
|
||
<div class="stat-grid">
|
||
<div class="stat half">
|
||
<h2><?= _t('admin.stats.entry_repartition') ?></h2>
|
||
<div class="table-wrapper scrollbar-thin">
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th> </th>
|
||
<th><?= _t('admin.stats.main_stream') ?></th>
|
||
<th><?= _t('admin.stats.all_feeds') ?></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<th><?= _t('admin.stats.status_total') ?></th>
|
||
<td class="numeric"><?= format_number($this->repartitions['main_stream']['total'] ?? -1) ?></td>
|
||
<td class="numeric"><?= format_number($this->repartitions['all_feeds']['total'] ?? -1) ?></td>
|
||
</tr>
|
||
<tr>
|
||
<th><?= _t('admin.stats.status_read') ?></th>
|
||
<td class="numeric"><?= format_number($this->repartitions['main_stream']['count_reads'] ?? -1) ?></td>
|
||
<td class="numeric"><?= format_number($this->repartitions['all_feeds']['count_reads'] ?? -1) ?></td>
|
||
</tr>
|
||
<tr>
|
||
<th><?= _t('admin.stats.status_unread') ?></th>
|
||
<td class="numeric"><?= format_number($this->repartitions['main_stream']['count_unreads'] ?? -1) ?></td>
|
||
<td class="numeric"><?= format_number($this->repartitions['all_feeds']['count_unreads'] ?? -1) ?></td>
|
||
</tr>
|
||
<tr>
|
||
<th><?= _t('admin.stats.status_favorites') ?></th>
|
||
<td class="numeric"><?= format_number($this->repartitions['main_stream']['count_favorites'] ?? -1) ?></td>
|
||
<td class="numeric"><?= format_number($this->repartitions['all_feeds']['count_favorites'] ?? -1) ?></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="stat half">
|
||
<h2><?= _t('admin.stats.top_feed') ?></h2>
|
||
<div class="table-wrapper scrollbar-thin">
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th><?= _t('admin.stats.feed') ?></th>
|
||
<th><?= _t('admin.stats.category') ?></th>
|
||
<th><?= _t('admin.stats.entry_count') ?></th>
|
||
<th><?= _t('admin.stats.percent_of_total') ?></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<?php foreach ($this->topFeed as $feed): ?>
|
||
<tr>
|
||
<td><a href="<?= _url('stats', 'repartition', 'id', $feed['id']) ?>"><?= $feed['name'] ?></a></td>
|
||
<td><?= $feed['category'] ?></td>
|
||
<td class="numeric"><?= format_number($feed['count']) ?></td>
|
||
<td class="numeric"><?php
|
||
if (!empty($this->repartitions['all_feeds']['total'])) {
|
||
echo format_number($feed['count'] / $this->repartitions['all_feeds']['total'] * 100, 1);
|
||
}
|
||
?></td>
|
||
</tr>
|
||
<?php endforeach; ?>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="stat">
|
||
<h2><?= _t('admin.stats.entry_per_day') ?></h2>
|
||
<div>
|
||
<canvas id="statsEntriesPerDay"></canvas>
|
||
<script class="jsonData-stats" type="application/json">
|
||
<?php
|
||
echo json_encode(array(
|
||
'canvasID' => 'statsEntriesPerDay',
|
||
'charttype' => 'barWithAverage',
|
||
'labelBarChart' => _t('admin.stats.entry_count'),
|
||
'dataBarChart' => $this->entryCount,
|
||
'labelAverage' => 'Average ('.$this->average.')',
|
||
'dataAverage' => $this->average,
|
||
'xAxisLabels' => $this->last30DaysLabels,
|
||
), JSON_UNESCAPED_UNICODE);
|
||
?></script>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="stat half">
|
||
<h2><?= _t('admin.stats.feed_per_category') ?></h2>
|
||
<div>
|
||
<canvas id="statsFeedsPerCategory"></canvas>
|
||
<script class="jsonData-stats" type="application/json">
|
||
<?php
|
||
echo json_encode(array(
|
||
'canvasID' => 'statsFeedsPerCategory',
|
||
'charttype' => 'doughnut',
|
||
'data' => $this->feedByCategory['data'],
|
||
'labels' => $this->feedByCategory['label'],
|
||
), JSON_UNESCAPED_UNICODE);
|
||
?></script>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="stat half">
|
||
<h2><?= _t('admin.stats.entry_per_category') ?></h2>
|
||
<div>
|
||
<canvas id="statsEntriesPerCategory"></canvas>
|
||
<script class="jsonData-stats" type="application/json">
|
||
<?php
|
||
echo json_encode(array(
|
||
'canvasID' => 'statsEntriesPerCategory',
|
||
'charttype' => 'doughnut',
|
||
'data' => $this->entryByCategory['data'],
|
||
'labels' => $this->entryByCategory['label'],
|
||
), JSON_UNESCAPED_UNICODE);
|
||
?></script>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
|
||
<script src="../scripts/statsWithChartjs.js?<?= @filemtime(PUBLIC_PATH . '/scripts/statsWithChartjs.js') ?>"></script>
|