Skip to content

Commit 1d93cc3

Browse files
authored
Merge pull request #598 from vincentlaine/feat/newsletterCallout
feat: ✨ Ajout de la variante "Mise en avant" du composant DsfrNewsLetter
2 parents 0728604 + 1a6345e commit 1d93cc3

File tree

4 files changed

+175
-2
lines changed

4 files changed

+175
-2
lines changed

src/components/DsfrFollow/DsfrFollow.stories.ts

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export default {
1515
},
1616
newsletterData: {
1717
control: 'object',
18-
description: 'Objet contenant en propriété les props attendues par DsfrSocialNetworks',
18+
description: 'Objet contenant en propriété les props attendues par DsfrNewsLetter',
1919
},
2020
},
2121
}
@@ -67,5 +67,59 @@ Suivre.args = {
6767
hintText: 'Mise en garde concernant l’abonnement à la lettre d’information',
6868
buttonText: 'S’abonner',
6969
buttonTitle: 'Titre du bouton (valeur de l’attribut `title` de la balise `button`)',
70+
buttonAction: () => undefined,
71+
onlyCallout: false,
72+
},
73+
}
74+
75+
export const SuivreMiseEnAvant = (args) => ({
76+
components: { DsfrFollow },
77+
data () {
78+
return {
79+
...args,
80+
}
81+
},
82+
template: `
83+
<DsfrFollow
84+
:networks="networks"
85+
:newsletter-data="newsletterData"
86+
/>
87+
`,
88+
89+
})
90+
SuivreMiseEnAvant.args = {
91+
networks: [
92+
{
93+
name: 'facebook',
94+
href: 'https://www.facebook.com',
95+
},
96+
{
97+
name: 'twitter',
98+
href: 'https://www.twitter.com',
99+
},
100+
{
101+
name: 'youtube',
102+
href: 'https://www.youtube.com',
103+
},
104+
{
105+
name: 'linkedin',
106+
href: 'https://www.linkedin.com',
107+
},
108+
{
109+
name: 'instagram',
110+
href: 'https://www.instagram.com',
111+
},
112+
],
113+
newsletterData: {
114+
title: 'Titre de la lettre d’informations',
115+
description: 'Description de la lettre d’informations',
116+
email: '',
117+
labelEmail: '',
118+
placeholder: '',
119+
hintText: '',
120+
buttonText: 'S’abonner',
121+
buttonTitle: 'Titre du bouton (valeur de l’attribut `title` de la balise `button`)',
122+
buttonAction: () => undefined,
123+
onlyCallout: true,
70124
},
71125
}

src/components/DsfrFollow/DsfrNewsLetter.spec.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,58 @@ describe('DsfrNewsLetter', () => {
5454
expect(buttonTextEl).toHaveClass('fr-btn')
5555
expect(buttonTextEl).toHaveAttribute('title', buttonTitle)
5656
})
57+
58+
it('should mount DsfrNewsLetter only callout', () => {
59+
// Given
60+
const title = 'Abonnez-vous à notre lettre d’information'
61+
const description = 'Lorem ipsum dolor sit amet'
62+
const email = '[email protected]'
63+
const labelEmail = 'Votre adresse électronique (ex. : [email protected])'
64+
const placeholder = '[email protected]'
65+
const hintText = 'En renseignant votre adresse électronique, vous acceptez de recevoir nos actualités par courriel...'
66+
const buttonText = 'S’abonner'
67+
const buttonTitle = 'S’abonner à notre lettre d’information'
68+
const buttonAction = () => undefined
69+
const onlyCallout = true
70+
71+
// When
72+
const { getByText, queryByText, queryByDisplayValue, queryByPlaceholderText } = render(DsfrNewsLetter, {
73+
global: {
74+
},
75+
props: {
76+
title,
77+
description,
78+
email,
79+
labelEmail,
80+
placeholder,
81+
hintText,
82+
buttonText,
83+
buttonTitle,
84+
buttonAction,
85+
onlyCallout,
86+
},
87+
})
88+
89+
const titleEl = getByText(title)
90+
const descriptionEl = getByText(description)
91+
const emailInputEl = queryByDisplayValue(email)
92+
// eslint-disable-next-line no-undef
93+
const labelEmailEl = queryByText(labelEmail)
94+
const placeholderEl = queryByPlaceholderText(placeholder)
95+
const hintTextEl = queryByText(hintText)
96+
const buttonTextEl = getByText(buttonText)
97+
98+
// Then
99+
expect(titleEl.tagName).toBe('H3')
100+
expect(titleEl).toHaveClass('fr-follow__title')
101+
expect(descriptionEl.tagName).toBe('P')
102+
expect(descriptionEl).toHaveClass('fr-follow__desc')
103+
expect(emailInputEl).toBeNull()
104+
expect(labelEmailEl).toBeNull()
105+
expect(placeholderEl).toBeNull()
106+
expect(hintTextEl).toBeNull()
107+
expect(buttonTextEl.tagName).toBe('BUTTON')
108+
expect(buttonTextEl).toHaveClass('fr-btn')
109+
expect(buttonTextEl).toHaveAttribute('title', buttonTitle)
110+
})
57111
})

