diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php index 2cfdcbf..27191df 100644 --- a/app/Http/Controllers/Admin/DashboardController.php +++ b/app/Http/Controllers/Admin/DashboardController.php @@ -5,13 +5,23 @@ declare(strict_types=1); namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; +use App\Services\DashboardStatisticsService; use Illuminate\Http\Request; use Illuminate\View\View; class DashboardController extends Controller { - public function __invoke(Request $request): View + public function __invoke(Request $request, DashboardStatisticsService $statistics): View { - return view('admin.dashboard'); + $user = $request->user(); + abort_if($user === null, 401); + + $stats = $statistics->forUser($user); + + return view('admin.dashboard', [ + 'totalPages' => $stats['total_pages'], + 'totalSubscribers' => $stats['total_subscribers'], + 'activePages' => $stats['active_pages'], + ]); } } diff --git a/app/Http/Controllers/Auth/AuthenticatedSessionController.php b/app/Http/Controllers/Auth/AuthenticatedSessionController.php index 613bcd9..a572ab7 100644 --- a/app/Http/Controllers/Auth/AuthenticatedSessionController.php +++ b/app/Http/Controllers/Auth/AuthenticatedSessionController.php @@ -28,7 +28,7 @@ class AuthenticatedSessionController extends Controller $request->session()->regenerate(); - return redirect()->intended(route('dashboard', absolute: false)); + return redirect()->intended(route('admin.dashboard', absolute: false)); } /** diff --git a/app/Http/Controllers/Auth/ConfirmablePasswordController.php b/app/Http/Controllers/Auth/ConfirmablePasswordController.php index 712394a..018a63e 100644 --- a/app/Http/Controllers/Auth/ConfirmablePasswordController.php +++ b/app/Http/Controllers/Auth/ConfirmablePasswordController.php @@ -35,6 +35,6 @@ class ConfirmablePasswordController extends Controller $request->session()->put('auth.password_confirmed_at', time()); - return redirect()->intended(route('dashboard', absolute: false)); + return redirect()->intended(route('admin.dashboard', absolute: false)); } } diff --git a/app/Http/Controllers/Auth/EmailVerificationNotificationController.php b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php index f64fa9b..a8f8f06 100644 --- a/app/Http/Controllers/Auth/EmailVerificationNotificationController.php +++ b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php @@ -14,7 +14,7 @@ class EmailVerificationNotificationController extends Controller public function store(Request $request): RedirectResponse { if ($request->user()->hasVerifiedEmail()) { - return redirect()->intended(route('dashboard', absolute: false)); + return redirect()->intended(route('admin.dashboard', absolute: false)); } $request->user()->sendEmailVerificationNotification(); diff --git a/app/Http/Controllers/Auth/EmailVerificationPromptController.php b/app/Http/Controllers/Auth/EmailVerificationPromptController.php index ee3cb6f..1b4447f 100644 --- a/app/Http/Controllers/Auth/EmailVerificationPromptController.php +++ b/app/Http/Controllers/Auth/EmailVerificationPromptController.php @@ -15,7 +15,7 @@ class EmailVerificationPromptController extends Controller public function __invoke(Request $request): RedirectResponse|View { return $request->user()->hasVerifiedEmail() - ? redirect()->intended(route('dashboard', absolute: false)) + ? redirect()->intended(route('admin.dashboard', absolute: false)) : view('auth.verify-email'); } } diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index 44a3930..2cb3036 100644 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -46,6 +46,6 @@ class RegisteredUserController extends Controller Auth::login($user); - return redirect(route('dashboard', absolute: false)); + return redirect(route('admin.dashboard', absolute: false)); } } diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php index 784765e..49fb0b2 100644 --- a/app/Http/Controllers/Auth/VerifyEmailController.php +++ b/app/Http/Controllers/Auth/VerifyEmailController.php @@ -15,13 +15,13 @@ class VerifyEmailController extends Controller public function __invoke(EmailVerificationRequest $request): RedirectResponse { if ($request->user()->hasVerifiedEmail()) { - return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + return redirect()->intended(route('admin.dashboard', absolute: false).'?verified=1'); } if ($request->user()->markEmailAsVerified()) { event(new Verified($request->user())); } - return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + return redirect()->intended(route('admin.dashboard', absolute: false).'?verified=1'); } } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index a48eb8d..3e5185e 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -34,7 +34,7 @@ class ProfileController extends Controller $request->user()->save(); - return Redirect::route('profile.edit')->with('status', 'profile-updated'); + return Redirect::route('admin.profile.edit')->with('status', 'profile-updated'); } /** diff --git a/app/Services/DashboardStatisticsService.php b/app/Services/DashboardStatisticsService.php new file mode 100644 index 0000000..aa8e829 --- /dev/null +++ b/app/Services/DashboardStatisticsService.php @@ -0,0 +1,41 @@ +isSuperadmin()) { + $pagesQuery->where('user_id', $user->id); + } + + $now = Carbon::now(); + $totalPages = (clone $pagesQuery)->count(); + $pageIds = (clone $pagesQuery)->pluck('id'); + $totalSubscribers = $pageIds->isEmpty() + ? 0 + : Subscriber::whereIn('preregistration_page_id', $pageIds)->count(); + $activePages = (clone $pagesQuery) + ->where('start_date', '<=', $now) + ->where('end_date', '>=', $now) + ->count(); + + return [ + 'total_pages' => $totalPages, + 'total_subscribers' => $totalSubscribers, + 'active_pages' => $activePages, + ]; + } +} diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php new file mode 100644 index 0000000..fe86d83 --- /dev/null +++ b/resources/views/admin/dashboard.blade.php @@ -0,0 +1,92 @@ +@extends('layouts.admin') + +@section('title', __('Dashboard')) + +@section('mobile_title', __('Dashboard')) + +@section('content') +
{{ __('Overview of your pre-registration activity.') }}
+{{ __('Total pages') }}
+{{ number_format($totalPages) }}
++ @if (auth()->user()->isSuperadmin()) + {{ __('All pre-registration pages in the system.') }} + @else + {{ __('Pages you own.') }} + @endif +
+{{ __('Total subscribers') }}
+{{ number_format($totalSubscribers) }}
+{{ __('Across all pages in this overview.') }}
+{{ __('Active pages') }}
+{{ number_format($activePages) }}
+{{ __('Currently within the start and end date window.') }}
+{{ __('Ready to launch a new campaign?') }}
+ + {{ __('Create a pre-registration page') }} → + +{{ __('Form will be added in Step 8.') }}
+{{ __('Form will be added in Step 8.') }}
+{{ __('Page list and CRUD will be added in the next step.') }}
+{{ __('Detail view placeholder.') }}
+{{ __('Form will be added in Step 10.') }}
+{{ $user->email }}
+{{ __('Form will be added in Step 10.') }}
+{{ __('User management will be completed in a later step.') }}
+