44
55use App \Country ;
66use App \Event ;
7- use App \Queries \CountriesQuery ;
87use Carbon \Carbon ;
9- use Illuminate \Support \Facades \App ;
108use Livewire \Component ;
119use Livewire \WithPagination ;
1210
1311class 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}
0 commit comments