Recap Work for users

This commit is contained in:
Matt Young 2024-11-04 12:06:29 -06:00
parent 0c28cbfceb
commit e7d5794164
4 changed files with 112 additions and 0 deletions

View File

@ -0,0 +1,58 @@
<?php
namespace App\Http\Controllers;
use App\Actions\Tabulation\RankAuditionEntries;
use App\Models\Audition;
use Illuminate\Support\Facades\App;
class RecapController extends Controller
{
public function selectAudition()
{
$auditions = Audition::orderBy('score_order')->get();
return view('recap.selectAudition', compact('auditions'));
}
public function showRecap(Audition $audition)
{
$ranker = App::make(RankAuditionEntries::class);
$subscores = $audition->scoringGuide->subscores()->orderBy('tiebreak_order')->get();
$entries = $ranker->rank('seating', $audition);
$recapRows = [];
$rowOn = 1;
foreach ($entries as $entry) {
if ($entry->hasFlag('no_show')) {
continue;
}
$recapRows[$rowOn]['rank'] = $entry->raw_rank;
$recapRows[$rowOn]['name'] = $entry->student->full_name(true);
$recapRows[$rowOn]['school'] = $entry->student->school->name;
$recapRows[$rowOn]['entryId'] = $entry->id;
$recapRows[$rowOn]['scores'] = $entry['score_totals'];
$recapRows[$rowOn]['total_score'] = $entry['score_totals'][0];
$rowOn++;
}
//dd($recapRows);
// Calculate ordinals for each score
$subscoreOrdinals = [];
$ssOn = 1;
foreach ($subscores as $subscore) {
$sortedEntries = $entries->sortByDesc(function ($entry) use ($ssOn) {
return $entry['score_totals'][$ssOn] ?? 0;
});
$thisOrdinal = 1;
foreach ($sortedEntries as $entry) {
$subscoreOrdinals['entry'.$entry->id][$ssOn] = $thisOrdinal;
$thisOrdinal++;
}
$ssOn++;
}
return view('recap.recap',
compact('audition', 'subscores', 'entries', 'recapRows', 'subscoreOrdinals'));
}
}

View File

@ -0,0 +1,38 @@
<x-layout.app>
<x-layout.page-header>{{$audition->name}} Recap</x-layout.page-header>
<x-card.card class="mt-3">
<x-table.table>
<thead>
<tr>
<x-table.th>#</x-table.th>
<x-table.th>Name</x-table.th>
@foreach($subscores as $subscore)
<x-table.th>
{{ $subscore->name }}<br>
Weight: {{ $subscore->weight }}<br>
Max: {{ $subscore->max_score }}
</x-table.th>
@endforeach
<x-table.th>Final</x-table.th>
</tr>
</thead>
<x-table.body>
@foreach($recapRows as $row)
<tr>
<x-table.td>{{$row['rank']}}</x-table.td>
<x-table.td>{{$row['name']}}<br>{{$row['school']}}</x-table.td>
@php ($ssOn = 1)
@foreach($subscores as $subscore)
<x-table.td>{{ $row['scores'][$ssOn] }} ( {{ $subscoreOrdinals['entry'.$row['entryId']][$ssOn] }} )</x-table.td>
@php ($ssOn++)
@endforeach
<x-table.td>{{$row['total_score']}}</x-table.td>
</tr>
@endforeach
</x-table.body>
</x-table.table>
</x-card.card>
</x-layout.app>

View File

@ -0,0 +1,13 @@
<x-layout.app>
<x-slot:page_title>Recap - Select Audition</x-slot:page_title>
<x-card.card class="max-w-lg mx-auto">
<x-card.heading>Select Audition</x-card.heading>
<x-card.list.body>
@foreach($auditions as $audition)
<x-card.list.row>
<a href="{{route('recap.recap',$audition->id)}}">{{$audition->name}}</a>
</x-card.list.row>
@endforeach
</x-card.list.body>
</x-card.card>
</x-layout.app>

View File

@ -2,6 +2,7 @@
use App\Http\Controllers\FilterController; use App\Http\Controllers\FilterController;
use App\Http\Controllers\MonitorController; use App\Http\Controllers\MonitorController;
use App\Http\Controllers\RecapController;
use App\Http\Controllers\TestController; use App\Http\Controllers\TestController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
@ -15,6 +16,8 @@ Route::get('/test', [TestController::class, 'flashTest'])->middleware('auth', 'v
Route::view('/home', 'welcome')->middleware('guest')->name('landing'); Route::view('/home', 'welcome')->middleware('guest')->name('landing');
Route::view('/', 'landing')->name('home'); Route::view('/', 'landing')->name('home');
Route::get('/results', [App\Http\Controllers\ResultsPage::class, '__invoke'])->name('results'); Route::get('/results', [App\Http\Controllers\ResultsPage::class, '__invoke'])->name('results');
Route::get('/recap', [RecapController::class, 'selectAudition'])->name('recap.selectAudition');
Route::get('/recap/{audition}', [RecapController::class, 'showRecap'])->name('recap.recap');
// Filter Related Routes // Filter Related Routes
Route::prefix('filters')->middleware(['auth', 'verified'])->controller(FilterController::class)->group(function () { Route::prefix('filters')->middleware(['auth', 'verified'])->controller(FilterController::class)->group(function () {