diff --git a/app/Http/Controllers/Admin/HomeController.php b/app/Http/Controllers/Admin/HomeController.php index 29861296e004a780d7c4548784cf5ec6ba96134a..ff5529d25461dc1a869bdc2c24dddf6b1a39ed02 100644 --- a/app/Http/Controllers/Admin/HomeController.php +++ b/app/Http/Controllers/Admin/HomeController.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Controller; use Carbon\Carbon; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; use Illuminate\Support\Str; use Illuminate\View\View; @@ -11,8 +12,13 @@ class HomeController extends Controller { - public function index(): View + public function index(Request $request): View { + $request->validate([ + 'start_date' => 'nullable|date', + 'end_date' => 'nullable|date', + ]); + $publicRoutes = collect(Route::getRoutes()->getRoutes()) ->filter(fn ($route) => ! Str::startsWith($route->uri, ['admin', 'api']) && ! empty($route->uri) && $route->uri !== '/') ->pluck('uri'); @@ -39,15 +45,47 @@ public function index(): View $totalVisitsPastThirtyDays = $visits->where('created_at', '>=', $now->copy()->subDays(30))->count(); $totalVisitsAllTime = $visits->count(); - $visitsPerDay = $visits->groupBy(fn ($visit) => Carbon::parse($visit->created_at)->format('Y-m-d')) + $periods = [ + now()->format('Y-m-d') => 'Aujourd\'hui', + now()->subDay()->format('Y-m-d') => 'Hier', + now()->subDays(7)->format('Y-m-d') => 'Les 7 derniers jours', + now()->subDays(30)->format('Y-m-d') => 'Les 30 derniers jours', + now()->startOfMonth()->format('Y-m-d') => 'Ce mois-ci', + $visits->min('created_at')->format('Y-m-d') => 'Depuis le début', + ]; + + $startDate = $request->input('start_date', now()->subDays(30)->format('Y-m-d')); + $dateEnd = $request->input('end_date', now()->format('Y-m-d')); + + $selectedPeriod = $startDate; + + // Now, all the stats are calculated for the selected period + + /*$visitsPerDay = $visits->groupBy(fn ($visit) => Carbon::parse($visit->created_at)->format('Y-m-d')) + ->map(fn ($group) => ['date' => $group->first()->created_at->format('Y-m-d'), 'count' => $group->count()]) + ->values();*/ + $visitsPerDay = $visits->where('created_at', '>=', $startDate) + ->where('created_at', '<=', $dateEnd) + ->groupBy(fn ($visit) => Carbon::parse($visit->created_at)->format('Y-m-d')) ->map(fn ($group) => ['date' => $group->first()->created_at->format('Y-m-d'), 'count' => $group->count()]) ->values(); - $visitsByCountry = $visits->groupBy('country_code') + /*$visitsByCountry = $visits->groupBy('country_code') + ->map(fn ($group, $country) => ['country_code' => $country, 'count' => $group->count()]) + ->values();*/ + $visitsByCountry = $visits->where('created_at', '>=', $startDate) + ->where('created_at', '<=', $dateEnd) + ->groupBy('country_code') ->map(fn ($group, $country) => ['country_code' => $country, 'count' => $group->count()]) ->values(); - $mostVisitedPages = $visits->groupBy('url') + /*$mostVisitedPages = $visits->groupBy('url') + ->map(fn ($group, $url) => ['url' => $url, 'count' => $group->count()]) + ->sortByDesc('count') + ->values();*/ + $mostVisitedPages = $visits->where('created_at', '>=', $startDate) + ->where('created_at', '<=', $dateEnd) + ->groupBy('url') ->map(fn ($group, $url) => ['url' => $url, 'count' => $group->count()]) ->sortByDesc('count') ->values(); @@ -60,6 +98,8 @@ public function index(): View 'visitsPerDay' => $visitsPerDay, 'visitsByCountry' => $visitsByCountry, 'mostVisitedPages' => $mostVisitedPages, + 'periods' => $periods, + 'selectedPeriod' => $selectedPeriod, ]); } } diff --git a/resources/js/pages/admin/home.js b/resources/js/pages/admin/home.js index f6c7de90dd8ad0f688bcb885d1d3121f481aa37b..b431283491da6011be352ee4a65d5003cdadb9da 100644 --- a/resources/js/pages/admin/home.js +++ b/resources/js/pages/admin/home.js @@ -7,4 +7,12 @@ const app = createApp(); app.component('visits-per-day-chart', VisitsPerDayChart); app.component('visits-by-country-chart', VisitsByCountryChart); -app.mount('#admin-home') \ No newline at end of file +app.mount('#admin-home') + +const statsSelect = document.getElementById('statsSelect'); +statsSelect.addEventListener('change', () => { + let startDate = statsSelect.value; + let endDate = new Date().toISOString().split('T')[0]; + + window.location.href = `?start_date=${startDate}&end_date=${endDate}`; +}); \ No newline at end of file diff --git a/resources/views/admin/home.blade.php b/resources/views/admin/home.blade.php index 6f223d4769b9f35f29e023bd7738f1817894ad6a..2ecf3e23d8592b7dd83e41a2ac5cabb1299f823e 100644 --- a/resources/views/admin/home.blade.php +++ b/resources/views/admin/home.blade.php @@ -4,7 +4,7 @@ <div class="container" id="admin-home"> <h3 class="mb-4">Statistiques des Visites uniques</h3> - <div class="grid g-4 mb-4"> + <div class="grid mb-4"> <!-- Total des visites --> <div class="g-col-12 g-col-md-6 g-col-lg-3"> <div class="card text-center"> @@ -40,7 +40,14 @@ </div> </div> - <div class="row g-4 mb-4"> + <div class="grid mb-4"> + <div class="g-col-12 g-col-md-6 g-col-lg-3"> + <x-bs.select id="statsSelect" label="Période de statistiques" name="period" + :options="$periods" :selected="$selectedPeriod"/> + </div> + </div> + + <div class="row mb-4"> <!-- Visites par jour --> <div class="g-col-md-6 mb-4"> <div class="card">