@vaadin/upload
Version:
Web Component for uploading files with drag and drop support
227 lines (195 loc) • 8.82 kB
TypeScript
/**
* @license
* Copyright (c) 2016 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
import { type UploadFile, type UploadFormat, UploadMixin } from './vaadin-upload-mixin.js';
export { UploadFile, UploadFormat, UploadI18n, UploadMethod } from './vaadin-upload-mixin.js';
type UploadEvent<T> = CustomEvent<T> & { target: Upload };
/**
* Fired when a file cannot be added to the queue due to a constrain:
* file-size, file-type or maxFiles
*/
export type UploadFileRejectEvent = UploadEvent<{ file: UploadFile; error: string }>;
/**
* Fired when the `files` property changes.
*/
export type UploadFilesChangedEvent = UploadEvent<{ value: UploadFile[] }>;
/**
* Fired when the `max-files-reached` property changes.
*/
export type UploadMaxFilesReachedChangedEvent = UploadEvent<{ value: boolean }>;
/**
* Fired before the XHR is opened. Could be used for changing the request
* URL. If the default is prevented, then XHR would not be opened.
*/
export type UploadBeforeEvent = UploadEvent<{ xhr: XMLHttpRequest; file: UploadFile }>;
/**
* Fired when the XHR is sent.
*/
export type UploadStartEvent = UploadEvent<{ xhr: XMLHttpRequest; file: UploadFile }>;
/**
* Fired as many times as the progress is updated.
*/
export type UploadProgressEvent = UploadEvent<{ xhr: XMLHttpRequest; file: UploadFile }>;
/**
* Fired in case the upload process succeeded.
*/
export type UploadSuccessEvent = UploadEvent<{ xhr: XMLHttpRequest; file: UploadFile }>;
/**
* Fired in case the upload process failed.
*/
export type UploadErrorEvent = UploadEvent<{ xhr: XMLHttpRequest; file: UploadFile }>;
/**
* Fired when we have the actual server response, and before the component
* analyses it. It's useful for developers to make the upload fail depending
* on the server response. If the event is defaultPrevented the vaadin-upload
* will return allowing the user to do something on his own like retry the
* upload, etc. since he has full access to the `xhr` and `file` objects.
* Otherwise, if the event is not prevented default `vaadin-upload` continues
* with the normal workflow checking the `xhr.status` and `file.error`
* which also might be modified by the user to force a customized response,
*/
export type UploadResponseEvent = UploadEvent<{ xhr: XMLHttpRequest; file: UploadFile }>;
/**
* Fired when retry upload is requested. If the default is prevented, then
* retry would not be performed.
*/
export type UploadRetryEvent = UploadEvent<{ xhr: XMLHttpRequest; file: UploadFile }>;
/**
* Fired when upload abort is requested. If the default is prevented, then the
* file upload would not be aborted.
*/
export type UploadAbortEvent = UploadEvent<{ xhr: XMLHttpRequest; file: UploadFile }>;
/**
* Fired when the XHR has been opened but not sent yet. Useful for appending
* data keys to the FormData object, for changing some parameters like
* headers, etc. If the event is defaultPrevented, `vaadin-upload` will not
* send the request allowing the user to do something on his own.
*/
export type UploadRequestEvent = UploadEvent<{
xhr: XMLHttpRequest;
file: UploadFile;
uploadFormat: UploadFormat;
requestBody: FormData | File;
formData?: FormData;
}>;
export interface UploadCustomEventMap {
'file-reject': UploadFileRejectEvent;
'files-changed': UploadFilesChangedEvent;
'max-files-reached-changed': UploadMaxFilesReachedChangedEvent;
'upload-before': UploadBeforeEvent;
'upload-start': UploadStartEvent;
'upload-progress': UploadProgressEvent;
'upload-response': UploadResponseEvent;
'upload-success': UploadSuccessEvent;
'upload-error': UploadErrorEvent;
'upload-retry': UploadRetryEvent;
'upload-abort': UploadAbortEvent;
'upload-request': UploadRequestEvent;
}
export interface UploadEventMap extends HTMLElementEventMap, UploadCustomEventMap {}
/**
* `<vaadin-upload>` is a Web Component for uploading multiple files with drag and drop support.
*
* Example:
*
* ```html
* <vaadin-upload></vaadin-upload>
* ```
*
* ### Styling
*
* The following shadow DOM parts are available for styling:
*
* Part name | Description
* -------------------|-------------------------------------
* `primary-buttons` | Upload container
* `drop-label` | Element wrapping drop label and icon
*
* The following state attributes are available for styling:
*
* Attribute | Description
* ---------------------|---------------------------------
* `disabled` | Set when the element is disabled
* `nodrop` | Set when drag and drop is disabled (e.g., on touch devices)
* `dragover` | Set when the file is being dragged over the element
* `dragover-valid` | Set when the dragged file is valid with `maxFiles` and `accept` criteria
* `max-files-reached` | Set when maximum number of files that the user is allowed to add has been reached
*
* The following custom CSS properties are available for styling:
*
* Custom CSS property |
* :--------------------------------------------|
* `--vaadin-upload-background` |
* `--vaadin-upload-border-color` |
* `--vaadin-upload-border-radius` |
* `--vaadin-upload-border-width` |
* `--vaadin-upload-gap` |
* `--vaadin-upload-padding` |
* `--vaadin-upload-drop-label-color` |
* `--vaadin-upload-drop-label-font-size` |
* `--vaadin-upload-drop-label-font-weight` |
* `--vaadin-upload-drop-label-gap` |
* `--vaadin-upload-drop-label-line-height` |
* `--vaadin-upload-file-list-divider-color` |
* `--vaadin-upload-file-list-divider-width` |
* `--vaadin-upload-file-border-radius` |
* `--vaadin-upload-file-button-background` |
* `--vaadin-upload-file-button-border-color` |
* `--vaadin-upload-file-button-border-radius` |
* `--vaadin-upload-file-button-border-width` |
* `--vaadin-upload-file-button-text-color` |
* `--vaadin-upload-file-button-padding` |
* `--vaadin-upload-file-done-color` |
* `--vaadin-upload-file-error-color` |
* `--vaadin-upload-file-error-font-size` |
* `--vaadin-upload-file-error-font-weight` |
* `--vaadin-upload-file-error-line-height` |
* `--vaadin-upload-file-gap` |
* `--vaadin-upload-file-name-color` |
* `--vaadin-upload-file-name-font-size` |
* `--vaadin-upload-file-name-font-weight` |
* `--vaadin-upload-file-name-line-height` |
* `--vaadin-upload-file-padding` |
* `--vaadin-upload-file-status-color` |
* `--vaadin-upload-file-status-font-size` |
* `--vaadin-upload-file-status-font-weight` |
* `--vaadin-upload-file-status-line-height` |
* `--vaadin-upload-file-warning-color` |
*
* See [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.
*
* @fires {CustomEvent} file-reject - Fired when a file cannot be added to the queue due to a constrain.
* @fires {CustomEvent} files-changed - Fired when the `files` property changes.
* @fires {CustomEvent} max-files-reached-changed - Fired when the `maxFilesReached` property changes.
* @fires {CustomEvent} upload-before - Fired before the XHR is opened.
* @fires {CustomEvent} upload-start - Fired when the XHR is sent.
* @fires {CustomEvent} upload-progress - Fired as many times as the progress is updated.
* @fires {CustomEvent} upload-success - Fired in case the upload process succeeded.
* @fires {CustomEvent} upload-error - Fired in case the upload process failed.
* @fires {CustomEvent} upload-request - Fired when the XHR has been opened but not sent yet.
* @fires {CustomEvent} upload-response - Fired when on the server response before analyzing it.
* @fires {CustomEvent} upload-retry - Fired when retry upload is requested.
* @fires {CustomEvent} upload-abort - Fired when upload abort is requested.
*/
declare class Upload extends UploadMixin(ThemableMixin(ElementMixin(HTMLElement))) {
addEventListener<K extends keyof UploadEventMap>(
type: K,
listener: (this: Upload, ev: UploadEventMap[K]) => void,
options?: AddEventListenerOptions | boolean,
): void;
removeEventListener<K extends keyof UploadEventMap>(
type: K,
listener: (this: Upload, ev: UploadEventMap[K]) => void,
options?: EventListenerOptions | boolean,
): void;
}
declare global {
interface HTMLElementTagNameMap {
'vaadin-upload': Upload;
}
}
export { Upload };