Skip to content

Commit 760c5e0

Browse files
Fix featured filters by stopping duplicate Livewire load.
Livewire was included twice on new_base pages, so month/language changes never updated the component. Also normalize bad language codes like eng and show upcoming open-online counts. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent d29cf7f commit 760c5e0

4 files changed

Lines changed: 86 additions & 15 deletions

File tree

‎app/Livewire/OnlineCalendar.php‎

Lines changed: 77 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -95,18 +95,15 @@ public function render()
9595
$languages = $this->baseQuery()
9696
->get(['language'])
9797
->flatMap(function ($event) {
98-
return $event->languages ?? [];
99-
})
100-
->filter(function ($language) {
101-
return ! empty($language);
98+
return $this->normalizedLanguagesForEvent($event);
10299
})
103100
->unique()
104101
->sort()
105102
->values()
106103
->map(function ($language) {
107104
return [
108105
'id' => $language,
109-
'name' => __("base.languages.{$language}"),
106+
'name' => __('base.languages.'.$language),
110107
];
111108
})
112109
->prepend([
@@ -115,10 +112,14 @@ public function render()
115112
])
116113
->toArray();
117114

115+
$totalUpcoming = $this->baseQuery()->count();
116+
118117
return view('livewire.online-calendar', [
119118
'countryNames' => $this->getCountryNamesFromEvents($events),
120119
'languages' => $languages,
121120
'filteredEvents' => $filteredEvents->paginate(50),
121+
'totalUpcoming' => $totalUpcoming,
122+
'visibleCount' => $filteredEvents->count(),
122123
]);
123124
}
124125

@@ -134,17 +135,81 @@ private function baseQuery()
134135

135136
private function eventMatchesLanguage($event, string $selectedLanguage): bool
136137
{
137-
$languages = $event->languages ?? [];
138+
$selected = $this->normalizeLanguageCode($selectedLanguage);
138139

139-
if (! is_array($languages)) {
140-
return strtolower((string) $languages) === strtolower($selectedLanguage);
140+
if ($selected === null) {
141+
return false;
141142
}
142143

143-
$normalized = array_map(static function ($language) {
144-
return strtolower((string) $language);
145-
}, $languages);
144+
return in_array($selected, $this->normalizedLanguagesForEvent($event), true);
145+
}
146+
147+
private function normalizedLanguagesForEvent($event): array
148+
{
149+
$raw = $event->languages ?? $event->language ?? [];
150+
151+
if (is_string($raw)) {
152+
$trimmed = trim($raw);
153+
if ($trimmed === '') {
154+
return [];
155+
}
156+
157+
if (str_starts_with($trimmed, '[')) {
158+
$decoded = json_decode($trimmed, true);
159+
$raw = is_array($decoded) ? $decoded : preg_split('/\s*,\s*/', $trimmed);
160+
} else {
161+
$raw = preg_split('/\s*,\s*/', $trimmed);
162+
}
163+
}
164+
165+
if (! is_array($raw)) {
166+
$raw = [$raw];
167+
}
168+
169+
return collect($raw)
170+
->map(fn ($language) => $this->normalizeLanguageCode(is_string($language) ? $language : null))
171+
->filter()
172+
->unique()
173+
->values()
174+
->all();
175+
}
176+
177+
private function normalizeLanguageCode(?string $code): ?string
178+
{
179+
if ($code === null) {
180+
return null;
181+
}
182+
183+
$code = strtolower(trim($code));
184+
$code = trim($code, "\"'[] ");
185+
186+
if ($code === '') {
187+
return null;
188+
}
189+
190+
$aliases = [
191+
'eng' => 'en',
192+
'deu' => 'de',
193+
'ger' => 'de',
194+
'fra' => 'fr',
195+
'fre' => 'fr',
196+
'spa' => 'es',
197+
'ita' => 'it',
198+
'nld' => 'nl',
199+
'dut' => 'nl',
200+
'pol' => 'pl',
201+
'tur' => 'tr',
202+
'ell' => 'el',
203+
'gre' => 'el',
204+
];
205+
206+
$code = $aliases[$code] ?? $code;
207+
208+
if (! trans()->has('base.languages.'.$code)) {
209+
return null;
210+
}
146211

147-
return in_array(strtolower($selectedLanguage), $normalized, true);
212+
return $code;
148213
}
149214

150215
private function getCountryNamesFromEvents($events)

‎resources/views/components/livewire.blade.php‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,5 @@
22
@livewireStyles
33
@endpush
44

5-
@push('scripts')
6-
@livewireScripts
7-
@endpush
5+
{{-- Do not push @livewireScripts here. Layouts (new_base/base) already include them.
6+
Loading Livewire twice breaks wire:model updates (filters appear to do nothing). --}}

‎resources/views/layout/new_base.blade.php‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick-theme.min.css" />
2222

2323
@stack('extra-css')
24+
@livewireStyles
2425
@include('layout.analytics')
2526

2627
<script>

‎resources/views/livewire/online-calendar.blade.php‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ class="w-full appearance-none rounded-full border border-slate-200 bg-white py-3
4545
<div class="absolute top-0 w-full h-64 bg-yellow-50 hidden xl:block" style="clip-path: ellipse(65% 90% at 50% 90%)" ></div>
4646
<div class="bg-yellow-50">
4747
<div class="codeweek-container-lg relative pt-10 pb-16 md:pb-28">
48+
<p class="text-center text-slate-500 text-lg mb-8">
49+
Showing {{ $visibleCount }} of {{ $totalUpcoming }} upcoming open online activities
50+
@if($selectedDate)
51+
for {{ \Carbon\Carbon::createFromDate($selectedYear, $selectedMonth, 1)->format('F Y') }}
52+
@endif
53+
</p>
4854
@if(count($filteredEvents) > 0)
4955
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 xl:gap-10">
5056
@foreach($filteredEvents as $event)

0 commit comments

Comments
 (0)