Filters working on admin entries page

This commit is contained in:
Matt Young 2024-06-03 11:41:53 -05:00
parent 91f47717d3
commit d5fd164049
6 changed files with 127 additions and 3 deletions

View File

@ -15,8 +15,50 @@ class EntryController extends Controller
public function index()
{
if(! Auth::user()->is_admin) abort(403);
$entries = Entry::with(['student.school','audition'])->orderBy('updated_at','DESC')->paginate(10);
return view('admin.entries.index', ['entries' => $entries] );
$filters = session('adminEntryFilters');
$minGrade = Audition::min('minimum_grade');
$maxGrade = Audition::max('maximum_grade');
$auditions = Audition::orderBy('score_order')->get();
$schools = School::orderBy('name')->get();
$entries = Entry::with(['student.school','audition']);
$entries->orderBy('updated_at','DESC');
if($filters) {
if($filters['audition']) {
$entries->where('audition_id', $filters['audition']);
}
if($filters['school']) {
$entries->whereHas('student', function($query) use ($filters) {
$query->where('school_id', '=', $filters['school']);
});
}
if($filters['grade']) {
$entries->whereHas('student', function($query) use ($filters) {
$query->where('grade', $filters['grade']);
});
}
if($filters['first_name']) {
$entries->whereHas('student', function($query) use ($filters) {
$query->where('first_name', 'like', '%' . $filters['first_name'] . '%');
});
}
if($filters['last_name']) {
$entries->whereHas('student', function($query) use ($filters) {
$query->where('last_name', 'like', '%' . $filters['last_name'] . '%');
});
}
}
$entries = $entries->paginate(10);
return view('admin.entries.index', ['entries' => $entries,
'auditions' => $auditions,
'schools'=> $schools,
'minGrade' => $minGrade,
'maxGrade' => $maxGrade,
'filters' => $filters] );
}
public function create()

View File

@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FilterController extends Controller
{
public function adminEntryFilter(Request $request)
{
$filters = array();
$filters['audition'] = request('audition_filter') ? request('audition_filter') : null;
$filters['school'] = request('school_filter') ? request('school_filter') : null;
$filters['grade'] = request('grade_filter') ? request('grade_filter') : null;
$filters['first_name'] = request('first_name_filter') ? request('first_name_filter') : null;
$filters['last_name'] = request('last_name_filter') ? request('last_name_filter') : null;
// session(['admin_entry_filter', $filters]);
session(['adminEntryFilters' => $filters]);
return redirect('/admin/entries');
}
public function clearAdminEntryFilter(Request $request)
{
session()->forget('adminEntryFilters');
return redirect('/admin/entries');
}
}

View File

@ -1,7 +1,52 @@
<x-layout.app>
<x-slot:page_title>Entry Administration</x-slot:page_title>
{{-- Filter Control--}}
<x-card.card>
<x-card.heading>Set Filters</x-card.heading>
<x-form.form action="/filters/admin_entry_filter" method="POST">
<x-form.body-grid columns="12">
<x-form.select name="audition_filter" colspan="5">
<x-slot:label>Audition</x-slot:label>
<option value="">No Audition Filter</option>
@foreach($auditions as $audition)
<option value="{{ $audition->id }}" {{ ($filters['audition'] ?? null) == $audition->id ? 'SELECTED':'' }}>
{{ $audition->name }}
</option>
@endforeach
</x-form.select>
<x-form.select name="school_filter" colspan="5">
<x-slot:label>School</x-slot:label>
<option value="">No School Filter</option>
@foreach($schools as $school)
<option value="{{ $school->id }}" {{ ($filters['school'] ?? null) == $school->id ? 'SELECTED':'' }}>
{{ $school->name }}
</option>
@endforeach
</x-form.select>
<x-form.select name="grade_filter" colspan="2">
<x-slot:label>Grade</x-slot:label>
<option value="">No Grade Filter</option>
@php($n = $minGrade)
@while($n <= $maxGrade)
<option value="{{ $n }}" {{ ($filters['grade'] ?? null) == $n ? 'SELECTED':'' }}>
{{ $n }}
</option>
@php($n++);
@endwhile
</x-form.select>
<x-form.field name="first_name_filter" colspan="6" label_text="First Name" value="{{ ($filters['first_name'] ?? null) }}"/>
<x-form.field name="last_name_filter" colspan="6" label_text="Last Name" value="{{ ($filters['last_name'] ?? null) }}"/>
</x-form.body-grid>
<x-form.footer>
<x-form.button-nocolor href="filters/admin_entry_filter/clear">Clear Filters</x-form.button-nocolor>
<x-form.button>Apply Filters</x-form.button>
</x-form.footer>
</x-form.form>
</x-card.card>
{{-- Results Table--}}
<x-card.card class="mt-4">
<x-table.table with_title_area>
<x-slot:title class="ml-3">Entries</x-slot:title>
<x-slot:subtitle class="ml-3">Click id to edit</x-slot:subtitle>

View File

@ -16,7 +16,7 @@
'11' => 'sm:grid-cols-11',
'12' => 'sm:grid-cols-12'
];
$classes = "grid max-w-2xl grid-cols-1 gap-x-6 gap-y-3 ";
$classes = "grid grid-cols-1 gap-x-6 gap-y-3 ";
$classes .= $columnClasses["$columns"]
@endphp
<div {{ $attributes->merge(['class' => $classes]) }}>

View File

@ -5,5 +5,7 @@
{{ Audition::max('maximum_grade') }} is the oldest grade used. <br>
{{ Audition::min('minimum_grade') }} is the youngest grade.
@php( session(['testFnameFilter' => 'Matt']))
</x-layout.app>

View File

@ -2,6 +2,7 @@
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\EntryController;
use App\Http\Controllers\FilterController;
use App\Http\Controllers\SchoolController;
use App\Http\Controllers\StudentController;
use App\Http\Controllers\TestController;
@ -103,6 +104,12 @@ Route::middleware(['auth','verified'])->controller(SchoolController::class)->gro
Route::patch('/schools/{school}','update');
});
// Filter Related Routes
Route::prefix('filters')->middleware(['auth','verified'])->controller(FilterController::class)->group(function() {
Route::post('/admin_entry_filter','adminEntryFilter');
Route::get('/admin_entry_filter/clear','clearAdminEntryFilter');
});
//Route::get('/my_school', [SchoolController::class, 'my_school'])->middleware('auth','verified');
//Route::get('/schools/create', [SchoolController::class, 'create'])->middleware('auth','verified');