Work on seating function for SCOBDA nomination ensembles.

This commit is contained in:
Matt Young 2025-02-09 16:47:28 -06:00
parent 5c7dacc3da
commit ec6aa4aa53
5 changed files with 102 additions and 0 deletions

View File

@ -2,7 +2,13 @@
namespace App\Http\Controllers\NominationEnsembles; namespace App\Http\Controllers\NominationEnsembles;
use App\Models\NominationEnsemble;
interface NominationSeatingController interface NominationSeatingController
{ {
public function index(); public function index();
public function show(NominationEnsemble $ensemble);
public function seat(NominationEnsemble $ensemble);
} }

View File

@ -3,11 +3,59 @@
namespace App\Http\Controllers\NominationEnsembles; namespace App\Http\Controllers\NominationEnsembles;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\NominationEnsemble;
use App\Models\NominationEnsembleEntry;
class ScobdaNominationSeatingController extends Controller implements NominationSeatingController class ScobdaNominationSeatingController extends Controller implements NominationSeatingController
{ {
public function index() public function index()
{ {
$ensembles = NominationEnsemble::all();
$ensemble = null;
return view('nomination_ensembles.scobda.admin.seating.index', compact('ensembles', 'ensemble'));
}
public function show(NominationEnsemble $ensemble)
{
$ensembles = NominationEnsemble::all();
return view('nomination_ensembles.scobda.admin.seating.index', compact('ensembles', 'ensemble'));
} }
public function seat(NominationEnsemble $ensemble)
{
$nominations = NominationEnsembleEntry::where('nomination_ensemble_id',
$ensemble->id)->orderByRaw('CAST(data->"$.rank" AS UNSIGNED)')->get();
$rankGroupedNominations = $nominations->groupBy(function ($entry) {
return $entry->data['rank'];
});
$acceptedNominations = collect();
$rankOn = 1;
// Collect students to add to the ensemble
while ($rankOn <= $ensemble->data['max_nominations'] && $rankGroupedNominations->has($rankOn)) {
// If were at or over the target size of the ensemble, stop adding people
if ($acceptedNominations->count() >= $ensemble->data['target_size']) {
break;
}
// Add people of the current rank to the ensemble
foreach ($rankGroupedNominations[$rankOn] as $nomination) {
$acceptedNominations->push($nomination);
}
$rankOn++;
// If we want to round down the ensemble size, quit adding people if hte next rank will exceed the target
if (
$rankGroupedNominations->has($rankOn) &&
$acceptedNominations->count() + $rankGroupedNominations[$rankOn]->count() >= $ensemble->data['target_size'] &&
$ensemble->data['rounding_direction'] === 'down'
) {
break;
}
}
dd($acceptedNominations);
}
} }

View File

@ -33,6 +33,9 @@
@if(auditionSetting('advanceTo')) @if(auditionSetting('advanceTo'))
<a href="{{ route('advancement.status') }}" class="block p-2 hover:text-indigo-600">{{ auditionSetting('advanceTo') }} Status</a> <a href="{{ route('advancement.status') }}" class="block p-2 hover:text-indigo-600">{{ auditionSetting('advanceTo') }} Status</a>
@endif @endif
@if(auditionSetting('nomination_ensemble_rules') !== 'disabled')
<x-layout.navbar.menus.menu-item :href="route('nomination.admin.seating.index')">Nomination Ensemble Seating</x-layout.navbar.menus.menu-item>
@endif
</div> </div>

View File

@ -0,0 +1,38 @@
<x-layout.app>
<x-slot:page_title>Nomination Ensemble Seating</x-slot:page_title>
<div class="grid grid-cols-5 gap-3">
<div id="left-ensemble-list">
<nav class="flex flex-1 flex-col" aria-label="Sidebar Ensemble List">
<p class="text-md/6 font-semibold text-gray-800 mb-3">Select Ensemble</p>
<ul role="list" class="-mx2 space-y-1">
@foreach($ensembles as $menuItem)
<a href="{{ route('nomination.admin.seating.show',[$menuItem->id]) }}"
class="group flex gap-x-3 rounded-md p-2 pl-3 text-sm/6 font-semibold text-gray-700 hover:bg-gray-50 hover:text-indigo-600">
{{ $menuItem->name }}
</a>
@endforeach
</ul>
</nav>
</div>
<div id="seating-pane" class="col-span-4">
@if($ensemble)
<x-card.card>
<x-card.heading>
{{ $ensemble->name }}
<x-slot:right_side>
<x-form.form method="POST" action="{{ route('nomination.admin.seating.seat',[$ensemble]) }}">
<x-form.button>Seat Ensemble</x-form.button>
</x-form.form>
</x-slot:right_side>
</x-card.heading>
</x-card.card>
@endif
</div>
</div>
</x-layout.app>

View File

@ -3,6 +3,7 @@
use App\Http\Controllers\NominationEnsembles\NominationAdminController; use App\Http\Controllers\NominationEnsembles\NominationAdminController;
use App\Http\Controllers\NominationEnsembles\NominationEnsembleController; use App\Http\Controllers\NominationEnsembles\NominationEnsembleController;
use App\Http\Controllers\NominationEnsembles\NominationEnsembleEntryController; use App\Http\Controllers\NominationEnsembles\NominationEnsembleEntryController;
use App\Http\Controllers\NominationEnsembles\NominationSeatingController;
use App\Http\Middleware\CheckIfAdmin; use App\Http\Middleware\CheckIfAdmin;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
@ -17,6 +18,12 @@ Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('nomination
Route::prefix('nominations/')->controller(NominationAdminController::class)->group(function () { Route::prefix('nominations/')->controller(NominationAdminController::class)->group(function () {
Route::get('/', 'index')->name('nomination.admin.index'); Route::get('/', 'index')->name('nomination.admin.index');
}); });
Route::prefix('seating/')->controller(NominationSeatingController::class)->group(function () {
Route::get('/', 'index')->name('nomination.admin.seating.index');
Route::get('/{ensemble}', 'show')->name('nomination.admin.seating.show');
Route::post('/{ensemble}', 'seat')->name('nomination.admin.seating.seat');
});
}); });
Route::middleware(['auth', 'verified'])->prefix('nominations/')->group(function () { Route::middleware(['auth', 'verified'])->prefix('nominations/')->group(function () {