From 753d4bb296077e05dd7553b7cf6fdb496582488e Mon Sep 17 00:00:00 2001 From: Adrian Hopek Date: Tue, 8 Feb 2022 13:46:52 +0100 Subject: [PATCH] #22 - wip --- app/Eloquent/Models/User.php | 6 + .../VacationCalendarController.php | 68 ++++++- resources/js/Pages/Calendar.vue | 169 +++++++++++++----- resources/js/Shared/Layout/AppLayout.vue | 27 ++- resources/js/Shared/MainMenu.vue | 8 +- 5 files changed, 215 insertions(+), 63 deletions(-) diff --git a/app/Eloquent/Models/User.php b/app/Eloquent/Models/User.php index 6a7c4db..1f8c6e3 100644 --- a/app/Eloquent/Models/User.php +++ b/app/Eloquent/Models/User.php @@ -28,6 +28,7 @@ use Toby\Domain\Enums\Role; * @property Carbon $employment_date * @property Collection $vacationLimits * @property Collection $vacationRequests + * @property Collection $vacations */ class User extends Authenticatable { @@ -57,6 +58,11 @@ class User extends Authenticatable return $this->hasMany(VacationRequest::class); } + public function vacations(): HasMany + { + return $this->hasMany(Vacation::class); + } + public function scopeSearch(Builder $query, ?string $text): Builder { if ($text === null) { diff --git a/app/Infrastructure/Http/Controllers/VacationCalendarController.php b/app/Infrastructure/Http/Controllers/VacationCalendarController.php index 2891304..e3927b3 100644 --- a/app/Infrastructure/Http/Controllers/VacationCalendarController.php +++ b/app/Infrastructure/Http/Controllers/VacationCalendarController.php @@ -4,21 +4,85 @@ declare(strict_types=1); namespace Toby\Infrastructure\Http\Controllers; +use Carbon\CarbonImmutable; +use Carbon\CarbonInterface; +use Carbon\CarbonPeriod; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Http\Request; +use Illuminate\Support\Arr; use Inertia\Response; +use Toby\Domain\Enums\VacationRequestState; +use Toby\Eloquent\Helpers\YearPeriodRetriever; use Toby\Eloquent\Models\User; +use Toby\Eloquent\Models\Vacation; use Toby\Infrastructure\Http\Resources\UserResource; class VacationCalendarController extends Controller { - public function index(): Response + public function index(Request $request, YearPeriodRetriever $yearPeriodRetriever): Response { + $month = $request->query("month", "february"); + $yearPeriod = $yearPeriodRetriever->selected(); + $date = CarbonImmutable::create($yearPeriod->year, $this->monthNameToNumber($month)); + $period = CarbonPeriod::create($date->startOfMonth(), $date->endOfMonth()); + $holidays = $yearPeriod->holidays()->pluck("date"); $users = User::query() + ->with([ + "vacations" => fn($query) => $query + ->whereBetween("date", [$period->start, $period->end]) + ->whereRelation("vacationRequest", "state", VacationRequestState::APPROVED->value) + ]) ->orderBy("last_name") ->orderBy("first_name") ->paginate(); + $calendar = []; + + foreach ($period as $day) { + $calendar[] = [ + "date" => $day->toDateString(), + "dayOfMonth" => $day->translatedFormat("j"), + "dayOfWeek" => $day->translatedFormat("D"), + "isToday" => $day->isToday(), + "isWeekend" => $day->isWeekend(), + "isVacation" => Arr::random([false, false, false, false, true]), + "isHoliday" => $holidays->contains($day), + ]; + } + + $userVacations = []; + + /** @var User $user */ + foreach ($users as $user) { + $userVacations[] = [ + "user" => new UserResource($user), + "vacations" => $user->vacations->map(fn (Vacation $vacation) => $vacation->date->toDateString()), + ]; + } + + return inertia("Calendar", [ - "users" => UserResource::collection($users), + "calendar" => $calendar, + "currentMonth" => $month, + "userVacations" => $userVacations, ]); } + + protected function monthNameToNumber(?string $name): int + { + return match($name) { + default => CarbonInterface::JANUARY, + "february" => CarbonInterface::FEBRUARY, + "march" => CarbonInterface::MARCH, + "april" => CarbonInterface::APRIL, + "may" => CarbonInterface::MAY, + "june" => CarbonInterface::JUNE, + "julu" => CarbonInterface::JULY, + "august" => CarbonInterface::AUGUST, + "septemter" => CarbonInterface::SEPTEMBER, + "october" => CarbonInterface::OCTOBER, + "november" => CarbonInterface::NOVEMBER, + "december" => CarbonInterface::DECEMBER, + }; + } } diff --git a/resources/js/Pages/Calendar.vue b/resources/js/Pages/Calendar.vue index bf80d3f..58a15ea 100644 --- a/resources/js/Pages/Calendar.vue +++ b/resources/js/Pages/Calendar.vue @@ -7,7 +7,7 @@
- +
@@ -17,13 +17,10 @@ >
- Styczeń -
@@ -36,26 +33,25 @@ leave-to-class="transform opacity-0 scale-95" >
- - Styczeń - - - Luty - - - Marzec + + + {{ month.name }} + +
@@ -63,43 +59,63 @@
- {{ i }} -

- Pt -

+
+ {{ day.dayOfMonth }} +

+ {{ day.dayOfWeek }} +

+
- {{ user.name }} + {{ userVacation.user.name }}
+ v-for="day in calendar" + :key="day.dayOfMonth" + class="border border-gray-300" + :class="{'bg-gray-100': day.isWeekend, 'bg-green-100': day.isHoliday, 'bg-blumilk-200': userVacation.vacations.includes(day.date) }" + > +
+ + + +
+
@@ -109,7 +125,8 @@ diff --git a/resources/js/Shared/Layout/AppLayout.vue b/resources/js/Shared/Layout/AppLayout.vue index f03367c..7ad4df4 100644 --- a/resources/js/Shared/Layout/AppLayout.vue +++ b/resources/js/Shared/Layout/AppLayout.vue @@ -1,22 +1,19 @@ diff --git a/resources/js/Shared/MainMenu.vue b/resources/js/Shared/MainMenu.vue index 8ad8232..d5df879 100644 --- a/resources/js/Shared/MainMenu.vue +++ b/resources/js/Shared/MainMenu.vue @@ -110,7 +110,6 @@