From 3df99dd903e052673e300467a867dc6b9cfb7af8 Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 18:51:41 -0300 Subject: [PATCH 1/4] feat: adiciona scope past() ao model Event --- site_novo/app/Models/Event.php | 9 +++++++++ site_novo/tests/Feature/Models/EventTest.php | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/site_novo/app/Models/Event.php b/site_novo/app/Models/Event.php index 0f7fedd..38d43b9 100644 --- a/site_novo/app/Models/Event.php +++ b/site_novo/app/Models/Event.php @@ -53,6 +53,15 @@ public function scopeUpcoming(Builder $query): Builder return $query->where('starts_at', '>=', now()); } + /** + * @param Builder $query + * @return Builder + */ + public function scopePast(Builder $query): Builder + { + return $query->where('starts_at', '<', now()); + } + public function getBanner(): ?string { if ($this->banner) { diff --git a/site_novo/tests/Feature/Models/EventTest.php b/site_novo/tests/Feature/Models/EventTest.php index 609def1..97f601f 100644 --- a/site_novo/tests/Feature/Models/EventTest.php +++ b/site_novo/tests/Feature/Models/EventTest.php @@ -20,6 +20,14 @@ ->and(Event::upcoming()->first()->id)->toBe($upcoming->id); }); +test('past scope only returns events that already started', function () { + $past = Event::factory()->past()->create(); + Event::factory()->create(['starts_at' => now()->addDay()]); + + expect(Event::past()->get())->toHaveCount(1) + ->and(Event::past()->first()->id)->toBe($past->id); +}); + test('getBanner returns the storage url when a banner is set', function () { $event = Event::factory()->create(['banner' => 'events/banner.jpg']); From c5ddfcb24a19ffa3478ef5a253bab190391c8198 Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 18:51:43 -0300 Subject: [PATCH 2/4] =?UTF-8?q?feat(design):=20extrai=20card=20de=20evento?= =?UTF-8?q?=20como=20componente=20reutiliz=C3=A1vel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/landing/event-card.blade.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 site_novo/resources/views/components/landing/event-card.blade.php diff --git a/site_novo/resources/views/components/landing/event-card.blade.php b/site_novo/resources/views/components/landing/event-card.blade.php new file mode 100644 index 0000000..a2a9847 --- /dev/null +++ b/site_novo/resources/views/components/landing/event-card.blade.php @@ -0,0 +1,26 @@ +@props(['event', 'index' => 0]) + +@php $isPast = $event->starts_at->isPast(); @endphp + +
merge(['class' => 'relative snap-start rounded-[10px] overflow-hidden bg-[#0c3a68] border border-white/[0.08] transition-transform hover:-translate-y-1']) }}> + @if ($isPast) +
+ ENCERRADO +
+ @endif +
$isPast, + 'bg-[radial-gradient(circle_at_30%_40%,#3a6a9c,#0a2a4a_70%)]' => $index % 4 === 0, + 'bg-[radial-gradient(circle_at_70%_30%,#4b7aa6,#0a2a4a_70%)]' => $index % 4 === 1, + 'bg-[radial-gradient(circle_at_50%_60%,#2f5f94,#07223f_70%)]' => $index % 4 === 2, + 'bg-[radial-gradient(circle_at_20%_70%,#3f6e9e,#08254a_70%)]' => $index % 4 === 3, + ]) @style([ + "background-image: url('{$event->getBanner()}')" => $event->getBanner(), + ])>
+
+

{{ $event->title }}

