Scobda nomination ensembles #106
|
|
@ -2,7 +2,13 @@
|
|||
|
||||
namespace App\Http\Controllers\NominationEnsembles;
|
||||
|
||||
use App\Models\NominationEnsemble;
|
||||
|
||||
interface NominationSeatingController
|
||||
{
|
||||
public function index();
|
||||
|
||||
public function show(NominationEnsemble $ensemble);
|
||||
|
||||
public function seat(NominationEnsemble $ensemble);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,11 +3,59 @@
|
|||
namespace App\Http\Controllers\NominationEnsembles;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\NominationEnsemble;
|
||||
use App\Models\NominationEnsembleEntry;
|
||||
|
||||
class ScobdaNominationSeatingController extends Controller implements NominationSeatingController
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,9 @@
|
|||
@if(auditionSetting('advanceTo'))
|
||||
<a href="{{ route('advancement.status') }}" class="block p-2 hover:text-indigo-600">{{ auditionSetting('advanceTo') }} Status</a>
|
||||
@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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
use App\Http\Controllers\NominationEnsembles\NominationAdminController;
|
||||
use App\Http\Controllers\NominationEnsembles\NominationEnsembleController;
|
||||
use App\Http\Controllers\NominationEnsembles\NominationEnsembleEntryController;
|
||||
use App\Http\Controllers\NominationEnsembles\NominationSeatingController;
|
||||
use App\Http\Middleware\CheckIfAdmin;
|
||||
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::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 () {
|
||||
|
|
|
|||
Loading…
Reference in New Issue