194 lines
6.7 KiB
Vue
194 lines
6.7 KiB
Vue
<template>
|
|
<div class="h-full overflow-hidden flex flex-col">
|
|
<div class="flex flex-wrap items-center justify-between gap-4">
|
|
<h1 class="text-4xl font-bold text-primary-500">Heures</h1>
|
|
</div>
|
|
|
|
<HoursToolbar
|
|
v-model:selected-date="selectedDate"
|
|
v-model:view-mode="viewMode"
|
|
v-model:selected-site-ids="selectedSiteIds"
|
|
v-model:employee-filter="employeeFilter"
|
|
:is-admin="isAdmin"
|
|
:sites="sites"
|
|
:absence-types="absenceTypes"
|
|
:formatted-selected-date="formattedSelectedDate"
|
|
:shortcut-button-class="shortcutButtonClass"
|
|
:week-shortcut-button-class="weekShortcutButtonClass"
|
|
:get-week-shortcut-label="getWeekShortcutLabel"
|
|
@set-yesterday="setYesterday"
|
|
@set-today="setToday"
|
|
@set-tomorrow="setTomorrow"
|
|
@set-previous-week="setPreviousWeek"
|
|
@set-this-week="setThisWeek"
|
|
@set-next-week="setNextWeek"
|
|
@shift-date="shiftDate"
|
|
/>
|
|
|
|
<div v-if="isLoading" class="rounded-lg border border-neutral-200 bg-white p-6 text-md text-neutral-600">
|
|
Chargement...
|
|
</div>
|
|
|
|
<div v-else-if="employees.length === 0" class="rounded-lg border border-neutral-200 bg-white p-6 text-md text-neutral-600">
|
|
Aucun employé accessible.
|
|
</div>
|
|
|
|
<div v-else class="flex min-h-0 flex-col gap-4">
|
|
<div class="min-h-0 flex flex-col max-h-[calc(100vh-300px)]">
|
|
<HoursDayView
|
|
v-if="viewMode === 'day'"
|
|
v-model:rows="rows"
|
|
:employees="displayedEmployees"
|
|
:is-admin="isAdmin"
|
|
:is-site-manager="isSiteManager"
|
|
:day-grid-cols="dayGridCols"
|
|
:is-holiday="isSelectedDateHoliday"
|
|
:contract-label="contractLabel"
|
|
:is-time-tracking="isTimeTracking"
|
|
:is-presence-tracking="isPresenceTracking"
|
|
:is-row-locked="isRowLocked"
|
|
:is-half-locked-by-absence="isHalfLockedByAbsence"
|
|
:is-evening-locked-by-absence="isEveningLockedByAbsence"
|
|
:has-contract-at-selected-date="hasContractAtSelectedDate"
|
|
:is-validation-pending="isValidationPending"
|
|
:is-site-validation-pending="isSiteValidationPending"
|
|
:can-toggle-validation="canToggleValidation"
|
|
:can-toggle-site-validation="canToggleSiteValidation"
|
|
:can-create-site-validation-row-from-absence="canCreateSiteValidationRowFromAbsence"
|
|
:is-bulk-validation-checked="isBulkValidationChecked"
|
|
:is-bulk-validation-indeterminate="isBulkValidationIndeterminate"
|
|
:is-bulk-site-validation-checked="isBulkSiteValidationChecked"
|
|
:is-bulk-site-validation-indeterminate="isBulkSiteValidationIndeterminate"
|
|
:can-bulk-toggle-site-validation="canBulkToggleSiteValidation"
|
|
:on-toggle-validation="toggleValidation"
|
|
:on-toggle-site-validation="toggleSiteValidation"
|
|
:on-toggle-validation-bulk="toggleValidationBulk"
|
|
:on-toggle-site-validation-bulk="toggleSiteValidationBulk"
|
|
:get-row-metrics="getRowMetrics"
|
|
:get-row-absence-label="getRowAbsenceLabel"
|
|
:get-row-absence-style="getRowAbsenceStyle"
|
|
:get-row-updated-at="getRowUpdatedAt"
|
|
:get-presence-day-value="getPresenceDayValue"
|
|
:on-absence-click="openAbsenceDrawer"
|
|
:format-minutes="formatMinutes"
|
|
class="max-h-[calc(100vh-300px)]"
|
|
/>
|
|
|
|
<HoursWeekView
|
|
v-else-if="isAdmin && viewMode === 'week'"
|
|
:is-week-loading="isWeekLoading"
|
|
:week-grid-cols="weekGridCols"
|
|
:weekly-summary="filteredWeeklySummary"
|
|
:week-day-headers="weekDayHeaders"
|
|
:format-minutes="formatMinutes"
|
|
class="max-h-[calc(100vh-300px)]"
|
|
/>
|
|
</div>
|
|
|
|
<div v-if="viewMode === 'day'" class="shrink-0 px-4 pt-4 flex justify-center">
|
|
<button
|
|
type="button"
|
|
class="rounded-lg bg-primary-500 px-6 py-2 text-md font-semibold text-white hover:bg-secondary-500"
|
|
:class="saveButtonClass"
|
|
:disabled="isSubmitting || visibleEmployees.length === 0"
|
|
@click="handleSave"
|
|
>
|
|
Enregistrer
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<AbsenceFormDrawer
|
|
v-model="isAbsenceDrawerOpen"
|
|
:employees="employees"
|
|
:absence-types="absenceTypes"
|
|
:form="absenceForm"
|
|
:editing-absence="editingAbsence"
|
|
:is-submitting="isAbsenceSubmitting"
|
|
:lock-employee="true"
|
|
:lock-dates="true"
|
|
:show-comment="false"
|
|
@submit="submitAbsence"
|
|
@delete="deleteAbsenceFromDrawer"
|
|
@cancel="closeAbsenceDrawer"
|
|
/>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
const {
|
|
isAdmin,
|
|
isSiteManager,
|
|
viewMode,
|
|
selectedDate,
|
|
employeeFilter,
|
|
sites,
|
|
selectedSiteIds,
|
|
employees,
|
|
visibleEmployees,
|
|
displayedEmployees,
|
|
rows,
|
|
absenceTypes,
|
|
absenceForm,
|
|
isAbsenceDrawerOpen,
|
|
isAbsenceSubmitting,
|
|
editingAbsence,
|
|
filteredWeeklySummary,
|
|
isLoading,
|
|
isWeekLoading,
|
|
isSubmitting,
|
|
dayGridCols,
|
|
isSelectedDateHoliday,
|
|
weekGridCols,
|
|
saveButtonClass,
|
|
formattedSelectedDate,
|
|
weekDayHeaders,
|
|
shortcutButtonClass,
|
|
weekShortcutButtonClass,
|
|
getWeekShortcutLabel,
|
|
setToday,
|
|
setYesterday,
|
|
setTomorrow,
|
|
setThisWeek,
|
|
setPreviousWeek,
|
|
setNextWeek,
|
|
shiftDate,
|
|
contractLabel,
|
|
isTimeTracking,
|
|
isPresenceTracking,
|
|
isRowLocked,
|
|
isHalfLockedByAbsence,
|
|
isEveningLockedByAbsence,
|
|
hasContractAtSelectedDate,
|
|
isValidationPending,
|
|
isSiteValidationPending,
|
|
canToggleValidation,
|
|
canToggleSiteValidation,
|
|
canCreateSiteValidationRowFromAbsence,
|
|
isBulkValidationChecked,
|
|
isBulkValidationIndeterminate,
|
|
isBulkSiteValidationChecked,
|
|
isBulkSiteValidationIndeterminate,
|
|
canBulkToggleSiteValidation,
|
|
toggleValidation,
|
|
toggleSiteValidation,
|
|
toggleValidationBulk,
|
|
toggleSiteValidationBulk,
|
|
getRowMetrics,
|
|
getRowAbsenceLabel,
|
|
getRowAbsenceStyle,
|
|
getRowUpdatedAt,
|
|
getPresenceDayValue,
|
|
openAbsenceDrawer,
|
|
submitAbsence,
|
|
deleteAbsenceFromDrawer,
|
|
closeAbsenceDrawer,
|
|
formatMinutes,
|
|
handleSave
|
|
} = useHoursPage()
|
|
|
|
useHead({
|
|
title: 'Heures'
|
|
})
|
|
</script>
|