Skip to content

Commit d29cf7f

Browse files
authored
Merge pull request #3654 from codeeu/fix/featured-activities-filters
Fix featured activities filters
2 parents a8ea809 + 79a1a6c commit d29cf7f

3 files changed

Lines changed: 97 additions & 57 deletions

File tree

‎app/Livewire/OnlineCalendar.php‎

Lines changed: 38 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,31 @@
44

55
use App\Country;
66
use App\Event;
7-
use App\Queries\CountriesQuery;
87
use Carbon\Carbon;
9-
use Illuminate\Support\Facades\App;
108
use Livewire\Component;
119
use Livewire\WithPagination;
1210

1311
class OnlineCalendar extends Component
1412
{
1513
use WithPagination;
1614

17-
public $events;
18-
19-
private $filteredEvents;
20-
21-
public $selectedLanguage;
15+
public $selectedLanguage = '';
2216

2317
public $selectedYear;
2418

2519
public $selectedMonth;
2620

2721
public $selectedDate;
2822

29-
public $months;
30-
31-
public $listeners = ['eventsUpdated' => 'render'];
32-
33-
private $whereClause = [
34-
'activity_type' => 'open-online',
35-
'status' => 'APPROVED',
36-
];
23+
public $months = [];
3724

3825
public function mount()
3926
{
40-
$this->selectedLanguage = strtolower(App::getLocale());
4127
$this->selectedYear = Carbon::now()->year;
4228
$this->selectedMonth = Carbon::now()->month;
4329
$this->selectedDate = $this->selectedMonth.'/'.$this->selectedYear;
30+
// Default to all languages so the list is not silently reduced/restored by locale.
31+
$this->selectedLanguage = '';
4432

4533
$this->months = $this->baseQuery()
4634
->orderBy('start_date')
@@ -69,47 +57,51 @@ public function mount()
6957
}
7058
}
7159

