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/Controllers/Api/CalculateVacationDaysController.php b/app/Infrastructure/Http/Controllers/Api/CalculateVacationDaysController.php index b8a8c33..c204be1 100644 --- a/app/Infrastructure/Http/Controllers/Api/CalculateVacationDaysController.php +++ b/app/Infrastructure/Http/Controllers/Api/CalculateVacationDaysController.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Toby\Infrastructure\Http\Controllers\Api; use Illuminate\Http\JsonResponse; +use Illuminate\Support\Carbon; use Toby\Domain\VacationDaysCalculator; use Toby\Infrastructure\Http\Controllers\Controller; use Toby\Infrastructure\Http\Requests\Api\CalculateVacationDaysRequest; @@ -15,6 +16,6 @@ class CalculateVacationDaysController extends Controller { $days = $calculator->calculateDays($request->yearPeriod(), $request->from(), $request->to()); - return new JsonResponse($days->all()); + return new JsonResponse($days->map(fn(Carbon $day) => $day->toDateString())->all()); } } 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..92508d2 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() { @@ -395,15 +392,30 @@ function createForm() { } function onFromChange(selectedDates, dateStr) { - form.to = dateStr + if (form.to === null) { + form.to = dateStr + + return + } refreshEstimatedDays(form.from, form.to) } -function onToChange() { +function onToChange(selectedDates, dateStr) { + if (form.from === null) { + form.from = dateStr + + return + } 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 +424,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); });