From c086d7f7c22d03472473ad5caad857a7a91b20c6 Mon Sep 17 00:00:00 2001 From: HolgerHatGarKeineNode Date: Fri, 21 Nov 2025 10:55:01 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20event=20management=20to=20mee?= =?UTF-8?q?tups=20landing=20pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added route for event pages within meetups. - Updated meetups landing page to display upcoming events. - Implemented individual event detail pages. - Enhanced meetups table with the next event column. --- app/Models/Meetup.php | 5 +- .../views/livewire/meetups/index.blade.php | 16 +++ .../meetups/landingpage-event.blade.php | 118 ++++++++++++++++++ .../livewire/meetups/landingpage.blade.php | 48 +++++++ routes/web.php | 1 + 5 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 resources/views/livewire/meetups/landingpage-event.blade.php diff --git a/app/Models/Meetup.php b/app/Models/Meetup.php index 52da3bc..1853b1e 100644 --- a/app/Models/Meetup.php +++ b/app/Models/Meetup.php @@ -118,12 +118,13 @@ class Meetup extends Model implements HasMedia return Attribute::make( get: fn() => $nextEvent ? [ - 'start' => $nextEvent->start->toDateTimeString(), - 'portalLink' => url()->route('meetup.event.landing', ['country' => $this->city->country, 'meetupEvent' => $nextEvent]), + 'start' => $nextEvent->start, + 'portalLink' => url()->route('meetups.landingpage-event', ['country' => $this->city->country, 'meetup' => $this, 'event' => $nextEvent]), 'location' => $nextEvent->location, 'description' => $nextEvent->description, 'link' => $nextEvent->link, 'attendees' => count($nextEvent->attendees ?? []), + 'might_attendees' => count($nextEvent->might_attendees ?? []), 'nostr_note' => str($nextEvent->nostr_status)->after('Sent event ')->before(' to '), ] : null, ); diff --git a/resources/views/livewire/meetups/index.blade.php b/resources/views/livewire/meetups/index.blade.php index c7f87f2..44421da 100644 --- a/resources/views/livewire/meetups/index.blade.php +++ b/resources/views/livewire/meetups/index.blade.php @@ -62,6 +62,7 @@ new class extends Component { {{ __('Name') }} + {{ __('Nächster Termin') }} {{ __('Links') }} {{ __('Aktionen') }} @@ -87,6 +88,21 @@ new class extends Component { + + @if($meetup->nextEvent && $meetup->nextEvent['start']->isFuture()) +
+ + {{ $meetup->nextEvent['start']->format('d.m.Y H:i') }} + +
+ {{ $meetup->nextEvent['attendees'] }} Zusagen + + {{ $meetup->nextEvent['might_attendees'] }} Vielleicht +
+
+ @endif +
+
@if($meetup->telegram_link) diff --git a/resources/views/livewire/meetups/landingpage-event.blade.php b/resources/views/livewire/meetups/landingpage-event.blade.php new file mode 100644 index 0000000..dc25b2d --- /dev/null +++ b/resources/views/livewire/meetups/landingpage-event.blade.php @@ -0,0 +1,118 @@ +country = request()->route('country'); + } + + public function with(): array + { + return [ + 'event' => $this->event->load('meetup'), + ]; + } +}; ?> + +
+ +
+ + + {{ $event->meetup->name }} + + / + {{ $event->start->format('d.m.Y') }} + +
+ + + + + + {{ $event->start->format('d.m.Y') }} + + +
+ +
+ +
+
{{ $event->start->format('H:i') }} Uhr
+
{{ $event->start->isoFormat('dddd, D. MMMM YYYY') }}
+
+
+ + + @if($event->location) +
+ +
+
{{ __('Ort') }}
+
{{ $event->location }}
+
+
+ @endif + + + @if($event->description) +
+ {{ __('Beschreibung') }} + {{ $event->description }} +
+ @endif + + + @if($event->link) +
+ + + {{ __('Mehr Informationen') }} + +
+ @endif + + + @if($event->attendees && count($event->attendees) > 0) +
+ + {{ __('Zusagen') }} ({{ count($event->attendees) }}) + +
+ @foreach($event->attendees as $attendee) + {{ $attendee }} + @endforeach +
+
+ @endif + + + @if($event->might_attendees && count($event->might_attendees) > 0) +
+ + {{ __('Vielleicht') }} ({{ count($event->might_attendees) }}) + +
+ @foreach($event->might_attendees as $attendee) + {{ $attendee }} + @endforeach +
+
+ @endif +
+
+ + +
+ + + {{ __('Zurück zum Meetup') }} + +
+
diff --git a/resources/views/livewire/meetups/landingpage.blade.php b/resources/views/livewire/meetups/landingpage.blade.php index 4340b9d..99a42cd 100644 --- a/resources/views/livewire/meetups/landingpage.blade.php +++ b/resources/views/livewire/meetups/landingpage.blade.php @@ -1,15 +1,27 @@ country = request()->route('country'); + } + public function with(): array { return [ 'meetup' => $this->meetup, + 'events' => $this->meetup->meetupEvents() + ->where('start', '>=', now()) + ->orderBy('start', 'asc') + ->get(), ]; } }; ?> @@ -165,4 +177,40 @@ new class extends Component {
+ + + @if($events->isNotEmpty()) + + @endif diff --git a/routes/web.php b/routes/web.php index 8e057ce..68b1d3e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -17,6 +17,7 @@ Route::middleware([]) Volt::route('meetups', 'meetups.index')->name('meetups.index'); Volt::route('map', 'meetups.map')->name('meetups.map'); Volt::route('meetup/{meetup:slug}', 'meetups.landingpage')->name('meetups.landingpage'); + Volt::route('meetup/{meetup:slug}/event/{event}', 'meetups.landingpage-event')->name('meetups.landingpage-event'); }); Route::middleware(['auth'])