Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 77 additions & 12 deletions app/Livewire/OnlineCalendar.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,18 +95,15 @@ public function render()
$languages = $this->baseQuery()
->get(['language'])
->flatMap(function ($event) {
return $event->languages ?? [];
})
->filter(function ($language) {
return ! empty($language);
return $this->normalizedLanguagesForEvent($event);
})
->unique()
->sort()
->values()
->map(function ($language) {
return [
'id' => $language,
'name' => __("base.languages.{$language}"),
'name' => __('base.languages.'.$language),
];
})
->prepend([
Expand All @@ -115,10 +112,14 @@ public function render()
])
->toArray();

$totalUpcoming = $this->baseQuery()->count();

return view('livewire.online-calendar', [
'countryNames' => $this->getCountryNamesFromEvents($events),
'languages' => $languages,
'filteredEvents' => $filteredEvents->paginate(50),
'totalUpcoming' => $totalUpcoming,
'visibleCount' => $filteredEvents->count(),
]);
}

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

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

if (! is_array($languages)) {
return strtolower((string) $languages) === strtolower($selectedLanguage);
if ($selected === null) {
return false;
}

$normalized = array_map(static function ($language) {
return strtolower((string) $language);
}, $languages);
return in_array($selected, $this->normalizedLanguagesForEvent($event), true);
}

private function normalizedLanguagesForEvent($event): array
{
$raw = $event->languages ?? $event->language ?? [];

if (is_string($raw)) {
$trimmed = trim($raw);
if ($trimmed === '') {
return [];
}

if (str_starts_with($trimmed, '[')) {
$decoded = json_decode($trimmed, true);
$raw = is_array($decoded) ? $decoded : preg_split('/\s*,\s*/', $trimmed);
} else {
$raw = preg_split('/\s*,\s*/', $trimmed);
}
}

if (! is_array($raw)) {
$raw = [$raw];
}

return collect($raw)
->map(fn ($language) => $this->normalizeLanguageCode(is_string($language) ? $language : null))
->filter()
->unique()
->values()
->all();
}

private function normalizeLanguageCode(?string $code): ?string
{
if ($code === null) {
return null;
}

$code = strtolower(trim($code));
$code = trim($code, "\"'[] ");

if ($code === '') {
return null;
}

$aliases = [
'eng' => 'en',
'deu' => 'de',
'ger' => 'de',
'fra' => 'fr',
'fre' => 'fr',
'spa' => 'es',
'ita' => 'it',
'nld' => 'nl',
'dut' => 'nl',
'pol' => 'pl',
'tur' => 'tr',
'ell' => 'el',
'gre' => 'el',
];

$code = $aliases[$code] ?? $code;

if (! trans()->has('base.languages.'.$code)) {
return null;
}

return in_array(strtolower($selectedLanguage), $normalized, true);
return $code;
}

private function getCountryNamesFromEvents($events)
Expand Down
5 changes: 2 additions & 3 deletions resources/views/components/livewire.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,5 @@
@livewireStyles
@endpush

@push('scripts')
@livewireScripts
@endpush
{{-- Do not push @livewireScripts here. Layouts (new_base/base) already include them.
Loading Livewire twice breaks wire:model updates (filters appear to do nothing). --}}
1 change: 1 addition & 0 deletions resources/views/layout/new_base.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick-theme.min.css" />

@stack('extra-css')
@livewireStyles
@include('layout.analytics')

<script>
Expand Down
6 changes: 6 additions & 0 deletions resources/views/livewire/online-calendar.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ class="w-full appearance-none rounded-full border border-slate-200 bg-white py-3
<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>
<div class="bg-yellow-50">
<div class="codeweek-container-lg relative pt-10 pb-16 md:pb-28">
<p class="text-center text-slate-500 text-lg mb-8">
Showing {{ $visibleCount }} of {{ $totalUpcoming }} upcoming open online activities
@if($selectedDate)
for {{ \Carbon\Carbon::createFromDate($selectedYear, $selectedMonth, 1)->format('F Y') }}
@endif
</p>
@if(count($filteredEvents) > 0)
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 xl:gap-10">
@foreach($filteredEvents as $event)
Expand Down
Loading