Admin functions to manage nomination ensembles working.

This commit is contained in:
Matt Young 2025-02-02 16:56:56 -06:00
parent f7bb1547cc
commit f83ba6e806
6 changed files with 123 additions and 8 deletions

View File

@ -16,7 +16,7 @@ interface NominationEnsembleController
public function edit(NominationEnsemble $ensemble);
public function update();
public function update(NominationEnsemble $ensemble);
public function destroy();
public function destroy(NominationEnsemble $ensemble);
}

View File

@ -4,6 +4,7 @@ namespace App\Http\Controllers\NominationEnsembles;
use App\Http\Controllers\Controller;
use App\Models\NominationEnsemble;
use Illuminate\Validation\Rule;
use function redirect;
@ -11,7 +12,9 @@ class ScobdaNominationEnsembleController extends Controller implements Nominatio
{
public function index()
{
return view('nomination_ensembles.scobda.index');
$ensembles = NominationEnsemble::all();
return view('nomination_ensembles.scobda.index', compact('ensembles'));
}
public function show(NominationEnsemble $ensemble)
@ -28,7 +31,7 @@ class ScobdaNominationEnsembleController extends Controller implements Nominatio
{
//dd(request()->all());
$validated = request()->validate([
'ensemble_name' => 'required',
'ensemble_name' => 'required|unique:nomination_ensembles,name',
'entry_deadline' => 'required|date',
'min_grade' => 'required|numeric|min:0',
'max_grade' => 'required|numeric|gte:min_grade',
@ -52,6 +55,7 @@ class ScobdaNominationEnsembleController extends Controller implements Nominatio
$data['max_nominations'] = $validated['max_nominations'];
$data['target_size'] = $validated['target_size'];
$data['instruments'] = $instrument_array;
$data['rounding_direction'] = $validated['rounding_direction'];
$ensemble->data = $data;
$ensemble->save();
@ -63,13 +67,47 @@ class ScobdaNominationEnsembleController extends Controller implements Nominatio
// TODO: Implement edit() method.
}
public function update()
public function update(NominationEnsemble $ensemble)
{
// TODO: Implement update() method.
$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',
'target_size' => 'required|numeric|min:1',
'rounding_direction' => 'required|in:up,down',
'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*/', ',', $validated['instrument_list']);
$instrument_array = explode(',', $instrument_list);
$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['target_size'] = $validated['target_size'];
$data['instruments'] = $instrument_array;
$data['rounding_direction'] = $validated['rounding_direction'];
$ensemble->data = $data;
$ensemble->save();
return redirect()->route('nomination.admin.ensemble.index')->with('success', 'Nomination Ensemble has been modified.');
}
public function destroy()
public function destroy(NominationEnsemble $ensemble)
{
// TODO: Implement destroy() method.
$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,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('nomination_ensembles', function (Blueprint $table) {
$table->unique('name');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('nomination_ensembles', function (Blueprint $table) {
$table->dropUnique(['name']);
});
}
};

View File

@ -0,0 +1,3 @@
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" {{ $attributes }}>
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m14.304 4.844 2.852 2.852M7 7H4a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h11a1 1 0 0 0 1-1v-4.5m2.409-9.91a2.017 2.017 0 0 1 0 2.853l-6.844 6.844L8 14l.713-3.565 6.844-6.844a2.015 2.015 0 0 1 2.852 0Z"/>
</svg>

After

Width:  |  Height:  |  Size: 478 B

View File

@ -24,6 +24,50 @@
<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.field name="target_size" label_text="Target Ensemble Size" type="number" colspan="3" value="{{ $ensemble->data['target_size'] }}" x-bind:readonly="!editable" />
<x-form.select name="rounding_direction" colspan="3" x-bind:disabled="!editable" >
<x-slot:label>Round</x-slot:label>
<option value="up" @if(($ensemble->data['rounding_direction'] ?? null) == 'up') selected @endif()>Up</option>
<option value="down" @if(($ensemble->data['rounding_direction'] ?? null) == 'down') selected @endif()>Down</option>
</x-form.select>
<x-form.textarea name="instrument_list" colspan="9" x-bind:readonly="!editable" >
<x-slot:label>Instrument List (comma separated)</x-slot:label>
{{ implode(', ',$ensemble->data['instruments']) }}
</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>

View File

@ -8,5 +8,7 @@ Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('nomination
Route::prefix('ensemble/')->controller(NominationEnsembleController::class)->group(function () {
Route::get('/', 'index')->name('nomination.admin.ensemble.index');
Route::post('/', 'store')->name('nomination.admin.ensemble.store');
Route::patch('/{ensemble}', 'update')->name('nomination.admin.ensemble.update');
Route::delete('/{ensemble}', 'destroy')->name('nomination.admin.ensemble.destroy');
});
});