diff --git a/app/Http/Controllers/NominationEnsembles/NominationEnsembleController.php b/app/Http/Controllers/NominationEnsembles/NominationEnsembleController.php index 539d8f0..d9c86cd 100644 --- a/app/Http/Controllers/NominationEnsembles/NominationEnsembleController.php +++ b/app/Http/Controllers/NominationEnsembles/NominationEnsembleController.php @@ -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); } diff --git a/app/Http/Controllers/NominationEnsembles/ScobdaNominationEnsembleController.php b/app/Http/Controllers/NominationEnsembles/ScobdaNominationEnsembleController.php index 599930f..ce83fd4 100644 --- a/app/Http/Controllers/NominationEnsembles/ScobdaNominationEnsembleController.php +++ b/app/Http/Controllers/NominationEnsembles/ScobdaNominationEnsembleController.php @@ -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.'); } } diff --git a/database/migrations/2025_02_02_225428_add_unique_constraint_to_name_in_nomination_ensembles_table.php b/database/migrations/2025_02_02_225428_add_unique_constraint_to_name_in_nomination_ensembles_table.php new file mode 100644 index 0000000..bd6fc7b --- /dev/null +++ b/database/migrations/2025_02_02_225428_add_unique_constraint_to_name_in_nomination_ensembles_table.php @@ -0,0 +1,28 @@ +unique('name'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('nomination_ensembles', function (Blueprint $table) { + $table->dropUnique(['name']); + }); + } +}; diff --git a/resources/views/components/icons/pencil.blade.php b/resources/views/components/icons/pencil.blade.php new file mode 100644 index 0000000..e5ca2e7 --- /dev/null +++ b/resources/views/components/icons/pencil.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/nomination_ensembles/scobda/index.blade.php b/resources/views/nomination_ensembles/scobda/index.blade.php index 3550819..cec3d9f 100644 --- a/resources/views/nomination_ensembles/scobda/index.blade.php +++ b/resources/views/nomination_ensembles/scobda/index.blade.php @@ -24,6 +24,50 @@ + + + Nomination Ensembles +
+ @foreach($ensembles as $ensemble) + + + {{ $ensemble->name }} + + + + Are you sure you want to delete this nomination ensemble? + + + + + @method('PATCH') + + + + + + + + + Round + + + + + Instrument List (comma separated) + {{ implode(', ',$ensemble->data['instruments']) }} + + + + + + @endforeach +
+
diff --git a/routes/nominationEnsemble.php b/routes/nominationEnsemble.php index 6c94980..5f2f8e9 100644 --- a/routes/nominationEnsemble.php +++ b/routes/nominationEnsemble.php @@ -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'); }); });