Allow admin to update nominations in MEOBDA rules

This commit is contained in:
Matt Young 2025-03-26 21:49:55 -05:00
parent 917f570c42
commit 80e66aa49a
6 changed files with 135 additions and 17 deletions

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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.
}

View File

@ -0,0 +1,54 @@
<x-layout.app>
<x-card.card class="mx-auto max-w-lg">
<x-card.heading>Edit Nomination</x-card.heading>
<x-form.form method="PATCH" action="{{ route('nomination.admin.update',$nominationEnsembleEntry) }}" class="mb-4 mt-2">
<x-form.field readonly name="name" label_text="Student" value="{{ $nominationEnsembleEntry->student->full_name() }} - {{ $nominationEnsembleEntry->student->school->name }} - Grade: {{ $nominationEnsembleEntry->student->grade }}"/>
<x-form.field readonly name="ensemble" label_text="Ensemble" value="{{ $nominationEnsembleEntry->ensemble->name }}" />
<x-form.select name="instrument">
<x-slot:label>Instrument</x-slot:label>
@foreach($nominationEnsembleEntry->ensemble->data['instruments'] as $instrument)
<option value="{{$instrument['name']}}" @if($instrument['name'] == $nominationEnsembleEntry->data['instrument']) SELECTED @endif>{{$instrument['name']}}</option>
@endforeach
</x-form.select>
@error('instrument')
<p class="text-xs text-red-500 font-semibold mt-1 ml-3">{{ $message }}</p>
@enderror
<x-form.select name="split">
<x-slot:label>Split</x-slot:label>
<option value="--">---</option>
@foreach($nominationEnsembleEntry->ensemble->data['split_names'] as $splitName)
<option value="{{$splitName}}" @if($splitName == $nominationEnsembleEntry->data['split']) SELECTED @endif>{{$splitName}}</option>
@endforeach
</x-form.select>
@error('split')
<p class="text-xs text-red-500 font-semibold mt-1 ml-3">{{ $message }}</p>
@enderror
<x-form.field type="number" name="seat" value="{{$nominationEnsembleEntry->data['seat']}}" label_text="Seat"/>
<x-form.footer submit-button-text="Save Changes"></x-form.footer>
</x-form.form>
</x-card.card>
<x-card.card class="mt-3">
<x-card.heading>Current Instrumentation (before any changes)</x-card.heading>
<x-table.table>
<thead>
<tr>
<x-table.th> </x-table.th>
@foreach($nominationEnsembleEntry->ensemble->data['split_names'] as $split)
<x-table.th>{{$split}}</x-table.th>
@endforeach
</tr>
</thead>
<x-table.body>
@foreach($nominationEnsembleEntry->ensemble->data['instruments'] as $instrument)
<tr>
<x-table.td>{{$instrument['name']}}</x-table.td>
@foreach($nominationEnsembleEntry->ensemble->data['split_names'] as $split)
<x-table.td>{{ $instrumentation[$split][$instrument['name']] }}</x-table.td>
@endforeach
</tr>
@endforeach
</x-table.body>
</x-table.table>
</x-card.card>
</x-layout.app>

View File

@ -63,6 +63,7 @@
<x-table.th>Nominated For</x-table.th>
<x-table.th>Split</x-table.th>
<x-table.th>Seat</x-table.th>
<x-table.th></x-table.th>
</tr>
</thead>
<x-table.body>
@ -71,9 +72,15 @@
<x-table.td>{{ $nomination->id }}</x-table.td>
<x-table.td>{{ $nomination->student->full_name('fl') }}</x-table.td>
<x-table.td>{{ $nomination->student->school->name }}</x-table.td>
<x-table.td>{{ $nomination->ensemble->name }} - {{ $nomination->data['instrument'] }}</x-table.td>
<x-table.td>{{ $nomination->ensemble->name }}
- {{ $nomination->data['instrument'] }}</x-table.td>
<x-table.td>{{ $nomination->data['split'] ?? '---' }}</x-table.td>
<x-table.td>{{ $nomination->data['seat'] ?? '---' }}</x-table.td>
<x-table.td>
<a href="{{ route('nomination.admin.edit',[$nomination]) }}">
[ EDIT ]
</a>
</x-table.td>
</tr>
@endforeach
</x-table.body>

View File

@ -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 () {