Skip to content

Commit ab82292

Browse files
committed
refactor(DsfrSelect): ✨ modernise les composants et migration CSF3 partielle
## Pourquoi les changements ont été faits : - Amélioration de la documentation des slots avec defineSlots - Modernisation de la syntaxe des émissions d'événements - Migration partielle vers le format Storybook CSF3 - Harmonisation avec les conventions du projet ## Quelles modifications ont été apportées : - Ajout de defineSlots() avec documentation complète des slots - Migration de la syntaxe emit vers le format moderne avec documentation - Conversion de la première story au format CSF3 - Ajout de la prop label dans les argTypes de Storybook - Utilisation de hint au lieu de description (suivant la dépréciation)
1 parent e4c1be0 commit ab82292

File tree

2 files changed

+58
-46
lines changed

2 files changed

+58
-46
lines changed

src/components/DsfrSelect/DsfrSelect.stories.ts

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import type { Meta, StoryObj } from '@storybook/vue3-vite'
2+
13
import { fn } from 'storybook/test'
24

35
import DsfrSelect from './DsfrSelect.vue'
@@ -17,12 +19,12 @@ export default {
1719
required: {
1820
control: 'boolean',
1921
description:
20-
'Option permettant de rendre ce champ de formulaire obligatoire et d’assigner au label un astérisque afin de rendre ce changement visible',
22+
'Option permettant de rendre ce champ de formulaire obligatoire et d'assigner au label un astérisque afin de rendre ce changement visible',
23+
},
24+
label: {
25+
control: 'text',
26+
description: 'Label associé au `select`, donne le focus sur ce dernier au clic',
2127
},
22-
// label: {
23-
// control: 'text',
24-
// description: 'Label associé au `select`, donne le focus sur ce dernier au clic',
25-
// },
2628
options: {
2729
control: 'object',
2830
description:
@@ -31,11 +33,15 @@ export default {
3133
optionGroups: {
3234
control: 'object',
3335
description:
34-
'Liste des options groupées proposées par le `<select>` à lui passer sous forme de tableau d’objets (groupe) avec une propriété `"label"` et une propriété options qui est un tableau d‘options`',
36+
'Liste des options groupées proposées par le `<select>` à lui passer sous forme de tableau d'objets (groupe) avec une propriété `"label"` et une propriété options qui est un tableau d'options`',
37+
},
38+
hint: {
39+
control: 'text',
40+
description: 'Texte d'aide associé au champ',
3541
},
3642
description: {
3743
control: 'text',
38-
description: 'Description optionnelle du `select`',
44+
description: 'Description optionnelle du `select` (déprécié, utiliser `hint`)',
3945
},
4046
successMessage: {
4147
control: 'text',
@@ -60,46 +66,37 @@ export default {
6066
control: 'boolean',
6167
description: 'Option empêchant toute interaction avec le `select`',
6268
},
63-
'update:modelValue': {
64-
control: 'text',
65-
description: 'Événement émis lors du changement de l’option sélectionnée',
66-
},
67-
onChange: {
69+
'onUpdate:modelValue': {
6870
action: fn(),
71+
description: 'Événement émis lors du changement de l'option sélectionnée (visible dans l'onglet ***Actions*** de Storybook)',
6972
},
7073
},
71-
}
74+
} satisfies Meta<typeof DsfrSelect>
7275
73-
export const ListeDeroulante = (args) => ({
74-
components: {
75-
DsfrSelect,
76-
},
76+
export default meta
77+
type Story = StoryObj<typeof meta>
7778
78-
data () {
79-
return {
80-
...args,
81-
}
82-
},
83-
84-
template: `
85-
<DsfrSelect
86-
:required="required"
87-
:label="label"
88-
:options="options"
89-
:description="description"
90-
:success-message="successMessage"
91-
:error-message="errorMessage"
92-
:disabled="disabled"
93-
v-model="modelValue"
94-
/>
95-
`,
96-
97-
watch: {
98-
modelValue (newVal) {
99-
this.onChange(newVal)
79+
export const ListeDeroulante: Story = {
80+
render: (args) => ({
81+
components: { DsfrSelect },
82+
setup() {
83+
return { args }
10084
},
101-
},
102-
})
85+
template: `
86+
<DsfrSelect
87+
:required="args.required"
88+
:label="args.label"
89+
:options="args.options"
90+
:hint="args.hint"
91+
:success-message="args.successMessage"
92+
:error-message="args.errorMessage"
93+
:disabled="args.disabled"
94+
v-model="args.modelValue"
95+
@update:model-value="args['onUpdate:modelValue']"
96+
/>
97+
`,
98+
}),
99+
}
103100
104101
ListeDeroulante.args = {
105102
options: [
@@ -110,8 +107,8 @@ ListeDeroulante.args = {
110107
'Option 5',
111108
'Option 6',
112109
],
113-
label: 'Selection d’options',
114-
description: 'Je suis une description, je décris, cest ma raison dêtre',
110+
label: 'Sélection d'options',
111+
hint: 'Je suis une description, je décris, c'est ma raison d'être',
115112
successMessage: '',
116113
errorMessage: '',
117114
disabled: false,

src/components/DsfrSelect/DsfrSelect.vue

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,24 @@ const props = withDefaults(defineProps<DsfrSelectProps>(), {
2525
defaultUnselectedText: 'Sélectionner une option',
2626
})
2727
28-
defineEmits<{ (e: 'update:modelValue', payload: string | number): void }>()
28+
defineEmits<{
29+
/** Événement émis lors du changement de l'option sélectionnée */
30+
'update:modelValue': [payload: string | number]
31+
}>()
32+
33+
defineSlots<{
34+
/**
35+
* Slot pour personnaliser tout le contenu de la balise <label>
36+
* cf. [DsfrInput](/?path=/story/composants-champ-de-saisie-champ-simple-dsfrinput--champ-avec-label-personnalise).
37+
* Une **props porte le même nom pour un label simple** (texte sans mise en forme)
38+
*/
39+
label: () => any
40+
/**
41+
* Slot pour indiquer que le champ est obligatoire.
42+
* Par défaut, met une astérisque si `required` est à true (dans un `<span class="required">`)
43+
*/
44+
'required-tip': () => any
45+
}>()
2946
3047
if (props.description) {
3148
console.warn(
@@ -50,10 +67,8 @@ const messageType = computed(() => {
5067
class="fr-label"
5168
:for="selectId"
5269
>
53-
<!-- @slot Slot pour personnaliser tout le contenu de la balise <label> cf. [DsfrInput](/?path=/story/composants-champ-de-saisie-champ-simple-dsfrinput--champ-avec-label-personnalise). Une **props porte le même nom pour un label simple** (texte sans mise en forme) -->
5470
<slot name="label">
5571
{{ label }}
56-
<!-- @slot Slot pour indiquer que le champ est obligatoire. Par défaut, met une astérisque si `required` est à true (dans un `<span class="required">`) -->
5772
<slot name="required-tip">
5873
<span
5974
v-if="required"

0 commit comments

Comments
 (0)