From c97d8a151cb1af7e080ba3dfaf703d8e46ac75f3 Mon Sep 17 00:00:00 2001 From: Adrian Hopek Date: Mon, 28 Mar 2022 09:38:25 +0200 Subject: [PATCH] #95 - unavailable days --- ...CalculateUserUnavailableDaysController.php | 42 ++++++++++++++++++ .../CalculateUserUnavailableDaysRequest.php | 17 +++++++ resources/js/Pages/VacationRequest/Create.vue | 44 ++++++++++++++----- routes/api.php | 4 +- 4 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 app/Infrastructure/Http/Controllers/Api/CalculateUserUnavailableDaysController.php create mode 100644 app/Infrastructure/Http/Requests/Api/CalculateUserUnavailableDaysRequest.php diff --git a/app/Infrastructure/Http/Controllers/Api/CalculateUserUnavailableDaysController.php b/app/Infrastructure/Http/Controllers/Api/CalculateUserUnavailableDaysController.php new file mode 100644 index 0000000..dfa390d --- /dev/null +++ b/app/Infrastructure/Http/Controllers/Api/CalculateUserUnavailableDaysController.php @@ -0,0 +1,42 @@ +find($request->get("user")); + $yearPeriod = $yearPeriodRetriever->selected(); + + $holidays = $yearPeriod->holidays()->pluck("date"); + $vacationDays = $user->vacations() + ->where("year_period_id", $yearPeriod->id) + ->whereRelation( + "vacationRequest", + fn(Builder $query) => $query->noStates(VacationRequestStatesRetriever::failedStates()), + ) + ->pluck("date"); + + return new JsonResponse([ + ...$holidays->map(fn(Carbon $date) => $date->toDateString()), + ...$vacationDays->map(fn(Carbon $date) => $date->toDateString()), + ]); + } +} diff --git a/app/Infrastructure/Http/Requests/Api/CalculateUserUnavailableDaysRequest.php b/app/Infrastructure/Http/Requests/Api/CalculateUserUnavailableDaysRequest.php new file mode 100644 index 0000000..03a6c9c --- /dev/null +++ b/app/Infrastructure/Http/Requests/Api/CalculateUserUnavailableDaysRequest.php @@ -0,0 +1,17 @@ + ["required", "exists:users,id"], + ]; + } +} diff --git a/resources/js/Pages/VacationRequest/Create.vue b/resources/js/Pages/VacationRequest/Create.vue index 374cf47..87e5b63 100644 --- a/resources/js/Pages/VacationRequest/Create.vue +++ b/resources/js/Pages/VacationRequest/Create.vue @@ -332,7 +332,6 @@ import axios from 'axios' import useCurrentYearPeriodInfo from '@/Composables/yearPeriodInfo' import VacationChart from '@/Shared/VacationChart' - const props = defineProps({ auth: Object, users: Object, @@ -362,26 +361,24 @@ const stats = ref({ const { minDate, maxDate } = useCurrentYearPeriodInfo() -const disableDates = [ - date => (date.getDay() === 0 || date.getDay() === 6), -] +const weekends = date => (date.getDay() === 0 || date.getDay() === 6) const fromInputConfig = reactive({ minDate, maxDate, - disable: disableDates, + disable: [weekends], }) const toInputConfig = reactive({ minDate, maxDate, - disable: disableDates, + disable: [weekends], }) -watch(() => form.user, async user => { - const res = await axios.post('/api/calculate-vacations-stats', { user: user.id }) - - stats.value = res.data +watch(() => form.user, user => { + resetForm() + refreshVacationStats(user) + refreshUnavailableDays(user) }, { immediate: true }) function createForm() { @@ -404,6 +401,12 @@ function onToChange() { refreshEstimatedDays(form.from, form.to) } +function resetForm() { + form.reset('type', 'to', 'from', 'comment', 'flowSkipped') + form.clearErrors() + estimatedDays.value = [] +} + async function refreshEstimatedDays(from, to) { if (from && to) { const res = await axios.post('/api/calculate-vacation-days', { from, to }) @@ -412,4 +415,25 @@ async function refreshEstimatedDays(from, to) { } } +async function refreshVacationStats(user) { + const res = await axios.post('/api/calculate-vacation-stats', { user: user.id }) + + stats.value = res.data +} + +async function refreshUnavailableDays(user) { + const res = await axios.post('/api/calculate-unavailable-days', { user: user.id }) + const unavailableDays = res.data + + fromInputConfig.disable = [ + weekends, + ...unavailableDays, + ] + + toInputConfig.disable = [ + weekends, + ...unavailableDays, + ] +} + diff --git a/routes/api.php b/routes/api.php index 27cf9fe..47f45de 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,10 +3,12 @@ declare(strict_types=1); use Illuminate\Support\Facades\Route; +use Toby\Infrastructure\Http\Controllers\Api\CalculateUserUnavailableDaysController; use Toby\Infrastructure\Http\Controllers\Api\CalculateUserVacationStatsController; use Toby\Infrastructure\Http\Controllers\Api\CalculateVacationDaysController; Route::middleware("auth:sanctum")->group(function (): void { Route::post("calculate-vacation-days", CalculateVacationDaysController::class); - Route::post("calculate-vacations-stats", CalculateUserVacationStatsController::class); + Route::post("calculate-vacation-stats", CalculateUserVacationStatsController::class); + Route::post("calculate-unavailable-days", CalculateUserUnavailableDaysController::class); });