Skip to content

Commit 7d387f2

Browse files
committed
refactor(DsfrSideMenuList): ♻️ modernise le composant et convertit les stories en CSF3
- Modernisation du composant DsfrSideMenuList 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 - Utilisation de la fonction emit au lieu de $emit pour une syntaxe plus moderne - Ajout de defineSlots avec documentation TypeScript pour le slot default - Modernisation de la syntaxe emit avec types explicites et JSDoc - Remplacement de $emit par emit() dans le template pour plus de cohérence - Conversion de la story au format CSF3 avec Meta/StoryObj et satisfies - Migration de l'options API vers la Composition API avec setup() et ref - Ajout de types TypeScript pour la fonction toggleExpandedForMenuWithId - Échappement des apostrophes dans les descriptions argTypes françaises
1 parent afd3abf commit 7d387f2

File tree

2 files changed

+88
-72
lines changed

2 files changed

+88
-72
lines changed
Lines changed: 75 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import type { Meta, StoryObj } from '@storybook/vue3'
2+
13
import DsfrSideMenu from './DsfrSideMenu.vue'
24
import DsfrSideMenuList from './DsfrSideMenuList.vue'
35

4-
function toggleExpandedForMenuWithId (menuItems, id) {
6+
function toggleExpandedForMenuWithId (menuItems: any[], id: string) {
57
menuItems.forEach((menuItem) => {
68
if (menuItem.id === id) {
79
menuItem.expanded = !menuItem.expanded
@@ -13,13 +15,13 @@ function toggleExpandedForMenuWithId (menuItems, id) {
1315
})
1416
}
1517

16-
export default {
18+
const meta = {
1719
component: DsfrSideMenuList,
1820
title: 'Composants/DsfrSideMenuList',
1921
argTypes: {
2022
headingTitle: {
2123
control: 'text',
22-
description: 'Titre de la rubrique (cest le titre du menu latéral)',
24+
description: 'Titre de la rubrique (c\'est le titre du menu latéral)',
2325
},
2426
buttonLabel: {
2527
control: 'text',
@@ -45,84 +47,89 @@ export default {
4547
- \`id\`: identifiant unique d'item de menu
4648
- \`to\`: URL complète pour un lien externe, ou chaîne de caractère ou objet à donner à \`to\` de \`RouterLink\` pour un lien interne
4749
- \`text\`: texte du menu
48-
- \`active\`: indique que litem de menu correspond à la page courante
50+
- \`active\`: indique que l'item de menu correspond à la page courante
4951
`,
5052
},
5153
},
52-
}
54+
} satisfies Meta<typeof DsfrSideMenuList>
5355

54-
export const MenuLateral = (args) => ({
55-
components: {
56-
DsfrSideMenu,
57-
DsfrSideMenuList,
58-
},
56+
export default meta
5957

60-
data () {
61-
return {
62-
...args,
63-
}
64-
},
58+
type Story = StoryObj<typeof meta>
6559

66-
methods: {
67-
toggleExpand (id) {
68-
toggleExpandedForMenuWithId(this.menuItems, id)
60+
export const MenuLateral: Story = {
61+
render: (args) => ({
62+
components: {
63+
DsfrSideMenu,
64+
DsfrSideMenuList,
6965
},
70-
},
7166

72-
template: `
67+
setup () {
68+
const toggleExpand = (id: string) => {
69+
toggleExpandedForMenuWithId(args.menuItems, id)
70+
}
71+
72+
return {
73+
args,
74+
toggleExpand,
75+
}
76+
},
77+
78+
template: `
7379
<DsfrSideMenu
74-
:heading-title="headingTitle"
75-
:buttonLabel="buttonLabel"
80+
:heading-title="args.headingTitle"
81+
:buttonLabel="args.buttonLabel"
7682
>
7783
<DsfrSideMenuList
78-
:id="id"
79-
:menu-items="menuItems"
84+
:id="args.id"
85+
:menu-items="args.menuItems"
8086
@toggle-expand="toggleExpand"
8187
/>
8288
</DsfrSideMenu>
8389
`,
84-
})
85-
MenuLateral.args = {
86-
buttonLabel: 'Dans cette rubrique',
87-
headingTitle: 'Titre de la rubrique',
88-
id: 'list',
89-
menuItems: [
90-
{
91-
id: '11',
92-
to: '/rubrique-1',
93-
text: 'Premier titre de niveau 1',
94-
},
95-
{
96-
id: '12',
97-
to: '/rubrique-2',
98-
text: 'Deuxième titre de niveau 1',
99-
active: true,
100-
menuItems: [
101-
{
102-
id: '21',
103-
to: '/rubrique-2/sous-rubrique-1',
104-
text: 'Premier titre de niveau 2',
105-
},
106-
{
107-
id: '22',
108-
to: '/rubrique-2/sous-rubrique-2',
109-
text: 'Deuxième titre de niveau 2',
110-
active: true,
111-
menuItems: [
112-
{
113-
id: '31',
114-
to: '/rubrique-2/sous-rubrique-2/sous-sous-rubrique-1',
115-
text: 'Premier titre de niveau 3',
116-
},
117-
{
118-
id: '32',
119-
to: '/rubrique-2/sous-rubrique-2/sous-sous-rubrique-2',
120-
text: 'Deuxième titre de niveau 3',
121-
active: true,
122-
},
123-
],
124-
},
125-
],
126-
},
127-
],
90+
}),
91+
args: {
92+
buttonLabel: 'Dans cette rubrique',
93+
headingTitle: 'Titre de la rubrique',
94+
id: 'list',
95+
menuItems: [
96+
{
97+
id: '11',
98+
to: '/rubrique-1',
99+
text: 'Premier titre de niveau 1',
100+
},
101+
{
102+
id: '12',
103+
to: '/rubrique-2',
104+
text: 'Deuxième titre de niveau 1',
105+
active: true,
106+
menuItems: [
107+
{
108+
id: '21',
109+
to: '/rubrique-2/sous-rubrique-1',
110+
text: 'Premier titre de niveau 2',
111+
},
112+
{
113+
id: '22',
114+
to: '/rubrique-2/sous-rubrique-2',
115+
text: 'Deuxième titre de niveau 2',
116+
active: true,
117+
menuItems: [
118+
{
119+
id: '31',
120+
to: '/rubrique-2/sous-rubrique-2/sous-sous-rubrique-1',
121+
text: 'Premier titre de niveau 3',
122+
},
123+
{
124+
id: '32',
125+
to: '/rubrique-2/sous-rubrique-2/sous-sous-rubrique-2',
126+
text: 'Deuxième titre de niveau 3',
127+
active: true,
128+
},
129+
],
130+
},
131+
],
132+
},
133+
],
134+
},
128135
}

src/components/DsfrSideMenu/DsfrSideMenuList.vue

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,17 @@ const props = withDefaults(defineProps<DsfrSideMenuListProps>(), {
1515
menuItems: () => [],
1616
})
1717
18-
defineEmits<{ (e: 'toggleExpand', payload: string): void }>()
18+
/**
19+
* Événements émis par le composant DsfrSideMenuList
20+
*/
21+
const emit = defineEmits<{
22+
toggleExpand: [payload: string]
23+
}>()
24+
25+
defineSlots<{
26+
/** Slot par défaut pour le contenu d'une liste du menu latéral */
27+
default?: () => any
28+
}>()
1929
2030
const {
2131
collapse,
@@ -62,7 +72,6 @@ const linkProps = (to: string | RouteLocationRaw | undefined) => {
6272
<ul
6373
class="fr-sidemenu__list"
6474
>
65-
<!-- @slot Slot par défaut pour le contenu d’une liste du menu latéral -->
6675
<slot />
6776

6877
<DsfrSideMenuListItem
@@ -85,7 +94,7 @@ const linkProps = (to: string | RouteLocationRaw | undefined) => {
8594
:active="!!menuItem.active"
8695
:expanded="!!menuItem.expanded"
8796
:control-id="(menuItem.id as string)"
88-
@toggle-expand="menuItem.expanded = !menuItem.expanded"
97+
@toggle-expand="emit('toggleExpand', $event)"
8998
>
9099
{{ menuItem.text }}
91100
</DsfrSideMenuButton>
@@ -95,7 +104,7 @@ const linkProps = (to: string | RouteLocationRaw | undefined) => {
95104
collapsable
96105
:expanded="!!menuItem.expanded"
97106
:menu-items="menuItem.menuItems"
98-
@toggle-expand="$emit('toggleExpand', $event)"
107+
@toggle-expand="emit('toggleExpand', $event)"
99108
/>
100109
</template>
101110
</DsfrSideMenuListItem>

0 commit comments

Comments
 (0)