Todos los componentes (204)
Subida con progreso
Gestión · Uploader · .amset-uploader
Qué es y cuándo usarlo
Subir ficheros de verdad, en cuanto se eligen: la zona de FileUpload para soltarlos o elegirlos y, debajo, una fila por fichero con su barra de avance, el motivo si falla, un botón para reintentar y otro para quitarlo, que cancela la subida. Es FileUpload + FileList + useFileUploads, ya montados juntos.
Cuándo usarlo
- Adjuntos que se suben al elegirlos: facturas, justificantes, las fotos de un producto.
httpsube por HTTP, con un formulariomultipart:action(la dirección, o una función que la calcula para cada fichero),method(POSTpor defecto, oPUT),headers,data(campos extra que viajan con el fichero),fieldName(filepor defecto) ywithCredentials. Va conXMLHttpRequesty no confetchporquefetchno dice cuánto ha salido, y sin eso la barra no se movería.customRequestsube por donde diga quien lo usa (una URL firmada, el SDK de un almacenamiento) y manda sobrehttp: recibe{ file, onProgress, signal }, llama aonProgresscon el porcentaje y devuelve una promesa con lo que contesta el servidor. Tiene que respetarsignal, que se cancela al quitar el fichero.concurrencyes cuántos suben a la vez (3 por defecto): el resto espera su turno, y uno que falla no tumba a los demás.onChangeavisa con la lista entera a cada cambio;onUploadedyonFailed, de cada fichero que termina o falla (lo que contestó el servidor llega en suresponse);onReject, de lo que no pasa el filtro de tipo, de tamaño o de cuántos caben.- La zona es la de
FileUpload, con sus mismas props:label,hint,error,acceptedTypes,maxSizeMb,multiple,maxCount,directory,sizeydisabled. Sinmultiple, elegir otro fichero reemplaza al anterior y cancela su subida. - El filtro de tipo y tamaño es comodidad: el servidor tiene que volver a comprobarlo.
Cuándo no
- Elegir ficheros que viajan con el formulario al enviarlo, sin subirlos antes:
FileUpload. - Subir al pulsar «Enviar» y no al elegir:
useFileUploadsconautoStart: falsey sustart(), conFileUpload(hideList) yFileListpintados por tu cuenta. - Enseñar adjuntos que ya están subidos:
FileList.
Teclado: el de FileUpload: Tab llega a la zona y a su botón (Intro o Espacio abren el selector del sistema; con el foco en la zona se pueden pegar ficheros), y después a los botones de cada fila: «Reintentar» si ha fallado y «Quitar». Al quitar uno, el foco pasa a la lista, que dice cuántos quedan; al quitar el último, la lista desaparece y el foco vuelve al botón de elegir, con el aviso «factura.pdf quitado. No queda ninguno».
Accesibilidad: la lista es una región que se llama como la zona («Subidas de Facturas»). Mientras un fichero sube, su fila lleva una barra de progreso con nombre («Subiendo factura.pdf»); en cola no lleva barra, porque «0 %» diría que ya ha empezado. Cada cambio de estado se anuncia una sola vez en una región status —«factura.pdf subido», «No se ha podido subir falla.pdf: 413 Payload Too Large»—, y varios que terminan a la vez se anuncian juntos; el avance se ve en la barra, sin anunciarse cien veces. Los botones dicen de qué fichero son («Quitar factura.pdf»). Los errores de red, de tiempo y de estado que escribe http salen en el idioma de http.locale (castellano, por defecto).
Aspecto fino: --amset-uploader-gap, la separación entre la zona y la lista; la zona, con las --amset-upload-* de FileUpload, y la lista, con las --amset-files-* de FileList.
Cómo se ve
PDF de hasta 10 MB. Prueba con un fichero llamado «falla.pdf».
<Uploader
label="Facturas"
hint="PDF de hasta 10 MB"
acceptedTypes={['application/pdf']}
maxSizeMb={10}
multiple
maxCount={5}
http={{ action: '/api/facturas' }}
/>Props
Se importa con import { Uploader } from '@amset/ui'. Las obligatorias van marcadas.
| Prop | Tipo | Para qué sirve |
|---|---|---|
labelobligatoria | string | Lo que se sube. Es el nombre de la zona de soltar y de la lista de lo elegido. |
acceptedTypes | readonly string[] | Tipos MIME o extensiones: `['application/pdf', '.csv']`. |
className | string | Se une a las clases de la biblioteca, no las sustituye. |
concurrency | number | Cuantas suben a la vez. Por defecto, 3: mas satura la conexion y todas acaban mas tarde. |
customRequest | UploadRequest | Tu propia subida (un SDK, una URL firmada...). Manda sobre `http`. |
directory | boolean | Elegir una CARPETA entera en vez de ficheros sueltos. Soltar una carpeta encima no la recorre. |
disabled | boolean | — |
error | string | — |
hiddenLabel | boolean | La etiqueta solo para el lector de pantalla. La zona de soltar ya lleva su propio nombre, asi que se puede ocultar a la vista sin perder nada. |
hint | string | Texto de ayuda: qué formatos y qué tamaño se admiten. |
http | HttpUploadConfig | Subir por HTTP. Sin esto hace falta `customRequest`. |
inputRef | Ref<HTMLInputElement> | El `<input type="file">` de verdad (va escondido), para abrir el selector desde un boton propio con `inputRef.current?.click()` (AMS-735). |
maxCount | number | Cuantos ficheros caben como mucho. Los que sobran se rechazan con su motivo. Sin esto, sin tope. |
maxSizeMb | number | Tamaño máximo por fichero, en megabytes. |
multiple | boolean | — |
onChange | (entries: readonly UploadEntry[]) => void | Avisa de cada cambio de la lista: un fichero nuevo, un avance, un fallo, uno que acaba. |
onFailed | (entry: UploadEntry) => void | Un fichero ha fallado. No incluye los que se cancelan quitandolos. |
onReject | (rejected: readonly RejectedFile[]) => void | Se llama con los que no pasaron el filtro (tipo, tamano, cuantos caben). |
onUploaded | (entry: UploadEntry) => void | Un fichero ha subido del todo. |
size | "sm" | "md" | "lg" | — |
Acepta además los atributos del elemento que pinta: className, style, data-*, aria-* y sus eventos.
Mandos
Estas variables CSS son la forma de adaptarlo. Se declaran sobre el selector del componente, no en :root: la hoja las redeclara en la propia regla y una declaración en el mismo elemento gana siempre.
| Variable | Por defecto |
|---|---|
--amset-uploader-gap | var(--amset-space-3) |
Cómo se cambia
.amset-uploader {
--amset-uploader-gap: ...;
}En el banco de pruebas
Cada estado y cada variante, para tocarlos de uno en uno, en su ficha de ui.amset.tech:
