diff --git a/app/Http/Controllers/GroupController.php b/app/Http/Controllers/GroupController.php index 4001480865b805c0f355dc1bf00e2ac040acd6e5..9e5d975b21353a4ab44d9213be03e886cb3c4cc4 100644 --- a/app/Http/Controllers/GroupController.php +++ b/app/Http/Controllers/GroupController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Http\Requests\FilterGroupsPostRequest; use App\Http\Requests\GroupPostRequest; use App\Models\Group; @@ -12,10 +13,10 @@ class GroupController extends Controller return view('groups.create'); } - public function list() + public function list(FilterGroupsPostRequest $request) { return view('groups.show', [ - 'groups' => Group::paginate(5), + 'groups' => Group::filter($request->validated())->paginate(5), ]); } diff --git a/app/Http/Controllers/JournalController.php b/app/Http/Controllers/JournalController.php index 87db8799bcaef6c9dc2a42561d5d5b03d38430bc..ac38b4e01a3c615a6893c6dc929d3d5e70c210fc 100644 --- a/app/Http/Controllers/JournalController.php +++ b/app/Http/Controllers/JournalController.php @@ -18,7 +18,7 @@ class JournalController extends Controller public function journal(JournalPostRequest $request) { - $students = Student::groups($request->validated())->get(); + $students = Student::filter($request->validated())->get(); $subjects = Subject::all()->whereIn('id', Mark::all()->whereIn('student_id', $students->pluck('id'))->pluck('subject_id')); $avg = Mark::all()->whereIn('student_id', $students->pluck('id'))->groupBy('subject_id')->sortKeys(); diff --git a/app/Http/Controllers/StudentController.php b/app/Http/Controllers/StudentController.php index 0f3e6f1e53b7adc0a469b533e31ffec267257b91..b7864f2037269c15fd66b35362c04f202f79a4fe 100644 --- a/app/Http/Controllers/StudentController.php +++ b/app/Http/Controllers/StudentController.php @@ -28,10 +28,9 @@ class StudentController extends Controller public function list(FilterStudentPostRequest $request) { return view('students.show', [ - 'students' => Student::groups($request->validated())->paginate(5), + 'students' => Student::filter($request->validated())->paginate(5), 'groups' => Group::all(), ]); - } public function edit(Student $student) diff --git a/app/Http/Controllers/SubjectController.php b/app/Http/Controllers/SubjectController.php index 77ae24c0c200ae73460ab6474b0eaa6e13a2569e..62d97e96c6d5f939fa512863373dc462afcc7d7d 100644 --- a/app/Http/Controllers/SubjectController.php +++ b/app/Http/Controllers/SubjectController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Http\Requests\FilterSubjectsPostRequest; use App\Http\Requests\SubjectPostRequest; use App\Models\Subject; @@ -12,10 +13,10 @@ class SubjectController extends Controller return view('subjects.create'); } - public function list() + public function list(FilterSubjectsPostRequest $request) { return view('subjects.show', [ - 'subjects' => Subject::paginate(5), + 'subjects' => Subject::filter($request->validated())->paginate(5), ]); } diff --git a/app/Http/Requests/FilterGroupsPostRequest.php b/app/Http/Requests/FilterGroupsPostRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..8fd78acc0dbf22d2f9f6f887afc4a943d31c5eaf --- /dev/null +++ b/app/Http/Requests/FilterGroupsPostRequest.php @@ -0,0 +1,20 @@ +<?php + +namespace App\Http\Requests; + +use Illuminate\Foundation\Http\FormRequest; + +class FilterGroupsPostRequest extends FormRequest +{ + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'name' => ['string', 'max:255', 'min:3'], + ]; + } +} diff --git a/app/Http/Requests/FilterStudentPostRequest.php b/app/Http/Requests/FilterStudentPostRequest.php index eaadd8ab812332f0fa05545d27a9b018fe13b3ea..5ab676211c60b8a789e96bab28ada37daeaf0fea 100644 --- a/app/Http/Requests/FilterStudentPostRequest.php +++ b/app/Http/Requests/FilterStudentPostRequest.php @@ -14,7 +14,11 @@ class FilterStudentPostRequest extends FormRequest public function rules() { return [ - 'group_id' => ['integer', 'exists:groups,id'], + 'group_id' => ['integer', 'nullable', 'exists:groups,id'], + 'date_of_birth' => ['date', 'nullable', 'after:01.01.2010'], + 'name' => ['string', 'nullable'], + 'surname' => ['string', 'nullable'], + 'patronymic' => ['string', 'nullable'], ]; } } diff --git a/app/Http/Requests/FilterSubjectsPostRequest.php b/app/Http/Requests/FilterSubjectsPostRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..6be1177378bacfaa9627f17db3b65d358a109d95 --- /dev/null +++ b/app/Http/Requests/FilterSubjectsPostRequest.php @@ -0,0 +1,20 @@ +<?php + +namespace App\Http\Requests; + +use Illuminate\Foundation\Http\FormRequest; + +class FilterSubjectsPostRequest extends FormRequest +{ + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'name' => ['string', 'max:255', 'min:3'], + ]; + } +} diff --git a/app/Models/Group.php b/app/Models/Group.php index 0b083d08f7face87b0a4509b46f35a999f17aa41..8007c8a199542fe430c1d91cbfa0e24c7d51524e 100644 --- a/app/Models/Group.php +++ b/app/Models/Group.php @@ -4,10 +4,12 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use App\Traits\ScopeTrait; class Group extends Model { use HasFactory; + use ScopeTrait; protected $fillable = [ 'name', diff --git a/app/Models/Student.php b/app/Models/Student.php index ad6c48f8e204df662cdb957fcf6b20c4d030961e..c580e9e4c6479c25ccd3968798fa68f31dcc5147 100644 --- a/app/Models/Student.php +++ b/app/Models/Student.php @@ -2,14 +2,13 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; use Illuminate\Notifications\Notifiable; use Laravel\Fortify\TwoFactorAuthenticatable; use Laravel\Jetstream\HasProfilePhoto; use Laravel\Sanctum\HasApiTokens; use Illuminate\Foundation\Auth\User as Authenticatable; +use App\Traits\ScopeTrait; class Student extends Authenticatable { @@ -19,6 +18,7 @@ class Student extends Authenticatable use HasProfilePhoto; use Notifiable; use TwoFactorAuthenticatable; + use ScopeTrait; protected $fillable = [ 'name', @@ -40,21 +40,6 @@ class Student extends Authenticatable return $this->belongsToMany(Subject::class, 'marks')->withPivot('mark'); } - /** - * Filter - * @param Builder $query - * @param array|null $request - * @return Builder - */ - public function scopeGroups(Builder $query, ?array $request = null) : Builder - { - if (isset($request)) { - $query->where($request); - } - - return $query; - } - public function getFullNameAttribute() : string { return $this->surname . " " . substr($this->name, 0, 1) . ". " . substr($this->patronymic, 0, 1); diff --git a/app/Models/Subject.php b/app/Models/Subject.php index 7cd21f2cd2879b453cff67ef90677f89a687b1c8..c436c7ac4d5f8047a3120acdaab41cd2649a14f8 100644 --- a/app/Models/Subject.php +++ b/app/Models/Subject.php @@ -4,10 +4,12 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use App\Traits\ScopeTrait; class Subject extends Model { use HasFactory; + use ScopeTrait; protected $fillable = [ 'name', diff --git a/app/Traits/ScopeTrait.php b/app/Traits/ScopeTrait.php new file mode 100644 index 0000000000000000000000000000000000000000..c1516551da8598a1d8dca6b947f99c1f444255a2 --- /dev/null +++ b/app/Traits/ScopeTrait.php @@ -0,0 +1,23 @@ +<?php + +namespace App\Traits; + +use Illuminate\Database\Eloquent\Builder; + +trait ScopeTrait +{ + /** + * Filter + * @param Builder $query + * @param array|null $params + * @return Builder + */ + public function scopeFilter(Builder $query, ?array $params = null) : Builder + { + if (isset($params)) { + $query->where(array_filter($params)); + } + + return $query; + } +} diff --git a/resources/views/groups/filter.blade.php b/resources/views/groups/filter.blade.php new file mode 100644 index 0000000000000000000000000000000000000000..5c6065d429eef78cc2f0d4b60589e1c7e3c58d2f --- /dev/null +++ b/resources/views/groups/filter.blade.php @@ -0,0 +1,13 @@ +<div class="card text-dark bg-light mt-4"> + <div class="card-header">Groups</div> + <form action={{ route('groups.list') }} method="get"> + @csrf + <div class="card-body"> + <div class="input-group mb-3"> + <label class="input-group-text" for="inputGroupSelect01">Group</label> + <input type="text" class="form-control" name="name"> + </div> + <button class="btn btn-primary">Find</button> + </div> + </form> +</div> diff --git a/resources/views/groups/show.blade.php b/resources/views/groups/show.blade.php index e15cb96f0c10ee8006d373fadcabba27748d9566..a239c03c13e75048f747263a2be7c87519a0028d 100644 --- a/resources/views/groups/show.blade.php +++ b/resources/views/groups/show.blade.php @@ -1,34 +1,37 @@ <x-app-layout> - <x-slot name="header"> - <h2 class="font-semibold text-xl text-gray-800 leading-tight"> - {{ __('Groups') }} - </h2> - </x-slot> <div class="container"> - <div class="row mx-auto mt-5"> - <a href="{{ route('groups.create') }}" class="w-100 btn btn-success">Add</a> - </div> - <div class="row"> - @foreach($groups as $group) - <div class="col-md-4 mb-5 mt-5"> - <div class="card"> - <div class="card-body"> - <h5 class="card-title">{{ $group->name }}</h5> - <a class="card-link btn btn-primary mb-3 mt-1" href={{ route('groups.edit_form', $group->id) }}>Edit</a> - <form action={{ route('groups.delete', $group->id) }} method="post"> - @csrf - <button class="btn btn-danger" href="#" type="submit">Delete</button> - </form> + @include('groups.filter') + <x-slot name="header"> + <h2 class="font-semibold text-xl text-gray-800 leading-tight"> + {{ __('Groups') }} + </h2> + </x-slot> + <div class="container"> + <div class="row mx-auto mt-5"> + <a href="{{ route('groups.create') }}" class="w-100 btn btn-success">Add</a> + </div> + <div class="row"> + @foreach($groups as $group) + <div class="col-md-4 mb-5 mt-5"> + <div class="card"> + <div class="card-body"> + <h5 class="card-title">{{ $group->name }}</h5> + <a class="card-link btn btn-primary mb-3 mt-1" href={{ route('groups.edit_form', $group->id) }}>Edit</a> + <form action={{ route('groups.delete', $group->id) }} method="post"> + @csrf + <button class="btn btn-danger" href="#" type="submit">Delete</button> + </form> + </div> + </div> + </div> + @endforeach </div> </div> - </div> - @endforeach - </div> - </div> - <div class="container"> - <div class="row"> - <div class="col-md-7 ml-md-auto"> - {{$groups->links()}} + <div class="container"> + <div class="row"> + <div class="col-md-7 ml-md-auto"> + {{ $groups->appends(array_filter(request()->toArray()))->links() }} + </div> </div> </div> </div> diff --git a/resources/views/students/filter.blade.php b/resources/views/students/filter.blade.php index fa7a7756542eb49969bf8d76609f09900890201f..0a8b22f22586e53ea6f7371eb356613ac8a7a36f 100644 --- a/resources/views/students/filter.blade.php +++ b/resources/views/students/filter.blade.php @@ -1,16 +1,33 @@ <div class="card text-dark bg-light mt-4"> - <div class="card-header">Groups</div> - <form action={{ route('students.list') }} method="post"> + <div class="card-header">Students</div> + <form action={{ route('students.list') }} method="get"> @csrf <div class="card-body"> - <div class="input-group mb-3"> - <label class="input-group-text" for="inputGroupSelect01">Group</label> + <div class="input-group mb-2"> + <label class="input-group-text w-32" for="inputGroupSelect01">Group</label> <select class="custom-select" id="inputGroupSelect01" name="group_id"> + <option value="null">All</option> @foreach($groups as $group) <option value="{{ $group->id }}">{{ $group->name }}</option> @endforeach </select> </div> + <div class="input-group "> + <label class="input-group-text w-32">Date of birth</label> + <input type="date" class="form-control" name="date_of_birth"> + </div> + <div class="input-group mt-2"> + <label class="input-group-text w-32">Name</label> + <input type="text" class="form-control" name="name"> + </div> + <div class="input-group mt-2"> + <label class="input-group-text w-32">Surname</label> + <input type="text" class="form-control" name="surname"> + </div> + <div class="input-group mt-2"> + <label class="input-group-text w-32">Patronymic</label> + <input type="text" class="form-control" name="patronymic"> + </div> <button class="btn btn-primary">Submit</button> </div> </form> diff --git a/resources/views/students/show.blade.php b/resources/views/students/show.blade.php index 5bb400d5857cb44d786ec5981291f931d744e291..dd4c50cd8130dd033a141eca52884dbd44833795 100644 --- a/resources/views/students/show.blade.php +++ b/resources/views/students/show.blade.php @@ -31,9 +31,7 @@ <div class="container"> <div class="row"> <div class="col-md-7 ml-md-auto"> - @if(! empty($students->items())) - {{ request()->get('group_id') ? $students->appends(['group_id'=>$students->first()->group->id])->links() : $students->links() }} - @endif + {{ $students->appends(array_filter(request()->toArray()))->links() }} </div> </div> </div> diff --git a/resources/views/subjects/filter.blade.php b/resources/views/subjects/filter.blade.php new file mode 100644 index 0000000000000000000000000000000000000000..9cf83ed68836bd0fb4e1362b3d993a76ca7348fa --- /dev/null +++ b/resources/views/subjects/filter.blade.php @@ -0,0 +1,13 @@ +<div class="card text-dark bg-light mt-4"> + <div class="card-header">Subjects</div> + <form action={{ route('subjects.list') }} method="get"> + @csrf + <div class="card-body"> + <div class="input-group mb-3"> + <label class="input-group-text" for="name">Group</label> + <input type="text" class="form-control" name="name"> + </div> + <button class="btn btn-primary">Find</button> + </div> + </form> +</div> diff --git a/resources/views/subjects/show.blade.php b/resources/views/subjects/show.blade.php index de5bc0533aa10b6667276f7e3993e0637d24da18..f17cba7e066b7bbc2a2e548759a237fe522c0476 100644 --- a/resources/views/subjects/show.blade.php +++ b/resources/views/subjects/show.blade.php @@ -5,6 +5,7 @@ </h2> </x-slot> <div class="container"> + @include('subjects.filter') <div class="row mx-auto mt-5"> <a href="{{ route('subjects.create') }}" class="w-100 btn btn-success">Add</a> </div> @@ -28,7 +29,7 @@ <div class="container"> <div class="row"> <div class="col-md-7 ml-md-auto"> - {{$subjects->links()}} + {{ $subjects->appends(array_filter(request()->toArray()))->links() }} </div> </div> </div> diff --git a/routes/web.php b/routes/web.php index 9673973ae209160afac262794ac77c161817c668..7f79e81cf2f5cc703532a810138a9f7243212f5f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -40,7 +40,7 @@ Route::prefix('students')->middleware('auth')->name('students.')->group(function Route::post('edit/{student}', [StudentController::class, 'update'])->name('edit'); Route::post('create', [StudentController::class, 'create'])->name('create'); Route::get('create', [StudentController::class, 'createForm'])->name('create_form'); - Route::match(['get', 'post'], 'list', [StudentController::class, 'list'])->name('list'); + Route::get('list', [StudentController::class, 'list'])->name('list'); Route::post('addMark/{student}', [StudentController::class, 'addMark'])->name('add_mark'); Route::get('deleteMark/{student}/{subject}', [StudentController::class, 'deleteMark'])->name('delete_mark'); });