ng-devui
Version:
DevUI components based on Angular
359 lines • 81.9 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { DOCUMENT } from '@angular/common';
import { Component, EventEmitter, forwardRef, HostBinding, Inject, Input, Output, TemplateRef, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { I18nService } from 'ng-devui/i18n';
import { ToastService } from 'ng-devui/toast';
import { DevConfigService, WithConfig } from 'ng-devui/utils';
import { from } from 'rxjs';
import { debounceTime, last, map, mergeMap } from 'rxjs/operators';
import { IFileOptions, IUploadOptions, UploadStatus } from './file-uploader.types';
import { MultipleUploadViewComponent } from './multiple-upload-view.component';
import { SelectFiles } from './select-files.utils';
import { SliceUploadService } from './slice-upload.service';
import * as i0 from "@angular/core";
import * as i1 from "./select-files.utils";
import * as i2 from "ng-devui/i18n";
import * as i3 from "./slice-upload.service";
import * as i4 from "ng-devui/utils";
import * as i5 from "ng-devui/toast";
import * as i6 from "@angular/common";
import * as i7 from "ng-devui/button";
import * as i8 from "ng-devui/progress";
import * as i9 from "./multiple-upload-view.component";
import * as i10 from "./file-drop.directive";
export class MultipleUploadComponent {
get hasGlowStyle() {
return this.showGlowStyle;
}
constructor(selectFiles, i18n, doc, sliceUploadService, devConfigService, toastService) {
this.selectFiles = selectFiles;
this.i18n = i18n;
this.doc = doc;
this.sliceUploadService = sliceUploadService;
this.devConfigService = devConfigService;
this.toastService = toastService;
this.autoUpload = false;
this.withoutBtn = false;
this.showTip = false;
this.uploadedFiles = [];
this.oneTimeUpload = false;
this.disabled = false;
this.enableDrop = false;
this.showGlowStyle = true;
this.successEvent = new EventEmitter();
this.errorEvent = new EventEmitter();
this.errorChunkEvent = new EventEmitter();
this.deleteUploadedFileEvent = new EventEmitter();
this.fileDrop = new EventEmitter();
this.fileOver = new EventEmitter();
this.fileSelect = new EventEmitter();
this.isDropOVer = false;
this.errorMsg = [];
this.UploadStatus = UploadStatus;
this.onChange = (_) => null;
this.onTouched = () => null;
this.document = this.doc;
}
ngOnInit() {
this.i18nText = this.i18n.getI18nText().upload;
this.i18nCommonText = this.i18n.getI18nText().common;
this.i18nSubscription = this.i18n.langChange().subscribe((data) => {
this.i18nText = data.upload;
this.i18nCommonText = data.common;
});
}
writeValue(files) {
if (files) {
const simulateFiles = from(this.simulateSelectFiles(files)).pipe(mergeMap((file) => file));
this._dealFiles(simulateFiles);
}
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
simulateSelectFiles(files) {
return new Promise((resolve) => {
resolve(Array.prototype.slice.call(files));
});
}
_dealFiles(observale) {
this.multipleUploadViewComponent.resetSameNameFiles();
observale
.pipe(map((file) => this.multipleUploadViewComponent.addFile(file)), debounceTime(100))
.subscribe(() => {
this.checkValid();
const sameNameFiles = this.multipleUploadViewComponent.getSameNameFiles();
if (this.uploadOptions.checkSameName && sameNameFiles.length) {
this.alertMsg(this.i18nText.getExistSameNameFilesMsg(sameNameFiles));
}
this.onChange(this.multipleUploadViewComponent.fileUploaders.map((fileUploader) => fileUploader.file));
const selectedFiles = this.multipleUploadViewComponent.fileUploaders
.filter((fileUploader) => fileUploader.status === UploadStatus.preLoad)
.map((fileUploader) => fileUploader.file);
this.onFileSelect(selectedFiles);
if (this.autoUpload) {
this.upload();
}
}, (error) => {
this.alertMsg(error.message);
});
}
checkValid() {
let totalFileSize = 0;
this.multipleUploadViewComponent.fileUploaders.forEach((fileUploader) => {
totalFileSize += fileUploader.file.size;
const checkResult = this.selectFiles._validateFiles(this.multipleUploadViewComponent.fileUploaders.length, fileUploader.file, this.fileOptions.accept, fileUploader.uploadOptions);
if (checkResult && checkResult.checkError) {
this.multipleUploadViewComponent.deletePreUploadFile(fileUploader.file);
this.alertMsg(checkResult.errorMsg);
return;
}
});
if (this.oneTimeUpload) {
const checkResult = this.selectFiles.checkAllFilesSize(totalFileSize, this.uploadOptions.maximumSize);
if (checkResult && checkResult.checkError) {
this.multipleUploadViewComponent.removeFiles();
this.alertMsg(checkResult.errorMsg);
}
}
}
onClick(event) {
if (this.disabled) {
return;
}
this._dealFiles(this.selectFiles.triggerSelectFiles(this.fileOptions, this.uploadOptions));
}
onFileDrop(files) {
this.isDropOVer = false;
this._dealFiles(this.selectFiles.triggerDropFiles(this.fileOptions, this.uploadOptions, files));
this.fileDrop.emit(files);
}
onFileOver(event) {
this.isDropOVer = event;
this.fileOver.emit(event);
}
onFileSelect(files) {
this.fileSelect.emit(files);
}
handleOneTimeUpload(uploadObservable) {
uploadObservable.pipe(last()).subscribe((results) => {
this.successEvent.emit(results);
results.forEach((result) => {
this.multipleUploadViewComponent.uploadedFilesComponent.addFile(result.file);
});
}, (error) => {
this.errorEvent.emit(error);
});
}
handleUpload(uploadObservable) {
uploadObservable.pipe(last()).subscribe((results) => {
const successResult = results
.filter((item) => item.status === UploadStatus.uploaded)
.map((item) => {
return { file: item.file, response: item.response };
});
const failResult = results
.filter((item) => item.status === UploadStatus.failed)
.map((item) => {
return { file: item.file, response: item.response };
});
if (failResult.length) {
this.errorEvent.emit(failResult);
}
if (successResult.length) {
this.successEvent.emit(successResult);
successResult.forEach((result) => {
this.multipleUploadViewComponent.uploadedFilesComponent.addFile(result.file);
});
}
});
}
upload(event, fileUploader) {
if (event) {
event.stopPropagation();
}
this.canUpload().then((canUpload) => {
if (!canUpload) {
this.multipleUploadViewComponent.removeFiles();
return;
}
const tempNode = this.document.getElementById('d-upload-temp');
if (tempNode) {
this.document.body.removeChild(tempNode);
}
if (this.uploadOptions.isChunked &&
this.sliceUploadService.isNeedChunk(this.multipleUploadViewComponent.fileUploaders, this.uploadOptions)) {
this.sliceUploadService.sliceUpload(this, this.multipleUploadViewComponent);
}
else if (this.oneTimeUpload) {
const oneTimeUploadObservable = this.multipleUploadViewComponent.oneTimeUpload();
this.handleOneTimeUpload(oneTimeUploadObservable);
}
else {
const uploadObservable = this.multipleUploadViewComponent.upload(fileUploader, true);
this.handleUpload(uploadObservable);
}
});
}
canUpload() {
let uploadResult = Promise.resolve(true);
if (this.beforeUpload) {
const result = this.beforeUpload(this.multipleUploadViewComponent.getFullFiles());
if (typeof result !== 'undefined') {
if (result.then) {
uploadResult = result;
}
else if (result.subscribe) {
uploadResult = result.toPromise();
}
else {
uploadResult = Promise.resolve(result);
}
}
}
return uploadResult;
}
_onDeleteUploadedFile(filePath) {
this.deleteUploadedFileEvent.emit(filePath);
this.onChange(this.multipleUploadViewComponent.fileUploaders.map((fileUploader) => fileUploader.file));
}
deleteFile($event, file) {
$event.stopPropagation();
this.multipleUploadViewComponent.deleteFile(file);
}
alertMsg(errorMsg) {
this.toastService.open({
value: [{ severity: 'warn', content: errorMsg }],
});
}
getStatus() {
let uploadingCount = 0;
let uploadedCount = 0;
let failedCount = 0;
const filesCount = this.multipleUploadViewComponent.fileUploaders.length;
this.multipleUploadViewComponent.fileUploaders.forEach((fileUploader) => {
if (fileUploader.status === UploadStatus.uploading) {
uploadingCount++;
}
else if (fileUploader.status === UploadStatus.uploaded) {
uploadedCount++;
}
else if (fileUploader.status === UploadStatus.failed) {
failedCount++;
}
});
if (failedCount > 0) {
this.uploadTips = this.i18nText.getFailedFilesCount(failedCount);
return 'failed';
}
if (uploadingCount > 0) {
this.uploadTips = this.i18nText.getUploadingFilesCount(uploadingCount, filesCount);
return 'uploading';
}
if (uploadedCount === filesCount && uploadedCount !== 0) {
return 'uploaded';
}
if (filesCount !== 0) {
this.uploadTips = this.i18nText.getSelectedFilesCount(filesCount);
return 'selected';
}
}
cancelUpload() {
this.multipleUploadViewComponent.fileUploaders
.filter((fileUploader) => fileUploader.status === UploadStatus.uploading)
.forEach((fileUploader) => {
fileUploader.status = UploadStatus.failed;
});
}
ngOnDestroy() {
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultipleUploadComponent, deps: [{ token: i1.SelectFiles }, { token: i2.I18nService }, { token: DOCUMENT }, { token: i3.SliceUploadService }, { token: i4.DevConfigService }, { token: i5.ToastService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MultipleUploadComponent, selector: "d-multiple-upload", inputs: { uploadOptions: "uploadOptions", fileOptions: "fileOptions", autoUpload: "autoUpload", withoutBtn: "withoutBtn", showTip: "showTip", uploadedFiles: "uploadedFiles", uploadedFilesRef: "uploadedFilesRef", preloadFilesRef: "preloadFilesRef", filePath: "filePath", placeholderText: "placeholderText", uploadText: "uploadText", confirmText: "confirmText", oneTimeUpload: "oneTimeUpload", disabled: "disabled", beforeUpload: "beforeUpload", setCustomUploadOptions: "setCustomUploadOptions", enableDrop: "enableDrop", showGlowStyle: "showGlowStyle" }, outputs: { successEvent: "successEvent", errorEvent: "errorEvent", errorChunkEvent: "errorChunkEvent", deleteUploadedFileEvent: "deleteUploadedFileEvent", fileDrop: "fileDrop", fileOver: "fileOver", fileSelect: "fileSelect" }, host: { properties: { "class.devui-glow-style": "this.hasGlowStyle" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => MultipleUploadComponent),
multi: true,
},
], viewQueries: [{ propertyName: "multipleUploadViewComponent", first: true, predicate: ["dMultipleUploadView"], descendants: true, static: true }], exportAs: ["dMultipleUpload"], ngImport: i0, template: "<div\n d-file-drop\n [enableDrop]=\"enableDrop\"\n (fileDrop)=\"onFileDrop($event)\"\n (fileOver)=\"onFileOver($event)\"\n (fileSelect)=\"onFileSelect($event)\"\n [ngStyle]=\"{ border: isDropOVer ? '1px solid #15bf15' : '0' }\"\n style=\"display: flex\"\n>\n <div class=\"devui-input-group\" [class.disabled]=\"disabled\" [class.with-button]=\"!withoutBtn\" (click)=\"onClick($event)\">\n <div *ngIf=\"dMultipleUploadView.fileUploaders.length === 0\" class=\"devui-form-control devui-upload-placeholder\">\n {{ placeholderText ? placeholderText : i18nText?.chooseFile }}\n </div>\n <ul *ngIf=\"dMultipleUploadView.fileUploaders.length > 0\" class=\"devui-form-control devui-files-list\">\n <li\n *ngFor=\"let fileUploader of dMultipleUploadView.fileUploaders; let index = index\"\n class=\"devui-file-item devui-file-tag\"\n style=\"display: inline-block; margin: 0 2px 2px 0\"\n title=\"{{ fileUploader.file.name }}\"\n >\n <span class=\"devui-filename {{ fileUploader.status === UploadStatus.failed ? 'devui-failed-color' : '' }}\">\n {{ fileUploader.file.name }}\n </span>\n <span\n class=\"icon devui-upload-remove {{ fileUploader.status === UploadStatus.failed ? 'devui-upload-delete-file-button' : '' }}\n {{\n fileUploader.status === UploadStatus.uploading || fileUploader.status === UploadStatus.uploaded ? 'devui-uploading-delete' : ''\n }}\"\n (click)=\"deleteFile($event, fileUploader.file)\"\n >\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g transform=\"translate(-270.000000, -2376.000000)\">\n <g transform=\"translate(198.000000, 1991.000000)\">\n <g transform=\"translate(0.000000, 383.000000)\">\n <g transform=\"translate(72.000000, 2.000000)\">\n <path\n d=\"M4.570404,4.06442993 L4.6207661,4.10650663 L8,7.48581818 L11.3792339,4.10650663 C11.5212427,3.96449779 11.7514845,3.96449779 11.8934934,4.10650663 C12.0197234,4.2327367 12.033749,4.42868172 11.9355701,4.570404 L11.8934934,4.6207661 L8.51418182,8 L11.8934934,11.3792339 C12.0355022,11.5212427 12.0355022,11.7514845 11.8934934,11.8934934 C11.7672633,12.0197234 11.5713183,12.033749 11.429596,11.9355701 L11.3792339,11.8934934 L8,8.51418182 L4.6207661,11.8934934 C4.47875727,12.0355022 4.24851546,12.0355022 4.10650663,11.8934934 C3.98027655,11.7672633 3.96625099,11.5713183 4.06442993,11.429596 L4.10650663,11.3792339 L7.48581818,8 L4.10650663,4.6207661 C3.96449779,4.47875727 3.96449779,4.24851546 4.10650663,4.10650663 C4.2327367,3.98027655 4.42868172,3.96625099 4.570404,4.06442993 Z\"\n ></path>\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n </span>\n <div *ngIf=\"fileUploader.status === UploadStatus.uploading\" class=\"icon devui-upload-progress\">\n <d-progress\n [type]=\"'circle'\"\n [percentage]=\"fileUploader.percentage\"\n [strokeColor]=\"'#029931'\"\n [strokeWidth]=\"8\"\n [showContent]=\"false\"\n >\n </d-progress>\n </div>\n <span *ngIf=\"fileUploader.status === UploadStatus.failed\" class=\"icon icon-running\" (click)=\"upload($event, fileUploader)\"> </span>\n <span *ngIf=\"fileUploader.status === UploadStatus.uploaded\" class=\"icon icon-right\"></span>\n </li>\n </ul>\n <span class=\"devui-input-group-addon\">\n <svg class=\"svg-icon-dot\" height=\"1em\" width=\"1em\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"m400.31892 176.970574c0-61.574381 50.113351-111.680569 111.679545-111.680569 61.576427 0 111.680569 50.106188 111.680569 111.680569 0 61.568241-50.104141 111.679545-111.680569 111.679545-61.566194 0-111.679545-50.111304-111.679545-111.679545zm0 335.028403c0-61.568241 50.113351-111.678522 111.679545-111.678522 61.576427 0 111.680569 50.110281 111.680569 111.678522 0 61.574381-50.105165 111.682615-111.680569 111.682615-61.566194 0-111.679545-50.108235-111.679545-111.682615zm0 335.037612c0-61.572334 50.113351-111.679545 111.679545-111.679545 61.575404 0 111.680569 50.107211 111.680569 111.679545 0 61.567217-50.105165 111.672382-111.680569 111.672382-61.566194 0-111.679545-50.105164-111.679545-111.672382zm0 0\"\n />\n </svg>\n </span>\n </div>\n <d-button\n *ngIf=\"!autoUpload && !withoutBtn\"\n [disabled]=\"disabled\"\n (btnClick)=\"upload($event)\"\n [style.margin-left.px]=\"8\"\n bsStyle=\"common\"\n >\n {{ uploadText || i18nText?.upload }}\n </d-button>\n</div>\n<ng-container *ngIf=\"showTip\">\n <div class=\"devui-upload-tip\">\n <span *ngIf=\"getStatus() === 'selected'\" class=\"devui-loading\">{{ uploadTips }}</span>\n <span *ngIf=\"getStatus() === 'uploading'\" class=\"devui-loading\">\n <span style=\"margin-right: 8px\">{{ uploadTips }}</span>\n <a (click)=\"cancelUpload()\">{{ i18nText?.cancelUpload }}</a>\n </span>\n <div *ngIf=\"getStatus() === 'uploaded'\" class=\"devui-loaded\">\n <i class=\"icon icon-right-o\"></i>\n <span style=\"vertical-align: middle\">{{ i18nText?.uploadSuccess }}</span>\n </div>\n <div *ngIf=\"getStatus() === 'failed'\" class=\"devui-upload-failed\">\n <i class=\"icon icon-info-o\"></i>\n <span style=\"vertical-align: middle\">\n <span style=\"margin-right: 8px\">{{ uploadTips }}</span>\n <a (click)=\"upload($event)\">{{ i18nText?.reUpload }}</a>\n </span>\n </div>\n </div>\n</ng-container>\n<d-multiple-upload-view\n #dMultipleUploadView\n [uploadedFiles]=\"uploadedFiles\"\n [uploadedFilesRef]=\"uploadedFilesRef\"\n [preloadFilesRef]=\"preloadFilesRef\"\n [uploadOptions]=\"uploadOptions\"\n [filePath]=\"filePath\"\n [setCustomUploadOptions]=\"setCustomUploadOptions\"\n (deleteUploadedFileEvent)=\"_onDeleteUploadedFile($event)\"\n>\n</d-multiple-upload-view>\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-input-group{position:relative;display:flex;align-items:center;border-collapse:separate;width:100%;border-radius:var(--devui-border-radius, 2px)}.devui-input-group:not(.disabled):hover .devui-input-group-addon{background-color:var(--devui-dividing-line, #f0f0f0);font-weight:700}.devui-input-group:not(.disabled):hover .devui-form-control{border-right-color:var(--devui-form-control-line, #dbdbdb)}.devui-input-group:not(.disabled) .devui-input-group-addon:active{border-color:var(--devui-form-control-line-active, #0a59f7);border-right-color:var(--devui-form-control-line, #dbdbdb);background-color:var(--devui-dividing-line, #f0f0f0)}.devui-input-group .devui-input-group-addon{width:36px;white-space:nowrap;font-size:var(--devui-font-size-icon, 16px);font-weight:400;line-height:1;color:var(--devui-text, #191919);background-color:var(--devui-area, #f3f3f3);border-top:1px solid var(--devui-form-control-line, #dbdbdb);border-bottom:1px solid var(--devui-form-control-line, #dbdbdb);border-right:1px solid var(--devui-form-control-line, #dbdbdb);border-radius:0 var(--devui-border-radius, 2px) var(--devui-border-radius, 2px) 0;transition:border-color var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1)),background-color var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1));cursor:pointer;height:100%;position:relative;display:inline-block}.devui-input-group .devui-input-group-addon svg{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.devui-input-group .devui-form-control{cursor:pointer;display:block;width:100%;min-height:28px;height:unset;padding:4px 8px;font-size:var(--devui-font-size, 12px);line-height:1.5;background-image:none;border:1px solid var(--devui-form-control-line, #dbdbdb);border-radius:var(--devui-border-radius, 2px) 0 0 var(--devui-border-radius, 2px);transition:border-color var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1)),box-shadow var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1))}.devui-input-group .devui-form-control.devui-files-list{max-height:52px;padding:2px 2px 0;overflow-x:hidden;overflow-y:auto;max-width:100%}.devui-input-group .devui-form-control.devui-files-list .devui-file-item{height:22px;line-height:22px;padding:0 48px 0 12px}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag{position:relative;background-color:var(--devui-label-bg, #f0f0f0);border-radius:var(--devui-border-radius, 2px);max-width:100%}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .devui-filename{height:100%;display:inline-block;vertical-align:middle;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon{position:absolute;cursor:pointer;right:8px;top:50%;transform:translateY(-50%);line-height:1}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.icon-right{color:var(--devui-success, #058358)}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.icon-running{font-size:16px}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.devui-upload-delete-file-button{margin-right:20px}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.devui-uploading-delete{display:none}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.devui-upload-remove{width:16px;height:16px}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.devui-upload-remove svg path{fill:var(--devui-text, #191919)}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag:hover .devui-upload-progress,.devui-input-group .devui-form-control.devui-files-list .devui-file-tag:hover .icon-right{display:none}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag:hover .devui-upload-remove{display:inline-block}.devui-input-group.disabled .devui-upload-placeholder{color:var(--devui-disabled-text, #c2c2c2)}.devui-input-group .devui-upload-placeholder{max-height:28px;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--devui-placeholder, #808080)}:host ::ng-deep .devui-upload-progress{width:16px;height:16px}.devui-input-group.disabled .devui-form-control,.devui-input-group.disabled .devui-input-group-addon{cursor:not-allowed;background-color:var(--devui-disabled-bg, #f3f3f3);border-color:var(--devui-disabled-line, #e6e6e6);color:var(--devui-disabled-text, #c2c2c2)}svg.svg-icon-dot>path{fill:var(--devui-icon-text, #808080)}.devui-form-control{outline:none}.devui-input-group.disabled .devui-upload-delete-file-button{cursor:not-allowed;pointer-events:none}.devui-loading{color:var(--devui-aide-text, #595959)}.devui-failed-color{color:var(--devui-danger, #e02128)}.devui-upload-tip{height:18px;margin-top:8px;font-size:12px}.devui-upload-tip .icon{margin-right:8px;font-size:16px;vertical-align:middle}.devui-upload-tip .icon-right-o{color:var(--devui-success, #058358)}.devui-upload-tip .devui-upload-failed{color:var(--devui-danger, #e02128)}.devui-upload-tip a{color:var(--devui-link, #0950de);cursor:pointer}.with-button{max-width:calc(100% - 72px)}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i7.ButtonComponent, selector: "d-button", inputs: ["id", "type", "bsStyle", "shape", "bsSize", "bsPosition", "bordered", "icon", "disabled", "showLoading", "width", "autofocus", "loadingTemplateRef"], outputs: ["btnClick"] }, { kind: "component", type: i8.ProgressComponent, selector: "d-progress", inputs: ["isDynamic", "percentage", "percentageText", "barbgcolor", "strokeColor", "height", "strokeWidth", "isCircle", "type", "showContent", "multiProgressConfig"] }, { kind: "component", type: i9.MultipleUploadViewComponent, selector: "d-multiple-upload-view", inputs: ["uploadOptions", "preloadFilesRef", "uploadedFiles", "uploadedFilesRef", "filePath", "setCustomUploadOptions"], outputs: ["deleteUploadedFileEvent"] }, { kind: "directive", type: i10.FileDropDirective, selector: "[d-file-drop]", inputs: ["enableDrop", "isSingle"], outputs: ["fileOver", "fileDrop"] }] }); }
}
__decorate([
WithConfig(),
__metadata("design:type", Object)
], MultipleUploadComponent.prototype, "showGlowStyle", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultipleUploadComponent, decorators: [{
type: Component,
args: [{ selector: 'd-multiple-upload', exportAs: 'dMultipleUpload', preserveWhitespaces: false, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => MultipleUploadComponent),
multi: true,
},
], template: "<div\n d-file-drop\n [enableDrop]=\"enableDrop\"\n (fileDrop)=\"onFileDrop($event)\"\n (fileOver)=\"onFileOver($event)\"\n (fileSelect)=\"onFileSelect($event)\"\n [ngStyle]=\"{ border: isDropOVer ? '1px solid #15bf15' : '0' }\"\n style=\"display: flex\"\n>\n <div class=\"devui-input-group\" [class.disabled]=\"disabled\" [class.with-button]=\"!withoutBtn\" (click)=\"onClick($event)\">\n <div *ngIf=\"dMultipleUploadView.fileUploaders.length === 0\" class=\"devui-form-control devui-upload-placeholder\">\n {{ placeholderText ? placeholderText : i18nText?.chooseFile }}\n </div>\n <ul *ngIf=\"dMultipleUploadView.fileUploaders.length > 0\" class=\"devui-form-control devui-files-list\">\n <li\n *ngFor=\"let fileUploader of dMultipleUploadView.fileUploaders; let index = index\"\n class=\"devui-file-item devui-file-tag\"\n style=\"display: inline-block; margin: 0 2px 2px 0\"\n title=\"{{ fileUploader.file.name }}\"\n >\n <span class=\"devui-filename {{ fileUploader.status === UploadStatus.failed ? 'devui-failed-color' : '' }}\">\n {{ fileUploader.file.name }}\n </span>\n <span\n class=\"icon devui-upload-remove {{ fileUploader.status === UploadStatus.failed ? 'devui-upload-delete-file-button' : '' }}\n {{\n fileUploader.status === UploadStatus.uploading || fileUploader.status === UploadStatus.uploaded ? 'devui-uploading-delete' : ''\n }}\"\n (click)=\"deleteFile($event, fileUploader.file)\"\n >\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g transform=\"translate(-270.000000, -2376.000000)\">\n <g transform=\"translate(198.000000, 1991.000000)\">\n <g transform=\"translate(0.000000, 383.000000)\">\n <g transform=\"translate(72.000000, 2.000000)\">\n <path\n d=\"M4.570404,4.06442993 L4.6207661,4.10650663 L8,7.48581818 L11.3792339,4.10650663 C11.5212427,3.96449779 11.7514845,3.96449779 11.8934934,4.10650663 C12.0197234,4.2327367 12.033749,4.42868172 11.9355701,4.570404 L11.8934934,4.6207661 L8.51418182,8 L11.8934934,11.3792339 C12.0355022,11.5212427 12.0355022,11.7514845 11.8934934,11.8934934 C11.7672633,12.0197234 11.5713183,12.033749 11.429596,11.9355701 L11.3792339,11.8934934 L8,8.51418182 L4.6207661,11.8934934 C4.47875727,12.0355022 4.24851546,12.0355022 4.10650663,11.8934934 C3.98027655,11.7672633 3.96625099,11.5713183 4.06442993,11.429596 L4.10650663,11.3792339 L7.48581818,8 L4.10650663,4.6207661 C3.96449779,4.47875727 3.96449779,4.24851546 4.10650663,4.10650663 C4.2327367,3.98027655 4.42868172,3.96625099 4.570404,4.06442993 Z\"\n ></path>\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n </span>\n <div *ngIf=\"fileUploader.status === UploadStatus.uploading\" class=\"icon devui-upload-progress\">\n <d-progress\n [type]=\"'circle'\"\n [percentage]=\"fileUploader.percentage\"\n [strokeColor]=\"'#029931'\"\n [strokeWidth]=\"8\"\n [showContent]=\"false\"\n >\n </d-progress>\n </div>\n <span *ngIf=\"fileUploader.status === UploadStatus.failed\" class=\"icon icon-running\" (click)=\"upload($event, fileUploader)\"> </span>\n <span *ngIf=\"fileUploader.status === UploadStatus.uploaded\" class=\"icon icon-right\"></span>\n </li>\n </ul>\n <span class=\"devui-input-group-addon\">\n <svg class=\"svg-icon-dot\" height=\"1em\" width=\"1em\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"m400.31892 176.970574c0-61.574381 50.113351-111.680569 111.679545-111.680569 61.576427 0 111.680569 50.106188 111.680569 111.680569 0 61.568241-50.104141 111.679545-111.680569 111.679545-61.566194 0-111.679545-50.111304-111.679545-111.679545zm0 335.028403c0-61.568241 50.113351-111.678522 111.679545-111.678522 61.576427 0 111.680569 50.110281 111.680569 111.678522 0 61.574381-50.105165 111.682615-111.680569 111.682615-61.566194 0-111.679545-50.108235-111.679545-111.682615zm0 335.037612c0-61.572334 50.113351-111.679545 111.679545-111.679545 61.575404 0 111.680569 50.107211 111.680569 111.679545 0 61.567217-50.105165 111.672382-111.680569 111.672382-61.566194 0-111.679545-50.105164-111.679545-111.672382zm0 0\"\n />\n </svg>\n </span>\n </div>\n <d-button\n *ngIf=\"!autoUpload && !withoutBtn\"\n [disabled]=\"disabled\"\n (btnClick)=\"upload($event)\"\n [style.margin-left.px]=\"8\"\n bsStyle=\"common\"\n >\n {{ uploadText || i18nText?.upload }}\n </d-button>\n</div>\n<ng-container *ngIf=\"showTip\">\n <div class=\"devui-upload-tip\">\n <span *ngIf=\"getStatus() === 'selected'\" class=\"devui-loading\">{{ uploadTips }}</span>\n <span *ngIf=\"getStatus() === 'uploading'\" class=\"devui-loading\">\n <span style=\"margin-right: 8px\">{{ uploadTips }}</span>\n <a (click)=\"cancelUpload()\">{{ i18nText?.cancelUpload }}</a>\n </span>\n <div *ngIf=\"getStatus() === 'uploaded'\" class=\"devui-loaded\">\n <i class=\"icon icon-right-o\"></i>\n <span style=\"vertical-align: middle\">{{ i18nText?.uploadSuccess }}</span>\n </div>\n <div *ngIf=\"getStatus() === 'failed'\" class=\"devui-upload-failed\">\n <i class=\"icon icon-info-o\"></i>\n <span style=\"vertical-align: middle\">\n <span style=\"margin-right: 8px\">{{ uploadTips }}</span>\n <a (click)=\"upload($event)\">{{ i18nText?.reUpload }}</a>\n </span>\n </div>\n </div>\n</ng-container>\n<d-multiple-upload-view\n #dMultipleUploadView\n [uploadedFiles]=\"uploadedFiles\"\n [uploadedFilesRef]=\"uploadedFilesRef\"\n [preloadFilesRef]=\"preloadFilesRef\"\n [uploadOptions]=\"uploadOptions\"\n [filePath]=\"filePath\"\n [setCustomUploadOptions]=\"setCustomUploadOptions\"\n (deleteUploadedFileEvent)=\"_onDeleteUploadedFile($event)\"\n>\n</d-multiple-upload-view>\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-input-group{position:relative;display:flex;align-items:center;border-collapse:separate;width:100%;border-radius:var(--devui-border-radius, 2px)}.devui-input-group:not(.disabled):hover .devui-input-group-addon{background-color:var(--devui-dividing-line, #f0f0f0);font-weight:700}.devui-input-group:not(.disabled):hover .devui-form-control{border-right-color:var(--devui-form-control-line, #dbdbdb)}.devui-input-group:not(.disabled) .devui-input-group-addon:active{border-color:var(--devui-form-control-line-active, #0a59f7);border-right-color:var(--devui-form-control-line, #dbdbdb);background-color:var(--devui-dividing-line, #f0f0f0)}.devui-input-group .devui-input-group-addon{width:36px;white-space:nowrap;font-size:var(--devui-font-size-icon, 16px);font-weight:400;line-height:1;color:var(--devui-text, #191919);background-color:var(--devui-area, #f3f3f3);border-top:1px solid var(--devui-form-control-line, #dbdbdb);border-bottom:1px solid var(--devui-form-control-line, #dbdbdb);border-right:1px solid var(--devui-form-control-line, #dbdbdb);border-radius:0 var(--devui-border-radius, 2px) var(--devui-border-radius, 2px) 0;transition:border-color var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1)),background-color var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1));cursor:pointer;height:100%;position:relative;display:inline-block}.devui-input-group .devui-input-group-addon svg{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.devui-input-group .devui-form-control{cursor:pointer;display:block;width:100%;min-height:28px;height:unset;padding:4px 8px;font-size:var(--devui-font-size, 12px);line-height:1.5;background-image:none;border:1px solid var(--devui-form-control-line, #dbdbdb);border-radius:var(--devui-border-radius, 2px) 0 0 var(--devui-border-radius, 2px);transition:border-color var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1)),box-shadow var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1))}.devui-input-group .devui-form-control.devui-files-list{max-height:52px;padding:2px 2px 0;overflow-x:hidden;overflow-y:auto;max-width:100%}.devui-input-group .devui-form-control.devui-files-list .devui-file-item{height:22px;line-height:22px;padding:0 48px 0 12px}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag{position:relative;background-color:var(--devui-label-bg, #f0f0f0);border-radius:var(--devui-border-radius, 2px);max-width:100%}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .devui-filename{height:100%;display:inline-block;vertical-align:middle;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon{position:absolute;cursor:pointer;right:8px;top:50%;transform:translateY(-50%);line-height:1}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.icon-right{color:var(--devui-success, #058358)}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.icon-running{font-size:16px}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.devui-upload-delete-file-button{margin-right:20px}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.devui-uploading-delete{display:none}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.devui-upload-remove{width:16px;height:16px}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag .icon.devui-upload-remove svg path{fill:var(--devui-text, #191919)}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag:hover .devui-upload-progress,.devui-input-group .devui-form-control.devui-files-list .devui-file-tag:hover .icon-right{display:none}.devui-input-group .devui-form-control.devui-files-list .devui-file-tag:hover .devui-upload-remove{display:inline-block}.devui-input-group.disabled .devui-upload-placeholder{color:var(--devui-disabled-text, #c2c2c2)}.devui-input-group .devui-upload-placeholder{max-height:28px;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--devui-placeholder, #808080)}:host ::ng-deep .devui-upload-progress{width:16px;height:16px}.devui-input-group.disabled .devui-form-control,.devui-input-group.disabled .devui-input-group-addon{cursor:not-allowed;background-color:var(--devui-disabled-bg, #f3f3f3);border-color:var(--devui-disabled-line, #e6e6e6);color:var(--devui-disabled-text, #c2c2c2)}svg.svg-icon-dot>path{fill:var(--devui-icon-text, #808080)}.devui-form-control{outline:none}.devui-input-group.disabled .devui-upload-delete-file-button{cursor:not-allowed;pointer-events:none}.devui-loading{color:var(--devui-aide-text, #595959)}.devui-failed-color{color:var(--devui-danger, #e02128)}.devui-upload-tip{height:18px;margin-top:8px;font-size:12px}.devui-upload-tip .icon{margin-right:8px;font-size:16px;vertical-align:middle}.devui-upload-tip .icon-right-o{color:var(--devui-success, #058358)}.devui-upload-tip .devui-upload-failed{color:var(--devui-danger, #e02128)}.devui-upload-tip a{color:var(--devui-link, #0950de);cursor:pointer}.with-button{max-width:calc(100% - 72px)}\n"] }]
}], ctorParameters: () => [{ type: i1.SelectFiles }, { type: i2.I18nService }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i3.SliceUploadService }, { type: i4.DevConfigService }, { type: i5.ToastService }], propDecorators: { uploadOptions: [{
type: Input
}], fileOptions: [{
type: Input
}], autoUpload: [{
type: Input
}], withoutBtn: [{
type: Input
}], showTip: [{
type: Input
}], uploadedFiles: [{
type: Input
}], uploadedFilesRef: [{
type: Input
}], preloadFilesRef: [{
type: Input
}], filePath: [{
type: Input
}], placeholderText: [{
type: Input
}], uploadText: [{
type: Input
}], confirmText: [{
type: Input
}], oneTimeUpload: [{
type: Input
}], disabled: [{
type: Input
}], beforeUpload: [{
type: Input
}], setCustomUploadOptions: [{
type: Input
}], enableDrop: [{
type: Input
}], showGlowStyle: [{
type: Input
}], hasGlowStyle: [{
type: HostBinding,
args: ['class.devui-glow-style']
}], successEvent: [{
type: Output
}], errorEvent: [{
type: Output
}], errorChunkEvent: [{
type: Output
}], deleteUploadedFileEvent: [{
type: Output
}], fileDrop: [{
type: Output
}], fileOver: [{
type: Output
}], fileSelect: [{
type: Output
}], multipleUploadViewComponent: [{
type: ViewChild,
args: ['dMultipleUploadView', { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlwbGUtdXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL3VwbG9hZC9tdWx0aXBsZS11cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvdXBsb2FkL211bHRpcGxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQWlCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxJQUFJLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7OztBQWdCNUQsTUFBTSxPQUFPLHVC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