From 80e66aa49af5a03ce8c3b93e40409d31cea9cae7 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Wed, 26 Mar 2025 21:49:55 -0500 Subject: [PATCH] Allow admin to update nominations in MEOBDA rules --- .../MeobdaNominationAdminController.php | 67 +++++++++++++++++-- .../NominationAdminController.php | 8 +-- .../ScobdaNominationAdminController.php | 8 +-- .../meobda/admin/nomination-edit.blade.php | 54 +++++++++++++++ .../meobda/admin/nominations.blade.php | 13 +++- routes/nominationEnsemble.php | 2 + 6 files changed, 135 insertions(+), 17 deletions(-) create mode 100644 resources/views/nomination_ensembles/meobda/admin/nomination-edit.blade.php diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php index 45bd749..e6a7f6a 100644 --- a/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php @@ -6,6 +6,10 @@ use App\Http\Controllers\Controller; use App\Models\NominationEnsemble; use App\Models\NominationEnsembleEntry; use App\Models\School; +use App\Models\Student; +use Illuminate\Validation\Rule; + +use function redirect; class MeobdaNominationAdminController extends Controller implements NominationAdminController { @@ -81,7 +85,7 @@ class MeobdaNominationAdminController extends Controller implements NominationAd compact('nominations', 'schools', 'filterData', 'ensembles', 'sections', 'splits')); } - public function show(NominationEnsembleEntry $entry) + public function show(NominationEnsembleEntry $nominationEnsembleEntry) { // TODO: Implement show() method. } @@ -96,18 +100,69 @@ class MeobdaNominationAdminController extends Controller implements NominationAd // TODO: Implement store() method. } - public function edit(NominationEnsembleEntry $entry) + public function edit(NominationEnsembleEntry $nominationEnsembleEntry) { - // TODO: Implement edit() method. + $students = Student::with('school')->get() + ->sortBy('school.name'); + + $instrumentation = $this->get_ensemble_instrumentation($nominationEnsembleEntry->ensemble); + + return view('nomination_ensembles.meobda.admin.nomination-edit', + compact('nominationEnsembleEntry', 'students', 'instrumentation')); } - public function update(NominationEnsembleEntry $entry) + public function update(NominationEnsembleEntry $nominationEnsembleEntry) { - // TODO: Implement update() method. + $ensemble = $nominationEnsembleEntry->ensemble; + $validSplits = $ensemble->data['split_names']; + $validInstruments = []; + foreach ($ensemble->data['instruments'] as $instrument) { + $validInstruments[] = $instrument['name']; + } + $validData = request()->validate([ + 'instrument' => Rule::in($validInstruments), + 'split' => Rule::in($validSplits), + 'seat' => 'integer', + ]); + $data = $nominationEnsembleEntry->data; + $data['instrument'] = $validData['instrument']; + $data['split'] = $validData['split']; + $data['seat'] = $validData['seat']; + $nominationEnsembleEntry->update([ + 'data' => $data, + ]); + + return redirect()->back(); } - public function destroy(NominationEnsembleEntry $entry) + public function destroy(NominationEnsembleEntry $nominationEnsembleEntry) { // TODO: Implement destroy() method. } + + private function get_ensemble_instrumentation(NominationEnsemble $ensemble) + { + $entries = NominationEnsembleEntry::where('nomination_ensemble_id', $ensemble->id)->get(); + $splits = $ensemble->data['split_names']; + $instruments = []; + foreach ($ensemble->data['instruments'] as $instrument) { + $instruments[] = $instrument['name']; + } + $counts = []; + foreach ($splits as $split) { + $counts[$split] = []; + foreach ($instruments as $instrument) { + $counts[$split][$instrument] = 0; + } + } + + foreach ($entries as $entry) { + if (! isset($entry->data['split'])) { + continue; + } + $counts[$entry->data['split']][$entry->data['instrument']] += 1; + } + + return $counts; + } } diff --git a/app/Http/Controllers/NominationEnsembles/NominationAdminController.php b/app/Http/Controllers/NominationEnsembles/NominationAdminController.php index a1db51c..d6e26ef 100644 --- a/app/Http/Controllers/NominationEnsembles/NominationAdminController.php +++ b/app/Http/Controllers/NominationEnsembles/NominationAdminController.php @@ -8,15 +8,15 @@ interface NominationAdminController { public function index(); - public function show(NominationEnsembleEntry $entry); + public function show(NominationEnsembleEntry $nominationEnsembleEntry); public function create(); public function store(); - public function edit(NominationEnsembleEntry $entry); + public function edit(NominationEnsembleEntry $nominationEnsembleEntry); - public function update(NominationEnsembleEntry $entry); + public function update(NominationEnsembleEntry $nominationEnsembleEntry); - public function destroy(NominationEnsembleEntry $entry); + public function destroy(NominationEnsembleEntry $nominationEnsembleEntry); } diff --git a/app/Http/Controllers/NominationEnsembles/ScobdaNominationAdminController.php b/app/Http/Controllers/NominationEnsembles/ScobdaNominationAdminController.php index 99196f7..c659254 100644 --- a/app/Http/Controllers/NominationEnsembles/ScobdaNominationAdminController.php +++ b/app/Http/Controllers/NominationEnsembles/ScobdaNominationAdminController.php @@ -14,7 +14,7 @@ class ScobdaNominationAdminController extends Controller implements NominationAd return view('nomination_ensembles.scobda.admin.index', compact('nominations')); } - public function show(NominationEnsembleEntry $entry) + public function show(NominationEnsembleEntry $nominationEnsembleEntry) { // TODO: Implement show() method. } @@ -29,17 +29,17 @@ class ScobdaNominationAdminController extends Controller implements NominationAd // TODO: Implement store() method. } - public function edit(NominationEnsembleEntry $entry) + public function edit(NominationEnsembleEntry $nominationEnsembleEntry) { // TODO: Implement edit() method. } - public function update(NominationEnsembleEntry $entry) + public function update(NominationEnsembleEntry $nominationEnsembleEntry) { // TODO: Implement update() method. } - public function destroy(NominationEnsembleEntry $entry) + public function destroy(NominationEnsembleEntry $nominationEnsembleEntry) { // TODO: Implement destroy() method. } diff --git a/resources/views/nomination_ensembles/meobda/admin/nomination-edit.blade.php b/resources/views/nomination_ensembles/meobda/admin/nomination-edit.blade.php new file mode 100644 index 0000000..26d434a --- /dev/null +++ b/resources/views/nomination_ensembles/meobda/admin/nomination-edit.blade.php @@ -0,0 +1,54 @@ + + + Edit Nomination + + + + + Instrument + @foreach($nominationEnsembleEntry->ensemble->data['instruments'] as $instrument) + + @endforeach + + @error('instrument') +

{{ $message }}

+ @enderror + + Split + + @foreach($nominationEnsembleEntry->ensemble->data['split_names'] as $splitName) + + @endforeach + + + @error('split') +

{{ $message }}

+ @enderror + + +
+
+ + Current Instrumentation (before any changes) + + + + + @foreach($nominationEnsembleEntry->ensemble->data['split_names'] as $split) + {{$split}} + @endforeach + + + + @foreach($nominationEnsembleEntry->ensemble->data['instruments'] as $instrument) + + {{$instrument['name']}} + @foreach($nominationEnsembleEntry->ensemble->data['split_names'] as $split) + {{ $instrumentation[$split][$instrument['name']] }} + @endforeach + + @endforeach + + + +
diff --git a/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php index f989ccb..7795e02 100644 --- a/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php +++ b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php @@ -12,7 +12,7 @@ @foreach($schools as $school) @endforeach @@ -23,7 +23,7 @@ @foreach ($sections as $value => $name) @endforeach @@ -63,6 +63,7 @@ Nominated For Split Seat + @@ -71,9 +72,15 @@ {{ $nomination->id }} {{ $nomination->student->full_name('fl') }} {{ $nomination->student->school->name }} - {{ $nomination->ensemble->name }} - {{ $nomination->data['instrument'] }} + {{ $nomination->ensemble->name }} + - {{ $nomination->data['instrument'] }} {{ $nomination->data['split'] ?? '---' }} {{ $nomination->data['seat'] ?? '---' }} + + + [ EDIT ] + + @endforeach diff --git a/routes/nominationEnsemble.php b/routes/nominationEnsemble.php index 4e417f9..c77d1fd 100644 --- a/routes/nominationEnsemble.php +++ b/routes/nominationEnsemble.php @@ -19,6 +19,8 @@ Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('nomination Route::prefix('nominations/')->controller(NominationAdminController::class)->group(function () { Route::get('/', 'index')->name('nomination.admin.index'); + Route::get('/{nominationEnsembleEntry}/edit', 'edit')->name('nomination.admin.edit'); + Route::patch('/{nominationEnsembleEntry}', 'update')->name('nomination.admin.update'); }); Route::prefix('seating/')->controller(NominationSeatingController::class)->group(function () {