From 8ead108a273757d287e0b83bc44edf5ffe25007f Mon Sep 17 00:00:00 2001 From: isaacclad Date: Sat, 4 Jul 2026 12:49:21 +0000 Subject: [PATCH] Nest Programmes under Events in sidebar and add programmes index hero. Match the Events list layout with balance, programme, and session stats so programme management feels consistent with the rest of the app. Co-authored-by: Cursor --- .../Events/ProgrammeController.php | 19 +++- resources/views/events/programmes.blade.php | 105 +++++++++++++----- resources/views/partials/sidebar.blade.php | 27 ++++- 3 files changed, 118 insertions(+), 33 deletions(-) diff --git a/app/Http/Controllers/Events/ProgrammeController.php b/app/Http/Controllers/Events/ProgrammeController.php index b842765..2c7120f 100644 --- a/app/Http/Controllers/Events/ProgrammeController.php +++ b/app/Http/Controllers/Events/ProgrammeController.php @@ -3,14 +3,16 @@ namespace App\Http\Controllers\Events; use App\Http\Controllers\Controller; -use App\Models\QrCode; use App\Models\QrWallet; +use App\Services\Qr\QrCodeManagerService; use App\Support\Qr\QrTypeCatalog; use Illuminate\Http\Request; use Illuminate\View\View; class ProgrammeController extends Controller { + public function __construct(private QrCodeManagerService $manager) {} + public function create(): View { return view('events.programme-create', [ @@ -21,12 +23,25 @@ class ProgrammeController extends Controller public function index(Request $request): View { $account = ladill_account(); + $wallet = $this->manager->walletFor($account); $programmes = $account->qrCodes() ->whereIn('type', QrTypeCatalog::programmeTypes()) ->latest() ->get(); - return view('events.programmes', compact('programmes')); + $totalSessions = $programmes->sum(function ($programme) { + $days = (array) ($programme->content()['days'] ?? []); + + return collect($days)->sum(fn ($day) => count((array) ($day['items'] ?? []))); + }); + + return view('events.programmes', [ + 'programmes' => $programmes, + 'wallet' => $wallet, + 'totalSessions' => $totalSessions, + 'pricePerQr' => QrWallet::pricePerQr(), + 'topupUrl' => 'https://'.config('app.account_domain').'/wallet', + ]); } } diff --git a/resources/views/events/programmes.blade.php b/resources/views/events/programmes.blade.php index 96ee4b4..a216c82 100644 --- a/resources/views/events/programmes.blade.php +++ b/resources/views/events/programmes.blade.php @@ -1,34 +1,87 @@ Programmes -
-
-
-

Programmes

-

Itinerary and schedule outlines you can attach to events and share with attendees.

+ +
+ @foreach(['success', 'error'] as $flash) + @if(session($flash)) +
+

{{ session($flash) }}

+
+ @endif + @endforeach + +
+
+
+
+
+
+ Schedules · Sessions · Speaker line-ups +
+

Your programmes

+

+ Build itinerary outlines you can attach to events and share with attendees via Ladill Link. +

+
+ +
+
+ +
+
+

GHS {{ number_format($wallet->spendableBalance(), 2) }}

+

Account balance

+
+
+

{{ $programmes->count() }}

+

Programmes

+
+
+

{{ number_format($totalSessions) }}

+

Sessions

+
+
+
- - - New programme -
- @if($programmes->isEmpty()) -
-

No programmes yet.

- Create a programme outline +
+
+

Your programmes

- @else - - @endif + @if($programmes->isEmpty()) +

No programmes yet. Create your first programme outline to get started.

+ @else + + @endif +
diff --git a/resources/views/partials/sidebar.blade.php b/resources/views/partials/sidebar.blade.php index 948f421..c0475b6 100644 --- a/resources/views/partials/sidebar.blade.php +++ b/resources/views/partials/sidebar.blade.php @@ -5,25 +5,42 @@
@php + $eventsActive = request()->routeIs('events.index') || request()->routeIs('events.create') || request()->routeIs('events.show'); + $programmesActive = request()->routeIs('programmes.*'); + $eventsSectionActive = $eventsActive || $programmesActive; + $main = [ ['name' => 'Overview', 'route' => route('events.dashboard'), 'active' => request()->routeIs('events.dashboard'), 'icon' => ''], - ['name' => 'Events', 'route' => route('events.index'), 'active' => request()->routeIs('events.index') || request()->routeIs('events.create') || request()->routeIs('events.show'), - 'icon' => ''], ['name' => 'Attendees', 'route' => route('attendees.index'), 'active' => request()->routeIs('attendees.*') || request()->routeIs('events.attendees*'), 'icon' => ''], ['name' => 'Badge printing', 'route' => route('badges.index'), 'active' => request()->routeIs('badges.*') || request()->routeIs('events.badge-printing') || request()->routeIs('events.badges*'), 'icon' => ''], - ['name' => 'Programmes', 'route' => route('programmes.index'), 'active' => request()->routeIs('programmes.*'), - 'icon' => ''], ['name' => 'Speakers', 'route' => route('speakers.index'), 'active' => request()->routeIs('speakers.*'), 'icon' => ''], ['name' => 'Payments & Payouts', 'route' => route('events.payouts'), 'active' => request()->routeIs('events.payouts'), 'icon' => ''], ]; + + $eventsIcon = ''; @endphp