Managing nomination ensembles under MEOBDA rules implemented.
This commit is contained in:
parent
b68b84c4dd
commit
9d59832d0b
|
|
@ -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.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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>
|
||||||
Loading…
Reference in New Issue