commencer
Boutons
bouton
bouton icon
groupe de bouton
Textes
tag
chip
carte info
carte alerte
lien
touche de clavier
accordeon
Popover
tooltip
popover
dropdown-menu
Dialogue
dialog
toast
Formulaire
form
input
selection
textarea
checkbox
slider
sound-track
switch
input fichier
Temps
date-time-picker
date-picker
year-picker
month-of-year-picker
month-picker
day-picker
time-picker
Navigation
tabs
Données
caroussel
liste de données
tableau responsive
tableau
squelette
loader ligne
cercle de progression
Graphique
graphique en ligne
graphique en bar
fermé la barre de navigation Alt + B

InputSelector

Le composant InputSelector est un input synchroniser a votre api qui permet a l'utilisateur de sélectionner un ou des elements de votre base de données.

Import

import { InputSelector } from "hamzus-ui"

Exemple

produit

Pour reproduire ce composant vous devez créer un fichier racine du composant. Ici dans notre exemple le fichier racine est ProductInput.svelte
Il sera necessaire dans la balise script de déclaré 3 choses :

  • limit : Il sagit de la limite d'element que votre serveur peut récupérer en une fois

  • getMultipleElement(search, offset) : Il sagit de la fonction qui va appeller votre serveur afin de récuperer la liste d'element cette fonction dois renvoyé un objet avec la clé rows qui est un array des elements de notre liste et la clé totalOfRows qui est un int qui représente le nombre total disponible dans la base de données tant que la liste ne contient pas le nombre total un bouton "charger plus" sera affiché.
    Quand on clique sur un element de la liste il execute la fonction getElement(data) en lui passant dans le parametre data l'element de la liste rows en question et ce afin de récuperer les details de cette element coté serveur.

  • getElement(data) : Cette fonction permet de récuperer les details d'un element précis. Elle est éxecuter soit quand on selectionne un element soit au onMount() si la props value est set

Ces 3 choses doient etre passer en props a notre composant InputSelector

Il faut noter que chacune des deux fonctions getMultipleElement(search, offset) et getElement(data) doit renvoyé dans les elements une clé id c'est par cette clé que le composant va identifier les elements selectionné ou non et c'est cette clé qu'il va injecter dans un input:hidden afin de pouvoir récuperer coté serveur les ou l'element selectionner par son id

Ensuite il faut importer 2 composants ces 2 composant sont les boutons representant votre element en question :

  • ProductCard : Ici dans notre exemple il sagit de produit. Ce composant sera passer dans la props component de InputSelector il represente notre composant dans la liste deroulante. Le composant InputSelector va se charger d'injecter en props les données fournies dans les element que contient rows envoyé par la fonction getMultipleElement(search, offset) il injecte en plus une props selected (bool) si l'element fais partie de la selection afin de pouvoir styliser le composant lorsqu'il est deja selectionné.

  • ProductCardSelection : Ce composant sera passer dans la props selectionComponent de InputSelector il represente notre composant quand il est selectionné. Le composant InputSelector va se charger d'injecter en props les données fournies par la fonction getElement(data)

Il ne reste plus qu'a set les props pour le style :

  • label : c'est le nom de l'input afficher juste au dessus
  • name : c'est le name de l'input:hidden injecter dans l'html avec en valeur la clé id de l'element selectionné
  • placeholder : Il sagit du placeholder de l'input
  • variant : si vous souhaitez mettre l'input en style collapse vous pouvez definir cette props en "collapse"

ProductInput

1

<script>

2

import { InputSelector, sendRequest } from 'hamzus-ui';

3

import ProductCard from './ProductCard.svelte';

4

import ProductCardSelection from './ProductCardSelection.svelte';

5

6

export let value = null

7

8

let limit = 20;

9

10

async function getMultipleElement(search, offset) {

11

const request = await sendRequest({

12

path:"/get-all-products",

13

data:{

14

globalSearch:search,

15

offset:offset,

./ProductInput

ProductCard

1

2

<script>

3

export let props = {...$$restProps}

4

export let id;

5

export let name;

6

export let selected;

7

8

function handleClick() {

9

console.log("click");

10

11

props.onClick({

12

...props,

13

id:id,

14

name:name,

15

})

./ProductCard

ProductCardSelection

1

<script>

2

import { IconButton } from "hamzus-ui";

3

4

export let props = {...$$restProps}

5

export let id;

6

export let name;

7

8

function handleClick() {

9

props.onClick({

10

...props,

11

id:id,

12

name:name,

13

})

14

}

15

</script>

./ProductCardSelection

Multiple selection

Vous pouvez activer la selection multiple via la props multiple set a true
Si elle est true l'input hidden injecter ne portera pas comme name la props name mais portera comme name "name[]" le name sera suivie de "[]" ce qui permetra dans le cas d'un serveur php d'etre interpreter comme un array d'id.

La seul chose que j'ai decidé de changer pour le composant multiple est le style de mon ProductCardSelection

produit

Il sagit donc du meme code sauf qu'a la place de mettre "width:100%;" j'ai mis "max-width: 270px;". et j'ai set la props multiple sur le composant InputSelector dans le fichier ProductInput.svelte

ProductInput

1

2

<style>

3

.card {

4

display: flex;

5

justify-content: space-between;

6

max-width: 270px;

7

/* width: 100%; */

8

align-items: center;

9

gap: var(--pad-s);

10

padding: var(--pad-xs) var(--pad-m);

11

border-radius: var(--radius-m);

12

border: 1px solid var(--stroke);

13

cursor: pointer;

14

}

15

</style>

./ProductInput

ProductCardSelection

1

2

<InputSelector

3

{value}

4

{limit}

5

multiple

6

placeholder="rechercher un produit"

7

label="produit"

8

name="productId"

9

component={ProductCard}

10

selectionComponent={ProductCardSelection}

11

{getMultipleElement}

12

{getElement}

13

></InputSelector>

./ProductCardSelection

Valeur par defaut

Il est possible d'injecter une valeur par defaut via la props value.
Dans le cas d'un input multiple alor la value doit etre un array d'id et dans le cas d'un input a selection unique alors la value sera un int qui representent l'id de l'element.

Selection unique

produit

Selection multiple

produit