#44 - ui for summary

This commit is contained in:
EwelinaLasowy 2022-03-22 11:48:07 +01:00
parent 95f5ed44d6
commit 68f7f76eb6
7 changed files with 177 additions and 1 deletions

View File

@ -31,5 +31,6 @@ class AuthServiceProvider extends ServiceProvider
Gate::define("manageHolidays", fn(User $user) => $user->role === Role::AdministrativeApprover); Gate::define("manageHolidays", fn(User $user) => $user->role === Role::AdministrativeApprover);
Gate::define("manageVacationLimits", fn(User $user) => $user->role === Role::AdministrativeApprover); Gate::define("manageVacationLimits", fn(User $user) => $user->role === Role::AdministrativeApprover);
Gate::define("generateTimesheet", fn(User $user) => $user->role === Role::AdministrativeApprover); Gate::define("generateTimesheet", fn(User $user) => $user->role === Role::AdministrativeApprover);
Gate::define("listMonthlyUsage", fn(User $user) => $user->role === Role::AdministrativeApprover);
} }
} }

View File

@ -0,0 +1,35 @@
<?php
declare(strict_types=1);
namespace Toby\Infrastructure\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Response;
use Toby\Eloquent\Models\User;
use Toby\Infrastructure\Http\Resources\UserResource;
class MonthlyUsage extends Controller
{
public function index(Request $request): Response
{
$this->authorize("listMonthlyUsage");
$currentUser = $request->user();
$users = User::query()
->where("id", "!=", $currentUser->id)
->orderBy("last_name")
->orderBy("first_name")
->get();
$users->prepend($currentUser);
return inertia("MonthlyUsage", [
"users" => UserResource::collection($users),
"can" => [
"listMonthlyUsage" => $request->user()->can("listMonthlyUsage"),
],
]);
}
}

View File

