Nomination admin page working for MEOBDA rules.

This commit is contained in:
Matt Young 2025-02-14 11:52:05 -06:00
parent 60abd7de0f
commit 16e72ff06c
4 changed files with 178 additions and 7 deletions

View File

@ -0,0 +1,94 @@
<?php
namespace App\Http\Controllers\NominationEnsembles;
use App\Http\Controllers\Controller;
use App\Models\NominationEnsemble;
use App\Models\NominationEnsembleEntry;
use App\Models\School;
class MeobdaNominationAdminController extends Controller implements NominationAdminController
{
public function index()
{
if (request('newFilterParameters')) {
$newFilterData = request()->validate([
'school' => 'nullable|exists:schools,id',
'ensemble' => 'nullable|exists:nomination_ensembles,id',
'section' => 'nullable|string',
'newFilterParameters' => 'string',
]);
session()->put('nominationAdminFilters', $newFilterData);
$filterData = $newFilterData;
} elseif (session()->has('nominationAdminFilters')) {
$filterData = session()->get('nominationAdminFilters');
} else {
$filterData = [];
}
dump($filterData);
// Populate variables to complete the filter form
$schools = School::orderBy('name')->get();
$ensembles = NominationEnsemble::all();
$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['ensemble'] ?? false) {
$nominations = $nominations->where('nomination_ensemble_id', $filterData['ensemble']);
}
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]);
}
}
$nominations = $nominations->paginate(50);
$sections = [];
foreach ($ensembles as $ensemble) {
$sections[$ensemble->id.'---'.'all'] = $ensemble->name.' - ALL';
foreach ($ensemble->data['instruments'] as $instrument) {
$sections[$ensemble->id.'---'.$instrument['name']] = $ensemble->name.' - '.$instrument['name'];
}
}
return view('nomination_ensembles.meobda.admin.nominations',
compact('nominations', 'schools', 'filterData', 'ensembles', 'sections'));
}
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.
}
}

View File

@ -2,6 +2,7 @@
namespace App\Providers; namespace App\Providers;
use App\Http\Controllers\NominationEnsembles\MeobdaNominationAdminController;
use App\Http\Controllers\NominationEnsembles\MeobdaNominationEnsembleController; use App\Http\Controllers\NominationEnsembles\MeobdaNominationEnsembleController;
use App\Http\Controllers\NominationEnsembles\MeobdaNominationEnsembleEntryController; use App\Http\Controllers\NominationEnsembles\MeobdaNominationEnsembleEntryController;
use App\Http\Controllers\NominationEnsembles\NominationAdminController; use App\Http\Controllers\NominationEnsembles\NominationAdminController;
@ -20,10 +21,10 @@ class NominationEnsembleServiceProvider extends ServiceProvider
{ {
public function register(): void public function register(): void
{ {
$this->app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class); // $this->app->bind(NominationEnsembleController::class, ScobdaNominationEnsembleController::class);
$this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class); // $this->app->bind(NominationEnsembleEntryController::class, ScobdaNominationEnsembleEntryController::class);
$this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class); // $this->app->bind(NominationAdminController::class, ScobdaNominationAdminController::class);
$this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class); // $this->app->bind(NominationSeatingController::class, ScobdaNominationSeatingController::class);
} }
public function boot(): void public function boot(): void
@ -40,6 +41,7 @@ class NominationEnsembleServiceProvider extends ServiceProvider
// meobda implementation // meobda implementation
$this->app->bind(NominationEnsembleController::class, MeobdaNominationEnsembleController::class); $this->app->bind(NominationEnsembleController::class, MeobdaNominationEnsembleController::class);
$this->app->bind(NominationEnsembleEntryController::class, MeobdaNominationEnsembleEntryController::class); $this->app->bind(NominationEnsembleEntryController::class, MeobdaNominationEnsembleEntryController::class);
$this->app->bind(NominationAdminController::class, MeobdaNominationAdminController::class);
} }
} }
} }

View File

@ -17,9 +17,10 @@ class StudentFactory extends Factory
*/ */
public function definition(): array public function definition(): array
{ {
$school = School::factory()->create();
return [ return [
'school_id' => $school->id, 'school_id' => function () {
return School::factory()->create()->id;
},
'first_name' => fake()->firstName(), 'first_name' => fake()->firstName(),
'last_name' => fake()->lastName(), 'last_name' => fake()->lastName(),
'grade' => rand(7, 12), 'grade' => rand(7, 12),

View File

@ -0,0 +1,74 @@
<x-layout.app>
<x-slot:page_title>Nomination Administration</x-slot:page_title>
<x-card.card class="mb-3">
<x-card.heading>Filters</x-card.heading>
<x-form.form method="GET" action="{{route('nomination.admin.index')}}">
<input type="hidden" name="newFilterParameters" value="true">
<x-form.body-grid class="my-2">
<x-form.select name="school" onchange="this.form.submit()">
<x-slot:label>School</x-slot:label>
<option value="">All</option>
@foreach($schools as $school)
<option value="{{ $school->id }}"
@if($school->id == ($filterData['school'] ?? null)) SELECTED @endif>
{{ $school->name }}
</option>
@endforeach
</x-form.select>
<x-form.select name="ensemble" onchange="this.form.submit()">
<x-slot:label>Ensemble</x-slot:label>
<option value="">All</option>
@foreach($ensembles as $ensemble)
<option value="{{ $ensemble->id }}"
@if($ensemble->id == ($filterData['ensemble'] ?? null)) SELECTED @endif>
{{ $ensemble->name }}
</option>
@endforeach
</x-form.select>
<x-form.select name="section" onchange="this.form.submit()" colspan="2">
<x-slot:label>Ensemble / Instrument</x-slot:label>
<option value="">All</option>
@foreach ($sections as $value => $name)
<option value="{{$value}}"
@if($value == ($filterData['section'] ?? null)) SELECTED @endif>
{{$name}}</option>
@endforeach
</x-form.select>
</x-form.body-grid>
</x-form.form>
</x-card.card>
<div class="px-3">
{{ $nominations->onEachSide(3)->links() }}
</div>
<x-card.card class="mt-3">
<x-card.heading>Nominations</x-card.heading>
<x-table.table id="nominationTable">
<thead>
<tr>
<x-table.th>Name</x-table.th>
<x-table.th>School</x-table.th>
<x-table.th>Nominated For</x-table.th>
</tr>
</thead>
<x-table.body>
@foreach($nominations as $nomination)
<tr>
<x-table.td>{{ $nomination->student->full_name('fl') }}</x-table.td>
<x-table.td>{{ $nomination->student->school->name }}</x-table.td>
<x-table.td>{{ $nomination->ensemble->name }} - {{ $nomination->data['instrument'] }}</x-table.td>
</tr>
@endforeach
</x-table.body>
</x-table.table>
</x-card.card>
</x-layout.app>