UNPKG

ng-devui

Version:

DevUI components based on Angular

359 lines 81.9 kB
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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