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