Add search functionality to admin students page.

Closes #28
This commit is contained in:
Matt Young 2024-10-27 20:55:34 -05:00
parent d76236b47a
commit cce7abdaf6
4 changed files with 82 additions and 3 deletions

View File

@ -11,6 +11,7 @@ use Illuminate\Support\Facades\Auth;
use function abort; use function abort;
use function auth; use function auth;
use function compact;
use function request; use function request;
use function to_route; use function to_route;
use function view; use function view;
@ -22,9 +23,28 @@ class StudentController extends Controller
if (! Auth::user()->is_admin) { if (! Auth::user()->is_admin) {
abort(403); abort(403);
} }
$students = Student::with(['school'])->withCount('entries')->orderBy('last_name')->orderBy('first_name')->paginate(15); $filters = session('adminStudentFilters') ?? null;
$schools = School::orderBy('name')->get();
$students = Student::with(['school'])->withCount('entries')->orderBy('last_name')->orderBy('first_name');
// Apply filters
if ($filters) {
if ($filters['first_name']) {
$students = $students->where('first_name', 'like', '%'.$filters['first_name'].'%');
}
if ($filters['last_name']) {
$students = $students->where('last_name', 'like', '%'.$filters['last_name'].'%');
}
if ($filters['school'] && $filters['school'] != 'all') {
$students = $students->where('school_id', $filters['school']);
}
if ($filters['grade'] && $filters['grade'] != 'all') {
$students = $students->where('grade', $filters['grade']);
}
}
$students = $students->paginate(15);
$grades = Student::distinct()->pluck('grade');
return view('admin.students.index', ['students' => $students]); return view('admin.students.index', compact('students', 'schools', 'grades'));
} }
public function create() public function create()
@ -162,4 +182,9 @@ class StudentController extends Controller
return to_route('admin.students.index')->with('success', 'Student '.$name.' deleted successfully.'); return to_route('admin.students.index')->with('success', 'Student '.$name.' deleted successfully.');
} }
public function set_filter()
{
//
}
} }

View File

@ -8,7 +8,7 @@ class FilterController extends Controller
{ {
public function adminEntryFilter(Request $request) public function adminEntryFilter(Request $request)
{ {
$filters = array(); $filters = [];
$filters['id'] = request('id_filter') ?? null; $filters['id'] = request('id_filter') ?? null;
$filters['audition'] = request('audition_filter') ? request('audition_filter') : null; $filters['audition'] = request('audition_filter') ? request('audition_filter') : null;
$filters['school'] = request('school_filter') ? request('school_filter') : null; $filters['school'] = request('school_filter') ? request('school_filter') : null;
@ -17,12 +17,34 @@ class FilterController extends Controller
$filters['last_name'] = request('last_name_filter') ? request('last_name_filter') : null; $filters['last_name'] = request('last_name_filter') ? request('last_name_filter') : null;
session(['adminEntryFilters' => $filters]); session(['adminEntryFilters' => $filters]);
return redirect('/admin/entries')->with('success', 'Filters Applied'); return redirect('/admin/entries')->with('success', 'Filters Applied');
} }
public function clearAdminEntryFilter(Request $request) public function clearAdminEntryFilter(Request $request)
{ {
session()->forget('adminEntryFilters'); session()->forget('adminEntryFilters');
return redirect('/admin/entries')->with('success', 'Filters Cleared'); return redirect('/admin/entries')->with('success', 'Filters Cleared');
} }
public function adminStudentFilter(Request $request)
{
$filters = [];
$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(['adminStudentFilters' => $filters]);
return redirect()->back()->with('success', 'Filters Applied');
}
public function clearAdminStudentFilter()
{
session()->forget('adminStudentFilters');
return redirect(route('admin.students.index'))->with('success', 'Filters Cleared');
}
} }

View File

@ -1,6 +1,36 @@
<x-layout.app> <x-layout.app>
<x-slot:page_title>Student Administration</x-slot:page_title> <x-slot:page_title>Student Administration</x-slot:page_title>
<x-card.card class="mb-3">
<x-card.heading>Filter Students</x-card.heading>
<x-form.form method="post" action="{{route('admin.students.filter.set')}}">
<x-form.body-grid columns="11">
<x-form.field colspan="3" name="first_name_filter" label_text="First Name" value="{{ session('adminStudentFilters')['first_name'] ?? ''}}"/>
<x-form.field colspan="3" name="last_name_filter" label_text="Last Name" value="{{session('adminStudentFilters')['last_name'] ?? ''}}"/>
<x-form.select name="school_filter" colspan="3">
<x-slot:label>School</x-slot:label>
<option value="all" @if((session('adminStudentFilters')['school'] ?? null) == "all") selected @endif>All Schools</option>
@foreach($schools as $school)
<option value="{{$school->id}}" @if((session('adminStudentFilters')['school'] ?? null) == $school->id) selected @endif>{{$school->name}}</option>
@endforeach
</x-form.select>
<x-form.select name="grade_filter" colspan="2">
<x-slot:label>Grade</x-slot:label>
<option value="all" @if((session('adminStudentFilters')['grade'] ?? null) == "all") selected @endif>All Grades</option>
@foreach($grades as $grade)
<option value="{{$grade}}" @if((session('adminStudentFilters')['grade'] ?? null) == $grade) selected @endif>{{$grade}}</option>
@endforeach
</x-form.select>
</x-form.body-grid>
<x-form.footer class="pb-3">
<x-form.button-nocolor href="{{ route('admin.students.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>
<x-card.card> <x-card.card>
<x-table.table with_title_area> <x-table.table with_title_area>
<x-slot:title class="ml-3">Students</x-slot:title> <x-slot:title class="ml-3">Students</x-slot:title>

View File

@ -19,6 +19,8 @@ Route::get('/results', [App\Http\Controllers\ResultsPage::class, '__invoke'])->n
Route::prefix('filters')->middleware(['auth', 'verified'])->controller(FilterController::class)->group(function () { Route::prefix('filters')->middleware(['auth', 'verified'])->controller(FilterController::class)->group(function () {
Route::post('/admin_entry_filter', 'adminEntryFilter')->name('admin_entry_filter.set'); Route::post('/admin_entry_filter', 'adminEntryFilter')->name('admin_entry_filter.set');
Route::get('/admin_entry_filter/clear', 'clearAdminEntryFilter')->name('admin_entry_filter.clear'); Route::get('/admin_entry_filter/clear', 'clearAdminEntryFilter')->name('admin_entry_filter.clear');
Route::post('/admin_student_filter', 'adminStudentFilter')->name('admin.students.filter.set');
Route::get('/admin_student_filter/clear', 'clearAdminStudentFilter')->name('admin.students.filter.clear');
}); });
//Route::get('/my_school', [SchoolController::class, 'my_school'])->middleware('auth','verified'); //Route::get('/my_school', [SchoolController::class, 'my_school'])->middleware('auth','verified');