diff --git a/app/Http/Controllers/Admin/RoomController.php b/app/Http/Controllers/Admin/RoomController.php index 5b85165..94ed219 100644 --- a/app/Http/Controllers/Admin/RoomController.php +++ b/app/Http/Controllers/Admin/RoomController.php @@ -5,8 +5,10 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\Audition; use App\Models\Room; +use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use function redirect; class RoomController extends Controller { @@ -17,4 +19,39 @@ class RoomController extends Controller $rooms = Room::with('auditions.entries')->orderBy('name')->get(); return view('admin.rooms.index', ['rooms' => $rooms]); } + + public function judgingAssignment() + { + $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('users')->get(); + + return view('admin.rooms.judge_assignments', compact('usersWithoutRooms','usersWithRooms','rooms')); + } + + public function updateJudgeAssignment(Request $request, Room $room) + { + $validData = $request->validate([ + 'judge' => 'exists:users,id' + ]); + $judge = User::find($validData['judge']); + + if($request->isMethod('post')) { + // attach judge on post + $room->judges()->attach($judge->id); + $message = "Assigned " . $judge->full_name() . " to " . $room->name; + } elseif ($request->isMethod('delete')) { + // detach judge on delete + $room->judges()->detach($judge->id); + $message = "Removed " . $judge->full_name() . " from " . $room->name; + } else { + return redirect('/admin/rooms/judging_assignments')->with('error', 'Invalid request method.'); + } + + return redirect('/admin/rooms/judging_assignments')->with('success',$message); + } + + + + } diff --git a/app/Models/Room.php b/app/Models/Room.php index d5c6778..233819a 100644 --- a/app/Models/Room.php +++ b/app/Models/Room.php @@ -4,6 +4,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; @@ -27,4 +28,14 @@ class Room extends Model 'id' // Local key on the Auditions table ); } + + public function users(): BelongsToMany + { + return $this->belongsToMany(User::class,'room_user'); + } + + public function judges(): BelongsToMany + { + return $this->belongsToMany(User::class,'room_user','room_id','user_id'); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 2679295..d9ab82f 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -6,6 +6,7 @@ namespace App\Models; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; @@ -95,6 +96,16 @@ class User extends Authenticatable implements MustVerifyEmail ); } + public function rooms(): BelongsToMany + { + return $this->belongsToMany(Room::class,'room_user'); + } + + public function judgingAssignments(): BelongsToMany + { + return $this->rooms(); + } + /** * Return an array of schools using the users email domain * @return SchoolEmailDomain[] diff --git a/database/migrations/2024_06_05_055202_create_user_room_pivot_table.php b/database/migrations/2024_06_05_055202_create_user_room_pivot_table.php new file mode 100644 index 0000000..9696b92 --- /dev/null +++ b/database/migrations/2024_06_05_055202_create_user_room_pivot_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignIdFor(Room::class)->constrained()->cascadeOnUpdate()->cascadeOnDelete(); + $table->foreignIdFor(User::class)->constrained()->cascadeOnUpdate()->cascadeOnDelete(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('user_room_pivot'); + } +}; diff --git a/resources/views/admin/rooms/judge_assignments.blade.php b/resources/views/admin/rooms/judge_assignments.blade.php new file mode 100644 index 0000000..0afe203 --- /dev/null +++ b/resources/views/admin/rooms/judge_assignments.blade.php @@ -0,0 +1,115 @@ + + + diff --git a/resources/views/admin/rooms/judge_assignmentsFIRSTDRAFT.blade.php b/resources/views/admin/rooms/judge_assignmentsFIRSTDRAFT.blade.php new file mode 100644 index 0000000..335bc9b --- /dev/null +++ b/resources/views/admin/rooms/judge_assignmentsFIRSTDRAFT.blade.php @@ -0,0 +1,100 @@ + + + diff --git a/resources/views/admin/rooms/scratch.blade.php b/resources/views/admin/rooms/scratch.blade.php deleted file mode 100644 index 1c939b6..0000000 --- a/resources/views/admin/rooms/scratch.blade.php +++ /dev/null @@ -1,52 +0,0 @@ -
- @foreach($guides as $guide) -
- @foreach($guide->auditions as $audition) -
{{ $audition->name }}
- @endforeach -
- @endforeach -
- - diff --git a/resources/views/components/layout/app.blade.php b/resources/views/components/layout/app.blade.php index 8a28451..a4a6d59 100644 --- a/resources/views/components/layout/app.blade.php +++ b/resources/views/components/layout/app.blade.php @@ -1,3 +1,4 @@ +@php use App\Settings; @endphp @props(['page_title' => false, 'title_bar_right' => false ]) @@ -17,7 +18,18 @@ - +
+
+
+
+ AuditionAdmin{{ Settings::auditionName() }} +
+
+ [ ADMIN ] +
+
+
+
@if(request()->is('*admin*')) diff --git a/routes/web.php b/routes/web.php index aa53094..23ef2c9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -14,15 +14,14 @@ use Illuminate\Support\Facades\Route; Route::get('/test',[TestController::class,'flashTest'])->middleware('auth','verified'); -Route::post('/admin/scoring/assign_guide_to_audition',[\App\Http\Controllers\Admin\AuditionController::class,'scoringGuideUpdate']); +Route::post('/admin/scoring/assign_guide_to_audition',[\App\Http\Controllers\Admin\AuditionController::class,'scoringGuideUpdate']); // needs to move inside of admin group Route::view('/','welcome')->middleware('guest'); // Admin Routes Route::middleware(['auth','verified',CheckIfAdmin::class])->prefix('admin/')->group(function() { Route::view('/','admin.dashboard'); - Route::post('/auditions/roomUpdate',[\App\Http\Controllers\Admin\AuditionController::class,'roomUpdate']); - + Route::post('/auditions/roomUpdate',[\App\Http\Controllers\Admin\AuditionController::class,'roomUpdate']); // Endpoint for JS assigning auditions to rooms // Rooms Route::prefix('rooms')->controller(\App\Http\Controllers\Admin\RoomController::class)->group(function() { @@ -32,6 +31,9 @@ Route::middleware(['auth','verified',CheckIfAdmin::class])->prefix('admin/')->gr Route::post('/{room}/edit','edit'); Route::patch('/{room}','update'); Route::delete('/{room}','destroy'); + Route::get('/judging_assignments','judgingAssignment'); // Screen to assign judges to rooms + Route::match(['post', 'delete'], '/{room}/judge', 'updateJudgeAssignment'); + }); // Scoring