From 42b7837541db5d5314e27151b50360f2add1ff06 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Tue, 25 Jun 2024 21:11:49 -0500 Subject: [PATCH] Finish last migration --- .../Controllers/Admin/AuditionController.php | 128 +++++++++++------- .../Admin/ScoringGuideController.php | 74 ++++++---- ...and_seating_columns_to_auditions_table.php | 6 +- ...e_and_seating_columns_to_entries_table.php | 30 ++++ .../views/admin/auditions/create.blade.php | 10 ++ .../views/admin/auditions/edit.blade.php | 19 +++ .../views/admin/auditions/index.blade.php | 20 +++ .../views/components/form/checkbox.blade.php | 18 +++ .../icons/circle-slash-no.blade.php | 4 + 9 files changed, 232 insertions(+), 77 deletions(-) create mode 100644 database/migrations/2024_06_26_020924_add_advance_and_seating_columns_to_entries_table.php diff --git a/app/Http/Controllers/Admin/AuditionController.php b/app/Http/Controllers/Admin/AuditionController.php index cb3a892..86d9e12 100644 --- a/app/Http/Controllers/Admin/AuditionController.php +++ b/app/Http/Controllers/Admin/AuditionController.php @@ -2,108 +2,130 @@ namespace App\Http\Controllers\Admin; -use App\Events\AuditionChange; -use App\Events\RoomJudgeChange; use App\Http\Controllers\Controller; use App\Models\Audition; use App\Models\Event; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\Session; + use function abort; use function array_keys; use function compact; -use function dd; use function redirect; use function request; use function response; -use function route; use function view; class AuditionController extends Controller { public function index() { - if(! Auth::user()->is_admin) abort(403); - $auditions = Audition::with(['event','entries'])->orderBy('score_order')->orderBy('created_at','desc')->get(); - return view('admin.auditions.index', ['auditions' => $auditions] ); + if (! Auth::user()->is_admin) { + abort(403); + } + $auditions = Audition::with(['event', 'entries'])->orderBy('score_order')->orderBy('created_at', 'desc')->get(); + + return view('admin.auditions.index', ['auditions' => $auditions]); } public function create() { - if(! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $events = Event::orderBy('name')->get(); - return view('admin.auditions.create',['events'=> $events]); + return view('admin.auditions.create', ['events' => $events]); } public function store(Request $request) { - if(! Auth::user()->is_admin) abort(403); - + if (! Auth::user()->is_admin) { + abort(403); + } $validData = request()->validate([ - 'event_id' => ['required', 'exists:events,id'], - 'name' => ['required'], + 'event_id' => ['required', 'exists:events,id'], + 'name' => ['required'], 'entry_deadline' => ['required', 'date'], - 'entry_fee' => ['required', 'numeric'], - 'minimum_grade' => ['required', 'integer'], - 'maximum_grade' => 'required|numeric|gt:minimum_grade', + 'entry_fee' => ['required', 'numeric'], + 'minimum_grade' => ['required', 'integer'], + 'maximum_grade' => 'required|numeric|gte:minimum_grade', ], [ - 'maximum_grade.gt' => 'The maximum grade must be greater than the minimum grade.', + 'maximum_grade.gte' => 'The maximum grade must be greater than the minimum grade.', ]); + $validData['for_seating'] = $request->get('for_seating') ? 1 : 0; + $validData['for_advancement'] = $request->get('for_advancement') ? 1 : 0; + Audition::create([ - 'event_id' => $validData['event_id'], - 'name' => $validData['name'], + 'event_id' => $validData['event_id'], + 'name' => $validData['name'], 'entry_deadline' => $validData['entry_deadline'], - 'entry_fee' => $validData['entry_fee'] * 100, - 'minimum_grade' => $validData['minimum_grade'], - 'maximum_grade' => $validData['maximum_grade'], + 'entry_fee' => $validData['entry_fee'] * 100, + 'minimum_grade' => $validData['minimum_grade'], + 'maximum_grade' => $validData['maximum_grade'], + 'for_seating' => $validData['for_seating'], + 'for_advancement' => $validData['for_advancement'], ]); + return redirect('/admin/auditions'); } public function edit(Audition $audition) { - if(! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $events = Event::orderBy('name')->get(); - return view('admin.auditions.edit', ['audition' => $audition,'events'=> $events]); + + return view('admin.auditions.edit', ['audition' => $audition, 'events' => $events]); } - public function update(Audition $audition) + public function update(Request $request, Audition $audition) { - if(! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $validData = request()->validate([ - 'event_id' => ['required', 'exists:events,id'], - 'name' => ['required'], + 'event_id' => ['required', 'exists:events,id'], + 'name' => ['required'], 'entry_deadline' => ['required', 'date'], - 'entry_fee' => ['required', 'numeric'], - 'minimum_grade' => ['required', 'integer'], + 'entry_fee' => ['required', 'numeric'], + 'minimum_grade' => ['required', 'integer'], 'maximum_grade' => 'required|numeric|gt:minimum_grade', ], [ 'maximum_grade.gt' => 'The maximum grade must be greater than the minimum grade.', ]); + $validData['for_seating'] = $request->get('for_seating') ? 1 : 0; + $validData['for_advancement'] = $request->get('for_advancement') ? 1 : 0; + $audition->update([ - 'event_id' => $validData['event_id'], - 'name' => $validData['name'], + 'event_id' => $validData['event_id'], + 'name' => $validData['name'], 'entry_deadline' => $validData['entry_deadline'], - 'entry_fee' => $validData['entry_fee'] * 100, - 'minimum_grade' => $validData['minimum_grade'], - 'maximum_grade' => $validData['maximum_grade'], + 'entry_fee' => $validData['entry_fee'] * 100, + 'minimum_grade' => $validData['minimum_grade'], + 'maximum_grade' => $validData['maximum_grade'], + 'for_seating' => $validData['for_seating'], + 'for_advancement' => $validData['for_advancement'], ]); + return redirect('/admin/auditions'); } public function reorder(Request $request) { - if(! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $order = $request->order; foreach ($order as $index => $id) { $audition = Audition::find($id); $audition->update(['score_order' => $index]); } + return response()->json(['status' => 'success']); } @@ -115,9 +137,10 @@ class AuditionController extends Controller Audition::where('id', $audition['id']) ->update([ 'room_id' => $audition['room_id'], - 'order_in_room' => $audition['room_order'] + 'order_in_room' => $audition['room_order'], ]); } + return response()->json(['status' => 'success']); } @@ -128,44 +151,53 @@ class AuditionController extends Controller if ($audition) { $audition->update([ - 'scoring_guide_id' => $request->new_guide_id + 'scoring_guide_id' => $request->new_guide_id, ]); return response()->json(['success' => true]); } + return response()->json(['success' => false], 404); } public function destroy(Audition $audition) { - if(! Auth::user()->is_admin) abort(403); -// if($audition->entries->count() > 0) abort(403, 'Cannot delete an audition with entries.' - if($audition->entries->count() > 0) { + if (! Auth::user()->is_admin) { + abort(403); + } + // if($audition->entries->count() > 0) abort(403, 'Cannot delete an audition with entries.' + if ($audition->entries->count() > 0) { return redirect()->route('admin.auditions.index')->with('error', 'Cannot delete an audition with entries.'); } $audition->delete(); + return redirect('/admin/auditions'); } public function prepareDraw() { - if(! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $allAuditions = Audition::with('entries')->orderBy('score_order')->get(); - $nodraw_auditions = $allAuditions->filter(function($audition) { + $nodraw_auditions = $allAuditions->filter(function ($audition) { return $audition->has_no_draw(); }); - $drawn_auditions = $allAuditions->filter(function($audition) { + $drawn_auditions = $allAuditions->filter(function ($audition) { return $audition->has_complete_draw(); }); - $partial_draw_auditions = $allAuditions->filter(function($audition) { + $partial_draw_auditions = $allAuditions->filter(function ($audition) { return $audition->has_partial_draw(); }); - return view('admin.entries.prepare_draw',compact('nodraw_auditions','drawn_auditions','partial_draw_auditions')); + + return view('admin.entries.prepare_draw', compact('nodraw_auditions', 'drawn_auditions', 'partial_draw_auditions')); } public function runDraw(Request $request) { - if(! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $draw_auditions = Audition::with('entries')->find(array_keys($request->input('auditions'))); foreach ($draw_auditions as $audition) { $audition->runDraw(); diff --git a/app/Http/Controllers/Admin/ScoringGuideController.php b/app/Http/Controllers/Admin/ScoringGuideController.php index ef97ddf..279be7d 100644 --- a/app/Http/Controllers/Admin/ScoringGuideController.php +++ b/app/Http/Controllers/Admin/ScoringGuideController.php @@ -2,15 +2,14 @@ namespace App\Http\Controllers\Admin; -use App\Events\AuditionChange; use App\Http\Controllers\Controller; use App\Models\ScoringGuide; use App\Models\SubscoreDefinition; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; + use function abort; -use function dd; use function request; use function response; @@ -18,72 +17,86 @@ class ScoringGuideController extends Controller { public function index() { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } DB::table('auditions') ->whereNull('scoring_guide_id') ->update(['scoring_guide_id' => 0]); $guides = ScoringGuide::with('auditions')->orderBy('name')->get(); - return view('admin.scoring.index',['guides'=>$guides]); + + return view('admin.scoring.index', ['guides' => $guides]); } public function store() { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } request()->validate([ - 'name' => ['required','unique:scoring_guides'] + 'name' => ['required', 'unique:scoring_guides'], ]); $guide = ScoringGuide::create([ - 'name' => request('name') + 'name' => request('name'), ]); - return redirect('/admin/scoring'); } public function edit(Request $request, ScoringGuide $guide) { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $tab = $request->query('tab') ?? 'detail'; if ($tab == 'tiebreakOrder') { $subscores = SubscoreDefinition::where('scoring_guide_id', $guide->id)->orderBy('tiebreak_order')->get(); } else { $subscores = SubscoreDefinition::where('scoring_guide_id', $guide->id)->orderBy('display_order')->get(); } - return view('admin.scoring.edit',['guide'=>$guide,'subscores'=>$subscores, 'tab'=>$tab]); + + return view('admin.scoring.edit', ['guide' => $guide, 'subscores' => $subscores, 'tab' => $tab]); } public function update(ScoringGuide $guide) { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } request()->validate([ - 'name' => ['required','unique:scoring_guides'] + 'name' => ['required', 'unique:scoring_guides'], ]); $guide->update([ - 'name' => request('name') + 'name' => request('name'), ]); - return redirect('/admin/scoring/guides/' . $guide->id . '/edit' )->with('success','Scoring guide updated'); + + return redirect('/admin/scoring/guides/'.$guide->id.'/edit')->with('success', 'Scoring guide updated'); } public function subscore_store(Request $request, ScoringGuide $guide) { - if (! Auth::user()->is_admin) abort(403); - if (!$guide->exists()) abort(409); + if (! Auth::user()->is_admin) { + abort(403); + } + if (! $guide->exists()) { + abort(409); + } $validateData = request()->validate([ 'name' => ['required'], - 'max_score' => ['required','integer'], - 'weight'=>['required','integer'], - 'for_seating'=>['nullable','boolean'], - 'for_advance'=>['nullable','boolean'], + 'max_score' => ['required', 'integer'], + 'weight' => ['required', 'integer'], + 'for_seating' => ['nullable', 'boolean'], + 'for_advance' => ['nullable', 'boolean'], ]); $for_seating = $request->has('for_seating') ? (bool) $request->input('for_seating') : false; $for_advance = $request->has('for_advance') ? (bool) $request->input('for_advance') : false; - $display_order = SubscoreDefinition::where('scoring_guide_id','=',$guide->id)->max('display_order') + 1; - $tiebreak_order = SubscoreDefinition::where('scoring_guide_id','=',$guide->id)->max('tiebreak_order') + 1; + $display_order = SubscoreDefinition::where('scoring_guide_id', '=', $guide->id)->max('display_order') + 1; + $tiebreak_order = SubscoreDefinition::where('scoring_guide_id', '=', $guide->id)->max('tiebreak_order') + 1; $subscore = SubscoreDefinition::create([ 'scoring_guide_id' => $guide->id, @@ -95,30 +108,37 @@ class ScoringGuideController extends Controller 'for_seating' => $for_seating, 'for_advance' => $for_advance, ]); - return redirect('/admin/scoring/guides/' . $guide->id . '/edit' )->with('success','Subscore added'); + + return redirect('/admin/scoring/guides/'.$guide->id.'/edit')->with('success', 'Subscore added'); } public function reorder_display(Request $request) { - if(! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $order = $request->order; foreach ($order as $index => $id) { $subscore = SubscoreDefinition::find($id); $subscore->update(['display_order' => $index]); } - return response()->json(['status'=>'success']); + + return response()->json(['status' => 'success']); } public function reorder_tiebreak(Request $request) { - if(! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $order = $request->order; foreach ($order as $index => $id) { $subscore = SubscoreDefinition::find($id); $subscore->update(['tiebreak_order' => $index]); } - return response()->json(['status'=>'success']); + + return response()->json(['status' => 'success']); } } diff --git a/database/migrations/2024_06_26_002318_add_advance_and_seating_columns_to_auditions_table.php b/database/migrations/2024_06_26_002318_add_advance_and_seating_columns_to_auditions_table.php index 77a472c..9723361 100644 --- a/database/migrations/2024_06_26_002318_add_advance_and_seating_columns_to_auditions_table.php +++ b/database/migrations/2024_06_26_002318_add_advance_and_seating_columns_to_auditions_table.php @@ -12,7 +12,8 @@ return new class extends Migration public function up(): void { Schema::table('auditions', function (Blueprint $table) { - // + $table->boolean('for_seating')->default(1); + $table->boolean('for_advancement')->default(1); }); } @@ -22,7 +23,8 @@ return new class extends Migration public function down(): void { Schema::table('auditions', function (Blueprint $table) { - // + $table->dropColumn('for_seating'); + $table->dropColumn('for_advancement'); }); } }; diff --git a/database/migrations/2024_06_26_020924_add_advance_and_seating_columns_to_entries_table.php b/database/migrations/2024_06_26_020924_add_advance_and_seating_columns_to_entries_table.php new file mode 100644 index 0000000..c3e8833 --- /dev/null +++ b/database/migrations/2024_06_26_020924_add_advance_and_seating_columns_to_entries_table.php @@ -0,0 +1,30 @@ +boolean('for_seating')->default(1); + $table->boolean('for_advancement')->default(1); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('entries', function (Blueprint $table) { + $table->dropColumn('for_seating'); + $table->dropColumn('for_advancement'); + }); + } +}; diff --git a/resources/views/admin/auditions/create.blade.php b/resources/views/admin/auditions/create.blade.php index c232d0c..2944c51 100644 --- a/resources/views/admin/auditions/create.blade.php +++ b/resources/views/admin/auditions/create.blade.php @@ -18,6 +18,16 @@ + @if(auditionSetting('advanceTo')) +
+ +
+
+ +
+ @else + + @endif diff --git a/resources/views/admin/auditions/edit.blade.php b/resources/views/admin/auditions/edit.blade.php index f49955f..a7b6b21 100644 --- a/resources/views/admin/auditions/edit.blade.php +++ b/resources/views/admin/auditions/edit.blade.php @@ -18,6 +18,25 @@ + + @if(auditionSetting('advanceTo')) +
+ +
+
+ +
+ @else + + @endif +
diff --git a/resources/views/admin/auditions/index.blade.php b/resources/views/admin/auditions/index.blade.php index 141b4d0..4f84350 100644 --- a/resources/views/admin/auditions/index.blade.php +++ b/resources/views/admin/auditions/index.blade.php @@ -15,6 +15,10 @@ Deadline Entry Fee Grade Range + @if(auditionSetting('advanceTo')) + Seats + {{ auditionSetting('advanceTo') }} + @endif Entries @@ -29,6 +33,22 @@ {{ $audition->entry_deadline }} {{ $audition->dislpay_fee() }} {{ $audition->minimum_grade }} - {{ $audition->maximum_grade }} + @if(auditionSetting('advanceTo')) + + @if($audition->for_seating) + + @else + + @endif + + + @if($audition->for_advancement) + + @else + + @endif + + @endif {{ $audition->entries->count() }} @endforeach diff --git a/resources/views/components/form/checkbox.blade.php b/resources/views/components/form/checkbox.blade.php index e69de29..ac46979 100644 --- a/resources/views/components/form/checkbox.blade.php +++ b/resources/views/components/form/checkbox.blade.php @@ -0,0 +1,18 @@ +@props(['name','label','description' => '', 'checked' => false]) +
+
+ +
+
+ +

{{ $description }}

+ @error($name) +

{{ $message }}

+ @enderror +
+
diff --git a/resources/views/components/icons/circle-slash-no.blade.php b/resources/views/components/icons/circle-slash-no.blade.php index e69de29..1bedb5e 100644 --- a/resources/views/components/icons/circle-slash-no.blade.php +++ b/resources/views/components/icons/circle-slash-no.blade.php @@ -0,0 +1,4 @@ +@props(['color' => 'currentColor']) +