diff --git a/app/Domain/VacationRequestStatesRetriever.php b/app/Domain/VacationRequestStatesRetriever.php index f4caeb8..0f26cf6 100644 --- a/app/Domain/VacationRequestStatesRetriever.php +++ b/app/Domain/VacationRequestStatesRetriever.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Toby\Domain; +use Toby\Domain\Enums\Role; use Toby\Domain\States\VacationRequest\AcceptedByAdministrative; use Toby\Domain\States\VacationRequest\AcceptedByTechnical; use Toby\Domain\States\VacationRequest\Approved; @@ -12,6 +13,7 @@ use Toby\Domain\States\VacationRequest\Created; use Toby\Domain\States\VacationRequest\Rejected; use Toby\Domain\States\VacationRequest\WaitingForAdministrative; use Toby\Domain\States\VacationRequest\WaitingForTechnical; +use Toby\Eloquent\Models\User; class VacationRequestStatesRetriever { @@ -39,6 +41,16 @@ class VacationRequestStatesRetriever ]; } + public static function waitingForUserActionStates(User $user): array + { + return match ($user->role) { + Role::AdministrativeApprover => [WaitingForAdministrative::class], + Role::TechnicalApprover => [WaitingForTechnical::class], + Role::Administrator => [WaitingForAdministrative::class, WaitingForTechnical::class], + default => [], + }; + } + public static function all(): array { return [ @@ -48,12 +60,13 @@ class VacationRequestStatesRetriever ]; } - public static function filterByStatusGroup(string $filter): array + public static function filterByStatusGroup(string $filter, ?User $user = null): array { return match ($filter) { "pending" => self::pendingStates(), "success" => self::successStates(), "failed" => self::failedStates(), + "waiting_for_action" => self::waitingForUserActionStates($user), default => self::all(), }; } diff --git a/app/Infrastructure/Http/Controllers/DashboardController.php b/app/Infrastructure/Http/Controllers/DashboardController.php index f7b6fef..2dc3bed 100644 --- a/app/Infrastructure/Http/Controllers/DashboardController.php +++ b/app/Infrastructure/Http/Controllers/DashboardController.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Illuminate\Support\Carbon; use Inertia\Response; +use Toby\Domain\Enums\Role; use Toby\Domain\UserVacationStatsRetriever; use Toby\Domain\VacationRequestStatesRetriever; use Toby\Eloquent\Models\Holiday; @@ -35,10 +36,18 @@ class DashboardController extends Controller ) ->get(); - $vacationRequests = VacationRequest::query() - ->latest("updated_at") - ->limit(3) - ->get(); + if ($user->role !== Role::Employee) { + $vacationRequests = VacationRequest::query() + ->states(VacationRequestStatesRetriever::waitingForUserActionStates($user)) + ->latest("updated_at") + ->limit(3) + ->get(); + } else { + $vacationRequests = $user->vacationRequests() + ->latest("updated_at") + ->limit(3) + ->get(); + } $holidays = Holiday::query() ->whereDate("date", ">=", $now) diff --git a/app/Infrastructure/Http/Controllers/VacationRequestController.php b/app/Infrastructure/Http/Controllers/VacationRequestController.php index 10cb697..84ce8e5 100644 --- a/app/Infrastructure/Http/Controllers/VacationRequestController.php +++ b/app/Infrastructure/Http/Controllers/VacationRequestController.php @@ -40,7 +40,7 @@ class VacationRequestController extends Controller ->with("vacations") ->where("year_period_id", $yearPeriodRetriever->selected()->id) ->latest() - ->states(VacationRequestStatesRetriever::filterByStatusGroup($status)) + ->states(VacationRequestStatesRetriever::filterByStatusGroup($status, $request->user())) ->paginate(); return inertia("VacationRequest/Index", [ @@ -67,7 +67,7 @@ class VacationRequestController extends Controller ->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([$status])) + ->when($status !== null, fn(Builder $query) => $query->states(VacationRequestStatesRetriever::filterByStatusGroup($status, $request->user()))) ->latest() ->paginate(); diff --git a/app/Infrastructure/Http/Resources/UserResource.php b/app/Infrastructure/Http/Resources/UserResource.php index 2428f7f..8d0263c 100644 --- a/app/Infrastructure/Http/Resources/UserResource.php +++ b/app/Infrastructure/Http/Resources/UserResource.php @@ -16,7 +16,8 @@ class UserResource extends JsonResource "id" => $this->id, "name" => $this->fullName, "email" => $this->email, - "role" => $this->role->label(), + "displayRole" => $this->role->label(), + "role" => $this->role, "position" => $this->position, "avatar" => $this->getAvatar(), "deleted" => $this->trashed(), diff --git a/resources/js/Pages/Dashboard.vue b/resources/js/Pages/Dashboard.vue index 51730f8..a42ff35 100644 --- a/resources/js/Pages/Dashboard.vue +++ b/resources/js/Pages/Dashboard.vue @@ -11,7 +11,6 @@
@@ -22,7 +21,7 @@ {{ user.name }}

- {{ user.role }} + {{ user.displayRole }}

@@ -98,7 +97,7 @@
-
+

@@ -134,9 +133,70 @@

+
+ + Zobacz wszystkie + +
+
+
+ +
+
+
+

+ Wnioski oczekujące na akcje +

+
+
+
+
    +
  • +
    +

    + + + Wniosek o {{ request.type.toLowerCase() }} + [{{ request.name }}] + +

    +

    + {{ request.from }} - {{ request.to }} +

    +
    +
    + +
    +

    + {{ request.user.name }} +

    +

    + {{ request.user.email }} +

    +
    +
    +
    +
    +
  • +
+
Zobacz wszystkie diff --git a/resources/js/Pages/Users/Index.vue b/resources/js/Pages/Users/Index.vue index 7bb4bce..6ade8ed 100644 --- a/resources/js/Pages/Users/Index.vue +++ b/resources/js/Pages/Users/Index.vue @@ -101,7 +101,7 @@
- {{ user.role }} + {{ user.displayRole }} {{ user.position }} diff --git a/resources/js/Pages/VacationRequest/Index.vue b/resources/js/Pages/VacationRequest/Index.vue index 49a30c0..cda0c13 100644 --- a/resources/js/Pages/VacationRequest/Index.vue +++ b/resources/js/Pages/VacationRequest/Index.vue @@ -9,7 +9,7 @@
Dodaj wniosek diff --git a/resources/js/Pages/VacationRequest/IndexForApprovers.vue b/resources/js/Pages/VacationRequest/IndexForApprovers.vue index dbf4fe9..eca8a97 100644 --- a/resources/js/Pages/VacationRequest/IndexForApprovers.vue +++ b/resources/js/Pages/VacationRequest/IndexForApprovers.vue @@ -123,14 +123,10 @@ - - Wszystkie - - {{ form.status.text }} + {{ form.status.name }} @@ -145,40 +141,20 @@ - -
  • -
    - Wszystkie statusy -
    - - - - -
  • -
  • - {{ status.text }} + {{ status.name }} @@ -255,17 +231,18 @@ -
    - - - +
    +
    -
    +

    {{ request.user.name }} -

    +

    +

    + {{ request.user.email }} +

    @@ -376,7 +353,6 @@ import {watch, reactive} from 'vue' import {debounce} from 'lodash' import {Inertia} from '@inertiajs/inertia' import {Listbox, ListboxButton, ListboxLabel, ListboxOption, ListboxOptions} from '@headlessui/vue' -import {useStatusInfo} from '@/Composables/statusInfo' export default { name: 'VacationRequestIndex', @@ -415,17 +391,36 @@ export default { }, }, setup(props) { - const {getStatues, findStatus} = useStatusInfo() + const statuses = [ + { + name: 'Wszystkie', + value: 'all', + }, + { + name: 'Oczekujące na akcje', + value: 'waiting_for_action', + }, + { + name: 'W trakcie', + value: 'pending', + }, + { + name: 'Zatwierdzone', + value: 'success', + }, + { + name: 'Odrzucone/anulowane', + value: 'failed', + }, + ] const form = reactive({ user: props.users.data.find(user => user.id === props.filters.user) ?? null, - status: findStatus(props.filters.status) ?? null, + status: statuses.find(status => status.value === props.filters.status) ?? statuses[0], }) - const statuses = getStatues() - watch(form, debounce(() => { - Inertia.get('/vacation-requests', {user: form.user?.id, status: form.status?.value}, { + Inertia.get('/vacation-requests', {user: form.user?.id, status: form.status.value}, { preserveState: true, replace: true, }) diff --git a/resources/js/Shared/MainMenu.vue b/resources/js/Shared/MainMenu.vue index ae7a392..5bd78cf 100644 --- a/resources/js/Shared/MainMenu.vue +++ b/resources/js/Shared/MainMenu.vue @@ -74,7 +74,7 @@ v-for="item in navigation" :key="item.name" :href="item.href" - :class="[$page.url.startsWith(item.href) ? 'bg-blumilk-800 text-white' : 'text-blumilk-100 hover:text-white hover:bg-blumilk-600', 'group flex items-center px-2 py-2 text-base font-medium rounded-md']" + :class="[$page.url === item.href ? 'bg-blumilk-800 text-white' : 'text-blumilk-100 hover:text-white hover:bg-blumilk-600', 'group flex items-center px-2 py-2 text-base font-medium rounded-md']" > create(); $this->actingAs($user) - ->get("/vacation-requests") + ->get("/vacation-requests/me") ->assertOk() ->assertInertia( fn(Assert $page) => $page