|
| 1 | +# Liste déroulante enrichie - DsfrMultiselect |
| 2 | + |
| 3 | +## 🌟 Introduction |
| 4 | + |
| 5 | +Le `DsfrMultiselect` est un composant Vue permettant à un utilisateur de choisir un ou plusieurs élément dans une liste donnée. |
| 6 | + |
| 7 | +La liste déroulante fournit une liste d’option parmi lesquelles l’utilisateur peut choisir. L'utilisateur peut filtrer cette liste et utiliser un bouton pour sélectionner/déselectionner tous les éléments visibles |
| 8 | + |
| 9 | +🏅 La documentation sur **liste déroulante riche** sur le [DSFR](https://www.systeme-de-design.gouv.fr/composants-et-modeles/composants-beta/liste-deroulante-riche) |
| 10 | + |
| 11 | +## 🛠️ Props |
| 12 | + |
| 13 | +| nom | type | défaut | obligatoire | Description | |
| 14 | +|--------------------|---------------------------------------|-----------------------------------------------|-------------|-------------------------------------------------------------------------------| |
| 15 | +| `id` | *`string`* | *random string* | | Identifiant unique pour l'input. Si non spécifié, un ID aléatoire est généré. | |
| 16 | +| `modelValue` | *`(string \| number)[]`* | `` | ✅ | La valeur liée au modèle de l'input. | |
| 17 | +| `options` | *`(T \| string \| number)[]`* | `''` | ✅ | Options sélectionnables. | |
| 18 | +| `label` | *`string`* | `''` | | Le libellé de l'input. | |
| 19 | +| `labelVisible` | *`boolean`* | `true` | | Gére l'affichage du label ou non. | |
| 20 | +| `labelClass` | *`string`* | `''` | | Classe personnalisée pour le style du libellé. | |
| 21 | +| `legend` | *`string`* | `''` | | Texte de legend. | |
| 22 | +| `hint` | *`string`* | `''` | | Texte d'indice pour guider l'utilisateur. | |
| 23 | +| `successMessage` | *`string`* | `''` | | Message de validation à afficher en dessous du select. | |
| 24 | +| `errorMessage` | *`string`* | `''` | | Message d'erreur à afficher en dessous du select. | |
| 25 | +| `buttonLabel` | *`string`* | `Sélectionner une option, ...` | | Texte qui s'affiche sur le bouton. | |
| 26 | +| `selectAll` | *`boolean`* | `true` | | Gérer l'affichage du bouton de 'sélectionner tout'. | |
| 27 | +| `search` | *`boolean`* | `true` | | Gérer le label du 'sélectionner tout'. | |
| 28 | +| `selectAllLabel` | *`boolean`* | `["Tout sélectionner", "Tout désélectionner"]`| | Gérer le label du 'sélectionner tout'. | |
| 29 | +| `idKey` | *`keyof T`* | `id` | | Voir ci dessous. | |
| 30 | +| `labelKey` | *`keyof T`* | `label` | | Voir ci dessous. | |
| 31 | +| `filteringKeys` | *`(keyof T)[]`* | `['label']` | | Voir ci dessous. | |
| 32 | +| `maxOverflowHeight`| *`CSSStyleDeclaration['maxHeight']`* | `'400px'` | | Taille maximum du dropdown. | |
| 33 | + |
| 34 | +### Cas d'utilisation d'objets dans des options |
| 35 | + |
| 36 | +Pour l'utilisation d'objets comme props, il peut être nécessaire de renseigner `idKey`, `labelKey` et `filteringKeys`: |
| 37 | + |
| 38 | +- `idKey` est la clef d'un identifiant unique de chaque élément. C'est cette valeur qui sera utilisée dans `modelValue` |
| 39 | +- `labelKey` est la clef utilisée pour afficher le label des checkboxs |
| 40 | +- `filteringKeys` est une array de clefs qui sont utilisé pour filtrer dans le search |
| 41 | + |
| 42 | +### Attributs implicitement déclarés |
| 43 | + |
| 44 | +::: warning Important |
| 45 | + |
| 46 | +Toutes les props passées à `<DsfrMultiselect>` dans une template et qui ne sont pas définies dans les props seront passées à la balise `<button>` native du composant (cf. [Attributs implicitement déclarés (Fallthrough attributes)](https://fr.vuejs.org/guide/components/attrs.html) de la documentation officielle de Vue.js.). Comme par exemple `readonly`. |
| 47 | + |
| 48 | +Voici une liste non-exhaustive: |
| 49 | + |
| 50 | +- `name` |
| 51 | +- `readonly` |
| 52 | +- `disabled` |
| 53 | +- `autocomplete` |
| 54 | +- `autofocus` ([déconseillé](https://brucelawson.co.uk/2009/the-accessibility-of-html-5-autofocus/)) |
| 55 | +- `size` |
| 56 | +- `maxlength` |
| 57 | +- `pattern` |
| 58 | + |
| 59 | +::: |
| 60 | + |
| 61 | +### DsfrMultiselect dans une iframe |
| 62 | + |
| 63 | +::: warning Important |
| 64 | + |
| 65 | +Si DsfrMultiselect est placé dans une iframe, il n'aura pas accès aux clics exterieurs pour se fermer. |
| 66 | + |
| 67 | +::: |
| 68 | + |
| 69 | +## 📡 Évenements |
| 70 | + |
| 71 | +`DsfrMultiselect` émet l'événement suivant : |
| 72 | + |
| 73 | +| Nom | type | Description | |
| 74 | +|--------------------|--------------------------|----------------------------------------------| |
| 75 | +| `update:modelValue`| *`(string \| number)[]`* | Est émis lorsque la valeur du select change. | |
| 76 | + |
| 77 | +## 🧩 Slots |
| 78 | + |
| 79 | +`DsfrMultiselect` permet les slots suivants : |
| 80 | + |
| 81 | +| Nom | props | Description | |
| 82 | +|--------------------|------------------------------------------------|-------------------------------------------------------------------------| |
| 83 | +| `label` | | Permet de changer le label. | |
| 84 | +| `required-tip` | | Permet de changer le required-tip. | |
| 85 | +| `hint` | | Permet de changer le hint. | |
| 86 | +| `button-label` | | Permet de changer le label du bouton. | |
| 87 | +| `legend` | | Permet de changer la legend du bouton. | |
| 88 | +| `checkbox-label` | *`(props: { option: T \| string \| number })`* | Permet de changer le label des checkboxs. | |
| 89 | +| `no-results` | | Permet de changer l'affichage lorsque la recherche donne aucun élément. | |
| 90 | + |
| 91 | +## 📝 Exemples |
| 92 | + |
| 93 | +### Exemple Basique |
| 94 | + |
| 95 | +::: code-group |
| 96 | + |
| 97 | +<Story data-title="Démo simple" min-h="550px"> |
| 98 | + <div |
| 99 | + class="flex flex-col" |
| 100 | + > |
| 101 | + <DsfrMultiselectDemoSimple /> |
| 102 | + </div> |
| 103 | +</Story> |
| 104 | +
|
| 105 | +<<< docs-demo/DsfrMultiselectDemoSimple.vue |
| 106 | + |
| 107 | +::: |
| 108 | + |
| 109 | +### Exemple Complexe |
| 110 | + |
| 111 | +::: code-group |
| 112 | + |
| 113 | +<Story data-title="Démo complexe" min-h="550px"> |
| 114 | + <div |
| 115 | + class="flex flex-col" |
| 116 | + > |
| 117 | + <DsfrMultiselectDemoComplexe /> |
| 118 | + </div> |
| 119 | +</Story> |
| 120 | +
|
| 121 | +<<< docs-demo/DsfrMultiselectDemoComplexe.vue |
| 122 | + |
| 123 | +::: |
| 124 | + |
| 125 | +## ⚙️ Code source du composant |
| 126 | + |
| 127 | +::: code-group |
| 128 | + |
| 129 | +<<< DsfrMultiselect.vue |
| 130 | +<<< DsfrMultiselect.types.ts |
| 131 | + |
| 132 | +::: |
| 133 | + |
| 134 | +<script setup lang="ts"> |
| 135 | +import DsfrMultiselectDemoSimple from './docs-demo/DsfrMultiselectDemoSimple.vue' |
| 136 | +import DsfrMultiselectDemoComplexe from './docs-demo/DsfrMultiselectDemoComplexe.vue' |
| 137 | +</script> |
0 commit comments