Skip to content

Commit afd3abf

Browse files
committed
refactor(DsfrSideMenuLink): ♻️ modernise le composant et convertit les stories en CSF3
## Pourquoi les changements ont été faits : - Modernisation du composant DsfrSideMenuLink selon les conventions Vue 3 - Migration des stories Storybook vers le format CSF3 moderne - Amélioration de la cohérence avec les autres composants du projet - Centralisation des types dans le fichier DsfrSideMenu.types.ts ## Quelles modifications ont été apportées : - Ajout du type DsfrSideMenuLinkProps dans DsfrSideMenu.types.ts - Ajout de defineSlots avec documentation TypeScript pour le slot default - Import du type depuis le fichier centralisé avec ordre correct des imports - Conversion de la story au format CSF3 avec Meta/StoryObj et satisfies - Migration de l'options API vers la Composition API avec setup() - Structure moderne sans erreurs ESLint et TypeScript
1 parent 902396a commit afd3abf

File tree

3 files changed

+40
-26
lines changed

3 files changed

+40
-26
lines changed

src/components/DsfrSideMenu/DsfrSideMenu.types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ import type { RouteLocationRaw } from 'vue-router'
22

33
export type DsfrSideMenuListItemProps = { active?: boolean }
44

5+
export type DsfrSideMenuLinkProps = {
6+
active?: boolean
7+
to: string
8+
}
9+
510
export type DsfrSideMenuProps = {
611
buttonLabel?: string
712
id?: string
Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import type { Meta, StoryObj } from '@storybook/vue3'
2+
13
import DsfrSideMenu from './DsfrSideMenu.vue'
24
import DsfrSideMenuLink from './DsfrSideMenuLink.vue'
35
import DsfrSideMenuList from './DsfrSideMenuList.vue'
46
import DsfrSideMenuListItem from './DsfrSideMenuListItem.vue'
57

6-
export default {
8+
const meta = {
79
component: DsfrSideMenuLink,
810
title: 'Composants/DsfrSideMenuLink',
911
argTypes: {
@@ -18,23 +20,28 @@ export default {
1820
'Indique si le lien correspond à la page courante (`true`) ou non (`false`)',
1921
},
2022
},
21-
}
23+
} satisfies Meta<typeof DsfrSideMenuLink>
2224

23-
export const LienDansUnElementDeListeDeMenuLateral = (args) => ({
24-
components: {
25-
DsfrSideMenu,
26-
DsfrSideMenuList,
27-
DsfrSideMenuListItem,
28-
DsfrSideMenuLink,
29-
},
25+
export default meta
3026

31-
data () {
32-
return {
33-
...args,
34-
}
35-
},
27+
type Story = StoryObj<typeof meta>
3628

37-
template: `
29+
export const LienDansUnElementDeListeDeMenuLateral: Story = {
30+
render: (args) => ({
31+
components: {
32+
DsfrSideMenu,
33+
DsfrSideMenuList,
34+
DsfrSideMenuListItem,
35+
DsfrSideMenuLink,
36+
},
37+
38+
setup () {
39+
return {
40+
...args,
41+
}
42+
},
43+
44+
template: `
3845
<DsfrSideMenu
3946
heading-title="Menu latéral exemplaire"
4047
buttonLabel="Bouton exemplaire"
@@ -51,9 +58,10 @@ export const LienDansUnElementDeListeDeMenuLateral = (args) => ({
5158
</DsfrSideMenuList>
5259
</DsfrSideMenu>
5360
`,
54-
})
55-
LienDansUnElementDeListeDeMenuLateral.args = {
56-
active: false,
57-
to: '/',
58-
id: 'list-id',
61+
}),
62+
args: {
63+
active: false,
64+
to: '/',
65+
id: 'list-id',
66+
},
5967
}

src/components/DsfrSideMenu/DsfrSideMenuLink.vue

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
<script lang="ts" setup>
2+
import type { DsfrSideMenuLinkProps } from './DsfrSideMenu.types'
3+
24
import { computed } from 'vue'
35
4-
export type DsfrSideMenuLinkProps = {
5-
active?: boolean
6-
to: string
7-
}
6+
export type { DsfrSideMenuLinkProps }
87
98
const props = withDefaults(defineProps<DsfrSideMenuLinkProps>(), {
109
to: '',
1110
})
1211
13-
defineEmits<{ (e: 'toggle-expand', payload: string): void }>()
12+
defineSlots<{
13+
/** Slot par défaut pour le contenu d'une liste du menu latéral */
14+
default?: () => any
15+
}>()
1416
1517
const isExternalLink = computed(() => {
1618
return typeof props.to === 'string' && props.to.startsWith('http')
@@ -30,7 +32,6 @@ const linkProps = computed(() => {
3032
class="fr-sidemenu__link"
3133
v-bind="linkProps"
3234
>
33-
<!-- @slot Slot par défaut pour le contenu d’une liste du menu latéral -->
3435
<slot />
3536
</component>
3637
</template>

0 commit comments

Comments
 (0)