src/components/DsfrFollow/DsfrNewsLetter.stories.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ export default {
4040
control: 'text',
4141
description: 'Contenu de l’attribut `title` du bouton d’abonnement',
4242
},
43+
buttonAction: { action: 'clicked' },
44+
onlyCallout: {
45+
control: 'boolean',
46+
description: 'Newsletter simplifiée avec seulement un bouton, le formulaire sera masqué',
47+
},
4348
},
4449
}
4550

@@ -141,3 +146,50 @@ NewsletterAvecErreur.args = {
141146
buttonText: 'S’abonner',
142147
buttonTitle: 'Titre du bouton (attribut `title`) de la balise `button`',
143148
}
149+
150+
export const NewsletterMiseEnAvant = (args) => ({
151+
components: {
152+
DsfrNewsLetter,
153+
DsfrFollow,
154+
},
155+
156+
data () {
157+
return {
158+
...args,
159+
}
160+
},
161+
162+
template: `
163+
<DsfrFollow>
164+
<div class="fr-col-12">
165+
<DsfrNewsLetter
166+
:title="title"
167+
:description="description"
168+
v-model:email="email"
169+
:labelEmail="labelEmail"
170+
:inputTitle="inputTitle"
171+
:placeholder="placeholder"
172+
:hintText="hintText"
173+
:buttonText="buttonText"
174+
:buttonTitle="buttonTitle"
175+
:buttonAction="buttonAction"
176+
:onlyCallout="onlyCallout"
177+
/>
178+
</div>
179+
</DsfrFollow>
180+
`,
181+
182+
})
183+
NewsletterMiseEnAvant.args = {
184+
title: 'Titre de la lettre d’information',
185+
description: 'Description de la lettre d’information',
186+
email: '',
187+
labelEmail: '',
188+
inputTitle: '',
189+
placeholder: '',
190+
hintText: '',
191+
buttonText: 'S’abonner',
192+
buttonTitle: 'Titre du bouton (attribut `title`) de la balise `button`',
193+
buttonAction: () => undefined,
194+
onlyCallout: true,
195+
}

src/components/DsfrFollow/DsfrNewsLetter.vue

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export type DsfrNewsLetterProps = {
1010
inputTitle?: string
1111
buttonText?: string
1212
buttonTitle?: string
13+
buttonAction?: ($event: MouseEvent) => void
14+
onlyCallout?: boolean
1315
}
1416
1517
withDefaults(defineProps<DsfrNewsLetterProps>(), {
@@ -23,6 +25,8 @@ withDefaults(defineProps<DsfrNewsLetterProps>(), {
2325
hintText: '',
2426
buttonText: 'S’abonner',
2527
buttonTitle: 'S‘abonner à notre lettre d’information',
28+
buttonAction: () => undefined,
29+
onlyCallout: false,
2630
})
2731
2832
const emit = defineEmits<{(e: 'update:email', payload: string): void}>()
@@ -41,7 +45,16 @@ const updateEmail = ($event: InputEvent) => emit('update:email', $event.target.v
4145
{{ description }}
4246
</p>
4347
</div>
44-
<div>
48+
<div v-if="onlyCallout">
49+
<button
50+
class="fr-btn"
51+
:title="buttonTitle"
52+
@click="buttonAction ? buttonAction($event) : () => {}"
53+
>
54+
{{ buttonText }}
55+
</button>
56+
</div>
57+
<div v-else>
4558
<form action="">
4659
<label
4760
class="fr-label"

0 commit comments

Comments
 (0)