From ddb5b7a71e0294667b7f683704b8e2359cd125ce Mon Sep 17 00:00:00 2001 From: Matt Young Date: Mon, 3 Jun 2024 00:14:02 -0500 Subject: [PATCH] Admin Entries Page Working --- .../Controllers/Admin/EntryController.php | 69 +++++++++++++++++++ .../Controllers/Admin/SchoolController.php | 2 +- .../Controllers/Admin/StudentController.php | 2 +- app/Http/Controllers/Admin/UserController.php | 2 +- app/Models/Audition.php | 2 + app/Models/Entry.php | 6 ++ app/Models/School.php | 8 ++- .../views/admin/entries/create.blade.php | 29 ++++++++ resources/views/admin/entries/edit.blade.php | 35 ++++++++++ resources/views/admin/entries/index.blade.php | 41 +++++++++++ .../components/layout/navbar-admin.blade.php | 1 + routes/web.php | 9 +++ 12 files changed, 202 insertions(+), 4 deletions(-) create mode 100644 app/Http/Controllers/Admin/EntryController.php create mode 100644 resources/views/admin/entries/create.blade.php create mode 100644 resources/views/admin/entries/edit.blade.php create mode 100644 resources/views/admin/entries/index.blade.php diff --git a/app/Http/Controllers/Admin/EntryController.php b/app/Http/Controllers/Admin/EntryController.php new file mode 100644 index 0000000..142c1a7 --- /dev/null +++ b/app/Http/Controllers/Admin/EntryController.php @@ -0,0 +1,69 @@ +is_admin) abort(403); + $entries = Entry::with(['student.school','audition'])->orderBy('created_at','DESC')->paginate(10); + return view('admin.entries.index', ['entries' => $entries] ); + } + + public function create() + { + if(! Auth::user()->is_admin) abort(403); + $students = Student::with('school')->orderBy('last_name')->orderBy('first_name')->get(); + $auditions = Audition::orderBy('name')->get(); + return view('admin.entries.create', ['students' => $students, 'auditions' => $auditions]); + } + + public function store() + { + if(! Auth::user()->is_admin) abort(403); + request()->validate([ + 'student_id' => ['required', 'exists:students,id'], + 'audition_id' => ['required', 'exists:auditions,id'], + ]); + + Entry::create([ + 'student_id' => request('student_id'), + 'audition_id' => request('audition_id'), + ]); + + return redirect('/admin/entries'); + } + + public function edit(Entry $entry) + { + if(! Auth::user()->is_admin) abort(403); + $students = Student::with('school')->orderBy('last_name')->orderBy('first_name')->get(); + $auditions = Audition::orderBy('name')->get(); + return view('admin.entries.edit', ['entry' => $entry, 'students' => $students, 'auditions' => $auditions]); + } + + public function update(Entry $entry) + { + if(! Auth::user()->is_admin) abort(403); + request()->validate([ + 'student_id' => ['required', 'exists:students,id'], + 'audition_id' => ['required', 'exists:auditions,id'], + ]); + + $entry->update([ + 'student_id' => request('student_id'), + 'audition_id' => request('audition_id'), + ]); + + return redirect('/admin/entries'); + } +} diff --git a/app/Http/Controllers/Admin/SchoolController.php b/app/Http/Controllers/Admin/SchoolController.php index 8c8e5ef..d0fad41 100644 --- a/app/Http/Controllers/Admin/SchoolController.php +++ b/app/Http/Controllers/Admin/SchoolController.php @@ -15,7 +15,7 @@ class SchoolController extends Controller public function index() { if (! Auth::user()->is_admin) abort(403); - $schools = School::orderBy('name')->get(); + $schools = School::with(['users','students','entries'])->orderBy('name')->get(); return view('admin.schools.index', ['schools' => $schools]); } diff --git a/app/Http/Controllers/Admin/StudentController.php b/app/Http/Controllers/Admin/StudentController.php index 16ef58d..5f8983e 100644 --- a/app/Http/Controllers/Admin/StudentController.php +++ b/app/Http/Controllers/Admin/StudentController.php @@ -17,7 +17,7 @@ class StudentController extends Controller public function index() { if (! Auth::user()->is_admin) abort(403); - $students = Student::orderBy('last_name')->orderBy('first_name')->paginate(15); + $students = Student::with(['school','entries'])->orderBy('last_name')->orderBy('first_name')->paginate(15); return view('admin.students.index', ['students' => $students]); } diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 9ce4079..b43e7a5 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -17,7 +17,7 @@ class UserController extends Controller public function index() { if (! Auth::user()->is_admin) abort(403); - $users = User::orderBy('last_name')->orderBy('first_name')->get(); + $users = User::with('school')->orderBy('last_name')->orderBy('first_name')->get(); return view('admin.users.index', ['users' => $users]); } diff --git a/app/Models/Audition.php b/app/Models/Audition.php index 47fb836..8c599d2 100644 --- a/app/Models/Audition.php +++ b/app/Models/Audition.php @@ -20,4 +20,6 @@ class Audition extends Model { return Audition::where('entry_deadline', '>=', now())->get(); } + +// TODO add order column to be able to sort in score order } diff --git a/app/Models/Entry.php b/app/Models/Entry.php index 5c486ff..fc889a7 100644 --- a/app/Models/Entry.php +++ b/app/Models/Entry.php @@ -5,6 +5,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasOneThrough; class Entry extends Model { @@ -20,4 +21,9 @@ class Entry extends Model { return $this->belongsTo(Audition::class); } + + public function school(): HasOneThrough + { + return $this->hasOneThrough(School::class, Student::class, 'id', 'id', 'student_id', 'school_id'); + } } diff --git a/app/Models/School.php b/app/Models/School.php index ab5ee2d..af18e16 100644 --- a/app/Models/School.php +++ b/app/Models/School.php @@ -40,7 +40,13 @@ class School extends Model public function entries(): HasManyThrough { - return $this->hasManyThrough(Entry::class,Student::class); + return $this->hasManyThrough( + Entry::class, + Student::class, + 'school_id', + 'student_id', + 'id', + 'id'); } } diff --git a/resources/views/admin/entries/create.blade.php b/resources/views/admin/entries/create.blade.php new file mode 100644 index 0000000..4360d22 --- /dev/null +++ b/resources/views/admin/entries/create.blade.php @@ -0,0 +1,29 @@ + + + Create Entry + + + + + Student + @foreach ($students as $student) + + + @endforeach + + + Audition + @foreach ($auditions as $audition) + + + @endforeach + + + + Create Entry + + + + + +{{--TODO apply javascript to only show appropriate auditions for the students grade--}} diff --git a/resources/views/admin/entries/edit.blade.php b/resources/views/admin/entries/edit.blade.php new file mode 100644 index 0000000..d52ee92 --- /dev/null +++ b/resources/views/admin/entries/edit.blade.php @@ -0,0 +1,35 @@ + + + Edit Entry #{{ $entry->id }} + + + + + Student + @foreach ($students as $student) + + + + @endforeach + + + Audition + @foreach ($auditions as $audition) + + + + @endforeach + + + + Create Entry + + + + + +{{--TODO apply javascript to only show appropriate auditions for the students grade--}} diff --git a/resources/views/admin/entries/index.blade.php b/resources/views/admin/entries/index.blade.php new file mode 100644 index 0000000..1473c5b --- /dev/null +++ b/resources/views/admin/entries/index.blade.php @@ -0,0 +1,41 @@ + + Entry Administration + + + + Entries + Click id to edit + + New Entry + + + + + ID + Audition + Student + Grade + School + Entry Date + + + + @foreach($entries as $entry) + + {{ $entry->id }} + {{ $entry->audition->name }} + {{ $entry->student->full_name() }} + {{ $entry->student->grade }} + {{ $entry->student->school->name }} + {{ $entry->created_at->format('m/d/Y g:i A') }} + + @endforeach + + + + +
+ {{ $entries->links('vendor.pagination.simple-audition') }} +
+
+{{--TODO add options to filter the page--}} diff --git a/resources/views/components/layout/navbar-admin.blade.php b/resources/views/components/layout/navbar-admin.blade.php index 400e454..3fbf687 100644 --- a/resources/views/components/layout/navbar-admin.blade.php +++ b/resources/views/components/layout/navbar-admin.blade.php @@ -21,6 +21,7 @@ Users Schools Students + Entries {{-- Dashboard--}} {{-- Students--}} diff --git a/routes/web.php b/routes/web.php index 0bc9ff2..1b91a00 100644 --- a/routes/web.php +++ b/routes/web.php @@ -18,6 +18,15 @@ Route::view('/','welcome')->middleware('guest'); Route::middleware(['auth','verified',CheckIfAdmin::class])->prefix('admin/')->group(function() { Route::view('/','admin.dashboard'); + // Admin Entries Routes + Route::prefix('entries')->controller(\App\Http\Controllers\Admin\EntryController::class)->group(function() { + Route::get('/','index'); + Route::get('/create','create'); + Route::post('/','store'); + Route::get('/{entry}/edit','edit'); + Route::patch('/{entry}','update'); + }); + // Admin Student Routes Route::prefix('students')->controller(\App\Http\Controllers\Admin\StudentController::class)->group(function() { Route::get('/','index');