From b68b84c4dd7d3ac6c1d8aaa037d6ab4d52af69ed Mon Sep 17 00:00:00 2001 From: Matt Young Date: Wed, 12 Feb 2025 18:15:27 -0600 Subject: [PATCH 01/16] Provide for switching implementation of nomination ensemble rules based on audition setting. --- .../Controllers/Admin/AuditionSettings.php | 2 +- app/Providers/AppServiceProvider.php | 9 ++-- .../NominationEnsembleServiceProvider.php | 43 +++++++++++++++++++ bootstrap/providers.php | 1 + .../views/admin/audition-settings.blade.php | 3 ++ 5 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 app/Providers/NominationEnsembleServiceProvider.php diff --git a/app/Http/Controllers/Admin/AuditionSettings.php b/app/Http/Controllers/Admin/AuditionSettings.php index b02a8be..665dd06 100644 --- a/app/Http/Controllers/Admin/AuditionSettings.php +++ b/app/Http/Controllers/Admin/AuditionSettings.php @@ -33,7 +33,7 @@ class AuditionSettings extends Controller 'payment_state' => ['required', 'max:2'], 'payment_zip' => ['required', 'min:5'], 'advanceTo' => ['nullable'], - 'nomination_ensemble_rules' => ['required', 'in:disabled,scobda'], + 'nomination_ensemble_rules' => ['required', 'in:disabled,scobda,meobda'], // Options should align with the boot method of NominationEnsembleServiceProvider ]); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 7c22988..5211a7e 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -71,10 +71,10 @@ class AppServiceProvider extends ServiceProvider $this->app->singleton(SetHeadDirector::class, SetHeadDirector::class); // Nomination Ensemble - $this->app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class); - $this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class); - $this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class); - $this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class); + // $this->app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class); + // $this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class); + // $this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class); + // $this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class); } /** @@ -82,7 +82,6 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { - Entry::observe(EntryObserver::class); Audition::observe(AuditionObserver::class); Room::observe(RoomObserver::class); diff --git a/app/Providers/NominationEnsembleServiceProvider.php b/app/Providers/NominationEnsembleServiceProvider.php new file mode 100644 index 0000000..606494a --- /dev/null +++ b/app/Providers/NominationEnsembleServiceProvider.php @@ -0,0 +1,43 @@ +app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class); + $this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class); + $this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class); + $this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class); + } + + public function boot(): void + { + if (auditionSetting('nomination_ensemble_rules') === 'scobda') { + $this->app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class); + $this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class); + $this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class); + $this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class); + } + + if (auditionSetting('nomination_ensemble_rules') === 'meobda') { + + // meobda implementation + $this->app->bind(NominationEnsembleController::class, MeobdaNominationEnsembleController::class); + } + } +} diff --git a/bootstrap/providers.php b/bootstrap/providers.php index eeeccb0..b64af49 100644 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -6,4 +6,5 @@ return [ App\Providers\InvoiceDataServiceProvider::class, App\Providers\PrintCardActionProvider::class, Barryvdh\Debugbar\ServiceProvider::class, + App\Providers\NominationEnsembleServiceProvider::class, ]; diff --git a/resources/views/admin/audition-settings.blade.php b/resources/views/admin/audition-settings.blade.php index 70a434e..adb0651 100644 --- a/resources/views/admin/audition-settings.blade.php +++ b/resources/views/admin/audition-settings.blade.php @@ -28,6 +28,9 @@ + -- 2.39.5 From 9d59832d0bfd9563fa4ced26811e5c4aab11d785 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Wed, 12 Feb 2025 22:43:36 -0600 Subject: [PATCH 02/16] Managing nomination ensembles under MEOBDA rules implemented. --- .../MeobdaNominationEnsembleController.php | 129 ++++++++++++++++++ .../meobda/admin/ensembles.blade.php | 77 +++++++++++ 2 files changed, 206 insertions(+) create mode 100644 app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php create mode 100644 resources/views/nomination_ensembles/meobda/admin/ensembles.blade.php diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php new file mode 100644 index 0000000..fee8bd0 --- /dev/null +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php @@ -0,0 +1,129 @@ +validate([ + 'ensemble_name' => 'required|unique:nomination_ensembles,name', + 'entry_deadline' => 'required|date', + 'min_grade' => 'required|numeric|min:0', + 'max_grade' => 'required|numeric|gte:min_grade', + 'max_nominations' => 'required|numeric|min:1', + 'instrument_list' => 'required|string', + ], [ + 'maximum_grade.gte' => 'The maximum grade must be greater than the minimum grade.', + 'rounding_direction.in' => 'The rounding direction must be either "up" or "down".', + ]); + $instrument_list = preg_replace('/^\s+|\s+$/m', '', $validated['instrument_list']); + $instrument_list = str_replace(["\r\n", "\r"], "\n", $instrument_list); + $instrument_array = explode("\n", $instrument_list); + $instruments = []; + foreach ($instrument_array as $instrument) { + $inst_arr = explode(':', $instrument); + $name = $inst_arr[0]; + $max = $inst_arr[1] ?? null; + $instruments[] = [ + 'name' => $name, + 'max' => $max, + ]; + } + + $ensemble = new NominationEnsemble(); + $ensemble->name = $validated['ensemble_name']; + $ensemble->entry_deadline = $validated['entry_deadline']; + $ensemble->minimum_grade = $validated['min_grade']; + $ensemble->maximum_grade = $validated['max_grade']; + $data = []; + $data['max_nominations'] = $validated['max_nominations']; + $data['instruments'] = $instruments; + $ensemble->data = $data; + $ensemble->save(); + + return redirect()->route('nomination.admin.ensemble.index')->with('success', + 'Nomination Ensemble has been created.'); + } + + public function edit(NominationEnsemble $ensemble) + { + // TODO: Implement edit() method. + } + + public function update(NominationEnsemble $ensemble) + { + $validated = request()->validate([ + 'ensemble_name' => [ + 'required', + Rule::unique('nomination_ensembles', 'name')->ignore($ensemble->id), + ], + 'entry_deadline' => 'required|date', + 'min_grade' => 'required|numeric|min:0', + 'max_grade' => 'required|numeric|gte:min_grade', + 'max_nominations' => 'required|numeric|min:1', + 'instrument_list' => 'required|string', + ], [ + 'maximum_grade.gte' => 'The maximum grade must be greater than the minimum grade.', + 'rounding_direction.in' => 'The rounding direction must be either "up" or "down".', + ]); + $instrument_list = preg_replace('/^\s+|\s+$/m', '', $validated['instrument_list']); + $instrument_list = str_replace(["\r\n", "\r"], "\n", $instrument_list); + $instrument_array = explode("\n", $instrument_list); + $instruments = []; + foreach ($instrument_array as $instrument) { + $inst_arr = explode(':', $instrument); + $name = $inst_arr[0]; + $max = $inst_arr[1] ?? null; + $instruments[] = [ + 'name' => $name, + 'max' => $max, + ]; + } + + $ensemble->name = $validated['ensemble_name']; + $ensemble->entry_deadline = $validated['entry_deadline']; + $ensemble->minimum_grade = $validated['min_grade']; + $ensemble->maximum_grade = $validated['max_grade']; + $data = []; + $data['max_nominations'] = $validated['max_nominations']; + $data['instruments'] = $instruments; + $ensemble->data = $data; + $ensemble->save(); + + return redirect()->route('nomination.admin.ensemble.index')->with('success', + 'Nomination Ensemble has been modified.'); + } + + public function destroy(NominationEnsemble $ensemble) + { + $ensemble->delete(); + + // TODO: Delete associated nomionations. + return redirect()->route('nomination.admin.ensemble.index')->with('success', + 'Nomination Ensemble has been deleted.'); + } +} diff --git a/resources/views/nomination_ensembles/meobda/admin/ensembles.blade.php b/resources/views/nomination_ensembles/meobda/admin/ensembles.blade.php new file mode 100644 index 0000000..a9adfbc --- /dev/null +++ b/resources/views/nomination_ensembles/meobda/admin/ensembles.blade.php @@ -0,0 +1,77 @@ + + Nomination Ensembles (MEOBDA Rules) + + + + Add Nomination Ensemble + + + + + + + + + Instrument List (One per line. Add :x to set a limit per school) + + + + + + + + + + Nomination Ensembles +
+ @foreach($ensembles as $ensemble) + + + {{ $ensemble->name }} + + + + Are you sure you want to delete this nomination ensemble? + + + + + @method('PATCH') + + + + + + + + + + Instrument List (One per line. Add :x to set a limit per school) + @foreach($ensemble->data['instruments'] as $instrument){{ trim($instrument['name']) }}@if($instrument['max']):{{trim($instrument['max'])}}@endif{{PHP_EOL}}@endforeach + + + + + + @endforeach +
+
+
+ + + + + +
-- 2.39.5 From 7eff16289f640cef5847b953768df5bcc10312e5 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Thu, 13 Feb 2025 02:20:41 -0600 Subject: [PATCH 03/16] Nominations by users under MEOBDA rules working. --- ...eobdaNominationEnsembleEntryController.php | 172 ++++++++++++++++++ .../NominationEnsembleServiceProvider.php | 2 + .../meobda/entries/index.blade.php | 64 +++++++ 3 files changed, 238 insertions(+) create mode 100644 app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php create mode 100644 resources/views/nomination_ensembles/meobda/entries/index.blade.php diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php new file mode 100644 index 0000000..5261c4d --- /dev/null +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php @@ -0,0 +1,172 @@ +format('Y-m-d'); + + $ensembles = NominationEnsemble::all(); + $availableInstruments = []; + $availableStudents = []; + $existingNominations = []; + $nominationsAvailable = []; + + foreach ($ensembles as $ensemble) { + // Get existing nominations + $existingNominations[$ensemble->id] = auth()->user()->school->nominations() + ->where('nomination_ensemble_id', $ensemble->id) + ->get() + ->keyBy('student_id'); + // Count how many nominations exist on each instrument + $nominatedInstrumentCount = []; + foreach ($existingNominations[$ensemble->id] as $nom) { + $nominatedInstrumentCount[$nom->data['instrument']] = + ($nominatedInstrumentCount[$nom->data['instrument']] ?? 0) + 1; + } + + // Set available instruments + foreach ($ensemble->data['instruments'] as $instrument) { + // Skip it if we're at the limit on this instrument + if (! is_null($instrument['max']) && $instrument['max'] <= ($nominatedInstrumentCount[$instrument['name']] ?? 0)) { + continue; + } + $availableInstruments[$ensemble->id][] = $instrument['name']; + } + + // Set available students + $students = Student::where('school_id', auth()->user()->school_id) + ->where('grade', '>=', $ensemble->minimum_grade) + ->where('grade', '<=', $ensemble->maximum_grade) + ->orderBy('last_name', 'asc') + ->orderBy('first_name', 'asc') + ->get(); + foreach ($existingNominations[$ensemble->id] as $checknom) { + $students = $students->reject(function ($student) use ($checknom) { + return $checknom->student_id == $student->id; + }); + } + $availableStudents[$ensemble->id] = $students; + $nominationsAvailable[$ensemble->id] = $existingNominations[$ensemble->id]->count() < $ensemble->data['max_nominations']; + } + + return view('nomination_ensembles.meobda.entries.index', + compact('ensembles', 'currentDate', 'availableInstruments', 'availableStudents', 'existingNominations', + 'nominationsAvailable')); + } + + public function show(NominationEnsembleEntry $entry) + { + // TODO: Implement show() method. + } + + public function create() + { + // TODO: Implement create() method. + } + + public function store() + { + $validData = request()->validate([ + 'ensemble' => [ + 'required', + 'exists:App\Models\NominationEnsemble,id', + ], + 'new_student' => [ + 'required', + 'exists:App\Models\Student,id', + ], + 'new_instrument' => 'required', + ]); + $ensemble = NominationEnsemble::find($validData['ensemble']); + + // Check that the deadline is not past + $currentDate = Carbon::now('America/Chicago'); + $currentDate = $currentDate->format('Y-m-d'); + if ($ensemble->entry_deadline < $currentDate) { + return redirect()->route('nomination.entry.index')->with('error', + 'The nomination deadline for that ensemble has passed'); + } + + // Check if new_instrument is valid + foreach ($ensemble->data['instruments'] as $instrument) { + $availableInstruments[] = $instrument['name']; + } + if (! in_array($validData['new_instrument'], $availableInstruments)) { + return redirect()->route('nomination.entry.index')->with('error', + 'Invalid Instrument Specified'); + } + + // Check if the student belongs to the current user + $student = Student::find($validData['new_student']); + if (auth()->user()->school_id !== $student->school_id) { + return redirect()->route('nomination.entry.index')->with('error', + 'You may only nominate students from your school'); + } + + // Check that the user's school has nominations available + $existing_nominations = auth()->user()->school->nominations; + if ($existing_nominations->count() >= $ensemble->data['max_nominations']) { + return redirect()->route('nomination.entry.index')->with('error', + 'You have already used all of your nominations for this ensemble'); + } + + // Check that the user's school isn't over limit for the requested instrument + $instrumentLimit = collect($ensemble->data['instruments'])->firstWhere('name', + $validData['new_instrument'])['max']; + if ($instrumentLimit) { + $used = 0; + foreach ($existing_nominations as $nom) { + if ($nom->data['instrument'] == $validData['new_instrument']) { + $used++; + } + if ($used >= $instrumentLimit) { + return redirect()->route('nomination.entry.index')->with('error', + 'You may not nominate any more students on that instrument'); + } + } + } + + // Check that the student isn't already nominated for this ensemble + if (NominationEnsembleEntry::where('student_id', $validData['new_student']) + ->where('nomination_ensemble_id', $validData['ensemble']) + ->count() > 0) { + return redirect()->route('nomination.entry.index')->with('error', + 'Student already nominated for that ensemble'); + } + + $newEntry = new NominationEnsembleEntry(); + $newEntry->student_id = $validData['new_student']; + $newEntry->nomination_ensemble_id = $validData['ensemble']; + $newEntry->data = ['instrument' => $validData['new_instrument']]; + $newEntry->save(); + + return redirect()->route('nomination.entry.index')->with('success', + 'Nomination entered'); + } + + public function edit(NominationEnsembleEntry $entry) + { + // TODO: Implement edit() method. + } + + public function update(NominationEnsembleEntry $entry) + { + // TODO: Implement update() method. + } + + public function destroy(NominationEnsembleEntry $entry) + { + // TODO: Implement destroy() method. + } +} diff --git a/app/Providers/NominationEnsembleServiceProvider.php b/app/Providers/NominationEnsembleServiceProvider.php index 606494a..1c1dea3 100644 --- a/app/Providers/NominationEnsembleServiceProvider.php +++ b/app/Providers/NominationEnsembleServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use App\Http\Controllers\NominationEnsembles\MeobdaNominationEnsembleController; +use App\Http\Controllers\NominationEnsembles\MeobdaNominationEnsembleEntryController; use App\Http\Controllers\NominationEnsembles\NominationAdminController; use App\Http\Controllers\NominationEnsembles\NominationEnsembleController; use App\Http\Controllers\NominationEnsembles\NominationEnsembleEntryController; @@ -38,6 +39,7 @@ class NominationEnsembleServiceProvider extends ServiceProvider // meobda implementation $this->app->bind(NominationEnsembleController::class, MeobdaNominationEnsembleController::class); + $this->app->bind(NominationEnsembleEntryController::class, MeobdaNominationEnsembleEntryController::class); } } } diff --git a/resources/views/nomination_ensembles/meobda/entries/index.blade.php b/resources/views/nomination_ensembles/meobda/entries/index.blade.php new file mode 100644 index 0000000..98ecccb --- /dev/null +++ b/resources/views/nomination_ensembles/meobda/entries/index.blade.php @@ -0,0 +1,64 @@ + + Nominations + + + @foreach($ensembles as $ensemble) + + {{ $ensemble->name }} + + {{ $ensemble->data['max_nominations'] }} nominations accepted
+ Entry Deadline {{ \Carbon\Carbon::parse($ensemble->entry_deadline)->format('M j, Y') }} +
+ + Existing Nominations + + + + Student + Grade + Instrument + + + + @foreach($existingNominations[$ensemble->id] as $nom) + + {{ $nom->student->full_name() }} + {{ $nom->student->grade }} + {{ $nom->data['instrument'] }} + + @endforeach + + + + + @if($nominationsAvailable[$ensemble->id]) + + New Entry + + + + + @foreach($availableStudents[$ensemble->id] as $student) + + @endforeach + + + + @foreach($availableInstruments[$ensemble->id] as $instrument) + + @endforeach + + + Add Nomination + + + + + @endif + +
+ @endforeach +
+
-- 2.39.5 From ac5c4cb53bc9c8b44dd48b1a515fc8da1856e70f Mon Sep 17 00:00:00 2001 From: Matt Young Date: Thu, 13 Feb 2025 11:01:06 -0600 Subject: [PATCH 04/16] Option for split ensembles added to MEOBDA nomination rules --- .../MeobdaNominationEnsembleController.php | 6 ++++++ .../nomination_ensembles/meobda/admin/ensembles.blade.php | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php index fee8bd0..f5699d6 100644 --- a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php @@ -36,6 +36,7 @@ class MeobdaNominationEnsembleController extends Controller implements Nominatio 'max_grade' => 'required|numeric|gte:min_grade', 'max_nominations' => 'required|numeric|min:1', 'instrument_list' => 'required|string', + 'split_names' => 'nullable|string', ], [ 'maximum_grade.gte' => 'The maximum grade must be greater than the minimum grade.', 'rounding_direction.in' => 'The rounding direction must be either "up" or "down".', @@ -53,6 +54,7 @@ class MeobdaNominationEnsembleController extends Controller implements Nominatio 'max' => $max, ]; } + $split_names = explode(',', $validated['split_names']); $ensemble = new NominationEnsemble(); $ensemble->name = $validated['ensemble_name']; @@ -62,6 +64,7 @@ class MeobdaNominationEnsembleController extends Controller implements Nominatio $data = []; $data['max_nominations'] = $validated['max_nominations']; $data['instruments'] = $instruments; + $data['split_names'] = $split_names; $ensemble->data = $data; $ensemble->save(); @@ -86,6 +89,7 @@ class MeobdaNominationEnsembleController extends Controller implements Nominatio 'max_grade' => 'required|numeric|gte:min_grade', 'max_nominations' => 'required|numeric|min:1', 'instrument_list' => 'required|string', + 'split_names' => 'nullable|string', ], [ 'maximum_grade.gte' => 'The maximum grade must be greater than the minimum grade.', 'rounding_direction.in' => 'The rounding direction must be either "up" or "down".', @@ -103,6 +107,7 @@ class MeobdaNominationEnsembleController extends Controller implements Nominatio 'max' => $max, ]; } + $split_names = explode(',', $validated['split_names']); $ensemble->name = $validated['ensemble_name']; $ensemble->entry_deadline = $validated['entry_deadline']; @@ -111,6 +116,7 @@ class MeobdaNominationEnsembleController extends Controller implements Nominatio $data = []; $data['max_nominations'] = $validated['max_nominations']; $data['instruments'] = $instruments; + $data['split_names'] = $split_names; $ensemble->data = $data; $ensemble->save(); diff --git a/resources/views/nomination_ensembles/meobda/admin/ensembles.blade.php b/resources/views/nomination_ensembles/meobda/admin/ensembles.blade.php index a9adfbc..78051e8 100644 --- a/resources/views/nomination_ensembles/meobda/admin/ensembles.blade.php +++ b/resources/views/nomination_ensembles/meobda/admin/ensembles.blade.php @@ -12,6 +12,7 @@ + Instrument List (One per line. Add :x to set a limit per school) @@ -56,6 +57,12 @@ type="number" colspan="3" value="{{ $ensemble->data['max_nominations'] }}" x-bind:readonly="!editable"/> + + + Instrument List (One per line. Add :x to set a limit per school) -- 2.39.5 From d7da1d4b7faad1d83477a8add6ca16658ce5d918 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Thu, 13 Feb 2025 12:07:49 -0600 Subject: [PATCH 05/16] Enable deletion of nominations by users --- ...eobdaNominationEnsembleEntryController.php | 19 ++++++++++++++++++- .../meobda/entries/index.blade.php | 16 +++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php index 5261c4d..85cbedd 100644 --- a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php @@ -58,6 +58,9 @@ class MeobdaNominationEnsembleEntryController extends Controller implements Nomi } $availableStudents[$ensemble->id] = $students; $nominationsAvailable[$ensemble->id] = $existingNominations[$ensemble->id]->count() < $ensemble->data['max_nominations']; + if ($currentDate > $ensemble->entry_deadline) { + $nominationsAvailable[$ensemble->id] = false; + } } return view('nomination_ensembles.meobda.entries.index', @@ -167,6 +170,20 @@ class MeobdaNominationEnsembleEntryController extends Controller implements Nomi public function destroy(NominationEnsembleEntry $entry) { - // TODO: Implement destroy() method. + if ($entry->student->school_id !== auth()->user()->school_id) { + return redirect()->route('nomination.entry.index')->with('error', + 'You may only delete nominations from your school'); + } + + $currentDate = Carbon::now('America/Chicago'); + $currentDate = $currentDate->format('Y-m-d'); + if ($entry->ensemble->entry_deadline < $currentDate) { + return redirect()->route('nomination.entry.index')->with('error', + 'You cannot delete nominations after the deadline'); + } + + $entry->delete(); + + return redirect()->route('nomination.entry.index')->with('success', 'Nomination Deleted'); } } diff --git a/resources/views/nomination_ensembles/meobda/entries/index.blade.php b/resources/views/nomination_ensembles/meobda/entries/index.blade.php index 98ecccb..cc2d7ce 100644 --- a/resources/views/nomination_ensembles/meobda/entries/index.blade.php +++ b/resources/views/nomination_ensembles/meobda/entries/index.blade.php @@ -22,9 +22,23 @@ @foreach($existingNominations[$ensemble->id] as $nom) - {{ $nom->student->full_name() }} + + {{ $nom->student->full_name() }} + {{ $nom->student->grade }} {{ $nom->data['instrument'] }} + @if($nominationsAvailable[$ensemble->id]) + + + Confirm you wish to delete the nomination + of {{ $nom->student->full_name() }}
+ for the {{ $ensemble->name }} ensemble. +
+
+ @endif @endforeach
-- 2.39.5 From 2e5b9384f8ae25ac899816ac1cdf976ac37cf900 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Thu, 13 Feb 2025 12:54:48 -0600 Subject: [PATCH 06/16] Seeder for MEOBDA nomination rules --- ...MeobdaNominationEnsembleAndEntrySeeder.php | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 database/seeders/MeobdaNominationEnsembleAndEntrySeeder.php diff --git a/database/seeders/MeobdaNominationEnsembleAndEntrySeeder.php b/database/seeders/MeobdaNominationEnsembleAndEntrySeeder.php new file mode 100644 index 0000000..7f8025f --- /dev/null +++ b/database/seeders/MeobdaNominationEnsembleAndEntrySeeder.php @@ -0,0 +1,78 @@ +truncate(); + DB::table('nomination_ensembles')->truncate(); + DB::statement('SET FOREIGN_KEY_CHECKS=1;'); + + // Create First Year Ensemble + $ensemble = new NominationEnsemble(); + $ensemble->name = 'Fake Band'; + $ensemble->entry_deadline = '2028-01-01'; + $ensemble->minimum_grade = 5; + $ensemble->maximum_grade = 8; + $instrumentNames = [ + 'Flute', + 'Oboe', + 'Bassoon', + 'Clarinet', + 'Bass Clarinet', + 'Contra Clarinet', + 'Alto Sax', + 'Tenor Sax', + 'Bari Sax', + 'Trumpet', + 'Horn', + 'Trombone', + 'Euphonium', + 'Tuba', + 'String Bass', + 'Percussion', + ]; + foreach ($instrumentNames as $name) { + $instruments[] = [ + 'name' => $name, + 'max' => null, + ]; + } + $data = [ + 'instruments' => $instruments, + 'max_nominations' => 8, + 'split_names' => ['Fake Red', 'Fake Black'], + ]; + $ensemble->data = $data; + $ensemble->save(); + + // Fill the nominations table + $faker = Faker::create(); + $schools = School::all(); + foreach ($schools as $school) { + $students = Student::factory()->count(10)->create(['school_id' => $school->id, 'grade' => 5]); + foreach ($students as $student) { + $nomData = [ + 'instrument' => $faker->randomElement($instrumentNames), + ]; + NominationEnsembleEntry::create([ + 'student_id' => $student->id, + 'nomination_ensemble_id' => $ensemble->id, + 'data' => $nomData, + ]); + } + } + } +} -- 2.39.5 From 60abd7de0ff50e828bf1ecd824b30784056de664 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Thu, 13 Feb 2025 15:45:56 -0600 Subject: [PATCH 07/16] Correct issue blocking nominations when total number of noms was greater than max for one ensemble. --- .../MeobdaNominationEnsembleEntryController.php | 9 ++++----- .../nomination_ensembles/meobda/entries/index.blade.php | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php index 85cbedd..b1d9add 100644 --- a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php @@ -21,6 +21,7 @@ class MeobdaNominationEnsembleEntryController extends Controller implements Nomi $availableStudents = []; $existingNominations = []; $nominationsAvailable = []; + $past_deadline = []; foreach ($ensembles as $ensemble) { // Get existing nominations @@ -58,14 +59,12 @@ class MeobdaNominationEnsembleEntryController extends Controller implements Nomi } $availableStudents[$ensemble->id] = $students; $nominationsAvailable[$ensemble->id] = $existingNominations[$ensemble->id]->count() < $ensemble->data['max_nominations']; - if ($currentDate > $ensemble->entry_deadline) { - $nominationsAvailable[$ensemble->id] = false; - } + $past_deadline[$ensemble->id] = $currentDate > $ensemble->entry_deadline; } return view('nomination_ensembles.meobda.entries.index', compact('ensembles', 'currentDate', 'availableInstruments', 'availableStudents', 'existingNominations', - 'nominationsAvailable')); + 'nominationsAvailable', 'past_deadline')); } public function show(NominationEnsembleEntry $entry) @@ -118,7 +117,7 @@ class MeobdaNominationEnsembleEntryController extends Controller implements Nomi } // Check that the user's school has nominations available - $existing_nominations = auth()->user()->school->nominations; + $existing_nominations = auth()->user()->school->nominations()->where('nomination_ensemble_id', $validData['ensemble']); if ($existing_nominations->count() >= $ensemble->data['max_nominations']) { return redirect()->route('nomination.entry.index')->with('error', 'You have already used all of your nominations for this ensemble'); diff --git a/resources/views/nomination_ensembles/meobda/entries/index.blade.php b/resources/views/nomination_ensembles/meobda/entries/index.blade.php index cc2d7ce..3c603d3 100644 --- a/resources/views/nomination_ensembles/meobda/entries/index.blade.php +++ b/resources/views/nomination_ensembles/meobda/entries/index.blade.php @@ -27,7 +27,7 @@ {{ $nom->student->grade }} {{ $nom->data['instrument'] }} - @if($nominationsAvailable[$ensemble->id]) + @if(!$past_deadline[$ensemble->id]) - @if($nominationsAvailable[$ensemble->id]) + @if($nominationsAvailable[$ensemble->id] && !$past_deadline[$ensemble->id]) New Entry -- 2.39.5 From 16e72ff06c7da6cba8e7e71b72246f1296f4c5da Mon Sep 17 00:00:00 2001 From: Matt Young Date: Fri, 14 Feb 2025 11:52:05 -0600 Subject: [PATCH 08/16] Nomination admin page working for MEOBDA rules. --- .../MeobdaNominationAdminController.php | 94 +++++++++++++++++++ .../NominationEnsembleServiceProvider.php | 10 +- database/factories/StudentFactory.php | 7 +- .../meobda/admin/nominations.blade.php | 74 +++++++++++++++ 4 files changed, 178 insertions(+), 7 deletions(-) create mode 100644 app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php create mode 100644 resources/views/nomination_ensembles/meobda/admin/nominations.blade.php diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php new file mode 100644 index 0000000..5718fb8 --- /dev/null +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php @@ -0,0 +1,94 @@ +validate([ + 'school' => 'nullable|exists:schools,id', + 'ensemble' => 'nullable|exists:nomination_ensembles,id', + 'section' => 'nullable|string', + 'newFilterParameters' => 'string', + ]); + session()->put('nominationAdminFilters', $newFilterData); + $filterData = $newFilterData; + } elseif (session()->has('nominationAdminFilters')) { + $filterData = session()->get('nominationAdminFilters'); + } else { + $filterData = []; + } + + dump($filterData); + + // Populate variables to complete the filter form + $schools = School::orderBy('name')->get(); + $ensembles = NominationEnsemble::all(); + + $nominations = NominationEnsembleEntry::with('student.school'); + if ($filterData['school'] ?? false) { + $nominations = $nominations->whereHas('student', function ($query) use ($filterData) { + $query->where('school_id', $filterData['school']); + }); + } + if ($filterData['ensemble'] ?? false) { + $nominations = $nominations->where('nomination_ensemble_id', $filterData['ensemble']); + } + if ($filterData['section'] ?? false) { + $sectionFilter = explode('---', $filterData['section']); + $nominations = $nominations->where('nomination_ensemble_id', $sectionFilter[0]); + if ($sectionFilter[1] != 'all') { + $nominations = $nominations->where('data->instrument', $sectionFilter[1]); + } + } + + $nominations = $nominations->paginate(50); + $sections = []; + foreach ($ensembles as $ensemble) { + $sections[$ensemble->id.'---'.'all'] = $ensemble->name.' - ALL'; + foreach ($ensemble->data['instruments'] as $instrument) { + $sections[$ensemble->id.'---'.$instrument['name']] = $ensemble->name.' - '.$instrument['name']; + } + } + + return view('nomination_ensembles.meobda.admin.nominations', + compact('nominations', 'schools', 'filterData', 'ensembles', 'sections')); + } + + public function show(NominationEnsembleEntry $entry) + { + // TODO: Implement show() method. + } + + public function create() + { + // TODO: Implement create() method. + } + + public function store() + { + // TODO: Implement store() method. + } + + public function edit(NominationEnsembleEntry $entry) + { + // TODO: Implement edit() method. + } + + public function update(NominationEnsembleEntry $entry) + { + // TODO: Implement update() method. + } + + public function destroy(NominationEnsembleEntry $entry) + { + // TODO: Implement destroy() method. + } +} diff --git a/app/Providers/NominationEnsembleServiceProvider.php b/app/Providers/NominationEnsembleServiceProvider.php index 1c1dea3..94dd577 100644 --- a/app/Providers/NominationEnsembleServiceProvider.php +++ b/app/Providers/NominationEnsembleServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use App\Http\Controllers\NominationEnsembles\MeobdaNominationAdminController; use App\Http\Controllers\NominationEnsembles\MeobdaNominationEnsembleController; use App\Http\Controllers\NominationEnsembles\MeobdaNominationEnsembleEntryController; use App\Http\Controllers\NominationEnsembles\NominationAdminController; @@ -20,10 +21,10 @@ class NominationEnsembleServiceProvider extends ServiceProvider { public function register(): void { - $this->app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class); - $this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class); - $this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class); - $this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class); + // $this->app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class); + // $this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class); + // $this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class); + // $this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class); } public function boot(): void @@ -40,6 +41,7 @@ class NominationEnsembleServiceProvider extends ServiceProvider // meobda implementation $this->app->bind(NominationEnsembleController::class, MeobdaNominationEnsembleController::class); $this->app->bind(NominationEnsembleEntryController::class, MeobdaNominationEnsembleEntryController::class); + $this->app->bind(NominationAdminController::class, MeobdaNominationAdminController::class); } } } diff --git a/database/factories/StudentFactory.php b/database/factories/StudentFactory.php index 99efec3..4aa2410 100644 --- a/database/factories/StudentFactory.php +++ b/database/factories/StudentFactory.php @@ -17,12 +17,13 @@ class StudentFactory extends Factory */ public function definition(): array { - $school = School::factory()->create(); return [ - 'school_id' => $school->id, + 'school_id' => function () { + return School::factory()->create()->id; + }, 'first_name' => fake()->firstName(), 'last_name' => fake()->lastName(), - 'grade' => rand(7,12), + 'grade' => rand(7, 12), ]; } } diff --git a/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php new file mode 100644 index 0000000..e8f9da5 --- /dev/null +++ b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php @@ -0,0 +1,74 @@ + + + Nomination Administration + + Filters + + + + + + School + + @foreach($schools as $school) + + @endforeach + + + + Ensemble + + @foreach($ensembles as $ensemble) + + @endforeach + + + + Ensemble / Instrument + + @foreach ($sections as $value => $name) + + @endforeach + + + + + + + + +
+ {{ $nominations->onEachSide(3)->links() }} +
+ + Nominations + + + + Name + School + Nominated For + + + + @foreach($nominations as $nomination) + + {{ $nomination->student->full_name('fl') }} + {{ $nomination->student->school->name }} + {{ $nomination->ensemble->name }} - {{ $nomination->data['instrument'] }} + + @endforeach + + + + + +
-- 2.39.5 From da31e194f131eaaab71c474ef9f9819689f3ad9c Mon Sep 17 00:00:00 2001 From: Matt Young Date: Fri, 14 Feb 2025 11:52:45 -0600 Subject: [PATCH 09/16] Remove missed dev code. --- .../NominationEnsembles/MeobdaNominationAdminController.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php index 5718fb8..7a7f263 100644 --- a/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php @@ -26,8 +26,6 @@ class MeobdaNominationAdminController extends Controller implements NominationAd $filterData = []; } - dump($filterData); - // Populate variables to complete the filter form $schools = School::orderBy('name')->get(); $ensembles = NominationEnsemble::all(); -- 2.39.5 From 1ee056149668c67cb0d6d2140eafa5844f78e5ff Mon Sep 17 00:00:00 2001 From: Matt Young Date: Fri, 14 Feb 2025 17:02:11 -0600 Subject: [PATCH 10/16] Start MEOBDA nomination seating pages. --- .../MeobdaNominationSeatingController.php | 24 +++++++++++++++++++ .../NominationEnsembleServiceProvider.php | 2 ++ .../meobda/admin/seating.blade.php | 3 +++ 3 files changed, 29 insertions(+) create mode 100644 app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php create mode 100644 resources/views/nomination_ensembles/meobda/admin/seating.blade.php diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php new file mode 100644 index 0000000..b90883f --- /dev/null +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php @@ -0,0 +1,24 @@ +app->bind(NominationEnsembleController::class, MeobdaNominationEnsembleController::class); $this->app->bind(NominationEnsembleEntryController::class, MeobdaNominationEnsembleEntryController::class); $this->app->bind(NominationAdminController::class, MeobdaNominationAdminController::class); + $this->app->bind(NominationSeatingController::class, MeobdaNominationSeatingController::class); } } } diff --git a/resources/views/nomination_ensembles/meobda/admin/seating.blade.php b/resources/views/nomination_ensembles/meobda/admin/seating.blade.php new file mode 100644 index 0000000..c5f483c --- /dev/null +++ b/resources/views/nomination_ensembles/meobda/admin/seating.blade.php @@ -0,0 +1,3 @@ + + Nomination Ensemble Seating + -- 2.39.5 From 3f9b467fe5aedcf21e2d65369a263ec4aefcd15d Mon Sep 17 00:00:00 2001 From: Matt Young Date: Fri, 14 Feb 2025 17:52:36 -0600 Subject: [PATCH 11/16] Base seating page. --- .../MeobdaNominationSeatingController.php | 9 +++- .../meobda/admin/seating.blade.php | 41 +++++++++++++++++++ .../scobda/admin/seating/index.blade.php | 1 + 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php index b90883f..6e8c3ad 100644 --- a/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php @@ -9,12 +9,17 @@ class MeobdaNominationSeatingController extends Controller implements Nomination { public function index() { - return view('nomination_ensembles.meobda.admin.seating'); + $ensembles = NominationEnsemble::all(); + $ensemble = null; + + return view('nomination_ensembles.meobda.admin.seating', compact('ensembles', 'ensemble')); } public function show(NominationEnsemble $ensemble) { - // TODO: Implement show() method. + $ensembles = NominationEnsemble::all(); + + return view('nomination_ensembles.meobda.admin.seating', compact('ensembles', 'ensemble')); } public function seat(NominationEnsemble $ensemble) diff --git a/resources/views/nomination_ensembles/meobda/admin/seating.blade.php b/resources/views/nomination_ensembles/meobda/admin/seating.blade.php index c5f483c..bdb3c71 100644 --- a/resources/views/nomination_ensembles/meobda/admin/seating.blade.php +++ b/resources/views/nomination_ensembles/meobda/admin/seating.blade.php @@ -1,3 +1,44 @@ Nomination Ensemble Seating + +
+ +
+ +
+ +
+ @if($ensemble) + + + {{ $ensemble->name }} + + + @if($ensemble->data['seated'] ?? false) + + Clear Seats + @else + + Seat + @endif + + + + + + @endif +
+ + +
diff --git a/resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php b/resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php index 4370a76..5b0c752 100644 --- a/resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php +++ b/resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php @@ -38,6 +38,7 @@ @endif + @foreach($ensemble->data['instruments'] as $instrument) @php($seatOn = 1) -- 2.39.5 From 6ef89c9dfad45f650a5148e7fba3f8cf91df7283 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Sat, 15 Feb 2025 10:37:21 -0600 Subject: [PATCH 12/16] MEOBDA nomination seating working. --- .../MeobdaNominationSeatingController.php | 78 ++++++++++++++++++- .../meobda/admin/seating.blade.php | 27 ++++++- 2 files changed, 101 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php index 6e8c3ad..b4b699d 100644 --- a/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\NominationEnsembles; use App\Http\Controllers\Controller; use App\Models\NominationEnsemble; +use App\Models\NominationEnsembleEntry; class MeobdaNominationSeatingController extends Controller implements NominationSeatingController { @@ -18,12 +19,85 @@ class MeobdaNominationSeatingController extends Controller implements Nomination public function show(NominationEnsemble $ensemble) { $ensembles = NominationEnsemble::all(); + $nominations = []; - return view('nomination_ensembles.meobda.admin.seating', compact('ensembles', 'ensemble')); + if ($ensemble->data['seated'] ?? false) { + $nominations = NominationEnsembleEntry::where('nomination_ensemble_id', $ensemble->id) + ->orderBy('data->instrument') + ->orderByRaw('CAST(data->"$.seat" AS UNSIGNED)') + ->with('student.school') + ->get(); + $nominations = $nominations->groupBy(function ($item) { + return $item->data['split']; + }); + foreach ($nominations as $split => $splitNoms) { + $nominations[$split] = $splitNoms->groupBy(function ($item) { + return $item->data['instrument']; + }); + } + } + + return view('nomination_ensembles.meobda.admin.seating', compact('ensembles', 'ensemble', 'nominations')); } public function seat(NominationEnsemble $ensemble) { - // TODO: Implement seat() method. + $validData = request()->validate([ + 'action' => 'required|in:seat,clear', + ]); + $action = $validData['action']; + $data = $ensemble['data']; + $nominations = NominationEnsembleEntry::where('nomination_ensemble_id', + $ensemble->id)->inRandomOrder()->get(); + $groupedNominations = $nominations->groupBy(function ($nom) { + return $nom->data['instrument']; + }); + + if ($action == 'seat') { + // If no split names are set, make the name of the ensemble the only split name + $splits = $data['split_names']; + if (count($splits) < 2 && strlen($splits[0]) < 2) { + $splits[0] = $ensemble->name; + } + $splitOn = 0; + + foreach ($ensemble->data['instruments'] as $instrument) { + if (! $groupedNominations->has($instrument['name'])) { + continue; + } + $seatOn = 1; + foreach ($groupedNominations[$instrument['name']] as $nomination) { + $nomData = $nomination['data']; + $nomData['seat'] = $seatOn; + $nomData['split'] = $splits[$splitOn]; + $nomination->data = $nomData; + $nomination->save(); + + $splitOn++; + if ($splitOn >= count($splits)) { + $seatOn++; + $splitOn = 0; + } + } + } + + $data['seated'] = true; + + } + + if ($action == 'clear') { + $data['seated'] = false; + foreach ($nominations as $nomination) { + $nomData = $nomination['data']; + unset($nomData['split']); + unset($nomData['seat']); + $nomination->data = $nomData; + $nomination->save(); + } + } + $ensemble->data = $data; + $ensemble->save(); + + return redirect(route('nomination.admin.seating.show', [$ensemble])); } } diff --git a/resources/views/nomination_ensembles/meobda/admin/seating.blade.php b/resources/views/nomination_ensembles/meobda/admin/seating.blade.php index bdb3c71..b984256 100644 --- a/resources/views/nomination_ensembles/meobda/admin/seating.blade.php +++ b/resources/views/nomination_ensembles/meobda/admin/seating.blade.php @@ -25,10 +25,10 @@ @if($ensemble->data['seated'] ?? false) - + Clear Seats @else - + Seat @endif @@ -36,6 +36,29 @@
+ @if($ensemble->data['seated'] ?? false) + @foreach($ensemble->data['split_names'] as $split) + + {{ $split }} + @foreach ($ensemble->data['instruments'] as $instrument) + @continue(! $nominations[$split]->has($instrument['name'])) + + {{ $instrument['name'] }} + + Count: {{ count($nominations[$split][$instrument['name']]) }} + + + @foreach($nominations[$split][$instrument['name']] as $thisNomination) + {{ $thisNomination->data['seat'] }} - {{ $thisNomination->student->full_name() }}, {{ $thisNomination->student->school->name }} + + @endforeach + + @endforeach + + + @endforeach + @endif + @endif -- 2.39.5 From d5699b14122bd673d559bec2164a6f62acd04dd2 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Sat, 15 Feb 2025 10:54:46 -0600 Subject: [PATCH 13/16] MEOBDA show assigned split and seat on nomination admin page --- .../nomination_ensembles/meobda/admin/nominations.blade.php | 4 ++++ .../views/nomination_ensembles/meobda/admin/seating.blade.php | 4 +--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php index e8f9da5..c933b49 100644 --- a/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php +++ b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php @@ -56,6 +56,8 @@ Name School Nominated For + Split + Seat @@ -64,6 +66,8 @@ {{ $nomination->student->full_name('fl') }} {{ $nomination->student->school->name }} {{ $nomination->ensemble->name }} - {{ $nomination->data['instrument'] }} + {{ $nomination->data['split'] ?? '---' }} + {{ $nomination->data['seat'] ?? '---' }} @endforeach diff --git a/resources/views/nomination_ensembles/meobda/admin/seating.blade.php b/resources/views/nomination_ensembles/meobda/admin/seating.blade.php index b984256..f1024d3 100644 --- a/resources/views/nomination_ensembles/meobda/admin/seating.blade.php +++ b/resources/views/nomination_ensembles/meobda/admin/seating.blade.php @@ -44,10 +44,8 @@ @continue(! $nominations[$split]->has($instrument['name'])) {{ $instrument['name'] }} - - Count: {{ count($nominations[$split][$instrument['name']]) }} - + @foreach($nominations[$split][$instrument['name']] as $thisNomination) {{ $thisNomination->data['seat'] }} - {{ $thisNomination->student->full_name() }}, {{ $thisNomination->student->school->name }} -- 2.39.5 From d7c495291c6350408d6de3ebf24f789020df12f5 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Sat, 15 Feb 2025 10:59:07 -0600 Subject: [PATCH 14/16] MEOBDA if no split names are given, set the ensemble name as the lone split name --- .../MeobdaNominationEnsembleController.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php index f5699d6..bf1fc34 100644 --- a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php @@ -55,6 +55,9 @@ class MeobdaNominationEnsembleController extends Controller implements Nominatio ]; } $split_names = explode(',', $validated['split_names']); + if (count($split_names) == 1) { + $split_names[0] = $validated['ensemble_name']; + } $ensemble = new NominationEnsemble(); $ensemble->name = $validated['ensemble_name']; @@ -108,6 +111,9 @@ class MeobdaNominationEnsembleController extends Controller implements Nominatio ]; } $split_names = explode(',', $validated['split_names']); + if (count($split_names) == 1) { + $split_names[0] = $validated['ensemble_name']; + } $ensemble->name = $validated['ensemble_name']; $ensemble->entry_deadline = $validated['entry_deadline']; -- 2.39.5 From c45b8cb349eee707466ad8d7634ec24fb5b07fe8 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Sat, 15 Feb 2025 11:43:06 -0600 Subject: [PATCH 15/16] MEOBDA nomination admin screen cna filter by split --- .../MeobdaNominationAdminController.php | 37 +++++++++++++------ .../meobda/admin/nominations.blade.php | 21 +++++------ 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php index 7a7f263..b5badc9 100644 --- a/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php @@ -14,9 +14,9 @@ class MeobdaNominationAdminController extends Controller implements NominationAd if (request('newFilterParameters')) { $newFilterData = request()->validate([ 'school' => 'nullable|exists:schools,id', - 'ensemble' => 'nullable|exists:nomination_ensembles,id', 'section' => 'nullable|string', 'newFilterParameters' => 'string', + 'split' => 'nullable|string', ]); session()->put('nominationAdminFilters', $newFilterData); $filterData = $newFilterData; @@ -29,16 +29,30 @@ class MeobdaNominationAdminController extends Controller implements NominationAd // Populate variables to complete the filter form $schools = School::orderBy('name')->get(); $ensembles = NominationEnsemble::all(); + $sections = []; + $splits = []; + foreach ($ensembles as $ensemble) { + // Populate sections for each ensemble + $sections[$ensemble->id.'---'.'all'] = $ensemble->name.' - ALL'; + foreach ($ensemble->data['instruments'] as $instrument) { + $sections[$ensemble->id.'---'.$instrument['name']] = $ensemble->name.' - '.$instrument['name']; + } + // Populate splits for each ensemble + $splits[$ensemble->id.'---'.'all'] = $ensemble->name.' - ALL'; + foreach ($ensemble->data['split_names'] as $splitName) { + $splits[$ensemble->id.'---'.$splitName] = $ensemble->name.' - '.$splitName; + } + } + + // Get and filter nominations $nominations = NominationEnsembleEntry::with('student.school'); if ($filterData['school'] ?? false) { $nominations = $nominations->whereHas('student', function ($query) use ($filterData) { $query->where('school_id', $filterData['school']); }); } - if ($filterData['ensemble'] ?? false) { - $nominations = $nominations->where('nomination_ensemble_id', $filterData['ensemble']); - } + if ($filterData['section'] ?? false) { $sectionFilter = explode('---', $filterData['section']); $nominations = $nominations->where('nomination_ensemble_id', $sectionFilter[0]); @@ -47,17 +61,18 @@ class MeobdaNominationAdminController extends Controller implements NominationAd } } - $nominations = $nominations->paginate(50); - $sections = []; - foreach ($ensembles as $ensemble) { - $sections[$ensemble->id.'---'.'all'] = $ensemble->name.' - ALL'; - foreach ($ensemble->data['instruments'] as $instrument) { - $sections[$ensemble->id.'---'.$instrument['name']] = $ensemble->name.' - '.$instrument['name']; + if ($filterData['split'] ?? false) { + $splitFilter = explode('---', $filterData['split']); + $nominations = $nominations->where('nomination_ensemble_id', $splitFilter[0]); + if ($splitFilter[1] != 'all') { + $nominations = $nominations->where('data->split', $splitFilter[1]); } } + $nominations = $nominations->paginate(50); + return view('nomination_ensembles.meobda.admin.nominations', - compact('nominations', 'schools', 'filterData', 'ensembles', 'sections')); + compact('nominations', 'schools', 'filterData', 'ensembles', 'sections', 'splits')); } public function show(NominationEnsembleEntry $entry) diff --git a/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php index c933b49..08af986 100644 --- a/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php +++ b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php @@ -18,17 +18,6 @@ @endforeach - - Ensemble - - @foreach($ensembles as $ensemble) - - @endforeach - - Ensemble / Instrument @@ -39,6 +28,16 @@ @endforeach + + Split + + @foreach ($splits as $value => $name) + + @endforeach + + -- 2.39.5 From defb561a258da7e10755c5e056df7fe85cf9c17d Mon Sep 17 00:00:00 2001 From: Matt Young Date: Sat, 15 Feb 2025 11:56:15 -0600 Subject: [PATCH 16/16] MEOBDA nomination admin page add option to clear filters --- .../MeobdaNominationAdminController.php | 10 ++++++++-- .../meobda/admin/nominations.blade.php | 5 +++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php index b5badc9..45bd749 100644 --- a/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php @@ -17,9 +17,15 @@ class MeobdaNominationAdminController extends Controller implements NominationAd 'section' => 'nullable|string', 'newFilterParameters' => 'string', 'split' => 'nullable|string', + 'clear' => 'nullable|string', ]); - session()->put('nominationAdminFilters', $newFilterData); - $filterData = $newFilterData; + if ($newFilterData['clear'] ?? false == 'clear') { + $filterData = []; + session()->forget('nominationAdminFilters'); + } else { + session()->put('nominationAdminFilters', $newFilterData); + $filterData = $newFilterData; + } } elseif (session()->has('nominationAdminFilters')) { $filterData = session()->get('nominationAdminFilters'); } else { diff --git a/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php index 08af986..0f47a63 100644 --- a/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php +++ b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php @@ -38,6 +38,11 @@ @endforeach +
+

 

+ Clear Filters +
+ -- 2.39.5