Skip to content
Snippets Groups Projects
Verified Commit 4d6a3312 authored by Sofiane Lasri's avatar Sofiane Lasri
Browse files

feat: add date range filtering to visit statistics

- Updated `HomeController` to accept `start_date` and `end_date` as request parameters for filtering visit statistics.
- Implemented validation for date inputs.
- Added a new select input in the admin home view for selecting the statistics period.
- Enhanced JavaScript to handle date selection and refresh the page with the selected date range.
parent 9febb932
No related branches found
No related tags found
No related merge requests found
......@@ -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,
]);
}
}
......@@ -8,3 +8,11 @@ app.component('visits-per-day-chart', VisitsPerDayChart);
app.component('visits-by-country-chart', VisitsByCountryChart);
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
......@@ -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">
......
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment