diff --git a/app/Http/Controllers/Admin/AuditionController.php b/app/Http/Controllers/Admin/AuditionController.php index 86d9e12..9025bf0 100644 --- a/app/Http/Controllers/Admin/AuditionController.php +++ b/app/Http/Controllers/Admin/AuditionController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\Audition; use App\Models\Event; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -14,16 +15,15 @@ use function compact; use function redirect; use function request; use function response; +use function to_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(); + $auditions = Audition::with(['event'])->withCount('entries')->orderBy('score_order')->orderBy('created_at', + 'desc')->get(); return view('admin.auditions.index', ['auditions' => $auditions]); } @@ -50,12 +50,16 @@ class AuditionController extends Controller 'entry_fee' => ['required', 'numeric'], 'minimum_grade' => ['required', 'integer'], 'maximum_grade' => 'required|numeric|gte:minimum_grade', + 'scoring_guide_id' => 'nullable|exists:scoring_guides,id', ], [ '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; + if (empty($alidData['scoring_guide_id'])) { + $validData['scoring_guide_id'] = 0; + } Audition::create([ 'event_id' => $validData['event_id'], @@ -66,9 +70,10 @@ class AuditionController extends Controller 'maximum_grade' => $validData['maximum_grade'], 'for_seating' => $validData['for_seating'], 'for_advancement' => $validData['for_advancement'], + 'scoring_guide_id' => $validData['scoring_guide_id'], ]); - return redirect('/admin/auditions'); + return to_route('admin.auditions.index')->with('success', 'Audition created successfully'); } public function edit(Audition $audition) @@ -93,7 +98,7 @@ class AuditionController extends Controller 'entry_deadline' => ['required', 'date'], 'entry_fee' => ['required', 'numeric'], 'minimum_grade' => ['required', 'integer'], - 'maximum_grade' => 'required|numeric|gt:minimum_grade', + 'maximum_grade' => 'required | numeric | gt:minimum_grade', ], [ 'maximum_grade.gt' => 'The maximum grade must be greater than the minimum grade.', ]); @@ -112,7 +117,7 @@ class AuditionController extends Controller 'for_advancement' => $validData['for_advancement'], ]); - return redirect('/admin/auditions'); + return to_route('admin.auditions.index')->with('success', 'Audition updated successfully'); } public function reorder(Request $request) @@ -144,6 +149,13 @@ class AuditionController extends Controller return response()->json(['status' => 'success']); } + /** + * Update the scoring guide for an audition + * Used by AJAX call on the scoring guide index page + * request should include scoring_guide_id and audition_id + * + * @return JsonResponse + */ public function scoringGuideUpdate(Request $request) { @@ -162,16 +174,12 @@ class AuditionController extends Controller 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('admin.auditions.index')->with('error', 'Cannot delete an audition with entries.'); } $audition->delete(); - return redirect('/admin/auditions'); + return to_route('admin.auditions.index')->with('success', 'Audition deleted successfully'); } public function prepareDraw() @@ -190,7 +198,8 @@ class AuditionController extends Controller 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) @@ -203,6 +212,6 @@ class AuditionController extends Controller $audition->runDraw(); } - return redirect('/admin/auditions/run_draw'); + return redirect(' / admin / auditions / run_draw'); } } diff --git a/app/Http/Controllers/Admin/AuditionSettings.php b/app/Http/Controllers/Admin/AuditionSettings.php index 6083f20..f879ea8 100644 --- a/app/Http/Controllers/Admin/AuditionSettings.php +++ b/app/Http/Controllers/Admin/AuditionSettings.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Settings; use Illuminate\Http\Request; +use function to_route; class AuditionSettings extends Controller { @@ -35,6 +36,6 @@ class AuditionSettings extends Controller Settings::set($key, $value); } - return view('admin.audition-settings')->with('success', 'Settings Saved'); + return to_route('audition-settings')->with('success', 'Settings Saved'); } } diff --git a/app/Http/Controllers/Admin/EnsembleController.php b/app/Http/Controllers/Admin/EnsembleController.php index 7574041..d3a79e4 100644 --- a/app/Http/Controllers/Admin/EnsembleController.php +++ b/app/Http/Controllers/Admin/EnsembleController.php @@ -8,7 +8,7 @@ use App\Models\Event; use App\Models\SeatingLimit; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\DB; + use function redirect; class EnsembleController extends Controller @@ -16,16 +16,19 @@ class EnsembleController extends Controller public function index() { $events = Event::with('ensembles')->get(); - return view('admin.ensembles.index',compact('events')); + + return view('admin.ensembles.index', compact('events')); } public function store(Request $request) { - if(! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } request()->validate([ 'name' => 'required', - 'code' => ['required','max:6'], - 'event_id' => ['required','exists:events,id'] + 'code' => ['required', 'max:6'], + 'event_id' => ['required', 'exists:events,id'], ]); Ensemble::create([ @@ -34,64 +37,78 @@ class EnsembleController extends Controller 'event_id' => request('event_id'), ]); - return redirect()->route('admin.ensembles.index')->with('success','Ensemble created successfully'); + return redirect()->route('admin.ensembles.index')->with('success', 'Ensemble created successfully'); } public function destroy(Request $request, Ensemble $ensemble) { - if(! Auth::user()->is_admin) abort(403); + if ($ensemble->seats->count() > 0) { + return redirect()->route('admin.ensembles.index')->with('error', 'Ensemble has students seated and cannot be deleted'); + } $ensemble->delete(); + return redirect()->route('admin.ensembles.index')->with('success', 'Ensemble deleted successfully'); } public function updateEnsemble(Request $request, Ensemble $ensemble) { - if(! Auth::user()->is_admin) abort(403); request()->validate([ 'name' => 'required', - 'code' => 'required|max:6' + 'code' => 'required|max:6', ]); $ensemble->update([ 'name' => request('name'), - 'code' => request('code') + 'code' => request('code'), ]); - return redirect()->route('admin.ensembles.index')->with('success','Ensemble updated successfully'); + + return redirect()->route('admin.ensembles.index')->with('success', 'Ensemble updated successfully'); } public function seatingLimits(Ensemble $ensemble) { - $ensembles = Ensemble::with('event')->orderBy('event_id')->get(); + $limits = []; + $ensembles = Ensemble::with(['event'])->orderBy('event_id')->get(); if ($ensemble->exists()) { $ensemble->load('seatingLimits'); + foreach ($ensemble->seatingLimits as $lim) { + $limits[$lim->audition_id] = $lim->maximum_accepted; + } } - return view('admin.ensembles.seatingLimits',compact('ensemble','ensembles')); + + return view('admin.ensembles.seatingLimits', compact('ensemble', 'ensembles', 'limits')); } public function seatingLimitsSet(Request $request, Ensemble $ensemble) { $request->validate([ - 'audition' => 'required', - 'audition.*' => ['integer','min:0'] + 'audition' => 'required', + 'audition.*' => ['integer', 'min:0'], ]); - foreach($ensemble->auditions as $audition) { + foreach ($ensemble->auditions as $audition) { SeatingLimit::upsert( - [[ - 'ensemble_id' => $ensemble->id, - 'audition_id' => $audition->id, - 'maximum_accepted' => $request->audition[$audition->id] - ]], - uniqueBy: ['ensemble_id','audition_id'], + [ + [ + 'ensemble_id' => $ensemble->id, + 'audition_id' => $audition->id, + 'maximum_accepted' => $request->audition[$audition->id], + ], + ], + uniqueBy: ['ensemble_id', 'audition_id'], update: ['maximum_accepted'] ); } - return redirect()->route('admin.ensembles.seatingLimits')->with('success', 'Seating limits set for ' . $ensemble->name); + + return redirect()->route('admin.ensembles.seatingLimits.ensemble', $ensemble)->with('success', + 'Seating limits set for '.$ensemble->name); } public function updateEnsembleRank(Request $request) { - if(! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $order = $request->input('order'); $eventId = $request->input('event_id'); diff --git a/app/Http/Controllers/Admin/EntryController.php b/app/Http/Controllers/Admin/EntryController.php index 529788c..79e016a 100644 --- a/app/Http/Controllers/Admin/EntryController.php +++ b/app/Http/Controllers/Admin/EntryController.php @@ -11,7 +11,9 @@ use App\Models\Student; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use function auditionSetting; use function compact; +use function to_route; class EntryController extends Controller { @@ -62,21 +64,24 @@ class EntryController extends Controller $entries = $entries->paginate(10); - return view('admin.entries.index', ['entries' => $entries, + return view('admin.entries.index', [ + 'entries' => $entries, 'auditions' => $auditions, 'schools' => $schools, 'minGrade' => $minGrade, 'maxGrade' => $maxGrade, - 'filters' => $filters]); + 'filters' => $filters, + ]); } public function create() { - if (! Auth::user()->is_admin) { - abort(403); - } $students = Student::with('school')->orderBy('last_name')->orderBy('first_name')->get(); - $auditions = Audition::orderBy('score_order')->get(); + $auditionsRaw = Audition::with('flags')->orderBy('score_order')->get(); + + $auditions = $auditionsRaw->reject(function ($audition) { + return $audition->hasFlag('seats_published') || $audition->hasFlag('advancement_published'); + }); return view('admin.entries.create', ['students' => $students, 'auditions' => $auditions]); } @@ -106,9 +111,16 @@ class EntryController extends Controller public function edit(Entry $entry) { - if (! Auth::user()->is_admin) { - abort(403); + if ($entry->audition->hasFlag('seats_published')) { + return to_route('admin.entries.index')->with('error', + 'Entries in auditions with seats published cannot be modified'); } + + if ($entry->audition->hasFlag('advancement_published')) { + return to_route('admin.entries.index')->with('error', + 'Entries in auditions with advancement results published cannot be modified'); + } + $students = Student::with('school')->orderBy('last_name')->orderBy('first_name')->get(); $auditions = Audition::orderBy('score_order')->get(); $scores = $entry->scoreSheets()->get(); @@ -119,31 +131,45 @@ class EntryController extends Controller public function update(Request $request, Entry $entry) { - if (! Auth::user()->is_admin) { - abort(403); + if ($entry->audition->hasFlag('seats_published')) { + return to_route('admin.entries.index')->with('error', + 'Entries in auditions with seats published cannot be modified'); + } + + if ($entry->audition->hasFlag('advancement_published')) { + return to_route('admin.entries.index')->with('error', + 'Entries in auditions with advancement results published cannot be modified'); } $validData = request()->validate([ - 'student_id' => ['required', 'exists:students,id'], 'audition_id' => ['required', 'exists:auditions,id'], ]); $validData['for_seating'] = $request->get('for_seating') ? 1 : 0; $validData['for_advancement'] = $request->get('for_advancement') ? 1 : 0; + if (! auditionSetting('advanceTo')) { + $validData['for_seating'] = 1; + } + $entry->update([ - 'student_id' => $validData['student_id'], 'audition_id' => $validData['audition_id'], 'for_seating' => $validData['for_seating'], 'for_advancement' => $validData['for_advancement'], ]); - return redirect('/admin/entries'); + return to_route('admin.entries.index')->with('success', 'Entry updated successfully'); } public function destroy(Request $request, Entry $entry) { - if (! Auth::user()->is_admin) { - abort(403); + if ($entry->audition->hasFlag('seats_published')) { + return to_route('admin.entries.index')->with('error', + 'Entries in auditions with seats published cannot be deleted'); + } + + if ($entry->audition->hasFlag('advancement_published')) { + return to_route('admin.entries.index')->with('error', + 'Entries in auditions with advancement results published cannot be deleted'); } if (Seat::where('entry_id', $entry->id)->exists()) { return redirect()->route('admin.entries.index')->with('error', 'Cannot delete an entry that is seated'); diff --git a/app/Http/Controllers/Admin/EventController.php b/app/Http/Controllers/Admin/EventController.php index 42a28f2..972bfe7 100644 --- a/app/Http/Controllers/Admin/EventController.php +++ b/app/Http/Controllers/Admin/EventController.php @@ -37,8 +37,9 @@ class EventController extends Controller public function destroy(Request $request, Event $event) { - if (! Auth::user()->is_admin) { - abort(403); + if ($event->auditions()->count() > 0) { + return redirect()->route('admin.events.index')->with('error', + 'Cannot delete an event with auditions'); } $event->delete(); diff --git a/app/Http/Controllers/Admin/RoomController.php b/app/Http/Controllers/Admin/RoomController.php index 9de1eed..4f1cee1 100644 --- a/app/Http/Controllers/Admin/RoomController.php +++ b/app/Http/Controllers/Admin/RoomController.php @@ -24,9 +24,6 @@ class RoomController extends Controller public function judgingAssignment() // Show form for assigning judges { - if (! Auth::user()->is_admin) { - abort(403); - } $usersWithoutRooms = User::doesntHave('rooms')->orderBy('last_name')->orderBy('first_name')->get(); $usersWithRooms = User::has('rooms')->orderBy('last_name')->orderBy('first_name')->get(); $rooms = Room::with(['judges.school', 'auditions'])->get(); @@ -100,7 +97,7 @@ class RoomController extends Controller $room->description = $validData['description']; $room->save(); - return redirect()->route('admin.rooms.index')->with('success', 'Room updated.'); + return redirect()->route('admin.rooms.index')->with('success', 'Room updated successfully'); } public function destroy(Room $room) diff --git a/app/Http/Controllers/Admin/SchoolController.php b/app/Http/Controllers/Admin/SchoolController.php index af0ea3c..da73483 100644 --- a/app/Http/Controllers/Admin/SchoolController.php +++ b/app/Http/Controllers/Admin/SchoolController.php @@ -6,7 +6,6 @@ use App\Http\Controllers\Controller; use App\Models\School; use App\Models\SchoolEmailDomain; use App\Services\Invoice\InvoiceDataService; -use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use function abort; @@ -15,7 +14,7 @@ use function request; class SchoolController extends Controller { - protected $invoiceService; + protected InvoiceDataService $invoiceService; public function __construct(InvoiceDataService $invoiceController) { @@ -36,7 +35,7 @@ class SchoolController extends Controller return view('admin.schools.index', compact('schools', 'schoolTotalFees')); } - public function show(Request $request, School $school) + public function show(School $school) { if (! Auth::user()->is_admin) { abort(403); @@ -50,16 +49,13 @@ class SchoolController extends Controller if (! Auth::user()->is_admin) { abort(403); } + $school->loadCount('students'); return view('admin.schools.edit', ['school' => $school]); } public function update(School $school) { - if (! Auth::user()->is_admin) { - abort(403); - } - request()->validate([ 'name' => ['required'], 'address' => ['required'], @@ -76,7 +72,8 @@ class SchoolController extends Controller 'zip' => request('zip'), ]); - return redirect()->route('admin.schools.show', ['school' => $school->id])->with('success', 'School '.$school->name.' updated'); + return redirect()->route('admin.schools.show', ['school' => $school->id])->with('success', + 'School '.$school->name.' updated'); } public function create() @@ -88,7 +85,7 @@ class SchoolController extends Controller return view('admin.schools.create'); } - public function store(Request $request) + public function store() { request()->validate([ 'name' => ['required'], @@ -109,7 +106,18 @@ class SchoolController extends Controller return redirect('/admin/schools')->with('success', 'School '.$school->name.' created'); } - public function add_domain(Request $request, School $school) + public function destroy(School $school) + { + if ($school->students()->count() > 0) { + return to_route('admin.schools.index')->with('error', 'You cannot delete a school with students.'); + } + $name = $school->name; + $school->delete(); + + return to_route('admin.schools.index')->with('success', 'School '.$school->name.' deleted'); + } + + public function add_domain(School $school) { if (! Auth::user()->is_admin) { abort(403); @@ -120,13 +128,14 @@ class SchoolController extends Controller ]); SchoolEmailDomain::updateOrInsert([ 'school_id' => $school->id, - 'domain' => request('domain')], []); + 'domain' => request('domain'), + ]); - return redirect('/admin/schools/'.$school->id.'/edit')->with('success', 'Domain Added'); + return redirect()->route('admin.schools.show', $school)->with('success', 'Domain Added'); } - public function destroy_domain(Request $request, SchoolEmailDomain $domain) + public function destroy_domain(SchoolEmailDomain $domain) { // Destroy the $domain $domain->delete(); @@ -135,7 +144,7 @@ class SchoolController extends Controller return redirect()->back(); } - public function viewInvoice(Request $request, School $school) + public function viewInvoice(School $school) { $invoiceData = $this->invoiceService->allData($school->id); diff --git a/app/Http/Controllers/Admin/ScoringGuideController.php b/app/Http/Controllers/Admin/ScoringGuideController.php index e07b1f7..efbf8aa 100644 --- a/app/Http/Controllers/Admin/ScoringGuideController.php +++ b/app/Http/Controllers/Admin/ScoringGuideController.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use function abort; +use function auditionSetting; use function request; use function response; @@ -17,13 +18,10 @@ class ScoringGuideController extends Controller { public function index() { - 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(); + $guides = ScoringGuide::with(['auditions'])->withCount('subscores')->orderBy('name')->get(); return view('admin.scoring.index', ['guides' => $guides]); } @@ -42,15 +40,14 @@ class ScoringGuideController extends Controller 'name' => request('name'), ]); - return redirect('/admin/scoring'); + return redirect(route('admin.scoring.index'))->with('success', 'Scoring guide created'); } - public function edit(Request $request, ScoringGuide $guide) + public function edit(Request $request, ScoringGuide $guide, string $tab = 'detail') { 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 { @@ -93,9 +90,6 @@ class ScoringGuideController extends Controller public function subscore_store(Request $request, ScoringGuide $guide) { - if (! Auth::user()->is_admin) { - abort(403); - } if (! $guide->exists()) { abort(409); } @@ -109,6 +103,9 @@ class ScoringGuideController extends Controller $for_seating = $request->has('for_seating') ? (bool) $request->input('for_seating') : false; $for_advance = $request->has('for_advance') ? (bool) $request->input('for_advance') : false; + if (! auditionSetting('advanceTo')) { + $for_seating = true; + } $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; @@ -124,7 +121,7 @@ class ScoringGuideController extends Controller 'for_advance' => $for_advance, ]); - return redirect('/admin/scoring/guides/'.$guide->id.'/edit')->with('success', 'Subscore added'); + return redirect(route('admin.scoring.edit', $guide))->with('success', 'Subscore added'); } public function subscore_update(ScoringGuide $guide, SubscoreDefinition $subscore) @@ -149,6 +146,10 @@ class ScoringGuideController extends Controller $for_seating = request()->has('for_seating') ? (bool) request()->input('for_seating') : false; $for_advance = request()->has('for_advance') ? (bool) request()->input('for_advance') : false; + if (! auditionSetting('advanceTo')) { + $for_seating = true; + } + $subscore->update([ 'name' => $validateData['name'], 'max_score' => $validateData['max_score'], @@ -178,7 +179,6 @@ class ScoringGuideController extends Controller } - public function reorder_display(Request $request) { if (! Auth::user()->is_admin) { @@ -187,7 +187,7 @@ class ScoringGuideController extends Controller $order = $request->order; foreach ($order as $index => $id) { $subscore = SubscoreDefinition::find($id); - $subscore->update(['display_order' => $index]); + $subscore->update(['display_order' => $index + 1]); } return response()->json(['status' => 'success']); @@ -202,7 +202,7 @@ class ScoringGuideController extends Controller $order = $request->order; foreach ($order as $index => $id) { $subscore = SubscoreDefinition::find($id); - $subscore->update(['tiebreak_order' => $index]); + $subscore->update(['tiebreak_order' => $index + 1]); } return response()->json(['status' => 'success']); diff --git a/app/Http/Controllers/Admin/StudentController.php b/app/Http/Controllers/Admin/StudentController.php index 6c775c9..24d29a5 100644 --- a/app/Http/Controllers/Admin/StudentController.php +++ b/app/Http/Controllers/Admin/StudentController.php @@ -9,7 +9,9 @@ use App\Models\Student; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Log; use function abort; +use function to_route; use function view; class StudentController extends Controller @@ -19,7 +21,7 @@ class StudentController extends Controller if (! Auth::user()->is_admin) { abort(403); } - $students = Student::with(['school', 'entries'])->orderBy('last_name')->orderBy('first_name')->paginate(15); + $students = Student::with(['school'])->withCount('entries')->orderBy('last_name')->orderBy('first_name')->paginate(15); return view('admin.students.index', ['students' => $students]); } @@ -66,8 +68,9 @@ class StudentController extends Controller $minGrade = Audition::min('minimum_grade'); $maxGrade = Audition::max('maximum_grade'); $schools = School::orderBy('name')->get(); - - return view('admin.students.edit', ['student' => $student, 'schools' => $schools, 'minGrade' => $minGrade, 'maxGrade' => $maxGrade]); + $student->loadCount('entries'); + return view('admin.students.edit', + ['student' => $student, 'schools' => $schools, 'minGrade' => $minGrade, 'maxGrade' => $maxGrade]); } public function update(Request $request, Student $student) @@ -84,7 +87,8 @@ class StudentController extends Controller foreach ($student->entries as $entry) { if ($entry->audition->minimum_grade > request('grade') || $entry->audition->maximum_grade < request('grade')) { - return redirect('/admin/students/'.$student->id.'/edit')->with('error', 'This student is entered in an audition that is not available to their new grade.'); + return redirect('/admin/students/'.$student->id.'/edit')->with('error', + 'This student is entered in an audition that is not available to their new grade.'); } } @@ -98,4 +102,16 @@ class StudentController extends Controller return redirect('/admin/students'); } + + public function destroy(Student $student) + { + Log::debug('Deleting student '.$student->id); + if($student->entries()->count() > 0) { + return to_route('admin.students.index')->with('error', 'You cannot delete a student with entries.'); + } + $name = $student->full_name(); + $student->delete(); + + return to_route('admin.students.index')->with('success', 'Student '.$name.' deleted successfully.'); + } } diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index ab5a1a6..1da19b7 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -2,8 +2,6 @@ namespace App\Http\Controllers\Admin; -use App\Events\AuditionChange; -use App\Events\RoomJudgeChange; use App\Http\Controllers\Controller; use App\Mail\NewUserPassword; use App\Models\School; @@ -18,28 +16,39 @@ class UserController extends Controller { public function index() { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $users = User::with('school')->orderBy('last_name')->orderBy('first_name')->get(); + return view('admin.users.index', ['users' => $users]); } public function edit(User $user) { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $schools = School::orderBy('name')->get(); - return view('admin.users.edit', ['user' => $user,'schools' => $schools]); + + return view('admin.users.edit', ['user' => $user, 'schools' => $schools]); } public function create() { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $schools = School::orderBy('name')->get(); + return view('admin.users.create', ['schools' => $schools]); } public function update(Request $request, User $user) { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } request()->validate([ 'first_name' => ['required'], @@ -47,7 +56,7 @@ class UserController extends Controller 'email' => ['required', 'email'], 'cell_phone' => ['required'], 'judging_preference' => ['required'], - 'school_id' => ['required','exists:schools,id'], + 'school_id' => ['required', 'exists:schools,id'], ]); $user->update([ @@ -56,8 +65,9 @@ class UserController extends Controller 'email' => request('email'), 'cell_phone' => request('cell_phone'), 'judging_preference' => request('judging_preference'), - 'school_id' => request('school_id') + 'school_id' => request('school_id'), ]); + return redirect('/admin/users'); } @@ -66,10 +76,10 @@ class UserController extends Controller $request->validate([ 'first_name' => ['required'], 'last_name' => ['required'], - 'email' => ['required', 'email','unique:users'], + 'email' => ['required', 'email', 'unique:users'], ]); - // Genearte a random password + // Generate a random password $randomPassword = Str::random(12); $user = \App\Models\User::make([ @@ -81,9 +91,9 @@ class UserController extends Controller 'password' => Hash::make($randomPassword), ]); - if (!is_null(request('school_id'))) { + if (! is_null(request('school_id'))) { $request->validate([ - 'school_id' => ['exists:schools,id'] + 'school_id' => ['exists:schools,id'], ]); } $user->school_id = request('school_id'); @@ -93,4 +103,13 @@ class UserController extends Controller return redirect('/admin/users'); } + + public function destroy(Request $request, User $user) + { + if (! Auth::user()->is_admin) { + abort(403); + } + $user->delete(); + return redirect()->route('admin.users.index')->with('success', 'User deleted successfully'); + } } diff --git a/app/Http/Controllers/EntryController.php b/app/Http/Controllers/EntryController.php index 6c16d8f..9396f2e 100644 --- a/app/Http/Controllers/EntryController.php +++ b/app/Http/Controllers/EntryController.php @@ -56,7 +56,7 @@ class EntryController extends Controller } $entry->delete(); - return redirect('/entries')->with('success', 'The '.$entry->audition->name.'entry for '.$entry->student->full_name().'has been deleted.'); + return redirect()->route('entries.index')->with('success', 'The '.$entry->audition->name.'entry for '.$entry->student->full_name().'has been deleted.'); } } diff --git a/app/Http/Controllers/FilterController.php b/app/Http/Controllers/FilterController.php index 00e2012..2cc06bd 100644 --- a/app/Http/Controllers/FilterController.php +++ b/app/Http/Controllers/FilterController.php @@ -16,14 +16,13 @@ class FilterController extends Controller $filters['first_name'] = request('first_name_filter') ? request('first_name_filter') : null; $filters['last_name'] = request('last_name_filter') ? request('last_name_filter') : null; -// session(['admin_entry_filter', $filters]); session(['adminEntryFilters' => $filters]); - return redirect('/admin/entries'); + return redirect('/admin/entries')->with('success', 'Filters Applied'); } public function clearAdminEntryFilter(Request $request) { session()->forget('adminEntryFilters'); - return redirect('/admin/entries'); + return redirect('/admin/entries')->with('success', 'Filters Cleared'); } } diff --git a/app/Http/Controllers/StudentController.php b/app/Http/Controllers/StudentController.php index be1b021..10a616a 100644 --- a/app/Http/Controllers/StudentController.php +++ b/app/Http/Controllers/StudentController.php @@ -5,10 +5,10 @@ namespace App\Http\Controllers; use App\Models\Audition; use App\Models\School; use App\Models\Student; -use App\Models\User; use App\Rules\UniqueFullNameAtSchool; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; + use function abort; use function redirect; @@ -20,9 +20,13 @@ class StudentController extends Controller */ public function index() { - $students = Auth::user()->students()->with('entries')->get(); + if (! Auth::user()->school_id) { + return redirect()->route('dashboard'); + } + $students = Auth::user()->students()->withCount('entries')->get(); $auditions = Audition::all(); - return view('students.index',['students' => $students, 'auditions' => $auditions]); + + return view('students.index', ['students' => $students, 'auditions' => $auditions]); } /** @@ -38,21 +42,26 @@ class StudentController extends Controller */ public function store(Request $request) { - if ($request->user()->cannot('create', Student::class)) abort(403); + if ($request->user()->cannot('create', Student::class)) { + abort(403); + } $request->validate([ 'first_name' => ['required'], - 'last_name' => ['required', new UniqueFullNameAtSchool(request('first_name'),request('last_name'), Auth::user()->school_id)], - 'grade' => ['required', 'integer'], + 'last_name' => [ + 'required', + new UniqueFullNameAtSchool(request('first_name'), request('last_name'), Auth::user()->school_id), + ], + 'grade' => ['required', 'integer'], ]); $student = Student::create([ 'first_name' => request('first_name'), 'last_name' => request('last_name'), 'grade' => request('grade'), - 'school_id' => Auth::user()->school_id + 'school_id' => Auth::user()->school_id, ]); - $request->session()->put('auditionMessages',['success','I did it again ma']); + $request->session()->put('auditionMessages', ['success', 'I did it again ma']); return redirect('/students'); } @@ -70,7 +79,10 @@ class StudentController extends Controller */ public function edit(Request $request, Student $student) { - if ($request->user()->cannot('update', $student)) abort(403); + if ($request->user()->cannot('update', $student)) { + abort(403); + } + return view('students.edit', ['student' => $student]); } @@ -79,23 +91,24 @@ class StudentController extends Controller */ public function update(Request $request, Student $student) { - if ($request->user()->cannot('update', $student)) abort(403); + if ($request->user()->cannot('update', $student)) { + abort(403); + } request()->validate([ 'first_name' => ['required'], - 'last_name' => ['required'], - 'grade' => ['required', 'integer'], + 'last_name' => ['required'], + 'grade' => ['required', 'integer'], ]); $student->update([ 'first_name' => request('first_name'), 'last_name' => request('last_name'), - 'grade' => request('grade') + 'grade' => request('grade'), ]); // TODO if a students grade is changed, we need to be sure they are still eligible for the auditions in which they are entered. - - return redirect('/students'); + return redirect('/students')->with('success', 'Student updated successfully.'); } /** @@ -103,8 +116,11 @@ class StudentController extends Controller */ public function destroy(Request $request, Student $student) { - if ($request->user()->cannot('delete', $student)) abort(403); + if ($request->user()->cannot('delete', $student)) { + abort(403); + } $student->delete(); - return redirect('/students'); + + return redirect(route('students.index')); } } diff --git a/app/Http/Middleware/CheckIfAdmin.php b/app/Http/Middleware/CheckIfAdmin.php index 36baeb2..71c0ceb 100644 --- a/app/Http/Middleware/CheckIfAdmin.php +++ b/app/Http/Middleware/CheckIfAdmin.php @@ -20,7 +20,7 @@ class CheckIfAdmin return $next($request); } - return redirect('/')->with('error', 'You do not have admin access.'); + return redirect(route('dashboard'))->with('error', 'You are not authorized to perform this action'); } } diff --git a/app/Http/Middleware/CheckIfHasSchool.php b/app/Http/Middleware/CheckIfHasSchool.php new file mode 100644 index 0000000..c77dc33 --- /dev/null +++ b/app/Http/Middleware/CheckIfHasSchool.php @@ -0,0 +1,28 @@ +school_id) { + return $next($request); + } + + return redirect(route('dashboard'))->with('error', 'You do not have a school to view students for.'); + + } +} diff --git a/app/Models/Audition.php b/app/Models/Audition.php index 66be60c..175c053 100644 --- a/app/Models/Audition.php +++ b/app/Models/Audition.php @@ -10,8 +10,6 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; -use function now; - class Audition extends Model { use HasFactory; @@ -26,7 +24,6 @@ class Audition extends Model protected $scored_entries_count; //Set by TabulationService - public function event(): BelongsTo { return $this->belongsTo(Event::class); @@ -175,12 +172,14 @@ class Audition extends Model } $this->flags()->create(['flag_name' => $flag]); + $this->load('flags'); } public function removeFlag($flag): void { // remove related auditionFlag where flag_name = $flag $this->flags()->where('flag_name', $flag)->delete(); + $this->load('flags'); } public function scopeOpen(Builder $query): void diff --git a/app/Models/Ensemble.php b/app/Models/Ensemble.php index 0024aa4..a616b05 100644 --- a/app/Models/Ensemble.php +++ b/app/Models/Ensemble.php @@ -2,6 +2,7 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -40,4 +41,16 @@ class Ensemble extends Model { return $this->hasMany(Seat::class); } + + public function scopeForAudition(Builder $query, $audition_id): Builder + { + $audition = Audition::find($audition_id); + // get instances of this class where the event_id is equal to the event_id of the audition with $audition_id + return $query->where('event_id', $audition->event_id); + } + + public function scopeForEvent(Builder $query, $event_id): Builder + { + return $query->where('event_id', $event_id); + } } diff --git a/app/Models/Entry.php b/app/Models/Entry.php index d48f760..9b08f7e 100644 --- a/app/Models/Entry.php +++ b/app/Models/Entry.php @@ -75,14 +75,15 @@ class Entry extends Model if ($this->hasFlag($flag)) { return; } - $this->flags()->create(['flag_name' => $flag]); + $this->load('flags'); } public function removeFlag($flag): void { // remove related auditionFlag where flag_name = $flag $this->flags()->where('flag_name', $flag)->delete(); + $this->load('flags'); } /** diff --git a/app/Models/Room.php b/app/Models/Room.php index add191f..d92b944 100644 --- a/app/Models/Room.php +++ b/app/Models/Room.php @@ -45,12 +45,14 @@ class Room extends Model public function addJudge($userId): void { $this->judges()->attach($userId); + $this->load('judges'); AuditionChange::dispatch(); } public function removeJudge($userId): void { $this->judges()->detach($userId); + $this->load('judges'); AuditionChange::dispatch(); } } diff --git a/app/Models/RoomUser.php b/app/Models/RoomUser.php index d493039..ff5e8c3 100644 --- a/app/Models/RoomUser.php +++ b/app/Models/RoomUser.php @@ -9,6 +9,9 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; class RoomUser extends Model { protected $table = 'room_user'; + + protected $guarded = []; + public function user(): BelongsTo { return $this->belongsTo(User::class); @@ -16,7 +19,7 @@ class RoomUser extends Model public function judge(): BelongsTo { - return $this->belongsTo(User::class); + return $this->belongsTo(User::class, 'user_id'); } public function room(): BelongsTo diff --git a/app/Models/ScoreSheet.php b/app/Models/ScoreSheet.php index cf93064..7b7c337 100644 --- a/app/Models/ScoreSheet.php +++ b/app/Models/ScoreSheet.php @@ -38,11 +38,6 @@ class ScoreSheet extends Model ); } - public function getSubscore($id) - { - return $this->subscores[$id]['score'] ?? false; - } - public function isValid() { // TODO move to either TabulationService or a specific service for scoreValidation diff --git a/app/Models/Student.php b/app/Models/Student.php index f93465b..f4c9667 100644 --- a/app/Models/Student.php +++ b/app/Models/Student.php @@ -21,7 +21,19 @@ class Student extends Model public function users(): HasManyThrough { - return $this->hasManyThrough(User::class, School::class); + return $this->hasManyThrough( + User::class, // The target model we want to access + School::class, // The intermediate model through which we access the target model + 'id', // The foreign key on the intermediate model + 'school_id', // The foreign key on the target model + 'school_id', // The local key + 'id' // The local key on the intermediate model + ); + } + + public function directors(): HasManyThrough + { + return $this->users(); } public function entries(): HasMany @@ -32,8 +44,9 @@ class Student extends Model public function full_name(bool $last_name_first = false): string { if ($last_name_first) { - return ($this->last_name.', '.$this->first_name); + return $this->last_name.', '.$this->first_name; } + return $this->first_name.' '.$this->last_name; } } diff --git a/app/Models/User.php b/app/Models/User.php index eb96143..361da51 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Collection; class User extends Authenticatable implements MustVerifyEmail { @@ -131,7 +132,7 @@ class User extends Authenticatable implements MustVerifyEmail * * @return SchoolEmailDomain[] */ - public function possibleSchools() + public function possibleSchools(): Collection { if ($this->school_id) { $return[] = $this->school; @@ -148,7 +149,11 @@ class User extends Authenticatable implements MustVerifyEmail return true; } - return $this->is_tab; + if ($this->is_tab) { + return true; + } + + return false; } public function scoreSheets(): HasMany diff --git a/app/Observers/EntryObserver.php b/app/Observers/EntryObserver.php index 67a51cf..c18ec21 100644 --- a/app/Observers/EntryObserver.php +++ b/app/Observers/EntryObserver.php @@ -13,8 +13,7 @@ class EntryObserver */ public function created(Entry $entry): void { - AuditionChange::dispatch(); - EntryChange::dispatch($entry->audition_id); + } /** @@ -22,8 +21,7 @@ class EntryObserver */ public function updated(Entry $entry): void { - AuditionChange::dispatch(); - EntryChange::dispatch($entry->audition_id); + } /** @@ -31,8 +29,7 @@ class EntryObserver */ public function deleted(Entry $entry): void { - AuditionChange::dispatch(); - EntryChange::dispatch($entry->audition_id); + } /** @@ -40,8 +37,7 @@ class EntryObserver */ public function restored(Entry $entry): void { - AuditionChange::dispatch(); - EntryChange::dispatch($entry->audition_id); + } /** @@ -49,6 +45,6 @@ class EntryObserver */ public function forceDeleted(Entry $entry): void { - EntryChange::dispatch($entry->audition_id); + } } diff --git a/app/Observers/StudentObserver.php b/app/Observers/StudentObserver.php index d9af204..8cec44c 100644 --- a/app/Observers/StudentObserver.php +++ b/app/Observers/StudentObserver.php @@ -21,8 +21,7 @@ class StudentObserver */ public function updated(Student $student): void { - AuditionChange::dispatch(); - EntryChange::dispatch(); + // } /** @@ -30,7 +29,7 @@ class StudentObserver */ public function deleted(Student $student): void { - AuditionChange::dispatch(); + // } /** diff --git a/app/Policies/EntryPolicy.php b/app/Policies/EntryPolicy.php index e080f66..f508bff 100644 --- a/app/Policies/EntryPolicy.php +++ b/app/Policies/EntryPolicy.php @@ -4,7 +4,7 @@ namespace App\Policies; use App\Models\Entry; use App\Models\User; -use Illuminate\Auth\Access\Response; + use function is_null; class EntryPolicy @@ -14,7 +14,7 @@ class EntryPolicy */ public function viewAny(User $user): bool { - // + return true; } /** @@ -22,8 +22,11 @@ class EntryPolicy */ public function view(User $user, Entry $entry): bool { - if($user->is_admin) return true; - return $user->school_id == $entry->student()->school_id; + if ($user->is_admin) { + return true; + } + + return $user->school_id == $entry->student->school_id; } /** @@ -31,7 +34,10 @@ class EntryPolicy */ public function create(User $user): bool { - if($user->is_admin) return true; + if ($user->is_admin) { + return true; + } + return ! is_null($user->school_id); } @@ -40,8 +46,11 @@ class EntryPolicy */ public function update(User $user, Entry $entry): bool { - if($user->is_admin) return true; - return $user->school_id == $entry->student()->school_id; + if ($user->is_admin) { + return true; + } + + return $user->school_id == $entry->student->school_id; } /** @@ -49,13 +58,15 @@ class EntryPolicy */ public function delete(User $user, Entry $entry): bool { - if($user->is_admin) return true; + if ($user->is_admin) { + return true; + } // Return false if $entry->audition->entry_deadline is in the past, continue if not if ($entry->audition->entry_deadline < now()) { return false; } - return $user->school_id == $entry->student()->school_id; + return $user->school_id == $entry->student->school_id; } /** @@ -63,7 +74,7 @@ class EntryPolicy */ public function restore(User $user, Entry $entry): bool { - // + return true; } /** @@ -71,6 +82,6 @@ class EntryPolicy */ public function forceDelete(User $user, Entry $entry): bool { - // + return true; } } diff --git a/app/Policies/StudentPolicy.php b/app/Policies/StudentPolicy.php index ae8e619..5ac1cf4 100644 --- a/app/Policies/StudentPolicy.php +++ b/app/Policies/StudentPolicy.php @@ -5,7 +5,7 @@ namespace App\Policies; use App\Models\Entry; use App\Models\Student; use App\Models\User; -use Illuminate\Auth\Access\Response; + use function is_null; class StudentPolicy @@ -31,7 +31,10 @@ class StudentPolicy */ public function create(User $user): bool { - if($user->is_admin) return true; + if ($user->is_admin) { + return true; + } + return ! is_null($user->school_id); } @@ -41,7 +44,10 @@ class StudentPolicy public function update(User $user, Student $student): bool { - if($user->is_admin) return true; + if ($user->is_admin) { + return true; + } + return $user->school_id == $student->school_id; } @@ -50,7 +56,10 @@ class StudentPolicy */ public function delete(User $user, Student $student): bool { - if (Entry::where('student_id','=',$student->id)->exists()) return false; // Don't allow deletion of a student with entries + if (Entry::where('student_id', '=', $student->id)->exists()) { + return false; + } // Don't allow deletion of a student with entries + return $user->school_id == $student->school_id; } diff --git a/app/Rules/UniqueFullNameAtSchool.php b/app/Rules/UniqueFullNameAtSchool.php index f67a8aa..29e78ad 100644 --- a/app/Rules/UniqueFullNameAtSchool.php +++ b/app/Rules/UniqueFullNameAtSchool.php @@ -19,7 +19,7 @@ class UniqueFullNameAtSchool implements ValidationRule $this->school_id = $schoolID; } - public function passes($attributies, $value) + public function studentExists() { return Student::where('first_name', $this->first_name) ->where('last_name', $this->last_name) @@ -38,6 +38,8 @@ class UniqueFullNameAtSchool implements ValidationRule */ public function validate(string $attribute, mixed $value, Closure $fail): void { - // + if($this->studentExists()) { + $fail($this->message()); + } } } diff --git a/app/Services/AuditionService.php b/app/Services/AuditionService.php index c45e064..6e2d9a9 100644 --- a/app/Services/AuditionService.php +++ b/app/Services/AuditionService.php @@ -69,9 +69,6 @@ class AuditionService public function clearCache(): void { - if (App::environment('local')) { - Session::flash('success', 'Audition Cache Cleared'); - } Cache::forget($this->cacheKey); } diff --git a/composer.json b/composer.json index ec0e281..853e072 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "codedge/laravel-fpdf": "^1.12", "laravel/fortify": "^1.21", "laravel/framework": "^11.0", + "laravel/pail": "^1.1", "laravel/tinker": "^2.9", "predis/predis": "^2.2", "symfony/http-client": "^7.1", @@ -16,6 +17,7 @@ }, "require-dev": { "barryvdh/laravel-debugbar": "^3.13", + "brianium/paratest": "^7.4", "fakerphp/faker": "^1.23", "laravel/pint": "^1.13", "laravel/sail": "^1.26", @@ -23,6 +25,7 @@ "nunomaduro/collision": "^8.0", "pestphp/pest": "^2.34", "pestphp/pest-plugin-laravel": "^2.4", + "sinnbeck/laravel-dom-assertions": "^1.5", "spatie/laravel-ignition": "^2.4" }, "autoload": { diff --git a/composer.lock b/composer.lock index 89e03a3..1a7527c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8a539bb700e8acfbb39c896521c16609", + "content-hash": "7aab57ef52f0152526434decd76ef1e1", "packages": [ { "name": "bacon/bacon-qr-code", @@ -1491,6 +1491,84 @@ }, "time": "2024-05-21T17:57:45+00:00" }, + { + "name": "laravel/pail", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "c22fe771277971eb9cd224955996bcf39c1a710d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/c22fe771277971eb9cd224955996bcf39c1a710d", + "reference": "c22fe771277971eb9cd224955996bcf39c1a710d", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-pcntl": "*", + "illuminate/console": "^10.24|^11.0", + "illuminate/contracts": "^10.24|^11.0", + "illuminate/log": "^10.24|^11.0", + "illuminate/process": "^10.24|^11.0", + "illuminate/support": "^10.24|^11.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "laravel/pint": "^1.13", + "orchestra/testbench": "^8.12|^9.0", + "pestphp/pest": "^2.20", + "pestphp/pest-plugin-type-coverage": "^2.3", + "phpstan/phpstan": "^1.10", + "symfony/var-dumper": "^6.3|^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2024-05-08T18:19:39+00:00" + }, { "name": "laravel/prompts", "version": "v0.1.22", @@ -9301,6 +9379,76 @@ ], "time": "2023-02-07T11:34:05+00:00" }, + { + "name": "sinnbeck/laravel-dom-assertions", + "version": "v1.5.3", + "source": { + "type": "git", + "url": "https://github.com/sinnbeck/laravel-dom-assertions.git", + "reference": "a2ce7540023fac4e6e010cbe5396b7aad9d22765" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sinnbeck/laravel-dom-assertions/zipball/a2ce7540023fac4e6e010cbe5396b7aad9d22765", + "reference": "a2ce7540023fac4e6e010cbe5396b7aad9d22765", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "illuminate/testing": "^9.0|^10.0|^11.0", + "php": "^8.0", + "symfony/css-selector": "^6.0|^7.0" + }, + "require-dev": { + "laravel/pint": "^1.2", + "nunomaduro/larastan": "^2.2", + "orchestra/testbench": "^7.0|^8.0|^9.0", + "pestphp/pest": "^1.0|^2.34", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.1", + "vimeo/psalm": "^4.29|^5.22" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Sinnbeck\\DomAssertions\\DomAssertionsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Sinnbeck\\DomAssertions\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "René Sinnbeck", + "email": "rene.sinnbeck@gmail.com", + "homepage": "https://sinnbeck.dev", + "role": "Developer" + } + ], + "homepage": "https://github.com/sinnbeck/laravel-dom-assertions", + "keywords": [ + "assertions", + "blade", + "dom", + "laravel", + "view" + ], + "support": { + "issues": "https://github.com/sinnbeck/laravel-dom-assertions/issues", + "source": "https://github.com/sinnbeck/laravel-dom-assertions/tree/v1.5.3" + }, + "time": "2024-06-17T12:30:14+00:00" + }, { "name": "spatie/backtrace", "version": "1.6.1", diff --git a/database/factories/AuditionFactory.php b/database/factories/AuditionFactory.php index 4cefeff..a7c909e 100644 --- a/database/factories/AuditionFactory.php +++ b/database/factories/AuditionFactory.php @@ -41,14 +41,18 @@ class AuditionFactory extends Factory return [ 'event_id' => $event->id, - 'name' => $this->faker->randomElement($instruments).$this->faker->randomNumber(1), - 'score_order' => 1, + #'name' => $this->faker->randomElement($instruments).$this->faker->numberBetween(1, 1000), + 'name' => 'New Instrument ' . $this->faker->unique()->words(4,true), + 'score_order' => $this->faker->numberBetween(2, 50), 'entry_deadline' => Carbon::tomorrow(), 'entry_fee' => 1000, - 'minimum_grade' => 7, - 'maximum_grade' => 12, + 'minimum_grade' => $this->faker->numberBetween(7, 9), + 'maximum_grade' => $this->faker->numberBetween(8, 12), 'for_seating' => 1, 'for_advancement' => 1, + 'room_id' => null, + 'order_in_room' => 0, + 'scoring_guide_id' => null, ]; } @@ -58,4 +62,17 @@ class AuditionFactory extends Factory fn (array $attributes) => ['entry_deadline' => $entryDeadline ?? Carbon::yesterday()] ); } + public function seatingOnly(): self + { + return $this->state( + fn (array $attributes) => ['for_advancement' => 0] + ); + } + + public function advancementOnly(): self + { + return $this->state( + fn (array $attributes) => ['for_seating' => 0] + ); + } } diff --git a/database/factories/EnsembleFactory.php b/database/factories/EnsembleFactory.php new file mode 100644 index 0000000..a0b950c --- /dev/null +++ b/database/factories/EnsembleFactory.php @@ -0,0 +1,26 @@ + + */ +class EnsembleFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => $this->faker->name, + 'event_id' => \App\Models\Event::factory(), + 'code' => $this->faker->randomLetter().$this->faker->randomLetter, + 'rank' => $this->faker->numberBetween(1, 10), + ]; + } +} diff --git a/database/factories/EntryFactory.php b/database/factories/EntryFactory.php index 5ee40fa..80cec5c 100644 --- a/database/factories/EntryFactory.php +++ b/database/factories/EntryFactory.php @@ -26,6 +26,7 @@ class EntryFactory extends Factory 'draw_number' => null, 'for_seating' => 1, 'for_advancement' => 1, + ]; } diff --git a/database/factories/EventFactory.php b/database/factories/EventFactory.php index ae4a7c9..e481e64 100644 --- a/database/factories/EventFactory.php +++ b/database/factories/EventFactory.php @@ -17,7 +17,7 @@ class EventFactory extends Factory public function definition(): array { return [ - 'name' => $this->faker->name(), + 'name' => $this->faker->unique()->name(), ]; } } diff --git a/database/factories/RoomFactory.php b/database/factories/RoomFactory.php index de64aad..f20bf5a 100644 --- a/database/factories/RoomFactory.php +++ b/database/factories/RoomFactory.php @@ -17,8 +17,8 @@ class RoomFactory extends Factory public function definition(): array { return [ - 'name' => 'Room ' . fake()->numberBetween(7,500), - 'description' => fake()->sentence() + 'name' => 'Room '.fake()->unique()->numberBetween(7, 500), + 'description' => fake()->sentence(), ]; } } diff --git a/database/factories/SchoolEmailDomainFactory.php b/database/factories/SchoolEmailDomainFactory.php new file mode 100644 index 0000000..5773348 --- /dev/null +++ b/database/factories/SchoolEmailDomainFactory.php @@ -0,0 +1,26 @@ + + */ +class SchoolEmailDomainFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + $school = School::factory()->create(); + return [ + 'school_id' => $school->id, + 'domain' => $this->faker->unique()->domainName, + ]; + } +} diff --git a/database/factories/ScoringGuideFactory.php b/database/factories/ScoringGuideFactory.php index 11339b3..9efa3d0 100644 --- a/database/factories/ScoringGuideFactory.php +++ b/database/factories/ScoringGuideFactory.php @@ -17,7 +17,7 @@ class ScoringGuideFactory extends Factory public function definition(): array { return [ - // + 'name' => $this->faker->sentence(3), ]; } } diff --git a/database/factories/SubscoreDefinitionFactory.php b/database/factories/SubscoreDefinitionFactory.php index 2ce384e..b84d521 100644 --- a/database/factories/SubscoreDefinitionFactory.php +++ b/database/factories/SubscoreDefinitionFactory.php @@ -2,6 +2,7 @@ namespace Database\Factories; +use App\Models\ScoringGuide; use Illuminate\Database\Eloquent\Factories\Factory; /** @@ -16,8 +17,45 @@ class SubscoreDefinitionFactory extends Factory */ public function definition(): array { + $sg = ScoringGuide::factory()->create(); + return [ - // + 'scoring_guide_id' => $sg->id, + 'name' => $this->faker->word, + 'max_score' => 100, + 'weight' => $this->faker->numberBetween(1, 4), + 'display_order' => $this->faker->numberBetween(1, 20), + 'tiebreak_order' => $this->faker->numberBetween(1, 20), + 'for_seating' => 1, + 'for_advance' => 1, ]; } + public function seatingOnly(): self + { + return $this->state( + fn (array $attributes) => ['for_advance' => 0] + ); + } + + public function advanceOnly(): self + { + return $this->state( + fn (array $attributes) => ['for_seating' => 0] + ); + } + + public function displayFirst(): self + { + return $this->state( + fn (array $attributes) => ['display_order' => 0] + ); + } + + public function tiebreakFirst(): self + { + return $this->state( + fn (array $attributes) => ['tiebreak_order' => 0] + ); + } + } diff --git a/database/migrations/2024_06_04_205015_ensure_room_id_0_for_unassigned_entries.php b/database/migrations/2024_06_04_205015_ensure_room_id_0_for_unassigned_entries.php index 1c28c98..c2e0ac5 100644 --- a/database/migrations/2024_06_04_205015_ensure_room_id_0_for_unassigned_entries.php +++ b/database/migrations/2024_06_04_205015_ensure_room_id_0_for_unassigned_entries.php @@ -1,10 +1,7 @@ 0, - 'name' => 'No Guide Assigned' + 'name' => 'No Guide Assigned', ]); $room->update([ - 'id' => 0 + 'id' => 0, ]); } } diff --git a/database/migrations/2024_06_05_011858_add_scoring_guide_id_column_to_auditions_table.php b/database/migrations/2024_06_05_011858_add_scoring_guide_id_column_to_auditions_table.php index c1f7640..c66e6ee 100644 --- a/database/migrations/2024_06_05_011858_add_scoring_guide_id_column_to_auditions_table.php +++ b/database/migrations/2024_06_05_011858_add_scoring_guide_id_column_to_auditions_table.php @@ -1,6 +1,5 @@ 0, - 'name' => 'No Guide Assigned' + 'name' => 'No Guide Assigned', ]); $sg->update([ - 'id' => 0 + 'id' => 0, ]); } } diff --git a/database/seeders/SampleSettingsSeeder.php b/database/seeders/SampleSettingsSeeder.php new file mode 100644 index 0000000..26090a6 --- /dev/null +++ b/database/seeders/SampleSettingsSeeder.php @@ -0,0 +1,77 @@ + 'auditionName', + 'setting_value' => 'Somewhere Band Directors Association', + ]); + SiteSetting::create([ + 'setting_key' => 'auditionAbbreviation', + 'setting_value' => 'SBDA', + ]); + SiteSetting::create([ + 'setting_key' => 'registrationCode', + 'setting_value' => 'secret', + ]); + SiteSetting::create([ + 'setting_key' => 'advanceTo', + 'setting_value' => 'OMEA', + ]); + SiteSetting::create([ + 'setting_key' => 'judging_enabled', + 'setting_value' => '1', + ]); + SiteSetting::create([ + 'setting_key' => 'organizerName', + 'setting_value' => 'John Doe', + ]); + SiteSetting::create([ + 'setting_key' => 'organizerEmail', + 'setting_value' => 'jdoe@sbda.null', + ]); + SiteSetting::create([ + 'setting_key' => 'olympic_scoring', + 'setting_value' => '0', + ]); + SiteSetting::create([ + 'setting_key' => 'fee_structure', + 'setting_value' => 'oneFeePerEntry', + ]); + SiteSetting::create([ + 'setting_key' => 'late_fee', + 'setting_value' => '1000', + ]); + SiteSetting::create([ + 'setting_key' => 'school_fee', + 'setting_value' => '2500', + ]); + SiteSetting::create([ + 'setting_key' => 'payment_address', + 'setting_value' => '143 Sousa Lane', + ]); + SiteSetting::create([ + 'setting_key' => 'payment_city', + 'setting_value' => 'Maud', + ]); + SiteSetting::create([ + 'setting_key' => 'payment_state', + 'setting_value' => 'OK', + ]); + SiteSetting::create([ + 'setting_key' => 'payment_zip', + 'setting_value' => '77777', + ]); + } +} diff --git a/resources/views/admin/audition-settings.blade.php b/resources/views/admin/audition-settings.blade.php index c32ad8a..17cbcf9 100644 --- a/resources/views/admin/audition-settings.blade.php +++ b/resources/views/admin/audition-settings.blade.php @@ -1,7 +1,7 @@ Audition Settings - + Group Information @@ -60,6 +60,15 @@ + + Payment Address + + + + + + +
diff --git a/resources/views/admin/auditions/edit.blade.php b/resources/views/admin/auditions/edit.blade.php index 0f362ea..dc2be46 100644 --- a/resources/views/admin/auditions/edit.blade.php +++ b/resources/views/admin/auditions/edit.blade.php @@ -3,6 +3,13 @@ Edit Audition + + @if($audition->entries->count() == 0) + + Please confirm that you would like to delete the audition {{ $audition->name }}. This action cannot be undone. + + @endif + {{-- TODO implement a way to update multiple auditions as once --}} @@ -39,18 +46,13 @@ -
- @if($audition->entries->count() == 0) - - @endif -
+
Edit Audition
-
diff --git a/resources/views/admin/auditions/index.blade.php b/resources/views/admin/auditions/index.blade.php index 527d197..d2f8a18 100644 --- a/resources/views/admin/auditions/index.blade.php +++ b/resources/views/admin/auditions/index.blade.php @@ -1,11 +1,11 @@ Audition Administration - + Auditions Drag to reorder. Double click to edit. - New Audition + New Audition @@ -27,7 +27,7 @@
@foreach($auditions as $audition) - {{ $audition->event->name }} {{ $audition->name }} @@ -50,7 +50,7 @@ @endif @endif - {{ $audition->entries->count() }} + {{ $audition->entries_count }} @endforeach diff --git a/resources/views/admin/ensembles/index-event-table.blade.php b/resources/views/admin/ensembles/index-event-table.blade.php index baebc90..9f337ce 100644 --- a/resources/views/admin/ensembles/index-event-table.blade.php +++ b/resources/views/admin/ensembles/index-event-table.blade.php @@ -15,7 +15,7 @@ @foreach($event->ensembles as $ensemble) - +
diff --git a/resources/views/admin/entries/create.blade.php b/resources/views/admin/entries/create.blade.php index 998fa00..d1c4376 100644 --- a/resources/views/admin/entries/create.blade.php +++ b/resources/views/admin/entries/create.blade.php @@ -1,7 +1,7 @@ Create Entry - + @@ -35,7 +35,7 @@ @endif - + Create Entry diff --git a/resources/views/admin/entries/edit.blade.php b/resources/views/admin/entries/edit.blade.php index 225b26a..9f37e22 100644 --- a/resources/views/admin/entries/edit.blade.php +++ b/resources/views/admin/entries/edit.blade.php @@ -5,19 +5,13 @@ Edit Entry #{{ $entry->id }} - @if(! Seat::where('entry_id', $entry->id)->exists()) -
- @csrf - @method('DELETE') - - - @else - Seated: {{ $entry->seat->ensemble->name }} #{{ $entry->seat->seat }} - @endif + + Confirm you would like to delete entry #{{$entry->id}} by {{$entry->student->full_name()}} on {{$entry->audition->name}}. +
- + @if(! Seat::where('entry_id', $entry->id)->exists()) diff --git a/resources/views/admin/entries/index.blade.php b/resources/views/admin/entries/index.blade.php index 71b8e3d..173899f 100644 --- a/resources/views/admin/entries/index.blade.php +++ b/resources/views/admin/entries/index.blade.php @@ -4,7 +4,7 @@ {{-- Filter Control--}} Set Filters - + @@ -40,7 +40,7 @@ - Clear Filters + Clear Filters Apply Filters @@ -52,7 +52,7 @@ Entries Double click row to edit - New Entry + New Entry @@ -71,7 +71,7 @@ @foreach($entries as $entry) - + {{ $entry->id }} {{ $entry->audition->name }} {{ $entry->student->full_name() }} diff --git a/resources/views/admin/rooms/index-room-card.blade.php b/resources/views/admin/rooms/index-room-card.blade.php index 624c8ef..c543b04 100644 --- a/resources/views/admin/rooms/index-room-card.blade.php +++ b/resources/views/admin/rooms/index-room-card.blade.php @@ -1,10 +1,12 @@ - @include('admin.rooms.index-edit-room-modal') + @if($room->id != '0') + @include('admin.rooms.index-edit-room-modal') + @endif {{ $room->name }} {{ $room->description }} - @if($room->entries->count() === 0 and $room->id != '0') + @if($room->auditions->count() === 0 and $room->id != '0')
Rooms - New Room + New Room
diff --git a/resources/views/admin/rooms/judge_assignments.blade.php b/resources/views/admin/rooms/judge_assignments.blade.php index a42f3d3..6ae2aec 100644 --- a/resources/views/admin/rooms/judge_assignments.blade.php +++ b/resources/views/admin/rooms/judge_assignments.blade.php @@ -5,7 +5,7 @@ @if($room->id == 0) @continue @endif -
  • {{-- card wrapper --}} +
  • {{-- card wrapper --}}
    {{-- card header --}}

    {{ $room->name }}

    @@ -60,8 +60,8 @@
    {{-- Judge Line --}}

    - {{ $judge->full_name() }}, - {{ $judge->school->name }} + {{ $judge->full_name() }} + {{ $judge->school->name ?? '' }}

    {{ $judge->judging_preference }}

    diff --git a/resources/views/admin/schools/create.blade.php b/resources/views/admin/schools/create.blade.php index 145406c..c513bad 100644 --- a/resources/views/admin/schools/create.blade.php +++ b/resources/views/admin/schools/create.blade.php @@ -5,7 +5,7 @@ - + diff --git a/resources/views/admin/schools/edit.blade.php b/resources/views/admin/schools/edit.blade.php index cb3fe60..8475878 100644 --- a/resources/views/admin/schools/edit.blade.php +++ b/resources/views/admin/schools/edit.blade.php @@ -1,7 +1,54 @@ - + + + Edit School + @if($school->students_count === 0) + + + Confirm you would like to delete the school {{ $school->name }}. This action cannot be undone. + + + @endif + + + + + + + + + + + Update School + + + - + + Associated Domains + + @foreach($school->emailDomains as $domain) + +
    + @csrf + @method('DELETE') + {{ $domain->domain }} +
    +
    + @endforeach + +
    + @csrf + Add Domain + +
    +
    +
    diff --git a/resources/views/admin/schools/index.blade.php b/resources/views/admin/schools/index.blade.php index 9ffc01e..61f351a 100644 --- a/resources/views/admin/schools/index.blade.php +++ b/resources/views/admin/schools/index.blade.php @@ -22,9 +22,9 @@ @foreach($schools as $school) - {{ $school->name }} + {{ $school->name }} - + ${{ number_format($schoolTotalFees[$school->id],2) }} diff --git a/resources/views/admin/schools/show-domain-form.blade.php b/resources/views/admin/schools/show-domain-form.blade.php index f62c928..4100842 100644 --- a/resources/views/admin/schools/show-domain-form.blade.php +++ b/resources/views/admin/schools/show-domain-form.blade.php @@ -3,7 +3,7 @@ @foreach($school->emailDomains as $domain) -
    + @csrf @method('DELETE')
    diff --git a/resources/views/admin/scoring/index-audition-scoring-guide-assignment-card.blade.php b/resources/views/admin/scoring/index-audition-scoring-guide-assignment-card.blade.php index 69dab01..16155a5 100644 --- a/resources/views/admin/scoring/index-audition-scoring-guide-assignment-card.blade.php +++ b/resources/views/admin/scoring/index-audition-scoring-guide-assignment-card.blade.php @@ -54,7 +54,7 @@ let auditionId = itemEl.getAttribute('data-id'); // Make an AJAX request to update the audition_guide_id - fetch('/admin/scoring/assign_guide_to_audition', { + fetch('{{route('ajax.assignScoringGuideToAudition')}}', { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/resources/views/admin/scoring/index-scoring-guide-management-card.blade.php b/resources/views/admin/scoring/index-scoring-guide-management-card.blade.php index 8a57ab3..851cef3 100644 --- a/resources/views/admin/scoring/index-scoring-guide-management-card.blade.php +++ b/resources/views/admin/scoring/index-scoring-guide-management-card.blade.php @@ -17,14 +17,14 @@ @continue @endif - {{ $guide->name }} {{ $guide->subscores->count() }} subscores - Edit + {{ $guide->name }} {{ $guide->subscores_count }} subscores + Edit @endforeach - + diff --git a/resources/views/admin/students/create.blade.php b/resources/views/admin/students/create.blade.php index 40bca42..fd3556a 100644 --- a/resources/views/admin/students/create.blade.php +++ b/resources/views/admin/students/create.blade.php @@ -1,7 +1,7 @@ Create Student - + @@ -22,7 +22,7 @@ - + Create Student diff --git a/resources/views/admin/students/edit.blade.php b/resources/views/admin/students/edit.blade.php index 36dce16..d8acda4 100644 --- a/resources/views/admin/students/edit.blade.php +++ b/resources/views/admin/students/edit.blade.php @@ -1,10 +1,19 @@ - Edit Student - - - - + + Edit Student + @if($student->entries_count === 0) + + + Please confirm you'd like to delete this student. This action cannot be undone. + + + @endif + + + + + Grade @php($n = $minGrade) @@ -13,7 +22,7 @@ @php($n++); @endwhile - + School @foreach ($schools as $school) diff --git a/resources/views/admin/students/index.blade.php b/resources/views/admin/students/index.blade.php index 9c40ddb..a56a5f3 100644 --- a/resources/views/admin/students/index.blade.php +++ b/resources/views/admin/students/index.blade.php @@ -6,7 +6,7 @@ Students Click name to edit - New Student + New Student @@ -20,10 +20,10 @@ @foreach($students as $student) - {{ $student->full_name(true) }} + {{ $student->full_name(true) }} {{ $student->school->name }} {{ $student->grade }} - {{ $student->entries->count() }} + {{ $student->entries_count }} @endforeach diff --git a/resources/views/admin/users/create.blade.php b/resources/views/admin/users/create.blade.php index 5e28ea4..ebc9fdf 100644 --- a/resources/views/admin/users/create.blade.php +++ b/resources/views/admin/users/create.blade.php @@ -1,7 +1,7 @@ Create User - + @@ -18,7 +18,7 @@ - + Create User diff --git a/resources/views/admin/users/edit.blade.php b/resources/views/admin/users/edit.blade.php index 7dbd695..c78ce44 100644 --- a/resources/views/admin/users/edit.blade.php +++ b/resources/views/admin/users/edit.blade.php @@ -1,7 +1,18 @@ - Edit User - + + Edit User + + @if($user->id != Auth::user()->id) +
    + @csrf + @method('DELETE') + + + @endif +
    +
    + diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php index 4379bab..d5bef00 100644 --- a/resources/views/admin/users/index.blade.php +++ b/resources/views/admin/users/index.blade.php @@ -4,9 +4,9 @@ Users - Click name to edit + Click name to edit or delete - New User + New User @@ -21,7 +21,7 @@ @foreach($users as $user) - {{ $user->full_name(true) }} + {{ $user->full_name(true) }} {{ $user->has_school() ? $user->school->name : ' ' }} {{ $user->email }} {{ $user->cell_phone }} @@ -32,7 +32,3 @@
    - - - -{{ $user->has_school() ? $user->school->name : 'No School' }} diff --git a/resources/views/components/delete-resource-modal.blade.php b/resources/views/components/delete-resource-modal.blade.php new file mode 100644 index 0000000..6c444ea --- /dev/null +++ b/resources/views/components/delete-resource-modal.blade.php @@ -0,0 +1,134 @@ +@php +/** + * @var int $size=20 Size of the icon + * @var string $title Title of the modal + * @var string $method='DELETE' method used by the form + * @var string $action action used for the form + */ +@endphp +@props(['size' => 20,'title','method'=>'DELETE','action']) + +
    + + + + + + +
    diff --git a/resources/views/components/form/red-trash-button.blade.php b/resources/views/components/form/red-trash-button.blade.php index 8b126d9..8b93ee1 100644 --- a/resources/views/components/form/red-trash-button.blade.php +++ b/resources/views/components/form/red-trash-button.blade.php @@ -10,5 +10,4 @@ - diff --git a/resources/views/components/icons/checkmark.blade.php b/resources/views/components/icons/checkmark.blade.php index 3231384..e781c65 100644 --- a/resources/views/components/icons/checkmark.blade.php +++ b/resources/views/components/icons/checkmark.blade.php @@ -1,4 +1,5 @@ -@props(['color' => 'currentColor']) +@props(['color' => 'currentColor', 'title'=>false]) diff --git a/resources/views/components/icons/circle-slash-no.blade.php b/resources/views/components/icons/circle-slash-no.blade.php index 1bedb5e..187593a 100644 --- a/resources/views/components/icons/circle-slash-no.blade.php +++ b/resources/views/components/icons/circle-slash-no.blade.php @@ -1,4 +1,5 @@ -@props(['color' => 'currentColor']) +@props(['color' => 'currentColor', 'title' => false]) diff --git a/resources/views/components/icons/hamburger-menu.blade.php b/resources/views/components/icons/hamburger-menu.blade.php index 3097cd3..eccb66c 100644 --- a/resources/views/components/icons/hamburger-menu.blade.php +++ b/resources/views/components/icons/hamburger-menu.blade.php @@ -1,3 +1,5 @@ +@props(['title' => false]) diff --git a/resources/views/components/icons/thumbs-down.blade.php b/resources/views/components/icons/thumbs-down.blade.php index 1990c19..7427f65 100644 --- a/resources/views/components/icons/thumbs-down.blade.php +++ b/resources/views/components/icons/thumbs-down.blade.php @@ -1,4 +1,5 @@ -@props(['color' => 'currentColor']) +@props(['color' => 'currentColor','title'=>false]) diff --git a/resources/views/components/icons/thumbs-up.blade.php b/resources/views/components/icons/thumbs-up.blade.php index 1f5c405..6a97b0a 100644 --- a/resources/views/components/icons/thumbs-up.blade.php +++ b/resources/views/components/icons/thumbs-up.blade.php @@ -1,4 +1,5 @@ -@props(['color' => 'currentColor']) +@props(['color' => 'currentColor','title'=>false]) diff --git a/resources/views/components/layout/navbar/menus/admin.blade.php b/resources/views/components/layout/navbar/menus/admin.blade.php index 21bc4b5..c0430d2 100644 --- a/resources/views/components/layout/navbar/menus/admin.blade.php +++ b/resources/views/components/layout/navbar/menus/admin.blade.php @@ -2,7 +2,7 @@ {{--