feat: filtre par page, multi-courbes chart, tri alphabétique options
- Ajout filtre multiselect par page(s) dans le dashboard analytics - Chart multi-courbes par page quand aucun filtre page sélectionné - Options de pages indépendantes du filtre page (persistent à la sélection) - Options de pages dépendantes du filtre utilisateur - Tracking modal-file avec format "Projet / Label" dans dialog.js - Tri alphabétique des options du filtre par page - Fix user list 500 error (email string, client field check) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
de104dc7dd
commit
084bb46379
6 changed files with 157 additions and 55 deletions
|
|
@ -95,15 +95,39 @@ class AnalyticsStore
|
|||
});
|
||||
}
|
||||
|
||||
// Filtrer par nom de page
|
||||
if (!empty($filters['pageNames'])) {
|
||||
$pageNames = $filters['pageNames'];
|
||||
$visits = array_filter($visits, function($visit) use ($pageNames) {
|
||||
$name = $visit->pageName ?: $visit->pageUrl;
|
||||
return in_array($name, $pageNames);
|
||||
});
|
||||
}
|
||||
|
||||
return array_values($visits);
|
||||
}
|
||||
|
||||
public static function getAggregatedData(array $filters = []): array
|
||||
{
|
||||
self::ensureFileExists();
|
||||
$visits = self::getVisits($filters);
|
||||
|
||||
// Visites par jour
|
||||
// Visits sans filtre pageNames → pour construire la liste des pages (options)
|
||||
$filtersWithoutPages = $filters;
|
||||
unset($filtersWithoutPages['pageNames']);
|
||||
$allVisits = self::getVisits($filtersWithoutPages);
|
||||
|
||||
$visitsByPage = [];
|
||||
foreach ($allVisits as $visit) {
|
||||
$page = $visit->pageName ?: $visit->pageUrl;
|
||||
$visitsByPage[$page] = ($visitsByPage[$page] ?? 0) + 1;
|
||||
}
|
||||
arsort($visitsByPage);
|
||||
|
||||
// Visits avec tous les filtres → pour les stats affichées
|
||||
$visits = !empty($filters['pageNames'])
|
||||
? self::getVisits($filters)
|
||||
: $allVisits;
|
||||
|
||||
$visitsByDay = [];
|
||||
foreach ($visits as $visit) {
|
||||
$day = date('Y-m-d', strtotime($visit->timestamp));
|
||||
|
|
@ -111,38 +135,27 @@ class AnalyticsStore
|
|||
}
|
||||
ksort($visitsByDay);
|
||||
|
||||
// Visites par page
|
||||
$visitsByPage = [];
|
||||
foreach ($visits as $visit) {
|
||||
$page = $visit->pageName ?: $visit->pageUrl;
|
||||
$visitsByPage[$page] = ($visitsByPage[$page] ?? 0) + 1;
|
||||
}
|
||||
arsort($visitsByPage);
|
||||
|
||||
// Visites par utilisateur
|
||||
$visitsByUser = [];
|
||||
foreach ($visits as $visit) {
|
||||
$visitsByUser[$visit->email] = ($visitsByUser[$visit->email] ?? 0) + 1;
|
||||
}
|
||||
arsort($visitsByUser);
|
||||
|
||||
// Nombre de sessions uniques
|
||||
$uniqueSessions = count(array_unique(array_map(fn($v) => $v->sessionId, $visits)));
|
||||
|
||||
// Visites par type de page
|
||||
$visitsByType = [];
|
||||
// Visites par jour par page (top 10 pages)
|
||||
$topPages = array_keys(array_slice($visitsByPage, 0, 10, true));
|
||||
$visitsByDayByPage = [];
|
||||
foreach ($visits as $visit) {
|
||||
$visitsByType[$visit->pageType] = ($visitsByType[$visit->pageType] ?? 0) + 1;
|
||||
$page = $visit->pageName ?: $visit->pageUrl;
|
||||
if (!in_array($page, $topPages)) continue;
|
||||
$day = date('Y-m-d', strtotime($visit->timestamp));
|
||||
$visitsByDayByPage[$page][$day] = ($visitsByDayByPage[$page][$day] ?? 0) + 1;
|
||||
}
|
||||
foreach ($visitsByDayByPage as &$days) {
|
||||
ksort($days);
|
||||
}
|
||||
arsort($visitsByType);
|
||||
|
||||
return [
|
||||
'totalVisits' => count($visits),
|
||||
'uniqueSessions' => $uniqueSessions,
|
||||
'visitsByDay' => $visitsByDay,
|
||||
'visitsByPage' => array_slice($visitsByPage, 0, 10),
|
||||
'visitsByUser' => $visitsByUser,
|
||||
'visitsByType' => $visitsByType,
|
||||
'visitsByPage' => array_slice($visitsByPage, 0, 10, true),
|
||||
'visitsByDayByPage' => $visitsByDayByPage,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue