Skip to content

Commit 20aeaa8

Browse files
authored
Merge pull request #485 from klee-contrib/gideruette/issue483
[DsfrHeader] Fix quick link : #483 #484 #486
2 parents 33b46e7 + a506bd8 commit 20aeaa8

File tree

4 files changed

+55
-12
lines changed

4 files changed

+55
-12
lines changed

src/components/DsfrHeader/DsfrHeader.stories.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export default {
4949
- \`to\`: Chemin ou objet à passer à \`to\` de \`RouterLink\` (\`'/notification'\` ou \`{ name: 'Notifications' }\` par ex.)
5050
- \`href\`: URL à passer à \`href\` de la balise \`<a>\` (\`'https://systeme-de-design.gouv.fr\` par ex.) **pour un lien externe uniquement**.
5151
- \`icon\` Nom de l’icône [Remix Icon](https://remixicon.com/) (ou toute autre icône de [oh-vue-icons](https://oh-vue-icons.netlify.app/)) à afficher (\`'ri-phone-line'\` par ex.)
52+
- \`target\` La target du lien (\`'_self'\`, \`'_blank'\` par ex.)
5253
- \`iconRight\` Permet de mettre l’icône à droite (si la valeur est \`true\` ou <em>truthy</em> et que \`icon\` est renseigné )
5354
- \`iconAttrs\` Ensemble des props/attributs à donner à \`<OhVueIcon>\` (Cf. [Doc](https://oh-vue-icons.netlify.app/docs#props)). Ex. : \`{ scale: 0.9, animation: }\`
5455
- \`button\`: \`true\` pour avoir une balise \`button\`, \`false\` pour laisser en balise \`a\`
@@ -144,7 +145,7 @@ EnTeteSimple.args = {
144145
homeTo: '#',
145146
quickLinks: [
146147
{ label: 'Créer un espace', to: '/space/create', icon: 'ri-add-circle-line', iconAttrs: { scale: 0.9 } },
147-
{ label: 'Se connecter', to: '/login', class: 'fr-fi-lock-line' },
148+
{ label: 'Se connecter', to: '/login', class: 'fr-fi-lock-line', target: '_blank' },
148149
{ label: 'S’enregistrer', to: '/signin', icon: 'ri-account-circle-line', iconRight: true, iconAttrs: { animation: 'spin', speed: 'slow' } },
149150
],
150151
}

src/components/DsfrHeader/DsfrHeader.vue

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ export default defineComponent({
6464
type: String,
6565
default: 'Recherche',
6666
},
67+
quickLinksAriaLabel: {
68+
type: String,
69+
default: 'Menu secondaire',
70+
},
6771
showSearch: Boolean,
6872
},
6973
@@ -83,22 +87,38 @@ export default defineComponent({
8387
},
8488
},
8589
90+
mounted () {
91+
document.addEventListener('keydown', this.onKeyDown)
92+
},
93+
unmounted () {
94+
document.removeEventListener('keydown', this.onKeyDown)
95+
},
8696
methods: {
8797
hideModal () {
8898
this.modalOpened = false
8999
this.menuOpened = false
90100
this.searchModalOpened = false
101+
document.getElementById('button-menu')?.focus()
91102
},
92103
showMenu () {
93104
this.modalOpened = true
94105
this.menuOpened = true
95106
this.searchModalOpened = false
107+
document.getElementById('close-button')?.focus()
96108
},
97109
showSearchModal () {
98110
this.modalOpened = true
99111
this.menuOpened = false
100112
this.searchModalOpened = true
101113
},
114+
onKeyDown (e) {
115+
if (e.key === 'Escape') {
116+
this.hideModal()
117+
}
118+
},
119+
onQuickLinkClick () {
120+
this.hideModal()
121+
},
102122
},
103123
})
104124
</script>
@@ -190,6 +210,7 @@ export default defineComponent({
190210
<DsfrHeaderMenuLinks
191211
v-if="!menuOpened"
192212
:links="quickLinks"
213+
:nav-aria-label="quickLinksAriaLabel"
193214
/>
194215
</div>
195216
<div
@@ -212,10 +233,13 @@ export default defineComponent({
212233
id="header-navigation"
213234
class="fr-header__menu fr-modal"
214235
:class="{ 'fr-modal--opened': modalOpened }"
215-
aria-labelledby="button-menu"
236+
aria-label="Menu modal"
237+
role="dialog"
238+
aria-modal="true"
216239
>
217240
<div class="fr-container">
218241
<button
242+
id="close-button"
219243
class="fr-btn fr-btn--close"
220244
aria-controls="header-navigation"
221245
data-testid="close-modal-btn"
@@ -227,6 +251,8 @@ export default defineComponent({
227251
<DsfrHeaderMenuLinks
228252
v-if="menuOpened"
229253
:links="quickLinks"
254+
:nav-aria-label="quickLinksAriaLabel"
255+
@link-click="onQuickLinkClick"
230256
/>
231257
</div>
232258
<div

src/components/DsfrHeader/DsfrHeaderMenuLink.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ export default defineComponent({
4141
type: String,
4242
default: undefined,
4343
},
44+
target: {
45+
type: String,
46+
default: '_self',
47+
},
4448
},
4549
4650
computed: {
@@ -80,6 +84,7 @@ export default defineComponent({
8084
:is="is"
8185
class="fr-btn"
8286
v-bind="linkData"
87+
:target="target"
8388
@click.stop="onClick"
8489
>
8590
<VIcon

src/components/DsfrHeader/DsfrHeaderMenuLinks.vue

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,32 @@ export default defineComponent({
1414
type: Array,
1515
default: () => undefined,
1616
},
17+
navAriaLabel: {
18+
type: String,
19+
default: 'Menu secondaire',
20+
},
1721
},
22+
emits: ['linkClick'],
1823
})
1924
</script>
2025

2126
<template>
22-
<ul
23-
class="fr-btns-group"
27+
<nav
28+
role="navigation"
29+
:aria-label="navAriaLabel"
2430
>
25-
<li
26-
v-for="(quickLink, index) in links"
27-
:key="index"
31+
<ul
32+
class="fr-btns-group"
2833
>
29-
<DsfrHeaderMenuLink
30-
v-bind="quickLink"
31-
/>
32-
</li>
33-
</ul>
34+
<li
35+
v-for="(quickLink, index) in links"
36+
:key="index"
37+
>
38+
<DsfrHeaderMenuLink
39+
v-bind="quickLink"
40+
:on-click="()=>$emit('linkClick')"
41+
/>
42+
</li>
43+
</ul>
44+
</nav>
3445
</template>

0 commit comments

Comments
 (0)