diff --git a/app/Containers/Dashboard/Actions/Schedules/GetAllScheduleIdsAction.php b/app/Containers/Dashboard/Actions/Schedules/GetAllScheduleIdsAction.php new file mode 100644 index 0000000..0049d37 --- /dev/null +++ b/app/Containers/Dashboard/Actions/Schedules/GetAllScheduleIdsAction.php @@ -0,0 +1,17 @@ +task->run($filters); + } +} diff --git a/app/Containers/Dashboard/Tasks/Schedules/GetFilteredScheduleIdsTask.php b/app/Containers/Dashboard/Tasks/Schedules/GetFilteredScheduleIdsTask.php new file mode 100644 index 0000000..3eb8453 --- /dev/null +++ b/app/Containers/Dashboard/Tasks/Schedules/GetFilteredScheduleIdsTask.php @@ -0,0 +1,31 @@ +where('educational_group_id', $filters['educational_group_id']); + } + + if (!empty($filters['education_form_id'])) { + $query->whereHas('educationalGroup', function ($q) use ($filters) { + $q->where('education_form_id', $filters['education_form_id']); + }); + } + + if (!empty($filters['search'])) { + $query->whereHas('educationalGroup', function ($q) use ($filters) { + $q->where('title', 'like', '%' . $filters['search'] . '%'); + }); + } + + return $query->pluck('id')->toArray(); + } +} diff --git a/app/Containers/Dashboard/UI/WEB/Controllers/ScheduleController.php b/app/Containers/Dashboard/UI/WEB/Controllers/ScheduleController.php index e3f2dbf..3d9ee5b 100644 --- a/app/Containers/Dashboard/UI/WEB/Controllers/ScheduleController.php +++ b/app/Containers/Dashboard/UI/WEB/Controllers/ScheduleController.php @@ -6,6 +6,7 @@ use App\Containers\Dashboard\Actions\Schedules\CreateScheduleAction; use App\Containers\Dashboard\Actions\Schedules\UpdateScheduleAction; use App\Containers\Dashboard\Actions\Schedules\DeleteScheduleAction; use App\Containers\Dashboard\Actions\Schedules\BulkDeleteSchedulesAction; +use App\Containers\Dashboard\Actions\Schedules\GetAllScheduleIdsAction; use App\Containers\Dashboard\Actions\Schedules\ListSchedulesAction; use App\Containers\Dashboard\UI\WEB\Requests\StoreScheduleRequest; use App\Containers\Dashboard\UI\WEB\Requests\UpdateScheduleRequest; @@ -25,6 +26,7 @@ class ScheduleController extends Controller private readonly UpdateScheduleAction $updateScheduleAction, private readonly DeleteScheduleAction $deleteScheduleAction, private readonly BulkDeleteSchedulesAction $bulkDeleteSchedulesAction, + private readonly GetAllScheduleIdsAction $getAllScheduleIdsAction, ) {} /** @@ -170,4 +172,16 @@ class ScheduleController extends Controller ->with('error', 'Ошибка при удалении: ' . $e->getMessage()); } } + + /** + * Все ID расписаний с учётом фильтров (для массового выделения) + */ + public function allIds(Request $request): \Illuminate\Http\JsonResponse + { + $filters = $request->only(['search', 'educational_group_id', 'education_form_id']); + + $ids = $this->getAllScheduleIdsAction->run($filters); + + return response()->json(['ids' => $ids, 'total' => count($ids)]); + } } diff --git a/app/Containers/Dashboard/UI/WEB/Routes/web.php b/app/Containers/Dashboard/UI/WEB/Routes/web.php index 6e44d6c..7f9fe1e 100755 --- a/app/Containers/Dashboard/UI/WEB/Routes/web.php +++ b/app/Containers/Dashboard/UI/WEB/Routes/web.php @@ -199,6 +199,7 @@ Route::middleware(['access-check', 'dashboard.auth', 'dashboard.permission'])->g Route::get('/create', [ScheduleController::class, 'create'])->name('create'); Route::post('/', [ScheduleController::class, 'store'])->name('store'); Route::delete('/bulk-destroy', [ScheduleController::class, 'bulkDestroy'])->name('bulk-destroy'); + Route::get('/all-ids', [ScheduleController::class, 'allIds'])->name('all-ids'); Route::get('/{schedule}/edit', [ScheduleController::class, 'edit'])->name('edit'); Route::put('/{schedule}', [ScheduleController::class, 'update'])->name('update'); Route::delete('/{schedule}', [ScheduleController::class, 'destroy'])->name('destroy'); diff --git a/resources/js/Pages/Dashboard/Schedules/Index.vue b/resources/js/Pages/Dashboard/Schedules/Index.vue index 24f1b56..23b6c00 100644 --- a/resources/js/Pages/Dashboard/Schedules/Index.vue +++ b/resources/js/Pages/Dashboard/Schedules/Index.vue @@ -37,6 +37,11 @@ class="text-xs text-muted-foreground-1 hover:text-primary transition-colors"> Выбрать все на странице +