Managing nomination ensembles under MEOBDA rules implemented.

This commit is contained in:
Matt Young 2025-02-12 22:43:36 -06:00
parent b68b84c4dd
commit 9d59832d0b
2 changed files with 206 additions and 0 deletions

View File

@ -0,0 +1,129 @@
<?php
namespace App\Http\Controllers\NominationEnsembles;
use App\Http\Controllers\Controller;
use App\Models\NominationEnsemble;
use Illuminate\Validation\Rule;
use function redirect;
class MeobdaNominationEnsembleController extends Controller implements NominationEnsembleController
{
public function index()
{
$ensembles = NominationEnsemble::all();
return view('nomination_ensembles.meobda.admin.ensembles', compact('ensembles'));
}
public function show(NominationEnsemble $ensemble)
{
// TODO: Implement show() method.
}
public function create()
{
// TODO: Implement create() method.
}
public function store()
{
$validated = request()->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.');
}
}

View File

@ -0,0 +1,77 @@
<x-layout.app>
<x-slot:page_title>Nomination Ensembles (MEOBDA Rules)</x-slot:page_title>
<x-layout.page-section-container>
<x-layout.page-section>
<x-slot:section_name>Add Nomination Ensemble</x-slot:section_name>
<x-form.form method="POST" action="{{ route('nomination.admin.ensemble.store') }}" class="mb-6 mt-3">
<x-form.body-grid columns="9" class="max-w-full">
<x-form.field name="ensemble_name" label_text="Ensemble Name" colspan="3" autofocus/>
<x-form.field name="entry_deadline" label_text="Entry Deadline" type="date" colspan="2"/>
<x-form.field name="min_grade" label_text="Minimum Grade" type="number" colspan="2"/>
<x-form.field name="max_grade" label_text="Maximum Grade" type="number" colspan="2"/>
<x-form.field name="max_nominations" label_text="Maximum Nominations per School" type="number"
colspan="3"/>
<x-form.textarea name="instrument_list" colspan="9">
<x-slot:label>Instrument List (One per line. Add :x to set a limit per school)</x-slot:label>
</x-form.textarea>
</x-form.body-grid>
<x-form.footer submit-button-text="Create Ensemble"/>
</x-form.form>
</x-layout.page-section>
<x-layout.page-section>
<x-slot:section_name>Nomination Ensembles</x-slot:section_name>
<div class="p-4">
@foreach($ensembles as $ensemble)
<x-card.card class="m-3" x-data="{ editable: false }">
<x-card.heading>
{{ $ensemble->name }}
<x-slot:right_side class="flex">
<x-icons.pencil @click="editable = true" x-show="!editable"/>
<x-delete-resource-modal
title="Delete Nomination Ensemble {{$ensemble->name}}"
method="DELETE"
action="{{ route('nomination.admin.ensemble.destroy',[$ensemble]) }}"
>
Are you sure you want to delete this nomination ensemble?
</x-delete-resource-modal>
</x-slot:right_side>
</x-card.heading>
<x-form.form method="POST" action="{{ route('nomination.admin.ensemble.update',[$ensemble]) }}"
class="mb-6 mt-3">
@method('PATCH')
<x-form.body-grid columns="9" class="max-w-full">
<x-form.field name="ensemble_name" label_text="Ensemble Name" colspan="3"
value="{{ $ensemble->name }}" x-bind:readonly="!editable"/>
<x-form.field name="entry_deadline" label_text="Entry Deadline" type="date" colspan="2"
value="{{ $ensemble->entry_deadline }}" x-bind:readonly="!editable"/>
<x-form.field name="min_grade" label_text="Minimum Grade" type="number" colspan="2"
value="{{ $ensemble->minimum_grade }}" x-bind:readonly="!editable"/>
<x-form.field name="max_grade" label_text="Maximum Grade" type="number" colspan="2"
value="{{ $ensemble->maximum_grade }}" x-bind:readonly="!editable"/>
<x-form.field name="max_nominations" label_text="Maximum Nominations per School"
type="number" colspan="3" value="{{ $ensemble->data['max_nominations'] }}"
x-bind:readonly="!editable"/>
<x-form.textarea name="instrument_list" colspan="9" x-bind:readonly="!editable">
<x-slot:label>Instrument List (One per line. Add :x to set a limit per school)</x-slot:label>
@foreach($ensemble->data['instruments'] as $instrument){{ trim($instrument['name']) }}@if($instrument['max']):{{trim($instrument['max'])}}@endif{{PHP_EOL}}@endforeach
</x-form.textarea>
</x-form.body-grid>
<x-form.footer submit-button-text="Edit Ensemble" x-show="editable" x-cloak/>
</x-form.form>
</x-card.card>
@endforeach
</div>
</x-layout.page-section>
</x-layout.page-section-container>
</x-layout.app>