@cleavelandprice/ngx-lib 4.8.7 → 4.8.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"cleavelandprice-ngx-lib-upload.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/upload/src/model/msg-file-content.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/model/upload-service-options.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/model/upload-service-options-token.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/services/upload.service.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/components/upload-dialog/upload-dialog.component.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/components/upload-dialog/upload-dialog.component.html","../../../../projects/cleavelandprice/ngx-lib/upload/src/components/upload/upload.component.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/upload.module.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/cleavelandprice-ngx-lib-upload.ts"],"sourcesContent":["interface MsgFileContact {\r\n displayName: string;\r\n email: string;\r\n raw: string;\r\n};\r\n\r\nexport interface MsgFileRecipient extends MsgFileContact {\r\n type: string;\r\n};\r\n\r\nexport interface MsgFileContent {\r\n attachments: string[];\r\n bodyHtml: string;\r\n bodyText: string;\r\n creationTime: string;\r\n id: string;\r\n importance: string;\r\n recipients: MsgFileRecipient[]\r\n sender: MsgFileContact;\r\n sentOn: string;\r\n subject: string;\r\n};","import { NgxLibServiceOptions } from \"@cleavelandprice/ngx-lib\";\r\n\r\nexport interface UploadServiceOptions extends NgxLibServiceOptions {\r\n databaseEndpoint?: string;\r\n uploadPath?: string;\r\n comment?: string;\r\n dbAppId?: string;\r\n externalReferenceId?: string;\r\n // UI configuration\r\n uploadDialogTitle?: string;\r\n uploadButtonText?: string;\r\n uploadDialogCancelButtonText?: string;\r\n uploadDialogFinishButtonText?: string;\r\n uploadDialogUploadButtonText?: string;\r\n uploadDialogAddFilesButtonText?: string;\r\n};","import { InjectionToken } from \"@angular/core\";\r\nimport { UploadServiceOptions } from \"./upload-service-options\";\r\n\r\nexport const UploadServiceOptionsToken = new InjectionToken<UploadServiceOptions>('');","import { HttpClient, HttpEventType, HttpHeaders, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { Inject, Injectable, Optional, inject } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nimport { NgxLibServiceBase } from '@cleavelandprice/ngx-lib';\r\nimport { DatabaseFileInfo } from '../model/database-file-info';\r\nimport { FileUploadRequest } from '../model/file-upload-request';\r\nimport { FilesystemFileInfo } from '../model/filesystem-file-info';\r\nimport { MsgFileContent } from '../model/msg-file-content';\r\nimport { UploadServiceOptions } from '../model/upload-service-options';\r\nimport { UploadServiceOptionsToken } from '../model/upload-service-options-token';\r\nimport { UploadStatus } from '../model/upload-status';\r\n\r\n// https://malcoded.com/posts/angular-file-upload-component-with-express\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UploadService extends NgxLibServiceBase {\r\n #http = inject(HttpClient);\r\n\r\n constructor(@Optional() @Inject(UploadServiceOptionsToken) public options: UploadServiceOptions) {\r\n super(options);\r\n \r\n this.options = {\r\n ...options,\r\n databaseEndpoint: options?.databaseEndpoint ?? '/upload/database',\r\n uploadDialogTitle: options?.uploadDialogTitle ?? 'Upload Files',\r\n uploadButtonText: options?.uploadButtonText ?? 'Upload',\r\n uploadDialogCancelButtonText: options?.uploadDialogCancelButtonText ?? 'Cancel',\r\n uploadDialogFinishButtonText: options?.uploadDialogFinishButtonText ?? 'Finish',\r\n uploadDialogUploadButtonText: options?.uploadButtonText ?? 'Upload',\r\n uploadDialogAddFilesButtonText: options?.uploadDialogAddFilesButtonText ?? 'Add Files'\r\n };\r\n }\r\n\r\n upload(files: Set<File>): UploadStatus { // {[key: string]: Observable<number>} {\r\n // this will be the our resulting map\r\n const status: UploadStatus = {};\r\n\r\n files.forEach(file => {\r\n // create a new multipart-form for every file\r\n const formData: FormData = new FormData();\r\n formData.append('file', file, file.name);\r\n\r\n // create a http-post request and pass the form\r\n // tell it to report the upload progress\r\n\r\n // A 'Destination' header is used to optionally configure the file upload destination (filesystem)\r\n // A 'DbAppId' header is used to configure the unique identifier of database uploads\r\n \r\n let headers = new HttpHeaders();\r\n if (this.options.uploadPath) {\r\n headers = headers.set('Destination', this.options.uploadPath);\r\n }\r\n if (this.options.dbAppId) {\r\n headers = headers.set('DbAppId', this.options.dbAppId);\r\n }\r\n if (this.options.externalReferenceId) {\r\n headers = headers.set('ExternalReferenceId', this.options.externalReferenceId);\r\n }\r\n if (this.options.comment) {\r\n headers = headers.set('Comment', this.options.comment);\r\n }\r\n\r\n const req = new HttpRequest('POST', `${this.apiUrl}${this.options.databaseEndpoint}`, formData, {\r\n reportProgress: true,\r\n responseType: 'blob',\r\n headers\r\n });\r\n\r\n // create a new progress-subject for every file\r\n const progress = new Subject<number>();\r\n\r\n // send the http-request and subscribe for progress-updates\r\n this.#http.request(req).subscribe(event => {\r\n if (event.type === HttpEventType.UploadProgress) {\r\n\r\n // calculate the progress percentage\r\n const percentDone = Math.round(100 * event.loaded / (event.total ?? 1));\r\n\r\n // pass the percentage into the progress-stream\r\n progress.next(percentDone);\r\n } else if (event instanceof HttpResponse) {\r\n\r\n // Close the progress-stream if we get an answer form the API\r\n // The upload is complete\r\n progress.complete();\r\n }\r\n });\r\n\r\n // Save every progress-observable in a map of all observables\r\n status[file.name] = {\r\n progress: progress.asObservable()\r\n };\r\n });\r\n\r\n // return the map of progress.observables\r\n return status;\r\n }\r\n\r\n exists(fileName: string): Observable<boolean> {\r\n const query = `${this.apiUrl}${this.options.databaseEndpoint}`.toLowerCase().includes('filesystem') ?\r\n { name: fileName, destination: this.options.uploadPath } :\r\n { name: fileName, dbAppId: this.options.dbAppId };\r\n\r\n return this.#http.post<boolean>(`${this.apiUrl}${this.options.databaseEndpoint}/exists`, query);\r\n }\r\n\r\n download(request: FileUploadRequest): Observable<Blob> {\r\n return this.#http.post(`${this.apiUrl}${this.options.databaseEndpoint}/stream`, request, { responseType: 'blob' });\r\n }\r\n\r\n getMsgContent(request: FileUploadRequest): Observable<MsgFileContent> {\r\n return this.#http.post<MsgFileContent>(`${this.apiUrl}${this.options.databaseEndpoint}/msg`, request);\r\n }\r\n\r\n getUploadInfo(request: FileUploadRequest):\r\n Observable<DatabaseFileInfo | DatabaseFileInfo[] | FilesystemFileInfo | FilesystemFileInfo[]> {\r\n return this.#http.post<DatabaseFileInfo | DatabaseFileInfo[] | FilesystemFileInfo | FilesystemFileInfo[]>\r\n (`${this.apiUrl}${this.options.databaseEndpoint}/info`, request);\r\n }\r\n}","import { AsyncPipe } from '@angular/common';\nimport {\n Component,\n ElementRef,\n inject,\n viewChild,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { MatButton } from '@angular/material/button';\nimport {\n MatDialogActions,\n MatDialogClose,\n MatDialogContent,\n MatDialogRef,\n} from '@angular/material/dialog';\nimport { MatList, MatListItem } from '@angular/material/list';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { Observable, forkJoin } from 'rxjs';\nimport { UploadStatus } from '../../model/upload-status';\nimport { UploadService } from './../../services/upload.service';\n\n@Component({\n templateUrl: './upload-dialog.component.html',\n imports: [\n AsyncPipe,\n MatButton,\n MatDialogActions,\n MatDialogClose,\n MatDialogContent,\n MatList,\n MatListItem,\n MatProgressBar,\n ],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './upload-dialog.component.scss',\n})\nexport class UploadDialogComponent {\n services = {\n dialogRef: inject(MatDialogRef<UploadDialogComponent>),\n upload: inject(UploadService),\n };\n\n file = viewChild.required<ElementRef>('file');\n\n files: Set<File> = new Set();\n existingFileConflict?: string;\n\n // State\n progress?: UploadStatus;\n canBeClosed = true;\n primaryButtonText = this.services.upload.options.uploadDialogUploadButtonText;\n showCancelButton = true;\n uploading = false;\n uploadSuccessful = false;\n\n addFiles() {\n this.file().nativeElement.click();\n }\n\n onFilesAdded() {\n const files: { [key: string]: File } = this.file().nativeElement.files;\n for (const key in files) {\n if (!isNaN(parseInt(key))) {\n // See if the file already exists\n this.services.upload.exists(files[key].name).subscribe((exists) => {\n if (exists) {\n this.existingFileConflict = files[key].name;\n }\n\n if (!exists) {\n this.files.add(files[key]);\n }\n });\n }\n }\n }\n\n closeDialog() {\n // if everything was uploaded already, just close the dialog\n if (this.uploadSuccessful) {\n return this.services.dialogRef.close();\n }\n\n // set the component state to \"uploading\"\n this.uploading = true;\n\n // start the upload and save the progress map\n this.progress = this.services.upload.upload(this.files);\n\n // convert the progress map into an array\n const allProgressObservables$: Observable<number>[] = [];\n\n for (let key in this.progress) {\n allProgressObservables$.push(this.progress[key].progress);\n }\n\n // Adjust the state variables\n\n // The OK-button should have the text \"Finish\" now\n this.primaryButtonText =\n this.services.upload.options.uploadDialogFinishButtonText;\n\n // The dialog should not be closed while uploading\n this.canBeClosed = false;\n this.services.dialogRef.disableClose = true;\n\n // Hide the cancel-button\n this.showCancelButton = false;\n\n // When all progress-observables are completed...\n forkJoin(allProgressObservables$).subscribe({\n complete: () => {\n // ... the dialog can be closed again...\n this.canBeClosed = true;\n this.services.dialogRef.disableClose = false;\n\n // ... the upload was successful...\n this.uploadSuccessful = true;\n\n // ... and the component is no longer uploading\n this.uploading = false;\n\n console.log('Upload complete', this.files);\n\n this.services.dialogRef.close();\n },\n });\n }\n}\n","<input type=\"file\" #file style=\"display: none\" (change)=\"onFilesAdded()\" multiple />\n\n<div mat-dialog-title id=\"title\">\n <div>{{ services.upload.options.uploadDialogTitle }}</div>\n <button [disabled]=\"uploading || uploadSuccessful\" mat-raised-button color=\"primary\" class=\"add-files-btn\" (click)=\"addFiles()\">\n {{ services.upload.options.uploadDialogAddFilesButtonText }}\n </button>\n</div>\n\n@if (existingFileConflict) {\n <div id=\"conflict\">\n {{ existingFileConflict }} already exists on the server and cannot be overwritten\n </div>\n}\n\n<mat-dialog-content>\n <mat-list>\n @for (file of files; track file) {\n <mat-list-item>\n <h4 mat-line>{{file.name}}</h4>\n @if (progress) {\n <mat-progress-bar mode=\"determinate\" [value]=\"progress[file.name].progress | async\"/>\n }\n </mat-list-item>\n }\n </mat-list>\n</mat-dialog-content>\n\n<mat-dialog-actions id=\"actions\">\n @if (showCancelButton) {\n <button mat-button mat-dialog-close>{{ services.upload.options.uploadDialogCancelButtonText }}</button>\n }\n @if (files.size > 0) {\n <button mat-raised-button color=\"primary\" [disabled]=\"!canBeClosed\" (click)=\"closeDialog()\">{{ primaryButtonText }}</button>\n }\n</mat-dialog-actions>\n","import {\n Component,\n inject,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\n\nimport { MatButton } from '@angular/material/button';\nimport { UploadService } from './../../services/upload.service';\nimport { UploadDialogComponent } from './../upload-dialog/upload-dialog.component';\n\n@Component({\n selector: 'cp-upload',\n imports: [MatButton],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager,\n template:\n '<button mat-raised-button (click)=\"openUploadDialog()\">{{ uploadService.options.uploadButtonText }}</button>',\n})\nexport class UploadComponent {\n #dialogService = inject(MatDialog);\n uploadService = inject(UploadService);\n\n dialogClosed = output();\n\n openUploadDialog() {\n this.#dialogService\n .open(UploadDialogComponent, { width: '50%' })\n .afterClosed()\n .subscribe(() => this.dialogClosed.emit());\n }\n}\n","import { CommonModule } from '@angular/common';\r\nimport { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\n\r\nimport { UploadDialogComponent } from './components/upload-dialog/upload-dialog.component';\r\nimport { UploadComponent } from './components/upload/upload.component';\r\nimport { UploadServiceOptions } from './model/upload-service-options';\r\nimport { UploadServiceOptionsToken } from './model/upload-service-options-token';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n MatListModule,\r\n MatProgressBarModule,\r\n\r\n UploadComponent,\r\n UploadDialogComponent\r\n ],\r\n exports: [\r\n UploadComponent,\r\n UploadDialogComponent\r\n ]\r\n})\r\nexport class UploadModule {\r\n static forRoot(options: UploadServiceOptions): ModuleWithProviders<UploadModule> {\r\n return {\r\n ngModule: UploadModule,\r\n providers: [\r\n {\r\n provide: UploadServiceOptionsToken,\r\n useValue: options\r\n }\r\n ]\r\n }\r\n }\r\n\r\n constructor(@Optional() @SkipSelf() parentModule: UploadModule) {\r\n if (parentModule) {\r\n throw new Error(\r\n 'UploadModule is already loaded. Import it in the AppModule only');\r\n }\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './upload.api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cleavelandprice-ngx-lib-upload.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/upload/src/model/msg-file-content.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/model/upload-service-options.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/model/upload-service-options-token.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/services/upload.service.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/components/upload-dialog/upload-dialog.component.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/components/upload-dialog/upload-dialog.component.html","../../../../projects/cleavelandprice/ngx-lib/upload/src/components/upload/upload.component.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/upload.module.ts","../../../../projects/cleavelandprice/ngx-lib/upload/src/cleavelandprice-ngx-lib-upload.ts"],"sourcesContent":["interface MsgFileContact {\r\n displayName: string;\r\n email: string;\r\n raw: string;\r\n};\r\n\r\nexport interface MsgFileRecipient extends MsgFileContact {\r\n type: string;\r\n};\r\n\r\nexport interface MsgFileContent {\r\n attachments: string[];\r\n bodyHtml: string;\r\n bodyText: string;\r\n creationTime: string;\r\n id: string;\r\n importance: string;\r\n recipients: MsgFileRecipient[]\r\n sender: MsgFileContact;\r\n sentOn: string;\r\n subject: string;\r\n};","import { NgxLibServiceOptions } from \"@cleavelandprice/ngx-lib\";\r\n\r\nexport interface UploadServiceOptions extends NgxLibServiceOptions {\r\n databaseEndpoint?: string;\r\n uploadPath?: string;\r\n comment?: string;\r\n dbAppId?: string;\r\n externalReferenceId?: string;\r\n // UI configuration\r\n uploadDialogTitle?: string;\r\n uploadButtonText?: string;\r\n uploadDialogCancelButtonText?: string;\r\n uploadDialogFinishButtonText?: string;\r\n uploadDialogUploadButtonText?: string;\r\n uploadDialogAddFilesButtonText?: string;\r\n};","import { InjectionToken } from \"@angular/core\";\r\nimport { UploadServiceOptions } from \"./upload-service-options\";\r\n\r\nexport const UploadServiceOptionsToken = new InjectionToken<UploadServiceOptions>('');","import { HttpClient, HttpEventType, HttpHeaders, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { Inject, Injectable, Optional, inject } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nimport { NgxLibServiceBase } from '@cleavelandprice/ngx-lib';\r\nimport { DatabaseFileInfo } from '../model/database-file-info';\r\nimport { FileUploadRequest } from '../model/file-upload-request';\r\nimport { FilesystemFileInfo } from '../model/filesystem-file-info';\r\nimport { MsgFileContent } from '../model/msg-file-content';\r\nimport { UploadServiceOptions } from '../model/upload-service-options';\r\nimport { UploadServiceOptionsToken } from '../model/upload-service-options-token';\r\nimport { UploadStatus } from '../model/upload-status';\r\n\r\n// https://malcoded.com/posts/angular-file-upload-component-with-express\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UploadService extends NgxLibServiceBase {\r\n #http = inject(HttpClient);\r\n\r\n constructor(@Optional() @Inject(UploadServiceOptionsToken) public options: UploadServiceOptions) {\r\n super(options);\r\n \r\n this.options = {\r\n ...options,\r\n databaseEndpoint: options?.databaseEndpoint ?? '/upload/database',\r\n uploadDialogTitle: options?.uploadDialogTitle ?? 'Upload Files',\r\n uploadButtonText: options?.uploadButtonText ?? 'Upload',\r\n uploadDialogCancelButtonText: options?.uploadDialogCancelButtonText ?? 'Cancel',\r\n uploadDialogFinishButtonText: options?.uploadDialogFinishButtonText ?? 'Finish',\r\n uploadDialogUploadButtonText: options?.uploadButtonText ?? 'Upload',\r\n uploadDialogAddFilesButtonText: options?.uploadDialogAddFilesButtonText ?? 'Add Files'\r\n };\r\n }\r\n\r\n upload(files: File[]): UploadStatus { // {[key: string]: Observable<number>} {\r\n // this will be the our resulting map\r\n const status: UploadStatus = {};\r\n\r\n files.forEach(file => {\r\n // create a new multipart-form for every file\r\n const formData: FormData = new FormData();\r\n formData.append('file', file, file.name);\r\n\r\n // create a http-post request and pass the form\r\n // tell it to report the upload progress\r\n\r\n // A 'Destination' header is used to optionally configure the file upload destination (filesystem)\r\n // A 'DbAppId' header is used to configure the unique identifier of database uploads\r\n \r\n let headers = new HttpHeaders();\r\n if (this.options.uploadPath) {\r\n headers = headers.set('Destination', this.options.uploadPath);\r\n }\r\n if (this.options.dbAppId) {\r\n headers = headers.set('DbAppId', this.options.dbAppId);\r\n }\r\n if (this.options.externalReferenceId) {\r\n headers = headers.set('ExternalReferenceId', this.options.externalReferenceId);\r\n }\r\n if (this.options.comment) {\r\n headers = headers.set('Comment', this.options.comment);\r\n }\r\n\r\n const req = new HttpRequest('POST', `${this.apiUrl}${this.options.databaseEndpoint}`, formData, {\r\n reportProgress: true,\r\n responseType: 'blob',\r\n headers\r\n });\r\n\r\n // create a new progress-subject for every file\r\n const progress = new Subject<number>();\r\n\r\n // send the http-request and subscribe for progress-updates\r\n this.#http.request(req).subscribe(event => {\r\n if (event.type === HttpEventType.UploadProgress) {\r\n\r\n // calculate the progress percentage\r\n const percentDone = Math.round(100 * event.loaded / (event.total ?? 1));\r\n\r\n // pass the percentage into the progress-stream\r\n progress.next(percentDone);\r\n } else if (event instanceof HttpResponse) {\r\n\r\n // Close the progress-stream if we get an answer form the API\r\n // The upload is complete\r\n progress.complete();\r\n }\r\n });\r\n\r\n // Save every progress-observable in a map of all observables\r\n status[file.name] = {\r\n progress: progress.asObservable()\r\n };\r\n });\r\n\r\n // return the map of progress.observables\r\n return status;\r\n }\r\n\r\n exists(fileName: string): Observable<boolean> {\r\n const query = `${this.apiUrl}${this.options.databaseEndpoint}`.toLowerCase().includes('filesystem') ?\r\n { name: fileName, destination: this.options.uploadPath } :\r\n { name: fileName, dbAppId: this.options.dbAppId };\r\n\r\n return this.#http.post<boolean>(`${this.apiUrl}${this.options.databaseEndpoint}/exists`, query);\r\n }\r\n\r\n download(request: FileUploadRequest): Observable<Blob> {\r\n return this.#http.post(`${this.apiUrl}${this.options.databaseEndpoint}/stream`, request, { responseType: 'blob' });\r\n }\r\n\r\n getMsgContent(request: FileUploadRequest): Observable<MsgFileContent> {\r\n return this.#http.post<MsgFileContent>(`${this.apiUrl}${this.options.databaseEndpoint}/msg`, request);\r\n }\r\n\r\n getUploadInfo(request: FileUploadRequest):\r\n Observable<DatabaseFileInfo | DatabaseFileInfo[] | FilesystemFileInfo | FilesystemFileInfo[]> {\r\n return this.#http.post<DatabaseFileInfo | DatabaseFileInfo[] | FilesystemFileInfo | FilesystemFileInfo[]>\r\n (`${this.apiUrl}${this.options.databaseEndpoint}/info`, request);\r\n }\r\n}","import { AsyncPipe } from '@angular/common';\nimport {\n Component,\n ElementRef,\n inject,\n viewChild,\n ChangeDetectionStrategy,\n signal,\n} from '@angular/core';\nimport { MatButton } from '@angular/material/button';\nimport { MatDialogRef, MatDialogModule } from '@angular/material/dialog';\nimport { MatList, MatListItem } from '@angular/material/list';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { Observable, forkJoin } from 'rxjs';\nimport { UploadStatus } from '../../model/upload-status';\nimport { UploadService } from './../../services/upload.service';\n\n@Component({\n templateUrl: './upload-dialog.component.html',\n imports: [\n AsyncPipe,\n MatButton,\n MatDialogModule,\n MatList,\n MatListItem,\n MatProgressBar\n ],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './upload-dialog.component.scss',\n})\nexport class UploadDialogComponent {\n services = {\n dialogRef: inject(MatDialogRef<UploadDialogComponent>),\n upload: inject(UploadService),\n };\n\n file = viewChild.required<ElementRef>('file');\n\n files = signal<File[]>([]);\n existingFileConflict?: string;\n\n // State\n progress?: UploadStatus;\n canBeClosed = true;\n primaryButtonText = this.services.upload.options.uploadDialogUploadButtonText;\n showCancelButton = true;\n uploading = false;\n uploadSuccessful = false;\n\n addFiles() {\n this.file().nativeElement.click();\n }\n\n onFilesAdded() {\n const files: { [key: string]: File } = this.file().nativeElement.files;\n for (const key in files) {\n if (!isNaN(parseInt(key))) {\n // See if the file already exists\n this.services.upload.exists(files[key].name).subscribe((exists) => {\n if (exists) {\n this.existingFileConflict = files[key].name;\n }\n\n if (!exists) {\n this.files.set([...this.files(), files[key]]);\n }\n });\n }\n }\n }\n\n closeDialog() {\n // if everything was uploaded already, just close the dialog\n if (this.uploadSuccessful) {\n return this.services.dialogRef.close();\n }\n\n // set the component state to \"uploading\"\n this.uploading = true;\n\n // start the upload and save the progress map\n this.progress = this.services.upload.upload(this.files());\n\n // convert the progress map into an array\n const allProgressObservables$: Observable<number>[] = [];\n\n for (let key in this.progress) {\n allProgressObservables$.push(this.progress[key].progress);\n }\n\n // Adjust the state variables\n\n // The OK-button should have the text \"Finish\" now\n this.primaryButtonText =\n this.services.upload.options.uploadDialogFinishButtonText;\n\n // The dialog should not be closed while uploading\n this.canBeClosed = false;\n this.services.dialogRef.disableClose = true;\n\n // Hide the cancel-button\n this.showCancelButton = false;\n\n // When all progress-observables are completed...\n forkJoin(allProgressObservables$).subscribe({\n complete: () => {\n // ... the dialog can be closed again...\n this.canBeClosed = true;\n this.services.dialogRef.disableClose = false;\n\n // ... the upload was successful...\n this.uploadSuccessful = true;\n\n // ... and the component is no longer uploading\n this.uploading = false;\n\n console.log('Upload complete', this.files());\n\n this.services.dialogRef.close();\n },\n });\n }\n}\n","<h2 mat-dialog-title>\n <div id=\"title\">\n <div>{{ services.upload.options.uploadDialogTitle }}</div>\n <button [disabled]=\"uploading || uploadSuccessful\" mat-raised-button color=\"primary\" class=\"add-files-btn\" (click)=\"addFiles()\">\n {{ services.upload.options.uploadDialogAddFilesButtonText }}\n </button>\n </div>\n</h2>\n\n@if (existingFileConflict) {\n <div id=\"conflict\">\n {{ existingFileConflict }} already exists on the server and cannot be overwritten\n </div>\n}\n\n<mat-dialog-content>\n <input type=\"file\" #file style=\"display: none\" (change)=\"onFilesAdded()\" multiple />\n\n <mat-list>\n @for (file of files(); track file) {\n <mat-list-item>\n <h4 mat-line>{{file.name}}</h4>\n @if (progress) {\n <mat-progress-bar mode=\"determinate\" [value]=\"progress[file.name].progress | async\"/>\n }\n </mat-list-item>\n }\n </mat-list>\n</mat-dialog-content>\n\n<mat-dialog-actions id=\"actions\" align=\"end\">\n @if (showCancelButton) {\n <button mat-button mat-dialog-close>{{ services.upload.options.uploadDialogCancelButtonText }}</button>\n }\n @if (files().length > 0) {\n <button mat-raised-button color=\"primary\" [disabled]=\"!canBeClosed\" (click)=\"closeDialog()\">{{ primaryButtonText }}</button>\n }\n</mat-dialog-actions>","import {\n Component,\n inject,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\n\nimport { MatButton } from '@angular/material/button';\nimport { UploadService } from './../../services/upload.service';\nimport { UploadDialogComponent } from './../upload-dialog/upload-dialog.component';\n\n@Component({\n selector: 'cp-upload',\n imports: [MatButton],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager,\n template:\n '<button mat-raised-button (click)=\"openUploadDialog()\">{{ uploadService.options.uploadButtonText }}</button>',\n})\nexport class UploadComponent {\n #dialogService = inject(MatDialog);\n uploadService = inject(UploadService);\n\n dialogClosed = output();\n\n openUploadDialog() {\n this.#dialogService\n .open(UploadDialogComponent, { width: '50%' })\n .afterClosed()\n .subscribe(() => this.dialogClosed.emit());\n }\n}\n","import { CommonModule } from '@angular/common';\r\nimport { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\n\r\nimport { UploadDialogComponent } from './components/upload-dialog/upload-dialog.component';\r\nimport { UploadComponent } from './components/upload/upload.component';\r\nimport { UploadServiceOptions } from './model/upload-service-options';\r\nimport { UploadServiceOptionsToken } from './model/upload-service-options-token';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n MatListModule,\r\n MatProgressBarModule,\r\n\r\n UploadComponent,\r\n UploadDialogComponent\r\n ],\r\n exports: [\r\n UploadComponent,\r\n UploadDialogComponent\r\n ]\r\n})\r\nexport class UploadModule {\r\n static forRoot(options: UploadServiceOptions): ModuleWithProviders<UploadModule> {\r\n return {\r\n ngModule: UploadModule,\r\n providers: [\r\n {\r\n provide: UploadServiceOptionsToken,\r\n useValue: options\r\n }\r\n ]\r\n }\r\n }\r\n\r\n constructor(@Optional() @SkipSelf() parentModule: UploadModule) {\r\n if (parentModule) {\r\n throw new Error(\r\n 'UploadModule is already loaded. Import it in the AppModule only');\r\n }\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './upload.api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "comment": "NGX-LIB primary entry point package.json",
3
3
  "name": "@cleavelandprice/ngx-lib",
4
- "version": "4.8.7",
4
+ "version": "4.8.9",
5
5
  "description": "Angular library providing foundational functionality to Cleaveland-Price applications",
6
6
  "peerDependencies": {
7
7
  "@angular/common": "^22.1.1",
@@ -84,7 +84,7 @@ declare class UploadService extends NgxLibServiceBase {
84
84
  #private;
85
85
  options: UploadServiceOptions;
86
86
  constructor(options: UploadServiceOptions);
87
- upload(files: Set<File>): UploadStatus;
87
+ upload(files: File[]): UploadStatus;
88
88
  exists(fileName: string): Observable<boolean>;
89
89
  download(request: FileUploadRequest): Observable<Blob>;
90
90
  getMsgContent(request: FileUploadRequest): Observable<MsgFileContent>;
@@ -99,7 +99,7 @@ declare class UploadDialogComponent {
99
99
  upload: UploadService;
100
100
  };
101
101
  file: i0.Signal<ElementRef<any>>;
102
- files: Set<File>;
102
+ files: i0.WritableSignal<File[]>;
103
103
  existingFileConflict?: string;
104
104
  progress?: UploadStatus;
105
105
  canBeClosed: boolean;