From fdafb76461f5e5d78d106a49915a8a9afc3b16d7 Mon Sep 17 00:00:00 2001 From: Adrian Hopek Date: Thu, 3 Mar 2022 10:52:05 +0100 Subject: [PATCH] #62 - wip --- app/Domain/Policies/VacationRequestPolicy.php | 5 + .../Controllers/VacationRequestController.php | 39 ++ .../Http/Middleware/HandleInertiaRequests.php | 2 + resources/js/Composables/statusInfo.js | 10 +- .../VacationRequest/IndexForApprovers.vue | 445 ++++++++++++++++++ resources/js/Shared/MainMenu.vue | 5 +- routes/web.php | 4 +- 7 files changed, 505 insertions(+), 5 deletions(-) create mode 100644 resources/js/Pages/VacationRequest/IndexForApprovers.vue diff --git a/app/Domain/Policies/VacationRequestPolicy.php b/app/Domain/Policies/VacationRequestPolicy.php index 3807180..61000ee 100644 --- a/app/Domain/Policies/VacationRequestPolicy.php +++ b/app/Domain/Policies/VacationRequestPolicy.php @@ -10,6 +10,11 @@ use Toby\Eloquent\Models\VacationRequest; class VacationRequestPolicy { + public function listAll(User $user): bool + { + return in_array($user->role, [Role::AdministrativeApprover, Role::TechnicalApprover], true); + } + public function createOnBehalfOfEmployee(User $user): bool { return $user->role === Role::AdministrativeApprover; diff --git a/app/Infrastructure/Http/Controllers/VacationRequestController.php b/app/Infrastructure/Http/Controllers/VacationRequestController.php index 71001e3..b82c42d 100644 --- a/app/Infrastructure/Http/Controllers/VacationRequestController.php +++ b/app/Infrastructure/Http/Controllers/VacationRequestController.php @@ -51,6 +51,45 @@ class VacationRequestController extends Controller ]); } + public function indexForApprovers( + Request $request, + YearPeriodRetriever $yearPeriodRetriever + ): RedirectResponse|Response { + if ($request->user()->cannot("listAll", VacationRequest::class)) { + return redirect()->route("vacation.requests.index"); + } + + $yearPeriod = $yearPeriodRetriever->selected(); + $status = $request->get("status"); + $user = $request->get("user"); + + $vacationRequests = VacationRequest::query() + ->with(["user", "vacations"]) + ->where("year_period_id", $yearPeriod->id) + ->when($user !== null, fn(Builder $query) => $query->where("user_id", $user)) + ->when($status !== null, fn (Builder $query) => $query->states(VacationRequestStatesRetriever::filterByStatus($status))) + ->latest() + ->paginate(); + + $users = User::query() + ->whereRelation( + "vacationlimits", + fn(Builder $query) => $query->where("year_period_id", $yearPeriod->id)->whereNotNull("days"), + ) + ->orderBy("last_name") + ->orderBy("first_name") + ->get(); + + return inertia("VacationRequest/IndexForApprovers", [ + "requests" => VacationRequestResource::collection($vacationRequests), + "users" => UserResource::collection($users), + "filters" => [ + "status" => $status, + "user" => $user, + ], + ]); + } + /** * @throws AuthorizationException */ diff --git a/app/Infrastructure/Http/Middleware/HandleInertiaRequests.php b/app/Infrastructure/Http/Middleware/HandleInertiaRequests.php index fb40418..8f45e25 100644 --- a/app/Infrastructure/Http/Middleware/HandleInertiaRequests.php +++ b/app/Infrastructure/Http/Middleware/HandleInertiaRequests.php @@ -7,6 +7,7 @@ namespace Toby\Infrastructure\Http\Middleware; use Illuminate\Http\Request; use Inertia\Middleware; use Toby\Eloquent\Helpers\YearPeriodRetriever; +use Toby\Eloquent\Models\VacationRequest; use Toby\Infrastructure\Http\Resources\UserResource; class HandleInertiaRequests extends Middleware @@ -25,6 +26,7 @@ class HandleInertiaRequests extends Middleware "can" => [ "manageVacationLimits" => $user ? $user->can("manageVacationLimits") : false, "manageUsers" => $user ? $user->can("manageUsers") : false, + "listAllVacationRequests" => $user ? $user->can("listAll", VacationRequest::class) : false, ], ], "flash" => fn() => [ diff --git a/resources/js/Composables/statusInfo.js b/resources/js/Composables/statusInfo.js index 6a459ca..91e7ceb 100644 --- a/resources/js/Composables/statusInfo.js +++ b/resources/js/Composables/statusInfo.js @@ -123,6 +123,12 @@ const statuses = [ }, ] -export function useStatusInfo(status) { - return statuses.find(statusInfo => statusInfo.value === status) +export function useStatusInfo() { + const getStatues = () => statuses + const findStatus = value => statuses.find(month => month.value === value) + + return { + getStatues, + findStatus, + } } diff --git a/resources/js/Pages/VacationRequest/IndexForApprovers.vue b/resources/js/Pages/VacationRequest/IndexForApprovers.vue new file mode 100644 index 0000000..737e8d5 --- /dev/null +++ b/resources/js/Pages/VacationRequest/IndexForApprovers.vue @@ -0,0 +1,445 @@ + + + diff --git a/resources/js/Shared/MainMenu.vue b/resources/js/Shared/MainMenu.vue index 7d47bfc..ae7a392 100644 --- a/resources/js/Shared/MainMenu.vue +++ b/resources/js/Shared/MainMenu.vue @@ -281,7 +281,7 @@ import { XIcon, SunIcon, StarIcon, - CalendarIcon, + CalendarIcon, DocumentTextIcon, } from '@heroicons/vue/outline' import { CashIcon, @@ -329,7 +329,8 @@ export default { const navigation = computed(() => [ - {name: 'Wnioski urlopowe', href: '/vacation-requests', icon: CollectionIcon, can: true}, + {name: 'Moje wnioski', href: '/vacation-requests/me', icon: DocumentTextIcon, can: true}, + {name: 'Wnioski urlopowe', href: '/vacation-requests', icon: CollectionIcon, can: auth.value.can.listAllVacationRequests}, {name: 'Kalendarz urlopów', href: '/vacation-calendar', icon: CalendarIcon, can: true}, {name: 'Dni wolne', href: '/holidays', icon: StarIcon, can: true}, {name: 'Limity urlopów', href: '/vacation-limits', icon: SunIcon, can: auth.value.can.manageVacationLimits}, diff --git a/routes/web.php b/routes/web.php index 154523e..87f894a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -34,8 +34,10 @@ Route::middleware("auth")->group(function (): void { Route::get("/vacation-limits", [VacationLimitController::class, "edit"])->name("vacation.limits"); Route::put("/vacation-limits", [VacationLimitController::class, "update"]); - Route::get("/vacation-requests", [VacationRequestController::class, "index"]) + Route::get("/vacation-requests/me", [VacationRequestController::class, "index"]) ->name("vacation.requests.index"); + Route::get("/vacation-requests", [VacationRequestController::class, "indexForApprovers"]) + ->name("vacation.requests.indexForApprovers"); Route::get("/vacation-requests/create", [VacationRequestController::class, "create"]) ->name("vacation.requests.create"); Route::post("/vacation-requests", [VacationRequestController::class, "store"])