diff --git a/frontend/components/PeriodStepperPicker.vue b/frontend/components/PeriodStepperPicker.vue new file mode 100644 index 0000000..c88b66d --- /dev/null +++ b/frontend/components/PeriodStepperPicker.vue @@ -0,0 +1,77 @@ + + + diff --git a/frontend/components/hours/HoursToolbar.vue b/frontend/components/hours/HoursToolbar.vue index 991ccfa..f833eb6 100644 --- a/frontend/components/hours/HoursToolbar.vue +++ b/frontend/components/hours/HoursToolbar.vue @@ -64,41 +64,17 @@ -
- - - - -
+
@@ -145,6 +121,7 @@ import type { Site } from '~/services/dto/site' import type { AbsenceType } from '~/services/dto/absence-type' import EmployeeNameFilterInput from '~/components/EmployeeNameFilterInput.vue' import SiteFilterSelector from '~/components/SiteFilterSelector.vue' +import PeriodStepperPicker from '~/components/PeriodStepperPicker.vue' import { weekInputValueToYmd, ymdToWeekInputValue } from '~/utils/date' const selectedDate = defineModel('selectedDate', { required: true }) @@ -172,7 +149,6 @@ const emit = defineEmits<{ (e: 'shift-date', value: number): void }>() -const nativeDateInput = ref(null) const pickerValue = computed(() => { if (viewMode.value === 'week') return ymdToWeekInputValue(selectedDate.value) return selectedDate.value @@ -186,19 +162,7 @@ const viewModeButtonClass = (mode: 'day' | 'week') => { return 'bg-white text-primary-500 hover:bg-tertiary-500' } -const openDatePicker = () => { - const input = nativeDateInput.value - if (!input) return - if (typeof input.showPicker === 'function') { - input.showPicker() - return - } - input.focus() - input.click() -} - -const onPickerInput = (event: Event) => { - const value = (event.target as HTMLInputElement).value +const onPickerValue = (value: string) => { if (!value) return if (viewMode.value === 'week') { diff --git a/frontend/pages/calendar.vue b/frontend/pages/calendar.vue index 88c183a..77d17f6 100644 --- a/frontend/pages/calendar.vue +++ b/frontend/pages/calendar.vue @@ -30,22 +30,17 @@
- - +
@@ -111,6 +106,7 @@ import CalendarGrid from '~/components/CalendarGrid.vue' import AbsenceFormDrawer from '~/components/AbsenceFormDrawer.vue' import AbsencePrintDrawer from '~/components/AbsencePrintDrawer.vue' import EmployeeNameFilterInput from '~/components/EmployeeNameFilterInput.vue' +import PeriodStepperPicker from '~/components/PeriodStepperPicker.vue' import SiteFilterSelector from '~/components/SiteFilterSelector.vue' useHead({ @@ -195,8 +191,8 @@ const months = [ {value: 11, label: 'Décembre'} ] -const years = Array.from({length: 5}, (unusedValue, index) => now.getFullYear() - 2 + index) - +const selectedMonthLabel = computed(() => `${months[selectedMonth.value]?.label ?? ''}`) +const monthPickerValue = computed(() => `${selectedYear.value}-${String(selectedMonth.value + 1).padStart(2, '0')}`) // Infos de calendrier calculées. const daysInMonth = computed(() => getDaysInMonth(selectedYear.value, selectedMonth.value)) @@ -316,6 +312,22 @@ const addMonths = (date: Date, months: number) => { return next } +const shiftMonth = (delta: number) => { + const next = new Date(selectedYear.value, selectedMonth.value + delta, 1) + selectedYear.value = next.getFullYear() + selectedMonth.value = next.getMonth() +} + +const onMonthPickerValue = (value: string) => { + if (!value) return + const [yearStr, monthStr] = value.split('-') + const year = Number(yearStr) + const month = Number(monthStr) + if (!Number.isInteger(year) || !Number.isInteger(month) || month < 1 || month > 12) return + selectedYear.value = year + selectedMonth.value = month - 1 +} + // Limite l'intervalle d'impression à 2 mois max. const enforcePrintRange = () => { if (!printForm.from) return