diff --git a/app/Http/Controllers/Admin/AuditionSettings.php b/app/Http/Controllers/Admin/AuditionSettings.php index b02a8be..665dd06 100644 --- a/app/Http/Controllers/Admin/AuditionSettings.php +++ b/app/Http/Controllers/Admin/AuditionSettings.php @@ -33,7 +33,7 @@ class AuditionSettings extends Controller 'payment_state' => ['required', 'max:2'], 'payment_zip' => ['required', 'min:5'], 'advanceTo' => ['nullable'], - 'nomination_ensemble_rules' => ['required', 'in:disabled,scobda'], + 'nomination_ensemble_rules' => ['required', 'in:disabled,scobda,meobda'], // Options should align with the boot method of NominationEnsembleServiceProvider ]); diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php new file mode 100644 index 0000000..45bd749 --- /dev/null +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminController.php @@ -0,0 +1,113 @@ +validate([ + 'school' => 'nullable|exists:schools,id', + 'section' => 'nullable|string', + 'newFilterParameters' => 'string', + 'split' => 'nullable|string', + 'clear' => 'nullable|string', + ]); + if ($newFilterData['clear'] ?? false == 'clear') { + $filterData = []; + session()->forget('nominationAdminFilters'); + } else { + session()->put('nominationAdminFilters', $newFilterData); + $filterData = $newFilterData; + } + } elseif (session()->has('nominationAdminFilters')) { + $filterData = session()->get('nominationAdminFilters'); + } else { + $filterData = []; + } + + // Populate variables to complete the filter form + $schools = School::orderBy('name')->get(); + $ensembles = NominationEnsemble::all(); + $sections = []; + $splits = []; + foreach ($ensembles as $ensemble) { + // Populate sections for each ensemble + $sections[$ensemble->id.'---'.'all'] = $ensemble->name.' - ALL'; + foreach ($ensemble->data['instruments'] as $instrument) { + $sections[$ensemble->id.'---'.$instrument['name']] = $ensemble->name.' - '.$instrument['name']; + } + + // Populate splits for each ensemble + $splits[$ensemble->id.'---'.'all'] = $ensemble->name.' - ALL'; + foreach ($ensemble->data['split_names'] as $splitName) { + $splits[$ensemble->id.'---'.$splitName] = $ensemble->name.' - '.$splitName; + } + } + + // Get and filter nominations + $nominations = NominationEnsembleEntry::with('student.school'); + if ($filterData['school'] ?? false) { + $nominations = $nominations->whereHas('student', function ($query) use ($filterData) { + $query->where('school_id', $filterData['school']); + }); + } + + if ($filterData['section'] ?? false) { + $sectionFilter = explode('---', $filterData['section']); + $nominations = $nominations->where('nomination_ensemble_id', $sectionFilter[0]); + if ($sectionFilter[1] != 'all') { + $nominations = $nominations->where('data->instrument', $sectionFilter[1]); + } + } + + if ($filterData['split'] ?? false) { + $splitFilter = explode('---', $filterData['split']); + $nominations = $nominations->where('nomination_ensemble_id', $splitFilter[0]); + if ($splitFilter[1] != 'all') { + $nominations = $nominations->where('data->split', $splitFilter[1]); + } + } + + $nominations = $nominations->paginate(50); + + return view('nomination_ensembles.meobda.admin.nominations', + compact('nominations', 'schools', 'filterData', 'ensembles', 'sections', 'splits')); + } + + public function show(NominationEnsembleEntry $entry) + { + // TODO: Implement show() method. + } + + public function create() + { + // TODO: Implement create() method. + } + + public function store() + { + // TODO: Implement store() method. + } + + public function edit(NominationEnsembleEntry $entry) + { + // TODO: Implement edit() method. + } + + public function update(NominationEnsembleEntry $entry) + { + // TODO: Implement update() method. + } + + public function destroy(NominationEnsembleEntry $entry) + { + // TODO: Implement destroy() method. + } +} diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php new file mode 100644 index 0000000..bf1fc34 --- /dev/null +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleController.php @@ -0,0 +1,141 @@ +validate([ + 'ensemble_name' => 'required|unique:nomination_ensembles,name', + 'entry_deadline' => 'required|date', + 'min_grade' => 'required|numeric|min:0', + 'max_grade' => 'required|numeric|gte:min_grade', + 'max_nominations' => 'required|numeric|min:1', + 'instrument_list' => 'required|string', + 'split_names' => 'nullable|string', + ], [ + 'maximum_grade.gte' => 'The maximum grade must be greater than the minimum grade.', + 'rounding_direction.in' => 'The rounding direction must be either "up" or "down".', + ]); + $instrument_list = preg_replace('/^\s+|\s+$/m', '', $validated['instrument_list']); + $instrument_list = str_replace(["\r\n", "\r"], "\n", $instrument_list); + $instrument_array = explode("\n", $instrument_list); + $instruments = []; + foreach ($instrument_array as $instrument) { + $inst_arr = explode(':', $instrument); + $name = $inst_arr[0]; + $max = $inst_arr[1] ?? null; + $instruments[] = [ + 'name' => $name, + 'max' => $max, + ]; + } + $split_names = explode(',', $validated['split_names']); + if (count($split_names) == 1) { + $split_names[0] = $validated['ensemble_name']; + } + + $ensemble = new NominationEnsemble(); + $ensemble->name = $validated['ensemble_name']; + $ensemble->entry_deadline = $validated['entry_deadline']; + $ensemble->minimum_grade = $validated['min_grade']; + $ensemble->maximum_grade = $validated['max_grade']; + $data = []; + $data['max_nominations'] = $validated['max_nominations']; + $data['instruments'] = $instruments; + $data['split_names'] = $split_names; + $ensemble->data = $data; + $ensemble->save(); + + return redirect()->route('nomination.admin.ensemble.index')->with('success', + 'Nomination Ensemble has been created.'); + } + + public function edit(NominationEnsemble $ensemble) + { + // TODO: Implement edit() method. + } + + public function update(NominationEnsemble $ensemble) + { + $validated = request()->validate([ + 'ensemble_name' => [ + 'required', + Rule::unique('nomination_ensembles', 'name')->ignore($ensemble->id), + ], + 'entry_deadline' => 'required|date', + 'min_grade' => 'required|numeric|min:0', + 'max_grade' => 'required|numeric|gte:min_grade', + 'max_nominations' => 'required|numeric|min:1', + 'instrument_list' => 'required|string', + 'split_names' => 'nullable|string', + ], [ + 'maximum_grade.gte' => 'The maximum grade must be greater than the minimum grade.', + 'rounding_direction.in' => 'The rounding direction must be either "up" or "down".', + ]); + $instrument_list = preg_replace('/^\s+|\s+$/m', '', $validated['instrument_list']); + $instrument_list = str_replace(["\r\n", "\r"], "\n", $instrument_list); + $instrument_array = explode("\n", $instrument_list); + $instruments = []; + foreach ($instrument_array as $instrument) { + $inst_arr = explode(':', $instrument); + $name = $inst_arr[0]; + $max = $inst_arr[1] ?? null; + $instruments[] = [ + 'name' => $name, + 'max' => $max, + ]; + } + $split_names = explode(',', $validated['split_names']); + if (count($split_names) == 1) { + $split_names[0] = $validated['ensemble_name']; + } + + $ensemble->name = $validated['ensemble_name']; + $ensemble->entry_deadline = $validated['entry_deadline']; + $ensemble->minimum_grade = $validated['min_grade']; + $ensemble->maximum_grade = $validated['max_grade']; + $data = []; + $data['max_nominations'] = $validated['max_nominations']; + $data['instruments'] = $instruments; + $data['split_names'] = $split_names; + $ensemble->data = $data; + $ensemble->save(); + + return redirect()->route('nomination.admin.ensemble.index')->with('success', + 'Nomination Ensemble has been modified.'); + } + + public function destroy(NominationEnsemble $ensemble) + { + $ensemble->delete(); + + // TODO: Delete associated nomionations. + return redirect()->route('nomination.admin.ensemble.index')->with('success', + 'Nomination Ensemble has been deleted.'); + } +} diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php new file mode 100644 index 0000000..b1d9add --- /dev/null +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php @@ -0,0 +1,188 @@ +format('Y-m-d'); + + $ensembles = NominationEnsemble::all(); + $availableInstruments = []; + $availableStudents = []; + $existingNominations = []; + $nominationsAvailable = []; + $past_deadline = []; + + foreach ($ensembles as $ensemble) { + // Get existing nominations + $existingNominations[$ensemble->id] = auth()->user()->school->nominations() + ->where('nomination_ensemble_id', $ensemble->id) + ->get() + ->keyBy('student_id'); + // Count how many nominations exist on each instrument + $nominatedInstrumentCount = []; + foreach ($existingNominations[$ensemble->id] as $nom) { + $nominatedInstrumentCount[$nom->data['instrument']] = + ($nominatedInstrumentCount[$nom->data['instrument']] ?? 0) + 1; + } + + // Set available instruments + foreach ($ensemble->data['instruments'] as $instrument) { + // Skip it if we're at the limit on this instrument + if (! is_null($instrument['max']) && $instrument['max'] <= ($nominatedInstrumentCount[$instrument['name']] ?? 0)) { + continue; + } + $availableInstruments[$ensemble->id][] = $instrument['name']; + } + + // Set available students + $students = Student::where('school_id', auth()->user()->school_id) + ->where('grade', '>=', $ensemble->minimum_grade) + ->where('grade', '<=', $ensemble->maximum_grade) + ->orderBy('last_name', 'asc') + ->orderBy('first_name', 'asc') + ->get(); + foreach ($existingNominations[$ensemble->id] as $checknom) { + $students = $students->reject(function ($student) use ($checknom) { + return $checknom->student_id == $student->id; + }); + } + $availableStudents[$ensemble->id] = $students; + $nominationsAvailable[$ensemble->id] = $existingNominations[$ensemble->id]->count() < $ensemble->data['max_nominations']; + $past_deadline[$ensemble->id] = $currentDate > $ensemble->entry_deadline; + } + + return view('nomination_ensembles.meobda.entries.index', + compact('ensembles', 'currentDate', 'availableInstruments', 'availableStudents', 'existingNominations', + 'nominationsAvailable', 'past_deadline')); + } + + public function show(NominationEnsembleEntry $entry) + { + // TODO: Implement show() method. + } + + public function create() + { + // TODO: Implement create() method. + } + + public function store() + { + $validData = request()->validate([ + 'ensemble' => [ + 'required', + 'exists:App\Models\NominationEnsemble,id', + ], + 'new_student' => [ + 'required', + 'exists:App\Models\Student,id', + ], + 'new_instrument' => 'required', + ]); + $ensemble = NominationEnsemble::find($validData['ensemble']); + + // Check that the deadline is not past + $currentDate = Carbon::now('America/Chicago'); + $currentDate = $currentDate->format('Y-m-d'); + if ($ensemble->entry_deadline < $currentDate) { + return redirect()->route('nomination.entry.index')->with('error', + 'The nomination deadline for that ensemble has passed'); + } + + // Check if new_instrument is valid + foreach ($ensemble->data['instruments'] as $instrument) { + $availableInstruments[] = $instrument['name']; + } + if (! in_array($validData['new_instrument'], $availableInstruments)) { + return redirect()->route('nomination.entry.index')->with('error', + 'Invalid Instrument Specified'); + } + + // Check if the student belongs to the current user + $student = Student::find($validData['new_student']); + if (auth()->user()->school_id !== $student->school_id) { + return redirect()->route('nomination.entry.index')->with('error', + 'You may only nominate students from your school'); + } + + // Check that the user's school has nominations available + $existing_nominations = auth()->user()->school->nominations()->where('nomination_ensemble_id', $validData['ensemble']); + if ($existing_nominations->count() >= $ensemble->data['max_nominations']) { + return redirect()->route('nomination.entry.index')->with('error', + 'You have already used all of your nominations for this ensemble'); + } + + // Check that the user's school isn't over limit for the requested instrument + $instrumentLimit = collect($ensemble->data['instruments'])->firstWhere('name', + $validData['new_instrument'])['max']; + if ($instrumentLimit) { + $used = 0; + foreach ($existing_nominations as $nom) { + if ($nom->data['instrument'] == $validData['new_instrument']) { + $used++; + } + if ($used >= $instrumentLimit) { + return redirect()->route('nomination.entry.index')->with('error', + 'You may not nominate any more students on that instrument'); + } + } + } + + // Check that the student isn't already nominated for this ensemble + if (NominationEnsembleEntry::where('student_id', $validData['new_student']) + ->where('nomination_ensemble_id', $validData['ensemble']) + ->count() > 0) { + return redirect()->route('nomination.entry.index')->with('error', + 'Student already nominated for that ensemble'); + } + + $newEntry = new NominationEnsembleEntry(); + $newEntry->student_id = $validData['new_student']; + $newEntry->nomination_ensemble_id = $validData['ensemble']; + $newEntry->data = ['instrument' => $validData['new_instrument']]; + $newEntry->save(); + + return redirect()->route('nomination.entry.index')->with('success', + 'Nomination entered'); + } + + public function edit(NominationEnsembleEntry $entry) + { + // TODO: Implement edit() method. + } + + public function update(NominationEnsembleEntry $entry) + { + // TODO: Implement update() method. + } + + public function destroy(NominationEnsembleEntry $entry) + { + if ($entry->student->school_id !== auth()->user()->school_id) { + return redirect()->route('nomination.entry.index')->with('error', + 'You may only delete nominations from your school'); + } + + $currentDate = Carbon::now('America/Chicago'); + $currentDate = $currentDate->format('Y-m-d'); + if ($entry->ensemble->entry_deadline < $currentDate) { + return redirect()->route('nomination.entry.index')->with('error', + 'You cannot delete nominations after the deadline'); + } + + $entry->delete(); + + return redirect()->route('nomination.entry.index')->with('success', 'Nomination Deleted'); + } +} diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php new file mode 100644 index 0000000..b4b699d --- /dev/null +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationSeatingController.php @@ -0,0 +1,103 @@ +data['seated'] ?? false) { + $nominations = NominationEnsembleEntry::where('nomination_ensemble_id', $ensemble->id) + ->orderBy('data->instrument') + ->orderByRaw('CAST(data->"$.seat" AS UNSIGNED)') + ->with('student.school') + ->get(); + $nominations = $nominations->groupBy(function ($item) { + return $item->data['split']; + }); + foreach ($nominations as $split => $splitNoms) { + $nominations[$split] = $splitNoms->groupBy(function ($item) { + return $item->data['instrument']; + }); + } + } + + return view('nomination_ensembles.meobda.admin.seating', compact('ensembles', 'ensemble', 'nominations')); + } + + public function seat(NominationEnsemble $ensemble) + { + $validData = request()->validate([ + 'action' => 'required|in:seat,clear', + ]); + $action = $validData['action']; + $data = $ensemble['data']; + $nominations = NominationEnsembleEntry::where('nomination_ensemble_id', + $ensemble->id)->inRandomOrder()->get(); + $groupedNominations = $nominations->groupBy(function ($nom) { + return $nom->data['instrument']; + }); + + if ($action == 'seat') { + // If no split names are set, make the name of the ensemble the only split name + $splits = $data['split_names']; + if (count($splits) < 2 && strlen($splits[0]) < 2) { + $splits[0] = $ensemble->name; + } + $splitOn = 0; + + foreach ($ensemble->data['instruments'] as $instrument) { + if (! $groupedNominations->has($instrument['name'])) { + continue; + } + $seatOn = 1; + foreach ($groupedNominations[$instrument['name']] as $nomination) { + $nomData = $nomination['data']; + $nomData['seat'] = $seatOn; + $nomData['split'] = $splits[$splitOn]; + $nomination->data = $nomData; + $nomination->save(); + + $splitOn++; + if ($splitOn >= count($splits)) { + $seatOn++; + $splitOn = 0; + } + } + } + + $data['seated'] = true; + + } + + if ($action == 'clear') { + $data['seated'] = false; + foreach ($nominations as $nomination) { + $nomData = $nomination['data']; + unset($nomData['split']); + unset($nomData['seat']); + $nomination->data = $nomData; + $nomination->save(); + } + } + $ensemble->data = $data; + $ensemble->save(); + + return redirect(route('nomination.admin.seating.show', [$ensemble])); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 7c22988..5211a7e 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -71,10 +71,10 @@ class AppServiceProvider extends ServiceProvider $this->app->singleton(SetHeadDirector::class, SetHeadDirector::class); // Nomination Ensemble - $this->app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class); - $this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class); - $this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class); - $this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class); + // $this->app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class); + // $this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class); + // $this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class); + // $this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class); } /** @@ -82,7 +82,6 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { - Entry::observe(EntryObserver::class); Audition::observe(AuditionObserver::class); Room::observe(RoomObserver::class); diff --git a/app/Providers/NominationEnsembleServiceProvider.php b/app/Providers/NominationEnsembleServiceProvider.php new file mode 100644 index 0000000..415d26a --- /dev/null +++ b/app/Providers/NominationEnsembleServiceProvider.php @@ -0,0 +1,49 @@ +app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class); + // $this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class); + // $this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class); + // $this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class); + } + + public function boot(): void + { + if (auditionSetting('nomination_ensemble_rules') === 'scobda') { + $this->app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class); + $this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class); + $this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class); + $this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class); + } + + if (auditionSetting('nomination_ensemble_rules') === 'meobda') { + + // meobda implementation + $this->app->bind(NominationEnsembleController::class, MeobdaNominationEnsembleController::class); + $this->app->bind(NominationEnsembleEntryController::class, MeobdaNominationEnsembleEntryController::class); + $this->app->bind(NominationAdminController::class, MeobdaNominationAdminController::class); + $this->app->bind(NominationSeatingController::class, MeobdaNominationSeatingController::class); + } + } +} diff --git a/bootstrap/providers.php b/bootstrap/providers.php index eeeccb0..b64af49 100644 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -6,4 +6,5 @@ return [ App\Providers\InvoiceDataServiceProvider::class, App\Providers\PrintCardActionProvider::class, Barryvdh\Debugbar\ServiceProvider::class, + App\Providers\NominationEnsembleServiceProvider::class, ]; diff --git a/database/factories/StudentFactory.php b/database/factories/StudentFactory.php index 99efec3..4aa2410 100644 --- a/database/factories/StudentFactory.php +++ b/database/factories/StudentFactory.php @@ -17,12 +17,13 @@ class StudentFactory extends Factory */ public function definition(): array { - $school = School::factory()->create(); return [ - 'school_id' => $school->id, + 'school_id' => function () { + return School::factory()->create()->id; + }, 'first_name' => fake()->firstName(), 'last_name' => fake()->lastName(), - 'grade' => rand(7,12), + 'grade' => rand(7, 12), ]; } } diff --git a/database/seeders/MeobdaNominationEnsembleAndEntrySeeder.php b/database/seeders/MeobdaNominationEnsembleAndEntrySeeder.php new file mode 100644 index 0000000..7f8025f --- /dev/null +++ b/database/seeders/MeobdaNominationEnsembleAndEntrySeeder.php @@ -0,0 +1,78 @@ +truncate(); + DB::table('nomination_ensembles')->truncate(); + DB::statement('SET FOREIGN_KEY_CHECKS=1;'); + + // Create First Year Ensemble + $ensemble = new NominationEnsemble(); + $ensemble->name = 'Fake Band'; + $ensemble->entry_deadline = '2028-01-01'; + $ensemble->minimum_grade = 5; + $ensemble->maximum_grade = 8; + $instrumentNames = [ + 'Flute', + 'Oboe', + 'Bassoon', + 'Clarinet', + 'Bass Clarinet', + 'Contra Clarinet', + 'Alto Sax', + 'Tenor Sax', + 'Bari Sax', + 'Trumpet', + 'Horn', + 'Trombone', + 'Euphonium', + 'Tuba', + 'String Bass', + 'Percussion', + ]; + foreach ($instrumentNames as $name) { + $instruments[] = [ + 'name' => $name, + 'max' => null, + ]; + } + $data = [ + 'instruments' => $instruments, + 'max_nominations' => 8, + 'split_names' => ['Fake Red', 'Fake Black'], + ]; + $ensemble->data = $data; + $ensemble->save(); + + // Fill the nominations table + $faker = Faker::create(); + $schools = School::all(); + foreach ($schools as $school) { + $students = Student::factory()->count(10)->create(['school_id' => $school->id, 'grade' => 5]); + foreach ($students as $student) { + $nomData = [ + 'instrument' => $faker->randomElement($instrumentNames), + ]; + NominationEnsembleEntry::create([ + 'student_id' => $student->id, + 'nomination_ensemble_id' => $ensemble->id, + 'data' => $nomData, + ]); + } + } + } +} diff --git a/resources/views/admin/audition-settings.blade.php b/resources/views/admin/audition-settings.blade.php index 70a434e..adb0651 100644 --- a/resources/views/admin/audition-settings.blade.php +++ b/resources/views/admin/audition-settings.blade.php @@ -28,6 +28,9 @@ + diff --git a/resources/views/nomination_ensembles/meobda/admin/ensembles.blade.php b/resources/views/nomination_ensembles/meobda/admin/ensembles.blade.php new file mode 100644 index 0000000..78051e8 --- /dev/null +++ b/resources/views/nomination_ensembles/meobda/admin/ensembles.blade.php @@ -0,0 +1,84 @@ + + Nomination Ensembles (MEOBDA Rules) + + + + Add Nomination Ensemble + + + + + + + + + + Instrument List (One per line. Add :x to set a limit per school) + + + + + + + + + + Nomination Ensembles +
+ @foreach($ensembles as $ensemble) + + + {{ $ensemble->name }} + + + + Are you sure you want to delete this nomination ensemble? + + + + + @method('PATCH') + + + + + + + + + + + + + Instrument List (One per line. Add :x to set a limit per school) + @foreach($ensemble->data['instruments'] as $instrument){{ trim($instrument['name']) }}@if($instrument['max']):{{trim($instrument['max'])}}@endif{{PHP_EOL}}@endforeach + + + + + + @endforeach +
+
+
+ + + + + +
diff --git a/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php new file mode 100644 index 0000000..0f47a63 --- /dev/null +++ b/resources/views/nomination_ensembles/meobda/admin/nominations.blade.php @@ -0,0 +1,82 @@ + + + Nomination Administration + + Filters + + + + + + School + + @foreach($schools as $school) + + @endforeach + + + + Ensemble / Instrument + + @foreach ($sections as $value => $name) + + @endforeach + + + + Split + + @foreach ($splits as $value => $name) + + @endforeach + + +
+

 

