UNPKG

33.9 kBSource Map (JSON)View Raw
1{"version":3,"file":"ngx-uploader.js","sources":["../../projects/ngx-uploader/src/lib/interfaces.ts","../../projects/ngx-uploader/src/lib/ngx-uploader.class.ts","../../projects/ngx-uploader/src/lib/ng-file-drop.directive.ts","../../projects/ngx-uploader/src/lib/ng-file-select.directive.ts","../../projects/ngx-uploader/src/lib/ngx-uploader.module.ts","../../../projects/ngx-uploader/src/public_api.ts","../../../projects/ngx-uploader/src/ngx-uploader.ts"],"sourcesContent":["import { Subscription } from 'rxjs';\n\nexport interface UploaderOptions {\n concurrency: number;\n allowedContentTypes?: string[];\n maxUploads?: number;\n maxFileSize?: number;\n}\n\nexport interface BlobFile extends Blob {\n name: string;\n}\n\nexport enum UploadStatus {\n Queue,\n Uploading,\n Done,\n Cancelled\n}\n\nexport interface UploadProgress {\n status: UploadStatus;\n data?: {\n percentage: number;\n speed: number;\n speedHuman: string;\n startTime: number | null;\n endTime: number | null;\n eta: number | null;\n etaHuman: string | null;\n };\n}\n\nexport interface UploadFile {\n id: string;\n fileIndex: number;\n lastModifiedDate: Date;\n name: string;\n size: number;\n type: string;\n form: FormData;\n progress: UploadProgress;\n response?: any;\n responseStatus?: number;\n sub?: Subscription | any;\n nativeFile?: File;\n responseHeaders?: { [key: string]: string };\n}\n\nexport interface UploadOutput {\n type: 'addedToQueue' | 'allAddedToQueue' | 'uploading' | 'done' | 'start' | 'cancelled' | 'dragOver'\n | 'dragOut' | 'drop' | 'removed' | 'removedAll' | 'rejected';\n file?: UploadFile;\n nativeFile?: File;\n}\n\nexport interface UploadInput {\n type: 'uploadAll' | 'uploadFile' | 'cancel' | 'cancelAll' | 'remove' | 'removeAll';\n url?: string;\n method?: string;\n id?: string;\n fieldName?: string;\n fileIndex?: number;\n file?: UploadFile;\n data?: { [key: string]: string | Blob };\n headers?: { [key: string]: string };\n includeWebKitFormBoundary?: boolean; // If false, only the file is send trough xhr.send (WebKitFormBoundary is omit)\n withCredentials?: boolean;\n}\n","import { EventEmitter } from '@angular/core';\nimport { Observable, Subject, Subscription } from 'rxjs';\nimport { mergeMap, finalize } from 'rxjs/operators';\nimport { UploadFile, UploadOutput, UploadInput, UploadStatus, BlobFile } from './interfaces';\n\nexport function humanizeBytes(bytes: number): string {\n if (bytes === 0) {\n return '0 Byte';\n }\n\n const k = 1024;\n const sizes: string[] = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const i: number = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport class NgUploaderService {\n queue: UploadFile[];\n serviceEvents: EventEmitter<UploadOutput>;\n uploadScheduler: Subject<{ file: UploadFile; event: UploadInput }>;\n subs: { id: string; sub: Subscription }[];\n contentTypes: string[];\n maxUploads: number;\n maxFileSize: number;\n\n constructor(\n concurrency: number = Number.POSITIVE_INFINITY,\n contentTypes: string[] = ['*'],\n maxUploads: number = Number.POSITIVE_INFINITY,\n maxFileSize: number = Number.POSITIVE_INFINITY\n ) {\n this.queue = [];\n this.serviceEvents = new EventEmitter<UploadOutput>();\n this.uploadScheduler = new Subject();\n this.subs = [];\n this.contentTypes = contentTypes;\n this.maxUploads = maxUploads;\n this.maxFileSize = maxFileSize;\n\n this.uploadScheduler\n .pipe(mergeMap(upload => this.startUpload(upload), concurrency))\n .subscribe(uploadOutput => this.serviceEvents.emit(uploadOutput));\n }\n\n handleFiles(incomingFiles: FileList): void {\n const allowedIncomingFiles: File[] = [].reduce.call(\n incomingFiles,\n (acc: File[], checkFile: File, i: number) => {\n const futureQueueLength = acc.length + this.queue.length + 1;\n if (\n this.isContentTypeAllowed(checkFile.type) &&\n futureQueueLength <= this.maxUploads &&\n this.isFileSizeAllowed(checkFile.size)\n ) {\n acc = acc.concat(checkFile);\n } else {\n const rejectedFile: UploadFile = this.makeUploadFile(checkFile, i);\n this.serviceEvents.emit({ type: 'rejected', file: rejectedFile });\n }\n\n return acc;\n },\n []\n );\n\n this.queue.push(\n ...[].map.call(allowedIncomingFiles, (file: File, i: number) => {\n const uploadFile: UploadFile = this.makeUploadFile(file, i);\n this.serviceEvents.emit({ type: 'addedToQueue', file: uploadFile });\n return uploadFile;\n })\n );\n\n this.serviceEvents.emit({ type: 'allAddedToQueue' });\n }\n\n initInputEvents(input: EventEmitter<UploadInput>): Subscription {\n return input.subscribe((event: UploadInput) => {\n switch (event.type) {\n case 'uploadFile':\n const uploadFileIndex = this.queue.findIndex(file => file === event.file);\n if (uploadFileIndex !== -1 && event.file) {\n this.uploadScheduler.next({ file: this.queue[uploadFileIndex], event: event });\n }\n break;\n case 'uploadAll':\n const files = this.queue.filter(file => file.progress.status === UploadStatus.Queue);\n files.forEach(file => this.uploadScheduler.next({ file: file, event: event }));\n break;\n case 'cancel':\n const id = event.id || null;\n if (!id) {\n return;\n }\n const subs = this.subs.filter(sub => sub.id === id);\n subs.forEach(sub => {\n if (sub.sub) {\n sub.sub.unsubscribe();\n const fileIndex = this.queue.findIndex(file => file.id === id);\n if (fileIndex !== -1) {\n this.queue[fileIndex].progress.status = UploadStatus.Cancelled;\n this.serviceEvents.emit({ type: 'cancelled', file: this.queue[fileIndex] });\n }\n }\n });\n break;\n case 'cancelAll':\n this.subs.forEach(sub => {\n if (sub.sub) {\n sub.sub.unsubscribe();\n }\n\n const file = this.queue.find(uploadFile => uploadFile.id === sub.id);\n if (file) {\n file.progress.status = UploadStatus.Cancelled;\n this.serviceEvents.emit({ type: 'cancelled', file: file });\n }\n });\n break;\n case 'remove':\n if (!event.id) {\n return;\n }\n\n const i = this.queue.findIndex(file => file.id === event.id);\n if (i !== -1) {\n const file = this.queue[i];\n this.queue.splice(i, 1);\n this.serviceEvents.emit({ type: 'removed', file: file });\n }\n break;\n case 'removeAll':\n if (this.queue.length) {\n this.queue = [];\n this.serviceEvents.emit({ type: 'removedAll' });\n }\n break;\n }\n });\n }\n\n startUpload(upload: { file: UploadFile; event: UploadInput }): Observable<UploadOutput> {\n return new Observable(observer => {\n const sub = this.uploadFile(upload.file, upload.event)\n .pipe(\n finalize(() => {\n if (!observer.closed) {\n observer.complete();\n }\n })\n )\n .subscribe(\n output => {\n observer.next(output);\n },\n err => {\n observer.error(err);\n observer.complete();\n },\n () => {\n observer.complete();\n }\n );\n\n this.subs.push({ id: upload.file.id, sub: sub });\n });\n }\n\n uploadFile(file: UploadFile, event: UploadInput): Observable<UploadOutput> {\n return new Observable(observer => {\n const url = event.url || '';\n const method = event.method || 'POST';\n const data = event.data || {};\n const headers = event.headers || {};\n\n const xhr = new XMLHttpRequest();\n const time: number = new Date().getTime();\n let progressStartTime: number = (file.progress.data && file.progress.data.startTime) || time;\n let speed = 0;\n let eta: number | null = null;\n\n xhr.upload.addEventListener(\n 'progress',\n (e: ProgressEvent) => {\n if (e.lengthComputable) {\n const percentage = Math.round((e.loaded * 100) / e.total);\n const diff = new Date().getTime() - time;\n speed = Math.round((e.loaded / diff) * 1000);\n progressStartTime = (file.progress.data && file.progress.data.startTime) || new Date().getTime();\n eta = Math.ceil((e.total - e.loaded) / speed);\n\n file.progress = {\n status: UploadStatus.Uploading,\n data: {\n percentage: percentage,\n speed: speed,\n speedHuman: `${humanizeBytes(speed)}/s`,\n startTime: progressStartTime,\n endTime: null,\n eta: eta,\n etaHuman: this.secondsToHuman(eta)\n }\n };\n\n observer.next({ type: 'uploading', file: file });\n }\n },\n false\n );\n\n xhr.upload.addEventListener('error', (e: Event) => {\n observer.error(e);\n observer.complete();\n });\n\n xhr.onreadystatechange = () => {\n if (xhr.readyState === XMLHttpRequest.DONE) {\n const speedAverage = Math.round((file.size / (new Date().getTime() - progressStartTime)) * 1000);\n file.progress = {\n status: UploadStatus.Done,\n data: {\n percentage: 100,\n speed: speedAverage,\n speedHuman: `${humanizeBytes(speedAverage)}/s`,\n startTime: progressStartTime,\n endTime: new Date().getTime(),\n eta: eta,\n etaHuman: this.secondsToHuman(eta || 0)\n }\n };\n\n file.responseStatus = xhr.status;\n\n try {\n file.response = JSON.parse(xhr.response);\n } catch (e) {\n file.response = xhr.response;\n }\n\n file.responseHeaders = this.parseResponseHeaders(xhr.getAllResponseHeaders());\n\n observer.next({ type: 'done', file: file });\n\n observer.complete();\n }\n };\n\n xhr.open(method, url, true);\n xhr.withCredentials = event.withCredentials ? true : false;\n\n try {\n const uploadFile = <BlobFile>file.nativeFile;\n const uploadIndex = this.queue.findIndex(outFile => outFile.nativeFile === uploadFile);\n\n if (this.queue[uploadIndex].progress.status === UploadStatus.Cancelled) {\n observer.complete();\n }\n\n Object.keys(headers).forEach(key => xhr.setRequestHeader(key, headers[key]));\n\n let bodyToSend: FormData | BlobFile;\n\n if (event.includeWebKitFormBoundary !== false) {\n Object.keys(data).forEach(key => file.form.append(key, data[key]));\n file.form.append(event.fieldName || 'file', uploadFile, uploadFile.name);\n bodyToSend = file.form;\n } else {\n bodyToSend = uploadFile;\n }\n\n this.serviceEvents.emit({ type: 'start', file: file });\n xhr.send(bodyToSend);\n } catch (e) {\n observer.complete();\n }\n\n return () => {\n xhr.abort();\n };\n });\n }\n\n secondsToHuman(sec: number): string {\n return new Date(sec * 1000).toISOString().substr(11, 8);\n }\n\n generateId(): string {\n return Math.random().toString(36).substring(7);\n }\n\n setContentTypes(contentTypes: string[]): void {\n if (typeof contentTypes !== 'undefined' && contentTypes instanceof Array) {\n if (contentTypes.find((type: string) => type === '*') !== undefined) {\n this.contentTypes = ['*'];\n } else {\n this.contentTypes = contentTypes;\n }\n return;\n }\n this.contentTypes = ['*'];\n }\n\n allContentTypesAllowed(): boolean {\n return this.contentTypes.find((type: string) => type === '*') !== undefined;\n }\n\n isContentTypeAllowed(mimetype: string): boolean {\n if (this.allContentTypesAllowed()) {\n return true;\n }\n return this.contentTypes.find((type: string) => type === mimetype) !== undefined;\n }\n\n isFileSizeAllowed(fileSize: number): boolean {\n if (!this.maxFileSize) {\n return true;\n }\n return fileSize <= this.maxFileSize;\n }\n\n makeUploadFile(file: File, index: number): UploadFile {\n return {\n fileIndex: index,\n id: this.generateId(),\n name: file.name,\n size: file.size,\n type: file.type,\n form: new FormData(),\n progress: {\n status: UploadStatus.Queue,\n data: {\n percentage: 0,\n speed: 0,\n speedHuman: `${humanizeBytes(0)}/s`,\n startTime: null,\n endTime: null,\n eta: null,\n etaHuman: null\n }\n },\n lastModifiedDate: new Date(file.lastModified),\n sub: undefined,\n nativeFile: file\n };\n }\n\n private parseResponseHeaders(httpHeaders: string): { [key: string]: string } {\n if (!httpHeaders) {\n return;\n }\n\n return httpHeaders\n .split('\\n')\n .map((x: string) => x.split(/: */, 2))\n .filter((x: string[]) => x[0])\n .reduce((acc: { [key: string]: string }, x: string[]) => {\n acc[x[0]] = x[1];\n return acc;\n }, {});\n }\n}\n","import { Directive, ElementRef, EventEmitter, Input, Output, OnInit, OnDestroy, HostListener } from '@angular/core';\nimport { UploadOutput, UploadInput, UploaderOptions } from './interfaces';\nimport { NgUploaderService } from './ngx-uploader.class';\nimport { Subscription } from 'rxjs';\n\n@Directive({\n selector: '[ngFileDrop]'\n})\nexport class NgFileDropDirective implements OnInit, OnDestroy {\n @Input() options: UploaderOptions;\n @Input() uploadInput: EventEmitter<UploadInput>;\n @Output() uploadOutput: EventEmitter<UploadOutput>;\n\n upload: NgUploaderService;\n el: HTMLInputElement;\n\n _sub: Subscription[];\n\n constructor(public elementRef: ElementRef) {\n this.uploadOutput = new EventEmitter<UploadOutput>();\n }\n\n ngOnInit() {\n this._sub = [];\n const concurrency = this.options && this.options.concurrency || Number.POSITIVE_INFINITY;\n const allowedContentTypes = this.options && this.options.allowedContentTypes || ['*'];\n const maxUploads = this.options && this.options.maxUploads || Number.POSITIVE_INFINITY;\n const maxFileSize = this.options && this.options.maxFileSize || Number.POSITIVE_INFINITY;\n this.upload = new NgUploaderService(concurrency, allowedContentTypes, maxUploads, maxFileSize);\n\n this.el = this.elementRef.nativeElement;\n\n this._sub.push(\n this.upload.serviceEvents.subscribe((event: UploadOutput) => {\n this.uploadOutput.emit(event);\n })\n );\n\n if (this.uploadInput instanceof EventEmitter) {\n this._sub.push(this.upload.initInputEvents(this.uploadInput));\n }\n\n this.el.addEventListener('drop', this.stopEvent, false);\n this.el.addEventListener('dragenter', this.stopEvent, false);\n this.el.addEventListener('dragover', this.stopEvent, false);\n }\n\n ngOnDestroy() {\n this._sub.forEach(sub => sub.unsubscribe());\n }\n\n stopEvent = (e: Event) => {\n e.stopPropagation();\n e.preventDefault();\n }\n\n @HostListener('drop', ['$event'])\n public onDrop(e: any) {\n e.stopPropagation();\n e.preventDefault();\n\n const event: UploadOutput = { type: 'drop' };\n this.uploadOutput.emit(event);\n this.upload.handleFiles(e.dataTransfer.files);\n }\n\n @HostListener('dragover', ['$event'])\n public onDragOver(e: Event) {\n if (!e) {\n return;\n }\n\n const event: UploadOutput = { type: 'dragOver' };\n this.uploadOutput.emit(event);\n }\n\n @HostListener('dragleave', ['$event'])\n public onDragLeave(e: Event) {\n if (!e) {\n return;\n }\n\n const event: UploadOutput = { type: 'dragOut' };\n this.uploadOutput.emit(event);\n }\n}\n","import { Directive, ElementRef, EventEmitter, Input, Output, OnInit, OnDestroy } from '@angular/core';\nimport { UploadOutput, UploaderOptions } from './interfaces';\nimport { NgUploaderService } from './ngx-uploader.class';\nimport { Subscription } from 'rxjs';\n\n@Directive({\n selector: '[ngFileSelect]'\n})\nexport class NgFileSelectDirective implements OnInit, OnDestroy {\n @Input() options: UploaderOptions;\n @Input() uploadInput: EventEmitter<any>;\n @Output() uploadOutput: EventEmitter<UploadOutput>;\n\n upload: NgUploaderService;\n el: HTMLInputElement;\n\n _sub: Subscription[];\n\n constructor(public elementRef: ElementRef) {\n this.uploadOutput = new EventEmitter<UploadOutput>();\n }\n\n ngOnInit() {\n this._sub = [];\n const concurrency = this.options && this.options.concurrency || Number.POSITIVE_INFINITY;\n const allowedContentTypes = this.options && this.options.allowedContentTypes || ['*'];\n const maxUploads = this.options && this.options.maxUploads || Number.POSITIVE_INFINITY;\n const maxFileSize = this.options && this.options.maxFileSize || Number.POSITIVE_INFINITY;\n this.upload = new NgUploaderService(concurrency, allowedContentTypes, maxUploads, maxFileSize);\n\n this.el = this.elementRef.nativeElement;\n this.el.addEventListener('change', this.fileListener, false);\n\n this._sub.push(\n this.upload.serviceEvents.subscribe((event: UploadOutput) => {\n this.uploadOutput.emit(event);\n })\n );\n\n if (this.uploadInput instanceof EventEmitter) {\n this._sub.push(this.upload.initInputEvents(this.uploadInput));\n }\n }\n\n ngOnDestroy() {\n if (this.el){\n this.el.removeEventListener('change', this.fileListener, false);\n this._sub.forEach(sub => sub.unsubscribe());\n }\n }\n\n fileListener = () => {\n if (this.el.files) {\n this.upload.handleFiles(this.el.files);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { NgFileDropDirective } from './ng-file-drop.directive';\nimport { NgFileSelectDirective } from './ng-file-select.directive';\n\n@NgModule({\n declarations: [NgFileDropDirective, NgFileSelectDirective],\n exports: [NgFileDropDirective, NgFileSelectDirective]\n})\nexport class NgxUploaderModule { }\n","/*\n * Public API Surface of ngx-uploader\n */\n\nexport * from './lib/interfaces';\nexport * from './lib/ng-file-drop.directive';\nexport * from './lib/ng-file-select.directive';\nexport * from './lib/ngx-uploader.class';\nexport * from './lib/ngx-uploader.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
\No newline at end of file