+ {{ $event->location }} + +
+
From 5c9c5a2a23c70be0d4db9c34d135cfc684178f5d Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 18:51:44 -0300 Subject: [PATCH 3/4] fix(design): grade simples pra poucos eventos e fallback pra passados na home --- .../\342\232\241events-timeline.blade.php" | 36 +++++++++---------- .../tests/Feature/Home/EventsTimelineTest.php | 25 +++++++++++++ 2 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 site_novo/tests/Feature/Home/EventsTimelineTest.php diff --git "a/site_novo/resources/views/components/landing/\342\232\241events-timeline.blade.php" "b/site_novo/resources/views/components/landing/\342\232\241events-timeline.blade.php" index bd70896..7409466 100644 --- "a/site_novo/resources/views/components/landing/\342\232\241events-timeline.blade.php" +++ "b/site_novo/resources/views/components/landing/\342\232\241events-timeline.blade.php" @@ -8,7 +8,11 @@ public function mount(): void { - $this->events = Event::published()->orderBy('starts_at', 'desc')->take(8)->get(); + $this->events = Event::published()->upcoming()->orderBy('starts_at')->take(8)->get(); + + if ($this->events->isEmpty()) { + $this->events = Event::published()->past()->orderBy('starts_at', 'desc')->take(8)->get(); + } } }; ?> @@ -29,7 +33,16 @@ class="w-full sm:w-auto justify-center inline-flex items-center gap-2.5 px-[18px - @if (count($events) > 0) + @if (count($events) === 0) +

Nenhum evento publicado no momento. Volte em breve!

+ @elseif (count($events) <= 4) + {{-- Poucos eventos: grade simples, sem carrossel (evita cards soltos e setas sem função) --}} +
+ @foreach ($events as $i => $event) + + @endforeach +
+ @else @@ -69,8 +67,6 @@ class="hidden sm:grid place-items-center absolute top-[40%] -right-[18px] z-[5] - @else -

Nenhum evento publicado no momento. Volte em breve!

@endif diff --git a/site_novo/tests/Feature/Home/EventsTimelineTest.php b/site_novo/tests/Feature/Home/EventsTimelineTest.php new file mode 100644 index 0000000..d60f4e6 --- /dev/null +++ b/site_novo/tests/Feature/Home/EventsTimelineTest.php @@ -0,0 +1,25 @@ +create(['title' => 'Meetup Futuro']); + Event::factory()->past()->create(['title' => 'Meetup Passado']); + + $this->get(route('home')) + ->assertSee('Meetup Futuro') + ->assertDontSee('Meetup Passado'); +}); + +test('the home carousel falls back to past events when there are no upcoming ones', function () { + Event::factory()->past()->create(['title' => 'Meetup Passado']); + + $this->get(route('home')) + ->assertSee('Meetup Passado') + ->assertSee('ENCERRADO'); +}); + +test('the home carousel shows a message when there are no published events at all', function () { + $this->get(route('home')) + ->assertSee('Nenhum evento publicado no momento'); +}); From 5de8547acfce68848fb05af34d94326e95b915a3 Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 18:51:45 -0300 Subject: [PATCH 4/4] =?UTF-8?q?feat(design):=20filtros=20todos/pr=C3=B3xim?= =?UTF-8?q?os/passados=20na=20p=C3=A1gina=20de=20eventos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/Http/Controllers/EventController.php | 4 +- site_novo/app/Livewire/Events/EventList.php | 45 +++++++ .../resources/views/events/index.blade.php | 80 +----------- .../livewire/events/event-list.blade.php | 116 ++++++++++++++++++ .../tests/Feature/Events/EventIndexTest.php | 6 +- .../Feature/Livewire/Events/EventListTest.php | 40 ++++++ 6 files changed, 210 insertions(+), 81 deletions(-) create mode 100644 site_novo/app/Livewire/Events/EventList.php create mode 100644 site_novo/resources/views/livewire/events/event-list.blade.php create mode 100644 site_novo/tests/Feature/Livewire/Events/EventListTest.php diff --git a/site_novo/app/Http/Controllers/EventController.php b/site_novo/app/Http/Controllers/EventController.php index f9ff3dd..fc3ca52 100644 --- a/site_novo/app/Http/Controllers/EventController.php +++ b/site_novo/app/Http/Controllers/EventController.php @@ -8,8 +8,8 @@ class EventController extends Controller { public function index() { - $events = Event::published()->upcoming()->orderBy('starts_at')->get(); + $upcomingEvents = Event::published()->upcoming()->orderBy('starts_at')->get(); - return view('events.index', ['events' => $events]); + return view('events.index', ['upcomingEvents' => $upcomingEvents]); } } diff --git a/site_novo/app/Livewire/Events/EventList.php b/site_novo/app/Livewire/Events/EventList.php new file mode 100644 index 0000000..361dba7 --- /dev/null +++ b/site_novo/app/Livewire/Events/EventList.php @@ -0,0 +1,45 @@ + ['except' => 'all'], + ]; + + public function mount(): void + { + $this->loadEvents(); + } + + public function updatedFilter(): void + { + $this->loadEvents(); + } + + private function loadEvents(): void + { + $query = Event::published(); + + match ($this->filter) { + 'upcoming' => $query->upcoming()->orderBy('starts_at'), + 'past' => $query->past()->orderBy('starts_at', 'desc'), + default => $query->orderBy('starts_at', 'desc'), + }; + + $this->events = $query->get(); + } + + public function render() + { + return view('livewire.events.event-list'); + } +} diff --git a/site_novo/resources/views/events/index.blade.php b/site_novo/resources/views/events/index.blade.php index 9861aeb..a3a5e5b 100644 --- a/site_novo/resources/views/events/index.blade.php +++ b/site_novo/resources/views/events/index.blade.php @@ -1,12 +1,12 @@ - @if ($events->count() > 0) + @if ($upcomingEvents->count() > 0)