@ -27,6 +27,7 @@ class HandleInertiaRequests extends Middleware
"manageVacationLimits" => $user ? $user->can("manageVacationLimits") : false, "manageVacationLimits" => $user ? $user->can("manageVacationLimits") : false,
"manageUsers" => $user ? $user->can("manageUsers") : false, "manageUsers" => $user ? $user->can("manageUsers") : false,
"listAllVacationRequests" => $user ? $user->can("listAll", VacationRequest::class) : false, "listAllVacationRequests" => $user ? $user->can("listAll", VacationRequest::class) : false,
"listMonthlyUsage" => $user ? $user->can("listMonthlyUsage") : false,
], ],
], ],
"flash" => fn() => [ "flash" => fn() => [

View File

@ -2,50 +2,62 @@ const months = [
{ {
'name': 'Styczeń', 'name': 'Styczeń',
'value': 'january', 'value': 'january',
'shortcut': 'Sty',
}, },
{ {
'name': 'Luty', 'name': 'Luty',
'value': 'february', 'value': 'february',
'shortcut': 'Lut',
}, },
{ {
'name': 'Marzec', 'name': 'Marzec',
'value': 'march', 'value': 'march',
'shortcut': 'Mar',
}, },
{ {
'name': 'Kwiecień', 'name': 'Kwiecień',
'value': 'april', 'value': 'april',
'shortcut': 'Kwi',
}, },
{ {
'name': 'Maj', 'name': 'Maj',
'value': 'may', 'value': 'may',
'shortcut':'Maj',
}, },
{ {
'name': 'Czerwiec', 'name': 'Czerwiec',
'value': 'june', 'value': 'june',
'shortcut': 'Cze',
}, },
{ {
'name': 'Lipiec', 'name': 'Lipiec',
'value': 'july', 'value': 'july',
'shortcut': 'Lip',
}, },
{ {
'name': 'Sierpień', 'name': 'Sierpień',
'value': 'august', 'value': 'august',
'shortcut': 'Sie',
}, },
{ {
'name': 'Wrzesień', 'name': 'Wrzesień',
'value': 'september', 'value': 'september',
'shortcut': 'Wrz',
}, },
{ {
'name': 'Październik', 'name': 'Październik',
'value': 'october', 'value': 'october',
'shortcut': 'Paź',
}, },
{ {
'name': 'Listopad', 'name': 'Listopad',
'value': 'november', 'value': 'november',
'shortcut': 'Lis',
}, },
{ {
'name': 'Grudzień', 'name': 'Grudzień',
'value': 'december', 'value': 'december',
'shortcut': 'Gru',
}, },
] ]

View File

@ -0,0 +1,120 @@
<template>
<InertiaHead title="Wykorzystanie miesięczne urlopu" />
<div class="bg-white shadow-md">
<div class="flex justify-between items-center p-4 sm:px-6">
<div class="flex items-center">
<h2 class="text-lg leading-6 font-medium text-gray-900">
Wykorzystanie miesięczne urlopu
</h2>
<div class="ml-5">
ROK TUTAJ
</div>
<div class="ml-5">
Select z typami urlopów
</div>
</div>
</div>
<div class="overflow-x-auto">
<table class="w-full text-center text-sm border border-gray-300">
<thead>
<tr>
<th class="w-64 py-2 border text-lg font-semibold text-gray-800 border-gray-300" />
<th
class="border border-gray-300 text-sm font-semibold text-gray-900 py-4 px-2"
>
Limit zaległy (2021)
</th>
<th
class="border border-gray-300 text-sm font-semibold text-gray-900 py-4 px-2"
>
Limit obecny (2022)
</th>
<th
v-for="month in months"
:key="month"
class="border border-gray-300 text-sm font-semibold text-gray-900 py-4 px-2"
style="min-width: 46px;"
>
<div>
{{ month.shortcut }}
</div>
</th>
<th
class="border border-gray-300 text-sm font-semibold text-gray-900 py-4 px-2"
>
Wykorzystany
</th>
<th
class="border border-gray-300 text-sm font-semibold text-gray-900 py-4 px-2"
>
Rozpatrywany
</th>
<th
class="border border-gray-300 text-sm font-semibold text-gray-900 py-4 px-2"
>
Pozostało
</th>
</tr>
</thead>
<tbody>
<tr
v-for="user in users.data"
:key="user.id"
>
<th
class="border border-gray-300 py-2 px-4"
>
<div class="flex justify-start items-center">
<span class="inline-flex items-center justify-center h-10 w-10 rounded-full">
<img
class="h-10 w-10 rounded-full"
:src="user.avatar"
>
</span>
<div class="ml-3">
<div
class="text-sm font-medium text-gray-900 whitespace-nowrap"
>
{{ user.name }}
</div>
</div>
</div>
</th>
<td
v-for="index in 17"
:key="index"
class="border border-gray-300"
/>
</tr>
</tbody>
</table>
</div>
</div>
</template>
<script>
import {useMonthInfo} from '@/Composables/monthInfo'
export default {
name: 'MonthlyUsage',
components: {
},
props: {
users: {
type: Object,
default: () => null,
},
can: {
type: Object,
default: () => null,
},
},
setup() {
const {getMonths} = useMonthInfo()
const months = getMonths()
return {
months,
}
},
}
</script>

View File

@ -281,7 +281,9 @@ import {
XIcon, XIcon,
SunIcon, SunIcon,
StarIcon, StarIcon,
CalendarIcon, DocumentTextIcon, CalendarIcon,
DocumentTextIcon,
AdjustmentsIcon,
} from '@heroicons/vue/outline' } from '@heroicons/vue/outline'
import { import {
CashIcon, CashIcon,
@ -320,6 +322,7 @@ export default {
UserGroupIcon, UserGroupIcon,
SunIcon, SunIcon,
CalendarIcon, CalendarIcon,
AdjustmentsIcon,
}, },
setup() { setup() {
const sidebarOpen = ref(false) const sidebarOpen = ref(false)
@ -332,6 +335,7 @@ export default {
{name: 'Moje wnioski', href: '/vacation-requests/me', component: 'VacationRequest/Index' , icon: DocumentTextIcon, can: true}, {name: 'Moje wnioski', href: '/vacation-requests/me', component: 'VacationRequest/Index' , icon: DocumentTextIcon, can: true},
{name: 'Wnioski urlopowe', href: '/vacation-requests', component: 'VacationRequest/IndexForApprovers', icon: CollectionIcon, can: auth.value.can.listAllVacationRequests}, {name: 'Wnioski urlopowe', href: '/vacation-requests', component: 'VacationRequest/IndexForApprovers', icon: CollectionIcon, can: auth.value.can.listAllVacationRequests},
{name: 'Kalendarz urlopów', href: '/vacation-calendar', component: 'Calendar', icon: CalendarIcon, can: true}, {name: 'Kalendarz urlopów', href: '/vacation-calendar', component: 'Calendar', icon: CalendarIcon, can: true},
{name: 'Wykorzystanie urlopu', href: '/monthly-usage', component: 'MonthlyUsage', icon: AdjustmentsIcon, can: auth.value.can.listMonthlyUsage},
{name: 'Dni wolne', href: '/holidays', component: 'Holidays/Index', icon: StarIcon, can: true}, {name: 'Dni wolne', href: '/holidays', component: 'Holidays/Index', icon: StarIcon, can: true},
{name: 'Limity urlopów', href: '/vacation-limits', component: 'VacationLimits', icon: SunIcon, can: auth.value.can.manageVacationLimits}, {name: 'Limity urlopów', href: '/vacation-limits', component: 'VacationLimits', icon: SunIcon, can: auth.value.can.manageVacationLimits},
{name: 'Użytkownicy', href: '/users', component: 'Users/Index', icon: UserGroupIcon, can: auth.value.can.manageUsers}, {name: 'Użytkownicy', href: '/users', component: 'Users/Index', icon: UserGroupIcon, can: auth.value.can.manageUsers},

View File

@ -7,6 +7,7 @@ use Toby\Infrastructure\Http\Controllers\DashboardController;
use Toby\Infrastructure\Http\Controllers\GoogleController; use Toby\Infrastructure\Http\Controllers\GoogleController;
use Toby\Infrastructure\Http\Controllers\HolidayController; use Toby\Infrastructure\Http\Controllers\HolidayController;
use Toby\Infrastructure\Http\Controllers\LogoutController; use Toby\Infrastructure\Http\Controllers\LogoutController;
use Toby\Infrastructure\Http\Controllers\MonthlyUsage;
use Toby\Infrastructure\Http\Controllers\SelectYearPeriodController; use Toby\Infrastructure\Http\Controllers\SelectYearPeriodController;
use Toby\Infrastructure\Http\Controllers\TimesheetController; use Toby\Infrastructure\Http\Controllers\TimesheetController;
use Toby\Infrastructure\Http\Controllers\UserController; use Toby\Infrastructure\Http\Controllers\UserController;
@ -63,6 +64,8 @@ Route::middleware("auth")->group(function (): void {
Route::post("year-periods/{yearPeriod}/select", SelectYearPeriodController::class) Route::post("year-periods/{yearPeriod}/select", SelectYearPeriodController::class)
->name("year-periods.select"); ->name("year-periods.select");
Route::get("/monthly-usage", [MonthlyUsage::class, "index"])->name("monthly-usage");
}); });
Route::middleware("guest")->group(function (): void { Route::middleware("guest")->group(function (): void {