angular-material-fileupload
Version:
A fileupload component based on angular-material design
221 lines • 18.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/mat-file-upload/mat-file-upload.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter, } from "@angular/core";
import { ReplaySubject, BehaviorSubject, Subscription } from "rxjs";
import { HttpClient, HttpEventType, } from "@angular/common/http";
import { MatFileUploadQueueService } from "../mat-file-upload-queue/mat-file-upload-queue.service";
export class MatFileUploadComponent {
/**
* @param {?} HttpClient
* @param {?} matFileUploadQueueService
*/
constructor(HttpClient, matFileUploadQueueService) {
this.HttpClient = HttpClient;
this.matFileUploadQueueService = matFileUploadQueueService;
this.uploadProgressSubject = new ReplaySubject();
this.uploadProgress$ = this.uploadProgressSubject.asObservable();
this.uploadInProgressSubject = new BehaviorSubject(false);
this.uploadInProgress$ = this.uploadInProgressSubject.asObservable();
this.subs = new Subscription();
this.fileUploadAriaLabel = "File Upload";
this.cancelAriaLabel = "Cancel File Upload";
/**
* Output
*/
this.removeEvent = new EventEmitter();
this.onUpload = new EventEmitter();
/** @type {?} */
const queueInput = this.matFileUploadQueueService.getInputValue();
if (queueInput) {
this.httpUrl = this.httpUrl || queueInput.httpUrl;
this.httpRequestHeaders =
this.httpRequestHeaders || queueInput.httpRequestHeaders;
this.httpRequestParams =
this.httpRequestParams || queueInput.httpRequestParams;
this.fileAlias = this.fileAlias || queueInput.fileAlias;
}
}
/**
* @return {?}
*/
get file() {
return this._file;
}
/**
* @param {?} file
* @return {?}
*/
set file(file) {
this._file = file;
}
/**
* @param {?} id
* @return {?}
*/
set id(id) {
this._id = id;
}
/**
* @return {?}
*/
get id() {
return this._id;
}
/**
* @return {?}
*/
ngOnInit() {
this.uploadProgressSubject.next({
progressPercentage: 0,
loaded: 0,
total: this._file.size,
});
}
/**
* @return {?}
*/
upload() {
this.uploadInProgressSubject.next(true);
// How to set the alias?
/** @type {?} */
let formData = new FormData();
formData.set(this.fileAlias, this._file, this._file.name);
this.subs.add(this.HttpClient.post(this.httpUrl, formData, {
headers: this.httpRequestHeaders,
observe: "events",
params: this.httpRequestParams,
reportProgress: true,
responseType: "json",
}).subscribe((/**
* @param {?} event
* @return {?}
*/
(event) => {
if (event.type === HttpEventType.UploadProgress) {
this.uploadProgressSubject.next({
progressPercentage: Math.floor((event.loaded * 100) / event.total),
loaded: event.loaded,
total: event.total,
});
}
this.onUpload.emit({ file: this._file, event: event });
}), (/**
* @param {?} error
* @return {?}
*/
(error) => {
if (this.fileUploadSubscription) {
this.fileUploadSubscription.unsubscribe();
}
this.uploadInProgressSubject.next(false);
this.onUpload.emit({ file: this._file, event: event });
}), (/**
* @return {?}
*/
() => this.uploadInProgressSubject.next(false))));
}
/**
* @return {?}
*/
remove() {
this.subs.unsubscribe();
this.removeEvent.emit(this);
}
/**
* @return {?}
*/
ngOnDestroy() {
this.subs.unsubscribe();
}
}
MatFileUploadComponent.decorators = [
{ type: Component, args: [{
selector: "mat-file-upload",
template: "<ng-container *ngIf=\"uploadProgress$ | async as uploadProgress\">\n <mat-card>\n <span class=\"file-summary\">{{ file.name }}({{ file.size | bytes }})</span>\n <div class=\"upload-progress\">\n <mat-progress-bar\n [value]=\"uploadProgress.progressPercentage\"\n ></mat-progress-bar>\n\n <button\n mat-icon-button\n [attr.aria-label]=\"fileUploadAriaLabel\"\n (click)=\"upload()\"\n [disabled]=\"uploadInProgress$ | async\"\n >\n <mat-icon>file_upload</mat-icon>\n </button>\n\n <button\n mat-icon-button\n [attr.aria-label]=\"cancelAriaLabel\"\n (click)=\"remove()\"\n >\n <mat-icon>cancel</mat-icon>\n </button>\n </div>\n <span class=\"file-summary\">{{ uploadProgress.progressPercentage }}%</span>\n <span>\n {{ uploadProgress.loaded | bytes }} of\n {{ uploadProgress.total | bytes }}</span\n >\n </mat-card>\n</ng-container>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [".file-summary{font-size:.85rem}.upload-progress{display:flex;align-content:center;align-items:center;height:10px}.upload-progress ::ng-deep .mat-progress-bar .mat-progress-bar-element{transition:none}"]
}] }
];
/** @nocollapse */
MatFileUploadComponent.ctorParameters = () => [
{ type: HttpClient },
{ type: MatFileUploadQueueService }
];
MatFileUploadComponent.propDecorators = {
httpUrl: [{ type: Input }],
httpRequestHeaders: [{ type: Input }],
httpRequestParams: [{ type: Input }],
fileAlias: [{ type: Input }],
file: [{ type: Input }],
id: [{ type: Input }],
fileUploadAriaLabel: [{ type: Input }],
cancelAriaLabel: [{ type: Input }],
removeEvent: [{ type: Output }],
onUpload: [{ type: Output }]
};
if (false) {
/**
* @type {?}
* @private
*/
MatFileUploadComponent.prototype.uploadProgressSubject;
/** @type {?} */
MatFileUploadComponent.prototype.uploadProgress$;
/**
* @type {?}
* @private
*/
MatFileUploadComponent.prototype.uploadInProgressSubject;
/** @type {?} */
MatFileUploadComponent.prototype.uploadInProgress$;
/** @type {?} */
MatFileUploadComponent.prototype.subs;
/** @type {?} */
MatFileUploadComponent.prototype.httpUrl;
/** @type {?} */
MatFileUploadComponent.prototype.httpRequestHeaders;
/** @type {?} */
MatFileUploadComponent.prototype.httpRequestParams;
/** @type {?} */
MatFileUploadComponent.prototype.fileAlias;
/**
* @type {?}
* @private
*/
MatFileUploadComponent.prototype._file;
/**
* @type {?}
* @private
*/
MatFileUploadComponent.prototype._id;
/** @type {?} */
MatFileUploadComponent.prototype.fileUploadAriaLabel;
/** @type {?} */
MatFileUploadComponent.prototype.cancelAriaLabel;
/**
* Output
* @type {?}
*/
MatFileUploadComponent.prototype.removeEvent;
/** @type {?} */
MatFileUploadComponent.prototype.onUpload;
/**
* @type {?}
* @private
*/
MatFileUploadComponent.prototype.fileUploadSubscription;
/**
* @type {?}
* @private
*/
MatFileUploadComponent.prototype.HttpClient;
/**
* @type {?}
* @private
*/
MatFileUploadComponent.prototype.matFileUploadQueueService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWZpbGUtdXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItbWF0ZXJpYWwtZmlsZXVwbG9hZC8iLCJzb3VyY2VzIjpbImxpYi9tYXQtZmlsZS11cGxvYWQvbWF0LWZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsdUJBQXVCLEVBRXZCLEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBR0wsVUFBVSxFQUNWLGFBQWEsR0FDZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBU25HLE1BQU0sT0FBTyxzQkFBc0I7Ozs7O0lBNkRqQyxZQUNVLFVBQXNCLEVBQ3RCLHlCQUFvRDtRQURwRCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBMkI7UUE5RHRELDBCQUFxQixHQUFHLElBQUksYUFBYSxFQUFtQixDQUFDO1FBQ3JFLG9CQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBELDRCQUF1QixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLHNCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV6RCxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQTJDakMsd0JBQW1CLEdBQUcsYUFBYSxDQUFDO1FBR3BDLG9CQUFlLEdBQUcsb0JBQW9CLENBQUM7Ozs7UUFHN0IsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUN6RCxhQUFRLEdBQUcsSUFB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Qyw0Q0FBOEI7Ozs7O0lBQzlCLDJEQUE0RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgT25EZXN0cm95LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1xuICBIdHRwSGVhZGVycyxcbiAgSHR0cFBhcmFtcyxcbiAgSHR0cENsaWVudCxcbiAgSHR0cEV2ZW50VHlwZSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBNYXRGaWxlVXBsb2FkUXVldWVTZXJ2aWNlIH0gZnJvbSBcIi4uL21hdC1maWxlLXVwbG9hZC1xdWV1ZS9tYXQtZmlsZS11cGxvYWQtcXVldWUuc2VydmljZVwiO1xuaW1wb3J0IHsgSVVwbG9hZFByb2dyZXNzIH0gZnJvbSBcIi4uL21hdC1maWxlLXVwbG9hZC50eXBlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJtYXQtZmlsZS11cGxvYWRcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9tYXQtZmlsZS11cGxvYWQuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL21hdC1maWxlLXVwbG9hZC5jb21wb25lbnQuc2Nzc1wiXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdEZpbGVVcGxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgdXBsb2FkUHJvZ3Jlc3NTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8SVVwbG9hZFByb2dyZXNzPigpO1xuICB1cGxvYWRQcm9ncmVzcyQgPSB0aGlzLnVwbG9hZFByb2dyZXNzU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHVwbG9hZEluUHJvZ3Jlc3NTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHVwbG9hZEluUHJvZ3Jlc3MkID0gdGhpcy51cGxvYWRJblByb2dyZXNzU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwdWJsaWMgc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAvKiBIdHRwIHJlcXVlc3QgaW5wdXQgYmluZGluZ3MgKi9cbiAgQElucHV0KClcbiAgaHR0cFVybDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGh0dHBSZXF1ZXN0SGVhZGVyczpcbiAgICB8IEh0dHBIZWFkZXJzXG4gICAgfCB7XG4gICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgICAgfTtcblxuICBASW5wdXQoKVxuICBodHRwUmVxdWVzdFBhcmFtczpcbiAgICB8IEh0dHBQYXJhbXNcbiAgICB8IHtcbiAgICAgICAgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgIH07XG5cbiAgQElucHV0KClcbiAgZmlsZUFsaWFzOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfZmlsZTogYW55O1xuICBwcml2YXRlIF9pZDogbnVtYmVyO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBmaWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGU7XG4gIH1cbiAgc2V0IGZpbGUoZmlsZTogYW55KSB7XG4gICAgdGhpcy5fZmlsZSA9IGZpbGU7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgaWQoaWQ6IG51bWJlcikge1xuICAgIHRoaXMuX2lkID0gaWQ7XG4gIH1cbiAgZ2V0IGlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgQElucHV0KClcbiAgZmlsZVVwbG9hZEFyaWFMYWJlbCA9IFwiRmlsZSBVcGxvYWRcIjtcblxuICBASW5wdXQoKVxuICBjYW5jZWxBcmlhTGFiZWwgPSBcIkNhbmNlbCBGaWxlIFVwbG9hZFwiO1xuXG4gIC8qKiBPdXRwdXQgICovXG4gIEBPdXRwdXQoKSByZW1vdmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8TWF0RmlsZVVwbG9hZENvbXBvbmVudD4oKTtcbiAgQE91dHB1dCgpIG9uVXBsb2FkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByaXZhdGUgZmlsZVVwbG9hZFN1YnNjcmlwdGlvbjogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgSHR0cENsaWVudDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIG1hdEZpbGVVcGxvYWRRdWV1ZVNlcnZpY2U6IE1hdEZpbGVVcGxvYWRRdWV1ZVNlcnZpY2VcbiAgKSB7XG4gICAgY29uc3QgcXVldWVJbnB1dCA9IHRoaXMubWF0RmlsZVVwbG9hZFF1ZXVlU2VydmljZS5nZXRJbnB1dFZhbHVlKCk7XG4gICAgaWYgKHF1ZXVlSW5wdXQpIHtcbiAgICAgIHRoaXMuaHR0cFVybCA9IHRoaXMuaHR0cFVybCB8fCBxdWV1ZUlucHV0Lmh0dHBVcmw7XG4gICAgICB0aGlzLmh0dHBSZXF1ZXN0SGVhZGVycyA9XG4gICAgICAgIHRoaXMuaHR0cFJlcXVlc3RIZWFkZXJzIHx8IHF1ZXVlSW5wdXQuaHR0cFJlcXVlc3RIZWFkZXJzO1xuICAgICAgdGhpcy5odHRwUmVxdWVzdFBhcmFtcyA9XG4gICAgICAgIHRoaXMuaHR0cFJlcXVlc3RQYXJhbXMgfHwgcXVldWVJbnB1dC5odHRwUmVxdWVzdFBhcmFtcztcbiAgICAgIHRoaXMuZmlsZUFsaWFzID0gdGhpcy5maWxlQWxpYXMgfHwgcXVldWVJbnB1dC5maWxlQWxpYXM7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGxvYWRQcm9ncmVzc1N1YmplY3QubmV4dCh7XG4gICAgICBwcm9ncmVzc1BlcmNlbnRhZ2U6IDAsXG4gICAgICBsb2FkZWQ6IDAsXG4gICAgICB0b3RhbDogdGhpcy5fZmlsZS5zaXplLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwbG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwbG9hZEluUHJvZ3Jlc3NTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgLy8gSG93IHRvIHNldCB0aGUgYWxpYXM/XG4gICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuc2V0KHRoaXMuZmlsZUFsaWFzLCB0aGlzLl9maWxlLCB0aGlzLl9maWxlLm5hbWUpO1xuICAgIHRoaXMuc3Vicy5hZGQoXG4gICAgICB0aGlzLkh0dHBDbGllbnQucG9zdCh0aGlzLmh0dHBVcmwsIGZvcm1EYXRhLCB7XG4gICAgICAgIGhlYWRlcnM6IHRoaXMuaHR0cFJlcXVlc3RIZWFkZXJzLFxuICAgICAgICBvYnNlcnZlOiBcImV2ZW50c1wiLFxuICAgICAgICBwYXJhbXM6IHRoaXMuaHR0cFJlcXVlc3RQYXJhbXMsXG4gICAgICAgIHJlcG9ydFByb2dyZXNzOiB0cnVlLFxuICAgICAgICByZXNwb25zZVR5cGU6IFwianNvblwiLFxuICAgICAgfSkuc3Vic2NyaWJlKFxuICAgICAgICAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzKSB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZFByb2dyZXNzU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgICAgcHJvZ3Jlc3NQZXJjZW50YWdlOiBNYXRoLmZsb29yKFxuICAgICAgICAgICAgICAgIChldmVudC5sb2FkZWQgKiAxMDApIC8gZXZlbnQudG90YWxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uVXBsb2FkLmVtaXQoeyBmaWxlOiB0aGlzLl9maWxlLCBldmVudDogZXZlbnQgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZmlsZVVwbG9hZFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5maWxlVXBsb2FkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBsb2FkSW5Qcm9ncmVzc1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5vblVwbG9hZC5lbWl0KHsgZmlsZTogdGhpcy5fZmlsZSwgZXZlbnQ6IGV2ZW50IH0pO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB0aGlzLnVwbG9hZEluUHJvZ3Jlc3NTdWJqZWN0Lm5leHQoZmFsc2UpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmUoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudC5lbWl0KHRoaXMpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==