Skip to content

Commit 24a68f5

Browse files
authored
Merge pull request #657 from dnum-mi/feat-635-links-in-modal-footer
feat: ✨ permet de personnaliser le pied-de-page de la modale
2 parents 983ed33 + 21d3cc2 commit 24a68f5

File tree

4 files changed

+145
-20
lines changed

4 files changed

+145
-20
lines changed

src/components/DsfrModal/DsfrModal.stories.ts

Lines changed: 125 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export default {
6262
},
6363
}
6464

65-
export const Modal = (args) => ({
65+
export const ModalAvecActions = (args) => ({
6666
components: {
6767
DsfrModal,
6868
DsfrButton,
@@ -75,7 +75,10 @@ export const Modal = (args) => ({
7575

7676
computed: {
7777
modifiedActions () {
78-
return this.actions.map(action => ({ ...action, onClick: () => { action.onClick(); this.onClose() } }))
78+
return this.actions.map(action => ({
79+
...action,
80+
onClick: () => { this.onClick?.(action.actionArg); this.onClose() },
81+
}))
7982
},
8083
},
8184

@@ -88,28 +91,29 @@ export const Modal = (args) => ({
8891
<DsfrModal
8992
ref="modal"
9093
:opened="opened"
91-
:actions="modifyActions"
94+
:actions="modifiedActions"
9295
:is-alert="isAlert"
9396
:icon="icon"
9497
:title="title"
9598
:origin="$refs.modalOrigin"
9699
:size="size"
97100
@close="onClose()"
98101
>
99-
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas varius tortor nibh, sit amet tempor nibh finibus et. Aenean eu enim justo. Vestibulum aliquam hendrerit molestie. Mauris malesuada nisi sit amet augue accumsan tincidunt. Maecenas tincidunt, velit ac porttitor pulvinar, tortor eros facilisis libero, vitae commodo nunc quam et ligula. Ut nec ipsum sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer id nisi nec nulla luctus lacinia non eu turpis. Etiam in ex imperdiet justo tincidunt egestas. Ut porttitor urna ac augue cursus tincidunt sit amet sed orci.</p>
102+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas varius tortor nibh, sit amet tempor nibh finibus et. Aenean eu enim justo. Vestibulum aliquam hendrerit molestie. Mauris malesuada nisi sit amet augue accumsan tincidunt. Maecenas tincidunt, velit ac porttitor pulvinar, tortor eros facilisis libero, vitae commodo nunc quam et ligula. Ut nec ipsum sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer id nisi nec nulla luctus lacinia non eu turpis. Etiam in ex imperdiet justo tincidunt egestas. Ut porttitor urna ac augue cursus tincidunt sit amet sed orci.</p>
100103
</DsfrModal>
101104
`,
102105

103106
methods: {
104107
onClose () {
108+
args.onClick('Fermer')
105109
this.opened = false
106110
},
107111
open () {
108112
this.opened = true
109113
},
110114
},
111115
})
112-
Modal.args = {
116+
ModalAvecActions.args = {
113117
opened: false,
114118
title: 'Titre de la modale',
115119
isAlert: false,
@@ -118,15 +122,130 @@ Modal.args = {
118122
actions: [
119123
{
120124
label: 'Valider',
125+
actionArg: 'Valider',
121126
},
122127
{
123128
label: 'Annuler',
129+
actionArg: 'Annuler',
124130
secondary: true,
125131
},
126132
],
127133
}
128134

129-
Modal.play = async ({ canvasElement }) => {
135+
export const ModalSansPiedDePage = (args) => ({
136+
components: {
137+
DsfrModal,
138+
DsfrButton,
139+
VIcon,
140+
},
141+
142+
data () {
143+
return args
144+
},
145+
146+
template: `
147+
<DsfrButton
148+
label="Ouvre la modale"
149+
@click="open()"
150+
ref="modalOrigin"
151+
/>
152+
<DsfrModal
153+
ref="modal"
154+
:opened="opened"
155+
:is-alert="isAlert"
156+
:icon="icon"
157+
:title="title"
158+
:origin="$refs.modalOrigin"
159+
:size="size"
160+
@close="onClose()"
161+
>
162+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas varius tortor nibh, sit amet tempor nibh finibus et. Aenean eu enim justo. Vestibulum aliquam hendrerit molestie. Mauris malesuada nisi sit amet augue accumsan tincidunt. Maecenas tincidunt, velit ac porttitor pulvinar, tortor eros facilisis libero, vitae commodo nunc quam et ligula. Ut nec ipsum sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer id nisi nec nulla luctus lacinia non eu turpis. Etiam in ex imperdiet justo tincidunt egestas. Ut porttitor urna ac augue cursus tincidunt sit amet sed orci.</p>
163+
</DsfrModal>
164+
`,
165+
166+
methods: {
167+
onClose () {
168+
args.onClick('Fermer')
169+
this.opened = false
170+
},
171+
open () {
172+
this.opened = true
173+
},
174+
},
175+
})
176+
ModalSansPiedDePage.args = {
177+
opened: false,
178+
title: 'Titre de la modale',
179+
isAlert: false,
180+
icon: 'ri-checkbox-circle-line',
181+
size: 'md',
182+
actions: [
183+
{
184+
label: 'Valider',
185+
actionArg: 'Valider',
186+
},
187+
{
188+
label: 'Annuler',
189+
actionArg: 'Annuler',
190+
secondary: true,
191+
},
192+
],
193+
}
194+
195+
export const ModalAvecFooterPersonnalise = (args) => ({
196+
components: {
197+
DsfrModal,
198+
DsfrButton,
199+
VIcon,
200+
},
201+
202+
data () {
203+
return args
204+
},
205+
206+
template: `
207+
<DsfrButton
208+
label="Ouvre la modale"
209+
@click="open()"
210+
ref="modalOrigin"
211+
/>
212+
<DsfrModal
213+
ref="modal"
214+
:opened="opened"
215+
:actions="modifiedActions"
216+
:is-alert="isAlert"
217+
:icon="icon"
218+
:title="title"
219+
:origin="$refs.modalOrigin"
220+
:size="size"
221+
@close="onClose()"
222+
>
223+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas varius tortor nibh, sit amet tempor nibh finibus et. Aenean eu enim justo. Vestibulum aliquam hendrerit molestie. Mauris malesuada nisi sit amet augue accumsan tincidunt. Maecenas tincidunt, velit ac porttitor pulvinar, tortor eros facilisis libero, vitae commodo nunc quam et ligula. Ut nec ipsum sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer id nisi nec nulla luctus lacinia non eu turpis. Etiam in ex imperdiet justo tincidunt egestas. Ut porttitor urna ac augue cursus tincidunt sit amet sed orci.</p>
224+
<template #footer>
225+
Ici pied de page personnalisé
226+
</template>
227+
</DsfrModal>
228+
`,
229+
230+
methods: {
231+
onClose () {
232+
args.onClick('Fermer')
233+
this.opened = false
234+
},
235+
open () {
236+
this.opened = true
237+
},
238+
},
239+
})
240+
ModalAvecFooterPersonnalise.args = {
241+
opened: false,
242+
title: 'Titre de la modale',
243+
isAlert: false,
244+
icon: 'ri-checkbox-circle-line',
245+
size: 'md',
246+
}
247+
248+
ModalAvecActions.play = async ({ canvasElement }) => {
130249
const canvas = within(canvasElement)
131250
const openModalButton = canvas.getByRole('button')
132251
await userEvent.type(openModalButton, '{enter}')

src/components/DsfrModal/DsfrModal.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,13 @@ async function close () {
125125
<slot />
126126
</div>
127127
<div
128-
v-if="actions && actions.length"
128+
v-if="actions?.length || $slots.footer"
129129
class="fr-modal__footer"
130130
>
131+
<!-- @slot Slot pour le pied-de-page de la modale `<ul class="fr-modal__footer">` -->
132+
<slot name="footer" />
131133
<DsfrButtonGroup
134+
v-if="actions?.length"
132135
align="right"
133136
:buttons="actions"
134137
inline-layout-when="large"

src/components/DsfrNavigation/DsfrNavigation.types.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export type DsfrNavigationItemProps = {
2828

2929
export type DsfrNavigationMegaMenuCategoryProps = {
3030
title: string
31+
active?: boolean
3132
links: DsfrNavigationMenuLinkProps[]
3233
}
3334

@@ -43,16 +44,12 @@ export type DsfrNavigationMegaMenuProps = {
4344

4445
export type DsfrNavigationMenuLinks = (DsfrNavigationMenuLinkProps | DsfrNavigationMegaMenuProps | DsfrNavigationMenuProps)[]
4546

46-
type SimpleLink = { text?: string ; to?: RouteLocationRaw }
47-
type MenuItem = { title?: string; active?: boolean; links?: DsfrNavigationMenuLinks }
48-
type MegaMenuItem = { title?: string; description: string, link: SimpleLink, menus: { title?: string; active?: boolean; links?: DsfrNavigationMenuLinks }[]}
49-
5047
export type DsfrNavigationProps = {
5148
id?: string
5249
label?: string
5350
navItems:(
54-
SimpleLink
55-
| MenuItem
56-
| MegaMenuItem
51+
DsfrNavigationMenuLinkProps
52+
| DsfrNavigationMenuProps
53+
| DsfrNavigationMegaMenuProps
5754
)[]
5855
}

src/components/DsfrNavigation/DsfrNavigation.vue

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ import DsfrNavigationMenuLink from './DsfrNavigationMenuLink.vue'
88
import DsfrNavigationMenu from './DsfrNavigationMenu.vue'
99
import DsfrNavigationMegaMenu from './DsfrNavigationMegaMenu.vue'
1010
11-
import type { DsfrNavigationMenuLinks, DsfrNavigationProps } from './DsfrNavigation.types'
11+
import type {
12+
DsfrNavigationMenuLinks,
13+
DsfrNavigationProps,
14+
DsfrNavigationMenuProps,
15+
DsfrNavigationMenuLinkProps,
16+
DsfrNavigationMegaMenuProps,
17+
} from './DsfrNavigation.types'
1218
1319
export type { DsfrNavigationMenuLinks, DsfrNavigationProps }
1420
@@ -76,22 +82,22 @@ onUnmounted(() => {
7682
:key="idx"
7783
>
7884
<DsfrNavigationMenuLink
79-
v-if="(navItem as SimpleLink).to && (navItem as SimpleLink).text"
85+
v-if="(navItem as DsfrNavigationMenuLinkProps).to && (navItem as DsfrNavigationMenuLinkProps).text"
8086
v-bind="navItem"
8187
:expanded-id="expandedMenuId"
8288
@toggle-id="toggle($event)"
8389
/>
8490
<!-- @vue-ignore -->
8591
<DsfrNavigationMenu
86-
v-else-if="(navItem as MenuItem).title && (navItem as MenuItem).links"
87-
v-bind="(navItem as MenuItem)"
92+
v-else-if="(navItem as DsfrNavigationMenuProps).title && (navItem as DsfrNavigationMenuProps).links"
93+
v-bind="(navItem as DsfrNavigationMenuProps)"
8894
:expanded-id="expandedMenuId"
8995
@toggle-id="toggle($event)"
9096
/>
9197
<!-- @vue-ignore -->
9298
<DsfrNavigationMegaMenu
93-
v-else-if="(navItem as MegaMenuItem).title && (navItem as MegaMenuItem).menus"
94-
v-bind="(navItem as MegaMenuItem)"
99+
v-else-if="(navItem as DsfrNavigationMegaMenuProps).title && (navItem as DsfrNavigationMegaMenuProps).menus"
100+
v-bind="(navItem as DsfrNavigationMegaMenuProps)"
95101
:expanded-id="expandedMenuId"
96102
@toggle-id="toggle($event)"
97103
/>

0 commit comments

Comments
 (0)