Skip to content

Commit 3d4f632

Browse files
committed
refactor(DsfrNavigationMenu): ♻️ remanie les stories et ajoute la JSDoc
## Pourquoi les changements ont été faits : - Migration des stories de `DsfrNavigationMenu` vers le format CSF3. - Ajout de la documentation JSDoc pour le slot par défaut de `DsfrNavigationMenu.vue`. ## Quelles modifications ont été apportées : - **`DsfrNavigationMenu.stories.ts`**: - Remplacement de l'export par défaut par un objet `meta` typé. - Déplacement de la logique de rendu dans la fonction `render` de `meta`, avec gestion de l'état `expandedMenuId` via `ref`. - Transformation de la story en un objet `StoryObj`. - L'événement `toggle-id` est maintenant tracé via `onToggleId`. - **`DsfrNavigationMenu.vue`**: - Ajout de `defineSlots` avec un commentaire JSDoc pour le slot `default`. - Suppression du commentaire `@slot` redondant dans le template.
1 parent bfcbf1a commit 3d4f632

File tree

3 files changed

+76
-49
lines changed

3 files changed

+76
-49
lines changed
Lines changed: 57 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
import type { Meta, StoryObj } from '@storybook/vue3'
2+
3+
import { fn } from '@storybook/test'
4+
import { ref } from 'vue'
5+
16
import DsfrNavigation from './DsfrNavigation.vue'
27
import DsfrNavigationItem from './DsfrNavigationItem.vue'
38
import DsfrNavigationMenu from './DsfrNavigationMenu.vue'
49

5-
export default {
10+
const meta = {
611
component: DsfrNavigationMenu,
712
title: 'Composants/DsfrNavigationMenu',
813
argTypes: {
@@ -11,10 +16,7 @@ export default {
1116
description:
1217
'(Optionnel) Valeur de l’attribut `id` de ce sous-menu. *N.B. : Il est recommandé de ne pas le donner, la bibliothèque lui en donnera un pseudo-aléatoire*.',
1318
},
14-
'toggle-id': {
15-
description:
16-
'Événement émis lors du click sur le lien, avec en argument l’id de l’élément cliqué',
17-
},
19+
onToggleId: fn(),
1820
links: {
1921
control: 'object',
2022
description:
@@ -35,59 +37,66 @@ export default {
3537
'Indique l’id de l’élément "ouvert" ou "déplié" dans le menu. Permet au composant de savoir s’il doit être déplié (si `expandedId` est identique à son `id`) ou non (si `expandedId` est différent de son `id`)',
3638
},
3739
},
38-
}
39-
40-
export const NavigationSousMenu = (args) => ({
41-
components: {
42-
DsfrNavigation,
43-
DsfrNavigationItem,
44-
DsfrNavigationMenu,
45-
},
40+
render: (args) => ({
41+
components: {
42+
DsfrNavigation,
43+
DsfrNavigationItem,
44+
DsfrNavigationMenu,
45+
},
46+
setup () {
47+
const expandedMenuId = ref(args.expandedId)
4648

47-
data () {
48-
return {
49-
...args,
50-
expandedMenuId: undefined,
51-
}
52-
},
49+
function toggle (id: string) {
50+
if (id === expandedMenuId.value) {
51+
expandedMenuId.value = undefined
52+
} else {
53+
expandedMenuId.value = id
54+
}
55+
args.onToggleId(id)
56+
}
5357

54-
methods: {
55-
toggle (id) {
56-
if (id === this.expandedMenuId) {
57-
this.expandedMenuId = undefined
58-
return
58+
return {
59+
args,
60+
expandedMenuId,
61+
toggle,
5962
}
60-
this.expandedMenuId = id
6163
},
62-
},
63-
64-
template: `
64+
template: `
6565
<DsfrNavigation>
6666
<DsfrNavigationItem>
6767
<DsfrNavigationMenu
68-
:title="title"
69-
:links="links"
68+
:title="args.title"
69+
:links="args.links"
7070
:expanded-id="expandedMenuId"
71-
@toggle-id="toggle($event)"
71+
@toggle-id="toggle"
7272
/>
7373
</DsfrNavigationItem>
7474
</DsfrNavigation>
7575
`,
76-
})
77-
NavigationSousMenu.args = {
78-
title: 'Nom de menu original',
79-
links: [
80-
{
81-
text: 'Valeur 1',
82-
to: '#val1',
83-
},
84-
{
85-
text: 'Valeur 2',
86-
to: '#val2',
87-
},
88-
{
89-
text: 'Valeur 3',
90-
to: '#val3',
91-
},
92-
],
76+
}),
77+
} satisfies Meta<typeof DsfrNavigationMenu>
78+
79+
export default meta
80+
type Story = StoryObj<typeof meta>
81+
82+
export const SousMenu: Story = {
83+
name: 'Sous-menu',
84+
args: {
85+
title: 'Nom de menu original',
86+
links: [
87+
{
88+
text: 'Valeur 1',
89+
to: '#val1',
90+
},
91+
{
92+
text: 'Valeur 2',
93+
to: '#val2',
94+
},
95+
{
96+
text: 'Valeur 3',
97+
to: '#val3',
98+
},
99+
],
100+
onToggleId: fn(),
101+
},
93102
}

src/components/DsfrNavigation/DsfrNavigationMenu.vue

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ const props = withDefaults(defineProps<DsfrNavigationMenuProps>(), {
1919
2020
defineEmits<{ (event: 'toggleId', id: string): void }>()
2121
22+
defineSlots<{
23+
/**
24+
* Slot par défaut pour le contenu de l’item de liste.
25+
* Sera dans `<ul class="fr-menu__list">`
26+
*/
27+
default: () => any
28+
}>()
29+
2230
const {
2331
collapse,
2432
collapsing,
@@ -66,7 +74,6 @@ onMounted(() => {
6674
<ul
6775
class="fr-menu__list"
6876
>
69-
<!-- @slot Slot par défaut pour le contenu de l’item de liste. Sera dans `<ul class="fr-menu__list">` -->
7077
<slot />
7178
<DsfrNavigationMenuItem
7279
v-for="(link, idx) of links"

src/components/DsfrNotice/DsfrNotice.vue

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,17 @@ withDefaults(defineProps<DsfrNoticeProps>(), {
1010
})
1111
1212
defineEmits<{ (event: 'close'): void }>()
13+
14+
defineSlots<{
15+
/**
16+
* Slot pour le contenu du titre du bandeau.
17+
*/
18+
default: () => any
19+
/**
20+
* Slot pour le contenu de la description du bandeau.
21+
*/
22+
desc: () => any
23+
}>()
1324
</script>
1425

1526
<template>

0 commit comments

Comments
 (0)