@amsom-habitat/amsom-autocomplete
v2.4.7
Published
Ce package propose un composant d'autocomplete pour Vue.js
Readme
AMSOM Autocomplete
Ce package propose un composant d'autocomplete pour Vue.js
Installation
npm i @amsom-habitat/amsom-autocompleteImporter les css dans le main.js tel que :
import '@amsom-habitat/amsom-autocomplete/dist/style.css'Pour utiliser le package:
import { AmsomAutocomplete } from '@amsom-habitat/amsom-autocomplete'Développement
Après avoir fait vos développements, veillez à bien tenir à jour le changelog.md ainsi que la version du package.json puis faites :
git add .
git commit -m '<commentaire>'
git push origin <branch>Tests
Les tests sont réalisés de manière automatique sur les branches main et dev mais peuvent être faits localement, notamment pour voir l'évolution du développement via la commande :
npm run storybookLe valideur devra, si des changements sont observés, aller sur la pipeline pour valider les différences à l'aide de chromatic, sans cela aucun merge-request ne sera possible. Si un merge est effectué, une double vérification sera nécessaire.
Déploiement
Après avoir merge les dev sur la branche main, exécutez :
make publishCette commande vérifie la version, le changelog et publie le tout
Utilisation
Props
v-model: La valeur de l'input (doit etre une instance de items)items: Les items à affichergetInputLibelle: La fonction qui permet de récupérer le libellé de l'item, par defaut récupère item.name ou item.label ou item.libellegetInputLibelleFromId: La fonction qui permet de récupérer le libellé de l'item à partir de son idgetId: La fonction qui permet de récupérer l'identifier de l'item, par defaut récupère item.ididentifier: L'identifiant de l'inputmaxResultsHeight: La hauteur max des résultatsplaceholder: Placeholder de l'input. DefaultRecherchez...loading: Ajoute un AmsomOverlay pour un chargement. Boolean defaultfalsezIndex: Permet d'ajuster le z-index de la liste affichée. Default1045required: Si l'input est requisallowEmpty: Si l'input peut être videselectOnBlur: Si l'item doit être sélectionné au blur de l'inputlabel: Le label de l'inputfloatingLabel: Si le label doit être flottant (A l'avenir penser a intégrer directement le composant AmsomFloatingInput quand il existera)emptyValue: La valeur vide de l'input. Par défaut{ id: null, libelle: 'Aucune sélection' }disabled: Si l'input est désactivémultiple: Si l'input est en mode multiple, permet de sélectionner plusieurs itemshideChoices: Si les choix doivent être cachésfilteringFunction: La fonction de filtrage des itemsdebounceDelay: Le délai de debounce pour la recherche. Default300msminSearchLength: La longueur minimale de la recherche avant de lancer le filtrage. Default0maxResults: Le nombre maximum de résultats à afficher. Defaultnull(affiche tous les résultats)infiniteScroll: Si l'infinite scroll est activé. DefaulttrueinfiniteScrollItemPerPage: Le nombre d'items par page pour l'infinite scroll. Default50inputRounded: Si l'input doit avoir les bords arrondis. DefaultfalseinputSize: La taille de l'input. Defaultmd. Options possibles :sm
Events
@search: Déclenché lors de la mise en oeuvre de la recherche@onFocus: Emit lorsque l'input est focus
Slots
Le composant expose plusieurs slots pour personnaliser l'affichage et le comportement :
input: Permet de remplacer complètement l'input (reçoit{ search, showList, keepOpen }).options: Utilisé pour rendre chaque option de la liste (reçoit l'objetitemen binding).empty-option: Permet de personnaliser l'option « vide » (valeur par défaut) lorsqu'il n'y a pas de sélection.no-options: Contenu affiché quand aucun résultat n'est trouvé.additional-option: Contenu collé en bas de la liste (pratique pour un bouton d'ajout ou un message complémentaire). Le slot reçoit{ items, search }.
Exemple d'utilisation des slots :
<amsom-autocomplete v-model="selection" :items="items">
<template #options="{ name, ...item }">
<div class="d-flex justify-content-between">
<span class="fw-bold">{{ name || item.label || item.libelle }}</span>
<small class="text-muted">#{{ item.id }}</small>
</div>
</template>
<template #no-options>
<div class="text-center text-muted">Aucun résultat, essayez un autre terme.</div>
</template>
<template #additional-option="{ items, search }">
<div class="p-2 text-end">
<button class="btn btn-sm btn-outline-primary" @click="$emit('add', search)">Ajouter « {{ search }} »</button>
</div>
</template>
</amsom-autocomplete>Exemple complet
<template>
<amsom-autocomplete
:items="items"
v-model="selection"
:filtering-function="customFilter"
maxResultsHeight="10vh"
/>
</template>
<script>
import '@amsom-habitat/amsom-autocomplete/dist/style.css'
import { AmsomAutocomplete } from '@amsom-habitat/amsom-autocomplete'
export default {
name: 'TestPage',
components: {
AmsomAutocomplete
},
data() {
return {
items: [
{ id: 1, name: 'item 1' },
{ id: 2, name: 'item 2' },
{ id: 3, name: 'item 3' },
{ id: 4, name: 'item 4' },
{ id: 5, name: 'item 5' }
],
selection: null
}
},
methods: {
customFilter({ search, items }) {
if (!search) return items
return items.filter((item) => item.name.toLowerCase().includes(search.toLowerCase()))
}
}
}
</script>