+ Clear Filters +
+ + +
+
+
+ + +
+ {{ $nominations->onEachSide(3)->links() }} +
+ + Nominations + + + + Name + School + Nominated For + Split + Seat + + + + @foreach($nominations as $nomination) + + {{ $nomination->student->full_name('fl') }} + {{ $nomination->student->school->name }} + {{ $nomination->ensemble->name }} - {{ $nomination->data['instrument'] }} + {{ $nomination->data['split'] ?? '---' }} + {{ $nomination->data['seat'] ?? '---' }} + + @endforeach + + + + + +
diff --git a/resources/views/nomination_ensembles/meobda/admin/seating.blade.php b/resources/views/nomination_ensembles/meobda/admin/seating.blade.php new file mode 100644 index 0000000..f1024d3 --- /dev/null +++ b/resources/views/nomination_ensembles/meobda/admin/seating.blade.php @@ -0,0 +1,65 @@ + + Nomination Ensemble Seating + +
+ +
+ +
+ +
+ @if($ensemble) + + + {{ $ensemble->name }} + + + @if($ensemble->data['seated'] ?? false) + + Clear Seats + @else + + Seat + @endif + + + + + + @if($ensemble->data['seated'] ?? false) + @foreach($ensemble->data['split_names'] as $split) + + {{ $split }} + @foreach ($ensemble->data['instruments'] as $instrument) + @continue(! $nominations[$split]->has($instrument['name'])) + + {{ $instrument['name'] }} + + + @foreach($nominations[$split][$instrument['name']] as $thisNomination) + {{ $thisNomination->data['seat'] }} - {{ $thisNomination->student->full_name() }}, {{ $thisNomination->student->school->name }} + + @endforeach + + @endforeach + + + @endforeach + @endif + + @endif +
+ + +
+
diff --git a/resources/views/nomination_ensembles/meobda/entries/index.blade.php b/resources/views/nomination_ensembles/meobda/entries/index.blade.php new file mode 100644 index 0000000..3c603d3 --- /dev/null +++ b/resources/views/nomination_ensembles/meobda/entries/index.blade.php @@ -0,0 +1,78 @@ + + Nominations + + + @foreach($ensembles as $ensemble) + + {{ $ensemble->name }} + + {{ $ensemble->data['max_nominations'] }} nominations accepted
+ Entry Deadline {{ \Carbon\Carbon::parse($ensemble->entry_deadline)->format('M j, Y') }} +
+ + Existing Nominations + + + + Student + Grade + Instrument + + + + @foreach($existingNominations[$ensemble->id] as $nom) + + + {{ $nom->student->full_name() }} + + {{ $nom->student->grade }} + {{ $nom->data['instrument'] }} + @if(!$past_deadline[$ensemble->id]) + + + Confirm you wish to delete the nomination + of {{ $nom->student->full_name() }}
+ for the {{ $ensemble->name }} ensemble. +
+
+ @endif + + @endforeach +
+
+
+ + @if($nominationsAvailable[$ensemble->id] && !$past_deadline[$ensemble->id]) + + New Entry + + + + + @foreach($availableStudents[$ensemble->id] as $student) + + @endforeach + + + + @foreach($availableInstruments[$ensemble->id] as $instrument) + + @endforeach + + + Add Nomination + + + + + @endif + +
+ @endforeach +
+
diff --git a/resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php b/resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php index 4370a76..5b0c752 100644 --- a/resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php +++ b/resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php @@ -38,6 +38,7 @@ @endif + @foreach($ensemble->data['instruments'] as $instrument) @php($seatOn = 1)