feat : header contextuel jours/mois/années (#date-year-picker)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-22 10:06:56 +02:00
parent ea379ce5e4
commit 59212a241e
@@ -4,7 +4,7 @@
type="button" type="button"
data-test="header-prev" data-test="header-prev"
class="ml-2 flex self-start rounded" class="ml-2 flex self-start rounded"
:aria-label="viewMode === 'days' ? 'Mois précédent' : 'Année précédente'" :aria-label="prevLabel"
@click="emit('prev')" @click="emit('prev')"
> >
<Icon <Icon
@@ -18,10 +18,11 @@
type="button" type="button"
data-test="header-toggle" data-test="header-toggle"
class="flex gap-1 rounded text-base font-medium" class="flex gap-1 rounded text-base font-medium"
@click="emit('toggle-view')" @click="viewMode !== 'years' && emit('toggle-view')"
> >
<span class="mt-[2px]">{{ label }}</span> <span class="mt-[2px]">{{ label }}</span>
<Icon <Icon
v-if="viewMode !== 'years'"
icon="mdi:chevron-down" icon="mdi:chevron-down"
:width="25" :width="25"
:height="25" :height="25"
@@ -32,7 +33,7 @@
type="button" type="button"
data-test="header-next" data-test="header-next"
class="mr-2 flex self-start rounded" class="mr-2 flex self-start rounded"
:aria-label="viewMode === 'days' ? 'Mois suivant' : 'Année suivante'" :aria-label="nextLabel"
@click="emit('next')" @click="emit('next')"
> >
<Icon <Icon
@@ -51,9 +52,10 @@ import {Icon} from '@iconify/vue'
defineOptions({name: 'MalioDateCalendarHeader'}) defineOptions({name: 'MalioDateCalendarHeader'})
const props = defineProps<{ const props = defineProps<{
viewMode: 'days' | 'months' viewMode: 'days' | 'months' | 'years'
currentMonth: number currentMonth: number
currentYear: number currentYear: number
yearPageStart: number
}>() }>()
const emit = defineEmits<{ const emit = defineEmits<{
@@ -64,7 +66,20 @@ const monthsLong = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'] 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre']
const label = computed(() => { const label = computed(() => {
if (props.viewMode === 'years') return `${props.yearPageStart} ${props.yearPageStart + 11}`
if (props.viewMode === 'months') return `${props.currentYear}`
const name = monthsLong[props.currentMonth] const name = monthsLong[props.currentMonth]
return `${name.charAt(0).toUpperCase()}${name.slice(1)} ${props.currentYear}` return `${name.charAt(0).toUpperCase()}${name.slice(1)} ${props.currentYear}`
}) })
const prevLabel = computed(() =>
props.viewMode === 'days' ? 'Mois précédent'
: props.viewMode === 'months' ? 'Année précédente'
: 'Période précédente',
)
const nextLabel = computed(() =>
props.viewMode === 'days' ? 'Mois suivant'
: props.viewMode === 'months' ? 'Année suivante'
: 'Période suivante',
)
</script> </script>