Champ de fichiers
La sélection de fichiers en champ de formulaire : un champ de texte en lecture seule par-dessus un champ fichier masqué, qui accepte aussi un dépôt. La valeur est toujours une liste de fichiers, que plusieurs soient permis ou non.
Utilisation
Exemples
Libellé et aide
label, hint et placeholder se comportent comme sur n'importe quel autre champ. iconStart pose une icône au début du champ, rendue avant les puces et non à leur place.
Tailles
size définit la hauteur du champ à 32, 40 ou 48 pixels, et compact lui retire 4px. Les puces des fichiers choisis se placent un palier en dessous du champ.
Fichiers multiples
multiple permet au champ de prendre plusieurs fichiers. Le modèle est un tableau de File dans les deux cas.
Effacement
clearable ajoute une croix qui vide toute la sélection d'un coup.
Affichage
display liste les fichiers en noms séparés par des virgules, ou en une puce supprimable chacun. Le slot #chip remplace une puce et reçoit son libellé raccourci, remove, ainsi que la taille et la densité calculées par le champ.
Limites par fichier
accept accepte la syntaxe du navigateur et filtre la boîte de dialogue système comme un fichier déposé sur le champ. maxSize borne un fichier. Un fichier refusé n'entre jamais dans le modèle, et reject est émis une fois par fichier.
Limites de sélection
maxFiles et maxTotalSize bornent la sélection dans son ensemble. Le filtrage suit un ordre fixe : type, puis taille, puis nombre, puis taille totale.
Compteur
counter ajoute une ligne sous le champ indiquant ce qui a été choisi. Le slot #counter la remplace et reçoit le nombre, le total en octets et la phrase déjà construite. Là où le counter de VInput et VTextarea compte des caractères sans slot, celui-ci compte des fichiers.
Icône personnalisée
pickerIcon est le glyphe en fin de champ qui ouvre la boîte de dialogue système, et il accepte toute valeur d'icône.
États
invalid marque le champ en erreur. readonly garde la sélection visible et refuse toute façon de la changer. disabled grise le champ et le sort de l'ordre de tabulation. noDrop n'écarte que le dépôt, et loading est purement visuel, un indicateur remplaçant l'icône de pièce jointe. pickerIconLabel, clearLabel et loadingText renomment ce que chacun annonce.
API
Props
| Prop | Type | Défaut |
|---|---|---|
multiple | boolean | false |
| Permet de choisir plusieurs fichiers. Avec un seul, tout fichier supplémentaire est écarté. | ||
accept | string | aucune |
| Quels genres de fichiers sont acceptés, dans la syntaxe du navigateur. C'est appliqué DEUX FOIS, et il le faut : en attribut, ce qui filtre la boîte de dialogue du système, et de nouveau en code, seule chose capable de filtrer un fichier DÉPOSÉ. | ||
display | FileInputDisplay'chip' | 'text' | 'text' |
| Comment les fichiers choisis sont montrés : leurs noms joints par des virgules, ou une puce retirable chacun. Cela ne signifie quelque chose que si plusieurs fichiers sont permis ; un nom seul est toujours du texte. | ||
maxSize | number | aucune |
| La taille maximale d'UN fichier, en octets. | ||
maxTotalSize | number | aucune |
| La taille maximale de toute la sélection, en octets. | ||
maxFiles | number | aucune |
| Combien de fichiers peuvent être choisis au plus. | ||
counter | boolean | false |
| Affiche ce qui a été choisi sous le champ, « 3 fichiers (1,2 Mo) ». | ||
pickerIcon | IconSource | attach_file |
| L'icône en fin de champ, qui ouvre la boîte de dialogue de fichiers. | ||
noDrop | boolean | false |
| Refuse les fichiers déposés sur le composant : seule la boîte de dialogue en ajoute alors. | ||
size | FileInputSize'sm' | 'md' | 'lg' | 'md' |
| La hauteur du champ : 32, 40 ou 48 pixels. | ||
compact | boolean | false |
| Retire 4px à la hauteur, en laissant le rembourrage, le texte et les icônes tels quels. | ||
disabled | boolean | false |
| Rend le champ inutilisable, grisé par les tokens de couleur. | ||
readonly | boolean | false |
| Montre ce qui a été choisi sans permettre de le changer : ni boîte de dialogue, ni dépôt, ni retrait. | ||
invalid | boolean | false |
| Marque le champ comme invalide, pour une règle à vous, puisque rien ici n'est vérifié par le navigateur. | ||
label | string | aucune |
| Le libellé au-dessus du champ, lié à lui pour qu'un clic dessus y place le focus. | ||
hint | string | aucune |
| Une ligne d'aide sous le champ, à gauche du compteur. Elle est liée au champ pour les technologies d'assistance. | ||
placeholder | string | aucune |
| Ce que dit le champ tant que rien n'est choisi. Il retombe sur le dictionnaire du design system. | ||
iconStart | IconSource | aucune |
Une icône dans le champ, au début. Elle est rendue avant les chips et non à leur place. Décorative jusqu'à ce qu'un écouteur @click:icon-start en fasse un bouton. | ||
iconStartLabel | string | aucune |
| Ce que fait l'icône de début, en mots, une fois cliquable. | ||
pickerIconLabel | string | aucune |
| Ce que fait l'icône de fin, en mots. Elle nomme le bouton qui ouvre la boîte de dialogue de fichiers, et sa valeur par défaut vient du dictionnaire du design system. | ||
loading | boolean | false |
| Affiche une roue à la place de l'icône de trombone, pendant un envoi. Elle ne change rien d'autre : les fichiers se déposent toujours et la boîte de dialogue s'ouvre toujours. | ||
loadingText | string | aucune |
| Ce que les lecteurs d'écran annoncent pendant que la roue tourne. Sa valeur par défaut vient du dictionnaire du design system. | ||
clearable | boolean | false |
| Propose une croix qui vide la sélection. Elle vaut plus la peine ici que sur un champ ordinaire : ce que contient un sélecteur ne s'efface pas en tapant, la croix est donc le seul retour en arrière après un mauvais choix. | ||
clearLabel | string | aucune |
| Ce que fait cette croix, en mots. Sa valeur par défaut vient du dictionnaire du design system. | ||
v-model | File[] | [] |
| Toujours une LISTE de fichiers, que plusieurs soient permis ou non, jamais un fichier seul. La forme ne dépend pas d'une prop : vous n'avez donc jamais à restreindre une union que TypeScript ne sait pas discriminer. | ||
Événements
| Événement | Type |
|---|---|
click:icon-start | [event: MouseEvent] |
L'icône de début a été cliquée. Attacher cet écouteur est ce qui en fait un vrai bouton, qui demande alors iconStartLabel. | |
clear | [] |
| La croix d'effacement a été pressée. La sélection est déjà vide. | |
change | [files: File[]] |
| La sélection a changé, avec toute la liste telle qu'elle est désormais. | |
reject | [rejection: FileRejection] |
| Un fichier a été écarté, avec lequel et pourquoi : son genre, sa taille, ou combien il y en avait déjà. | |
remove | [file: File, index: number] |
UN fichier a été retiré par sa puce, avec le fichier et la position qu'il occupait. change suit avec toute la liste. | |
Slots
| Slot | Type |
|---|---|
start | {} |
Du contenu au début du champ, rendu après iconStart plutôt qu'à sa place. | |
value-end | {} |
Des contrôles à vous à l'intérieur du champ, placés avant ceux que le champ possède : la croix d'effacement et l'icône qui ouvre le panneau. Ces deux-là sont l'affordance propre du composant, ce qui explique l'absence de slot end ici. | |
chip | FileInputChipSlotProps |
Remplace la puce qui représente un fichier. Elle reçoit le nom déjà raccourci AU MILIEU pour que son extension survive, remove, sans quoi le fichier ne pourrait plus être retiré, et la taille et la densité calculées pour tenir dans le champ. | |
counter | FileInputCounterSlotProps |
Remplace le compteur sous le champ. text est la phrase déjà construite et traduite ; le nombre et la taille totale en octets, bytes, sont là pour une formulation à vous. | |
Types
Les types que les tables ci-dessus nomment, écrits comme la librairie les déclare. Ceux qui portent export s'importent depuis vectis-ui pour typer votre propre code ; les autres décrivent la forme de ce qu'un slot fournit.
export interface BuiltinIcon {
name: string
paths: readonly [string] | readonly [string, string]
}export type ChipSize = 'xs' | 'sm'
export interface FileInputChipSlotProps {
file: File
index: number
label: string
remove: () => void
size: ChipSize
compact: boolean
}export interface FileInputCounterSlotProps {
count: number
bytes: number
text: string
}export type FileRejectReason = 'type' | 'size' | 'count' | 'total-size'
export interface FileRejection {
file: File
reason: FileRejectReason
}export type IconRender =
| { path: string; viewBox?: string }
| { component: Component; props?: Record<string, unknown> }
| { src: string }
| { text: string; class?: string }
| { class: string }export type IconSource = string | BuiltinIcon | IconRender