Compare commits

..

4 Commits

Author SHA1 Message Date
gitea-actions b13ba41674 chore: bump version to v0.4.11
Auto Tag Develop / tag (push) Successful in 6s
Build & Push Docker Image / build (push) Successful in 44s
2026-05-26 09:02:57 +00:00
Matthieu ac615875f3 fix(absences) : dates du drawer employé en pleine largeur (1 par ligne)
Auto Tag Develop / tag (push) Successful in 7s
Dans le drawer « Informations employé », les champs Date d'embauche et
Date de sortie étaient sur une grille 2 colonnes : le popover du
calendrier MalioDate, coincé en demi-largeur, chevauchait le champ
voisin. Passage en pleine largeur (sm:col-span-2) pour laisser le
calendrier s'afficher correctement.
2026-05-26 11:02:50 +02:00
gitea-actions f8322f8b1e chore: bump version to v0.4.10
Auto Tag Develop / tag (push) Successful in 6s
Build & Push Docker Image / build (push) Successful in 45s
2026-05-26 08:49:58 +00:00
Matthieu cd474d5089 feat(absences) : réserve « Mes absences » aux employés
Auto Tag Develop / tag (push) Successful in 6s
Un utilisateur non coché « Employé » (isEmployee = false) ne voit plus
l'entrée « Mes absences » dans le menu et ne peut plus accéder à la page
/absences (nouveau middleware employee qui redirige vers l'accueil).
L'entête de section « Absences » est masquée si l'utilisateur n'est ni
employé ni admin.
2026-05-26 10:49:52 +02:00
5 changed files with 37 additions and 15 deletions
+1 -1
View File
@@ -1,2 +1,2 @@
parameters: parameters:
app.version: '0.4.9' app.version: '0.4.11'
@@ -7,16 +7,22 @@
</div> </div>
</template> </template>
<form v-if="user" class="grid grid-cols-1 gap-4 sm:grid-cols-2" @submit.prevent="save"> <form v-if="user" class="grid grid-cols-1 gap-4 sm:grid-cols-2" @submit.prevent="save">
<!-- Dates en pleine largeur (1 par ligne) : le popover du calendrier
a besoin de toute la largeur pour s'afficher correctement. -->
<div class="sm:col-span-2">
<MalioDate <MalioDate
v-model="form.hireDate" v-model="form.hireDate"
:label="$t('absences.admin.employees.fields.hireDate')" :label="$t('absences.admin.employees.fields.hireDate')"
group-class="w-full" group-class="w-full"
/> />
</div>
<div class="sm:col-span-2">
<MalioDate <MalioDate
v-model="form.endDate" v-model="form.endDate"
:label="$t('absences.admin.employees.fields.endDate')" :label="$t('absences.admin.employees.fields.endDate')"
group-class="w-full" group-class="w-full"
/> />
</div>
<MalioSelect <MalioSelect
v-model="form.contractType" v-model="form.contractType"
:label="$t('absences.admin.employees.fields.contractType')" :label="$t('absences.admin.employees.fields.contractType')"
+5
View File
@@ -119,11 +119,14 @@
</div> </div>
<!-- Section : Absences --> <!-- Section : Absences -->
<template v-if="isAbsenceSectionVisible">
<p v-if="!sidebarIsCollapsed" class="px-4 pt-5 pb-1 text-xs font-semibold uppercase tracking-wider text-neutral-400"> <p v-if="!sidebarIsCollapsed" class="px-4 pt-5 pb-1 text-xs font-semibold uppercase tracking-wider text-neutral-400">
Absences Absences
</p> </p>
<div v-else class="mx-2 my-3 border-t border-secondary-500" /> <div v-else class="mx-2 my-3 border-t border-secondary-500" />
</template>
<SidebarLink <SidebarLink
v-if="isEmployee"
to="/absences" to="/absences"
icon="mdi:umbrella-beach-outline" icon="mdi:umbrella-beach-outline"
label="Mes absences" label="Mes absences"
@@ -211,6 +214,8 @@ const {version} = useAppVersion()
const route = useRoute() const route = useRoute()
const isAdmin = computed(() => (auth.user?.roles ?? []).includes('ROLE_ADMIN')) const isAdmin = computed(() => (auth.user?.roles ?? []).includes('ROLE_ADMIN'))
const isEmployee = computed(() => Boolean(auth.user?.isEmployee))
const isAbsenceSectionVisible = computed(() => isEmployee.value || isAdmin.value)
const isMailVisible = computed(() => { const isMailVisible = computed(() => {
const roles: string[] = auth.user?.roles ?? [] const roles: string[] = auth.user?.roles ?? []
+9
View File
@@ -0,0 +1,9 @@
export default defineNuxtRouteMiddleware(() => {
const auth = useAuthStore()
// "Mes absences" is reserved for users flagged as employees (subject to the
// absence management). Non-employees are redirected to the home page.
if (!auth.isAuthenticated || !auth.user?.isEmployee) {
return navigateTo('/')
}
})
+2
View File
@@ -75,6 +75,8 @@ import { useAbsenceHelpers } from '~/composables/useAbsenceHelpers'
type Row = AbsenceRequest & { typeLabelText: string; periodText: string; daysText: string; createdAtText: string } type Row = AbsenceRequest & { typeLabelText: string; periodText: string; daysText: string; createdAtText: string }
definePageMeta({ middleware: ['employee'] })
const { t } = useI18n() const { t } = useI18n()
const service = useAbsenceService() const service = useAbsenceService()
const { statusLabel, statusVariant, statusIcon, formatRange, formatDays, formatDate } = useAbsenceHelpers() const { statusLabel, statusVariant, statusIcon, formatRange, formatDays, formatDate } = useAbsenceHelpers()