diff --git a/app/Http/Controllers/Admin/AuditionController.php b/app/Http/Controllers/Admin/AuditionController.php index 4add20c..f91eee9 100644 --- a/app/Http/Controllers/Admin/AuditionController.php +++ b/app/Http/Controllers/Admin/AuditionController.php @@ -4,42 +4,112 @@ namespace App\Http\Controllers\Admin; 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 redirect; +use function request; use function response; +use function route; class AuditionController extends Controller { public function index() { if(! Auth::user()->is_admin) abort(403); - $auditions = Audition::with(['event','entries'])->orderBy('score_order')->get(); + $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); - return view('admin.auditions.create'); + $events = Event::orderBy('name')->get(); + return view('admin.auditions.create',['events'=> $events]); + } + + public function store(Request $request) + { + if(! Auth::user()->is_admin) abort(403); + + $validData = request()->validate([ + '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', + ], [ + 'maximum_grade.gt' => 'The maximum grade must be greater than the minimum grade.', + ]); + + Audition::create([ + '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'], + ]); + + return redirect('/admin/auditions'); } public function edit(Audition $audition) { if(! Auth::user()->is_admin) abort(403); - return view('admin.auditions.edit', ['audition' => $audition]); + $events = Event::orderBy('name')->get(); + return view('admin.auditions.edit', ['audition' => $audition,'events'=> $events]); + } + + public function update(Audition $audition) + { + if(! Auth::user()->is_admin) abort(403); + + $validData = request()->validate([ + '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', + ], [ + 'maximum_grade.gt' => 'The maximum grade must be greater than the minimum grade.', + ]); + + $audition->update([ + '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'], + ]); + + return redirect('/admin/auditions'); } public function reorder(Request $request) { - + if(! Auth::user()->is_admin) abort(403); $order = $request->order; foreach ($order as $index => $id) { $audition = Audition::find($id); - #$audition->score_order = $index; - #return response()->json(['status' => $index]); - #$item->save(); $audition->update(['score_order' => $index]); } return response()->json(['status' => 'success']); } + + 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) { + return redirect()->route('adminAuditionIndex')->with('error', 'Cannot delete an audition with entries.'); + } + $audition->delete(); + return redirect('/admin/auditions'); + } } diff --git a/resources/views/admin/auditions/create.blade.php b/resources/views/admin/auditions/create.blade.php new file mode 100644 index 0000000..c232d0c --- /dev/null +++ b/resources/views/admin/auditions/create.blade.php @@ -0,0 +1,25 @@ + + Auditions + + + + Create Audition + + + + + + Event + @foreach($events as $event) + + @endforeach + + + + + + + + + + diff --git a/resources/views/admin/auditions/edit.blade.php b/resources/views/admin/auditions/edit.blade.php new file mode 100644 index 0000000..71315b4 --- /dev/null +++ b/resources/views/admin/auditions/edit.blade.php @@ -0,0 +1,34 @@ + + Auditions + + + Edit Audition + + + + + + Event + @foreach($events as $event) + + @endforeach + + + + + + + +
+ +
+
+ Edit Audition +
+
+ +
+ +
+
+ diff --git a/resources/views/admin/auditions/index.blade.php b/resources/views/admin/auditions/index.blade.php index 7e8a70a..ea357f1 100644 --- a/resources/views/admin/auditions/index.blade.php +++ b/resources/views/admin/auditions/index.blade.php @@ -1,19 +1,17 @@ Audition Administration - Auditions - Click name to edit + Drag to reorder. Double click to edit. - New Audition + New Audition Event Name - Order Deadline Entry Fee Grade Range @@ -25,10 +23,9 @@
@foreach($auditions as $audition) - + {{ $audition->event->name }} {{ $audition->name }} - {{ $audition->score_order }} {{ $audition->entry_deadline }} {{ $audition->dislpay_fee() }} {{ $audition->minimum_grade }} - {{ $audition->maximum_grade }} diff --git a/resources/views/components/flash_message.blade.php b/resources/views/components/flash_message.blade.php index 8b226c5..2270067 100644 --- a/resources/views/components/flash_message.blade.php +++ b/resources/views/components/flash_message.blade.php @@ -1,39 +1,50 @@ -{{--Send messages with Session::flash('msg|MESSAGE HERE','success, caution or danger');--}} -{{--Can also use helper fuction: sendMessage('Test Message','danger')--}} @props(['message','messageType']) @php - $div_classes = 'flex justify-between mx-auto max-w-2xl text-sm rounded-md px-3 py-1 mb-2 font-medium ring-1 ring-inset '; - $button_classes = 'group relative mr-1 h-5 w-5 rounded-sm '; - $svg_classes = 'h-5 w-5 '; - switch($messageType) { - case 'caution': - $div_classes .= 'bg-yellow-50 text-yellow-800 ring-yellow-600/40'; - $button_classes .= 'hover:bg-yellow-600/20'; - $svg_classes .= 'stroke-yellow-700/50 group-hover:stroke-yellow-700/75'; - break; - - case 'danger': - $div_classes .= 'bg-red-50 text-red-700 ring-red-600/40'; - $button_classes .= 'hover:bg-red-600/20'; - $svg_classes .= 'stroke-red-600/50 group-hover:stroke-red-600/75'; - break; - - default: - $div_classes .= 'bg-green-50 text-green-700 ring-green-600/40 '; - $button_classes .= 'hover:bg-green-600/20'; - $svg_classes .= 'stroke-green-700/50 group-hover:stroke-green-700/75'; - break; - } + $messages = [ + 'success' => session()->get('success'), + 'error' => session()->get('error'), + 'caution' => session()->get('caution') + ]; @endphp -
-
{{ $message }}
-
- + + +@foreach($messages as $messageType => $message) + @continue(!$message) + @php + + $div_classes = 'flex justify-between mx-auto max-w-2xl text-sm rounded-md px-3 py-1 mb-5 font-medium ring-1 ring-inset '; + $button_classes = 'group relative mr-1 h-5 w-5 rounded-sm '; + $svg_classes = 'h-5 w-5 '; + switch($messageType) { + case 'caution': + $div_classes .= 'bg-yellow-50 text-yellow-800 ring-yellow-600/40'; + $button_classes .= 'hover:bg-yellow-600/20'; + $svg_classes .= 'stroke-yellow-700/50 group-hover:stroke-yellow-700/75'; + break; + + case 'error': + $div_classes .= 'bg-red-50 text-red-700 ring-red-600/40'; + $button_classes .= 'hover:bg-red-600/20'; + $svg_classes .= 'stroke-red-600/50 group-hover:stroke-red-600/75'; + break; + + case 'success': + $div_classes .= 'bg-green-50 text-green-700 ring-green-600/40 '; + $button_classes .= 'hover:bg-green-600/20'; + $svg_classes .= 'stroke-green-700/50 group-hover:stroke-green-700/75'; + break; + } + @endphp +
+
{{ $message }}
+
+ +
-
+@endforeach diff --git a/resources/views/components/form/delete-form.blade.php b/resources/views/components/form/delete-form.blade.php new file mode 100644 index 0000000..a3d308b --- /dev/null +++ b/resources/views/components/form/delete-form.blade.php @@ -0,0 +1,13 @@ +@props(['action']) +@php + $attribs = [ + 'method' => 'post', + 'id' => 'deleteResource', + 'action' => $action, + 'name' => 'deleteResource' +]; +@endphp +
merge($attribs) }}> + @csrf + @method('DELETE') +
diff --git a/resources/views/components/form/form.blade.php b/resources/views/components/form/form.blade.php index 3f9b9e5..5b69cff 100644 --- a/resources/views/components/form/form.blade.php +++ b/resources/views/components/form/form.blade.php @@ -1,6 +1,6 @@ @props([ 'method' => 'POST', - 'form_classes' => 'px-4 py-6 sm:p-8' + 'form_classes' => 'px-4 sm:px-8' ])
merge(['class' => $form_classes]) }}> diff --git a/resources/views/components/form/red-trash-button.blade.php b/resources/views/components/form/red-trash-button.blade.php new file mode 100644 index 0000000..5def2a1 --- /dev/null +++ b/resources/views/components/form/red-trash-button.blade.php @@ -0,0 +1,15 @@ +@props(['size' => 25]) +@php + $attribs = [ + 'form' => 'deleteResource', + 'type' => 'submit', + 'class' => 'rounded-lg bg-red-600 p-2 text-white shadow-sm hover:bg-red-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600' +]; +@endphp + diff --git a/resources/views/components/layout/app.blade.php b/resources/views/components/layout/app.blade.php index 374e7b6..5e3d89f 100644 --- a/resources/views/components/layout/app.blade.php +++ b/resources/views/components/layout/app.blade.php @@ -33,9 +33,7 @@
- @foreach(getMessages() as $message) - - @endforeach + {{ $slot }}
diff --git a/routes/web.php b/routes/web.php index 1663810..084ba7a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -31,12 +31,13 @@ Route::middleware(['auth','verified',CheckIfAdmin::class])->prefix('admin/')->gr // Admin Auditions Routes Route::prefix('auditions')->controller(\App\Http\Controllers\Admin\AuditionController::class)->group(function() { - Route::get('/','index'); + Route::get('/','index')->name('adminAuditionIndex'); Route::get('/create','create'); Route::post('/','store'); - Route::get('/{entry}/edit','edit'); - Route::patch('/{entry}','update'); + Route::get('/{audition}/edit','edit'); + Route::patch('/{audition}','update'); Route::post('/reorder','reorder'); + Route::delete('/{audition}','destroy'); }); // Admin Entries Routes