60+
public function updatedSelectedDate(): void
61+
{
62+
$this->resetPage();
63+
}
64+
65+
public function updatedSelectedLanguage(): void
66+
{
67+
$this->resetPage();
68+
}
69+
7270
public function render()
7371
{
7472
$parts = explode('/', (string) $this->selectedDate);
7573
$this->selectedMonth = (int) ($parts[0] ?: $this->selectedMonth);
7674
$this->selectedYear = (int) ($parts[1] ?? $this->selectedYear);
7775

78-
$this->events = $this->baseQuery()
76+
$events = $this->baseQuery()
7977
->whereMonth('start_date', $this->selectedMonth)
8078
->whereYear('start_date', $this->selectedYear)
8179
->orderBy('start_date')
8280
->get();
8381

84-
$this->events->map(function ($event) {
82+
$events->each(function ($event) {
8583
$event->title = str_limit($event->title, 50);
8684
$event->start_date = Carbon::parse($event->start_date);
8785
});
8886

89-
if ($this->selectedLanguage !== '') {
90-
$this->filteredEvents = $this->events->filter(function ($event) {
91-
return $this->eventMatchesLanguage($event, $this->selectedLanguage);
92-
});
93-
94-
if ($this->filteredEvents->isEmpty()) {
95-
$this->filteredEvents = $this->events;
96-
}
87+
if ($this->selectedLanguage !== '' && $this->selectedLanguage !== null) {
88+
$filteredEvents = $events->filter(function ($event) {
89+
return $this->eventMatchesLanguage($event, (string) $this->selectedLanguage);
90+
})->values();
9791
} else {
98-
$this->filteredEvents = $this->events;
92+
$filteredEvents = $events;
9993
}
10094

101-
$countries = CountriesQuery::withOnlineEvents('NONE');
102-
103-
$countryNames = $this->getCountryNamesFromEvents($this->events);
104-
105-
$languages = $this->events
95+
$languages = $this->baseQuery()
96+
->get(['language'])
10697
->flatMap(function ($event) {
10798
return $event->languages ?? [];
10899
})
109100
->filter(function ($language) {
110101
return ! empty($language);
111102
})
112103
->unique()
104+
->sort()
113105
->values()
114106
->map(function ($language) {
115107
return [
@@ -124,16 +116,18 @@ public function render()
124116
->toArray();
125117

126118
return view('livewire.online-calendar', [
127-
'countries' => $countries,
128-
'countryNames' => $countryNames,
119+
'countryNames' => $this->getCountryNamesFromEvents($events),
129120
'languages' => $languages,
130-
'filteredEvents' => $this->filteredEvents->paginate(50),
121+
'filteredEvents' => $filteredEvents->paginate(50),
131122
]);
132123
}
133124

134125
private function baseQuery()
135126
{
136-
return Event::where($this->whereClause)
127+
return Event::where([
128+
'activity_type' => 'open-online',
129+
'status' => 'APPROVED',
130+
])
137131
->where('start_date', '>=', Carbon::now()->firstOfMonth())
138132
->where('end_date', '>=', Carbon::now());
139133
}
@@ -143,16 +137,16 @@ private function eventMatchesLanguage($event, string $selectedLanguage): bool
143137
$languages = $event->languages ?? [];
144138

145139
if (! is_array($languages)) {
146-
return $languages == $selectedLanguage;
140+
return strtolower((string) $languages) === strtolower($selectedLanguage);
147141
}
148142

149-
return in_array($selectedLanguage, $languages, true)
150-
|| in_array(strtolower($selectedLanguage), array_map('strtolower', $languages), true);
143+
$normalized = array_map(static function ($language) {
144+
return strtolower((string) $language);
145+
}, $languages);
146+
147+
return in_array(strtolower($selectedLanguage), $normalized, true);
151148
}
152149

153-
/**
154-
* @return mixed
155-
*/
156150
private function getCountryNamesFromEvents($events)
157151
{
158152
$country_codes = $events
@@ -161,10 +155,9 @@ private function getCountryNamesFromEvents($events)
161155
->all();
162156

163157
$countriesObjects = Country::whereIn('iso', $country_codes)->get();
164-
$countryNames = $countriesObjects->mapWithKeys(function ($item) {
158+
159+
return $countriesObjects->mapWithKeys(function ($item) {
165160
return [$item['iso'] => __('countries.'.$item['name'])];
166161
});
167-
168-
return $countryNames;
169162
}
170163
}

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

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,33 @@
77
Month
88
</label>
99
<div class="dropdown-datepicker relative">
10-
<img src="/images/educational-resources/fi_calendar.svg" class="absolute top-1/2 left-4 -translate-y-1/2 z-[999]" />
11-
<select-field
10+
<img src="/images/educational-resources/fi_calendar.svg" class="absolute top-1/2 left-4 -translate-y-1/2 z-10 pointer-events-none" />
11+
<select
12+
id="selectedDate"
1213
wire:model.live="selectedDate"
13-
v-model="selectedDate"
14-
placeholder="Select month"
15-
:options="{{ json_encode($months) }}"
16-
></select-field>
14+
class="w-full appearance-none rounded-full border border-slate-200 bg-white py-3 pl-12 pr-10 text-slate-500 font-semibold focus:outline-none focus:ring-2 focus:ring-[#1C4DA1]"
15+
>
16+
@forelse($months as $month)
17+
<option value="{{ $month['id'] }}">{{ $month['name'] }}</option>
18+
@empty
19+
<option value="{{ $selectedDate }}">Select month</option>
20+
@endforelse
21+
</select>
1722
</div>
1823
</div>
1924
<div class="w-full md:w-[260px]">
20-
<label class="block text-default text-slate-500 mb-2" for="language">
25+
<label class="block text-default text-slate-500 mb-2" for="selectedLanguage">
2126
Language
2227
</label>
23-
<select-field
28+
<select
29+
id="selectedLanguage"
2430
wire:model.live="selectedLanguage"
25-
v-model="selectedLanguage"
26-
placeholder="Select language"
27-
:options="{{ json_encode($languages) }}"
28-
></select-field>
31+
class="w-full appearance-none rounded-full border border-slate-200 bg-white py-3 px-4 text-slate-500 font-semibold focus:outline-none focus:ring-2 focus:ring-[#1C4DA1]"
32+
>
33+
@foreach($languages as $language)
34+
<option value="{{ $language['id'] }}">{{ $language['name'] }}</option>
35+
@endforeach
36+
</select>
2937
</div>
3038
</div>
3139
</div>

‎tests/Feature/OnlineEventsWorkflowTest.php‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,45 @@ public function featured_activities_page_shows_all_upcoming_open_online_events()
256256
->assertDontSee($pendingEvent->title);
257257
}
258258

259+
#[Test]
260+
public function featured_activities_month_filter_only_shows_events_for_selected_month(): void
261+
{
262+
$this->seed('RolesAndPermissionsSeeder');
263+
264+
$october = Carbon::now()->addYear()->month(10)->startOfMonth();
265+
$november = Carbon::now()->addYear()->month(11)->startOfMonth();
266+
267+
$octoberEvent = \App\Event::factory()->create([
268+
'start_date' => $october->copy()->addDays(5),
269+
'end_date' => $october->copy()->addDays(6),
270+
'status' => 'APPROVED',
271+
'activity_type' => 'open-online',
272+
'language' => ['de'],
273+
'title' => 'October Open Online Unique',
274+
]);
275+
276+
$novemberEvent = \App\Event::factory()->create([
277+
'start_date' => $november->copy()->addDays(5),
278+
'end_date' => $november->copy()->addDays(6),
279+
'status' => 'APPROVED',
280+
'activity_type' => 'open-online',
281+
'language' => ['fr'],
282+
'title' => 'November Open Online Unique',
283+
]);
284+
285+
\Livewire\Livewire::test(\App\Livewire\OnlineCalendar::class)
286+
->set('selectedDate', '10/'.$october->year)
287+
->assertSee($octoberEvent->title)
288+
->assertDontSee($novemberEvent->title)
289+
->set('selectedDate', '11/'.$november->year)
290+
->assertSee($novemberEvent->title)
291+
->assertDontSee($octoberEvent->title)
292+
->set('selectedLanguage', 'fr')
293+
->assertSee($novemberEvent->title)
294+
->set('selectedLanguage', 'de')
295+
->assertDontSee($novemberEvent->title);
296+
}
297+
259298
#[Test]
260299
public function promoted_event_creates_notification_for_administrators(): void
261300
{

0 commit comments

Comments
 (0)