Scobda nomination ensembles #106
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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\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 () {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue