From 08719af53cfbb18bc5cb7cb551a7bfb3d850695d Mon Sep 17 00:00:00 2001 From: Timo Date: Tue, 19 Jan 2021 21:06:22 +0200 Subject: [PATCH] Added preview download and download options --- apps/red-ui/src/app/app.module.ts | 2 + .../file-actions/file-actions.component.html | 14 +- .../file-actions/file-actions.component.ts | 12 +- .../file-download-btn.component.html | 19 +++ .../file-download-btn.component.scss | 0 .../file-download-btn.component.ts | 86 ++++++++++++ .../report-download-btn.component.html | 2 +- .../report-download-btn.component.ts | 2 +- .../watermark-screen.component.ts | 2 - .../file-preview-screen.component.ts | 4 +- .../file/pdf-viewer/pdf-viewer.component.ts | 22 +-- ...ice.ts => single-file-download.service.ts} | 2 +- .../html-debug-screen.component.ts | 4 +- .../pdf-viewer-screen.component.ts | 4 +- .../bulk-actions/bulk-actions.component.html | 8 +- .../bulk-actions/bulk-actions.component.ts | 18 +-- .../project-overview-screen.component.html | 9 +- .../project-overview-screen.component.ts | 17 --- .../upload-download/file-download.service.ts | 26 ++-- .../model/project-download.model.ts | 1 + apps/red-ui/src/app/utils/pdf-coordinates.ts | 53 +++++++ apps/red-ui/src/assets/i18n/en.json | 5 +- .../api/fileManagementController.service.ts | 132 ++++++++++++++++++ 23 files changed, 352 insertions(+), 92 deletions(-) create mode 100644 apps/red-ui/src/app/components/buttons/file-download-btn/file-download-btn.component.html create mode 100644 apps/red-ui/src/app/components/buttons/file-download-btn/file-download-btn.component.scss create mode 100644 apps/red-ui/src/app/components/buttons/file-download-btn/file-download-btn.component.ts rename apps/red-ui/src/app/screens/file/service/{file-download.service.ts => single-file-download.service.ts} (99%) create mode 100644 apps/red-ui/src/app/utils/pdf-coordinates.ts diff --git a/apps/red-ui/src/app/app.module.ts b/apps/red-ui/src/app/app.module.ts index 009bd4ee4..32cb2d4e9 100644 --- a/apps/red-ui/src/app/app.module.ts +++ b/apps/red-ui/src/app/app.module.ts @@ -106,6 +106,7 @@ import { MatSliderModule } from '@angular/material/slider'; import { PendingChangesGuard } from './utils/can-deactivate.guard'; import { OverwriteFilesDialogComponent } from './dialogs/overwrite-files-dialog/overwrite-files-dialog.component'; import { KeycloakService } from 'keycloak-angular'; +import { FileDownloadBtnComponent } from './components/buttons/file-download-btn/file-download-btn.component'; export function HttpLoaderFactory(httpClient: HttpClient) { return new TranslateHttpLoader(httpClient, '/assets/i18n/', '.json'); @@ -330,6 +331,7 @@ const matImports = [ PdfViewerScreenComponent, HtmlDebugScreenComponent, ReportDownloadBtnComponent, + FileDownloadBtnComponent, ProjectListingActionsComponent, RuleSetActionsComponent, RuleSetViewSwitchComponent diff --git a/apps/red-ui/src/app/common/file-actions/file-actions.component.html b/apps/red-ui/src/app/common/file-actions/file-actions.component.html index 141c9b2d0..59bcae55b 100644 --- a/apps/red-ui/src/app/common/file-actions/file-actions.component.html +++ b/apps/red-ui/src/app/common/file-actions/file-actions.component.html @@ -51,17 +51,15 @@ - - - - + { - saveAs(data, fileStatus.filename); - }); - } } diff --git a/apps/red-ui/src/app/components/buttons/file-download-btn/file-download-btn.component.html b/apps/red-ui/src/app/components/buttons/file-download-btn/file-download-btn.component.html new file mode 100644 index 000000000..08e86e1a9 --- /dev/null +++ b/apps/red-ui/src/app/components/buttons/file-download-btn/file-download-btn.component.html @@ -0,0 +1,19 @@ + + + +
+
+
+
+
+
+
diff --git a/apps/red-ui/src/app/components/buttons/file-download-btn/file-download-btn.component.scss b/apps/red-ui/src/app/components/buttons/file-download-btn/file-download-btn.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/apps/red-ui/src/app/components/buttons/file-download-btn/file-download-btn.component.ts b/apps/red-ui/src/app/components/buttons/file-download-btn/file-download-btn.component.ts new file mode 100644 index 000000000..1e85cfc61 --- /dev/null +++ b/apps/red-ui/src/app/components/buttons/file-download-btn/file-download-btn.component.ts @@ -0,0 +1,86 @@ +import { ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core'; +import { PermissionsService } from '../../../common/service/permissions.service'; +import { ProjectWrapper } from '../../../state/model/project.wrapper'; +import { FileStatusWrapper } from '../../../screens/file/model/file-status.wrapper'; +import { FileManagementControllerService } from '@redaction/red-ui-http'; +import { StatusOverlayService } from '../../../upload-download/status-overlay.service'; +import { FileDownloadService } from '../../../upload-download/file-download.service'; +import { SingleFileDownloadService } from '../../../screens/file/service/single-file-download.service'; +import { saveAs } from 'file-saver'; + +export type MenuState = 'OPEN' | 'CLOSED'; + +@Component({ + selector: 'redaction-file-download-btn', + templateUrl: './file-download-btn.component.html', + styleUrls: ['./file-download-btn.component.scss'] +}) +export class FileDownloadBtnComponent { + @Input() project: ProjectWrapper; + @Input() file: FileStatusWrapper | FileStatusWrapper[]; + @Input() tooltipPosition: 'above' | 'below' | 'before' | 'after' = 'above'; + @Input() type: 'default' | 'primary' | 'warn' | 'dark-bg' = 'default'; + @Input() tooltipClass: string; + + @Output() menuStateChanged = new EventEmitter(); + + constructor( + private readonly _permissionsService: PermissionsService, + private readonly _fileDownloadService: FileDownloadService, + private readonly _singleFileDownloadService: SingleFileDownloadService, + private readonly _changeDetectorRef: ChangeDetectorRef, + private readonly _statusOverlayService: StatusOverlayService, + private readonly _fileManagementControllerService: FileManagementControllerService + ) {} + + openMenu($event: MouseEvent) { + $event.stopPropagation(); + this.menuStateChanged.emit('OPEN'); + } + + onMenuClosed() { + this.menuStateChanged.emit('CLOSED'); + } + + get canDownloadRedactedFiles() { + if (Array.isArray(this.file)) { + return this.file.reduce((acc, file) => acc && this._permissionsService.canDownloadRedactedFile(file), true); + } else { + return this._permissionsService.canDownloadRedactedFile(this.file); + } + } + + downloadRedactedFilesPreview($event: MouseEvent) { + $event.preventDefault(); + if (Array.isArray(this.file)) { + // Bulk Download + this._fileDownloadService.downloadProjectFiles( + this.file.map((file) => file.fileId), + this.project, + 'PREVIEW' + ); + this._statusOverlayService.openDownloadStatusOverlay(); + this._changeDetectorRef.detectChanges(); + } else { + this._fileManagementControllerService + .downloadPreviewFile(this.file.fileId, true, 'body') + .subscribe((data) => saveAs(data, (this.file).filename)); + } + } + + downloadRedactedFiles($event: MouseEvent) { + $event.preventDefault(); + if (Array.isArray(this.file)) { + // Bulk Download + this._fileDownloadService.downloadProjectFiles( + this.file.map((file) => file.fileId), + this.project, + 'REDACTED' + ); + this._statusOverlayService.openDownloadStatusOverlay(); + this._changeDetectorRef.detectChanges(); + } else { + this._singleFileDownloadService.loadFile('REDACTED', this.file).subscribe((data) => saveAs(data, (this.file).filename)); + } + } +} diff --git a/apps/red-ui/src/app/components/buttons/report-download-btn/report-download-btn.component.html b/apps/red-ui/src/app/components/buttons/report-download-btn/report-download-btn.component.html index 3e4c2e7ea..edcff43b6 100644 --- a/apps/red-ui/src/app/components/buttons/report-download-btn/report-download-btn.component.html +++ b/apps/red-ui/src/app/components/buttons/report-download-btn/report-download-btn.component.html @@ -1,7 +1,7 @@ { const selectedQuads = this.instance.docViewer.getSelectedTextQuads(); const text = this.instance.docViewer.getSelectedText(); - const mre = this._getManualRedactionEntry(selectedQuads, text); + const mre = this._getManualRedactionEntry(selectedQuads, text, true); this.manualAnnotationRequested.emit(new ManualRedactionEntryWrapper(this.instance.docViewer.getSelectedTextQuads(), mre, 'FALSE_POSITIVE')); } }); @@ -308,7 +309,7 @@ export class PdfViewerComponent implements OnInit, AfterViewInit, OnChanges { onClick: () => { const selectedQuads = this.instance.docViewer.getSelectedTextQuads(); const text = this.instance.docViewer.getSelectedText(); - const mre = this._getManualRedactionEntry(selectedQuads, text); + const mre = this._getManualRedactionEntry(selectedQuads, text, true); this.manualAnnotationRequested.emit(new ManualRedactionEntryWrapper(this.instance.docViewer.getSelectedTextQuads(), mre, 'DICTIONARY')); } }); @@ -321,7 +322,7 @@ export class PdfViewerComponent implements OnInit, AfterViewInit, OnChanges { onClick: () => { const selectedQuads = this.instance.docViewer.getSelectedTextQuads(); const text = this.instance.docViewer.getSelectedText(); - const mre = this._getManualRedactionEntry(selectedQuads, text); + const mre = this._getManualRedactionEntry(selectedQuads, text, true); this.manualAnnotationRequested.emit(new ManualRedactionEntryWrapper(this.instance.docViewer.getSelectedTextQuads(), mre, 'REDACTION')); } }); @@ -339,20 +340,25 @@ export class PdfViewerComponent implements OnInit, AfterViewInit, OnChanges { } } - private _getManualRedactionEntry(quads: any, text: string): ManualRedactionEntry { + private _getManualRedactionEntry(quads: any, text: string, convertQuads: boolean = false): ManualRedactionEntry { text = text.replace(/-\n/gi, ''); const entry: ManualRedactionEntry = { positions: [] }; for (const key of Object.keys(quads)) { for (const quad of quads[key]) { - entry.positions.push(this.toPosition(parseInt(key, 10), quad)); + const page = parseInt(key, 10); + entry.positions.push(this.toPosition(page, convertQuads ? this._translateQuads(page, quad) : quad)); } } entry.value = text; return entry; } + private _translateQuads(page: number, quads: any) { + const rotation = this.instance.docViewer.getCompleteRotation(page); + return translateQuads(page, rotation, quads); + } + private toPosition(page: number, selectedQuad: any): Rectangle { - console.log(selectedQuad); const pageHeight = this.instance.docViewer.getPageHeight(page); const height = selectedQuad.y2 - selectedQuad.y4; return { diff --git a/apps/red-ui/src/app/screens/file/service/file-download.service.ts b/apps/red-ui/src/app/screens/file/service/single-file-download.service.ts similarity index 99% rename from apps/red-ui/src/app/screens/file/service/file-download.service.ts rename to apps/red-ui/src/app/screens/file/service/single-file-download.service.ts index 1e8d75818..e2042bdf6 100644 --- a/apps/red-ui/src/app/screens/file/service/file-download.service.ts +++ b/apps/red-ui/src/app/screens/file/service/single-file-download.service.ts @@ -16,7 +16,7 @@ import { PermissionsService } from '../../../common/service/permissions.service' @Injectable({ providedIn: 'root' }) -export class FileDownloadService { +export class SingleFileDownloadService { constructor( private readonly _appStateService: AppStateService, private readonly _permissionsService: PermissionsService, diff --git a/apps/red-ui/src/app/screens/html-debug-screen/html-debug-screen.component.ts b/apps/red-ui/src/app/screens/html-debug-screen/html-debug-screen.component.ts index 23345d298..d0235b3b3 100644 --- a/apps/red-ui/src/app/screens/html-debug-screen/html-debug-screen.component.ts +++ b/apps/red-ui/src/app/screens/html-debug-screen/html-debug-screen.component.ts @@ -1,10 +1,10 @@ import { ChangeDetectorRef, Component } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { FileDownloadService } from '../file/service/file-download.service'; import { DebugControllerService } from '@redaction/red-ui-http'; import { FileType } from '../file/model/file-type'; import { FileStatusWrapper } from '../file/model/file-status.wrapper'; import { mergeMap } from 'rxjs/operators'; +import { SingleFileDownloadService } from '../file/service/single-file-download.service'; @Component({ selector: 'redaction-html-debug-screen', @@ -21,7 +21,7 @@ export class HtmlDebugScreenComponent { private readonly _activatedRoute: ActivatedRoute, private readonly _changeDetectorRef: ChangeDetectorRef, private readonly _debugControllerService: DebugControllerService, - private readonly _fileDownloadService: FileDownloadService + private readonly _fileDownloadService: SingleFileDownloadService ) { this._activatedRoute.params.subscribe((params) => { this._fileId = params.fileId; diff --git a/apps/red-ui/src/app/screens/pdf-viewer-screen/pdf-viewer-screen.component.ts b/apps/red-ui/src/app/screens/pdf-viewer-screen/pdf-viewer-screen.component.ts index dc0a16f3e..2c4ac4f55 100644 --- a/apps/red-ui/src/app/screens/pdf-viewer-screen/pdf-viewer-screen.component.ts +++ b/apps/red-ui/src/app/screens/pdf-viewer-screen/pdf-viewer-screen.component.ts @@ -1,10 +1,10 @@ import { ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import WebViewer, { WebViewerInstance } from '@pdftron/webviewer'; import { environment } from '../../../environments/environment'; -import { FileDownloadService } from '../file/service/file-download.service'; import { ActivatedRoute } from '@angular/router'; import { FileType } from '../file/model/file-type'; import { FileStatusWrapper } from '../file/model/file-status.wrapper'; +import { SingleFileDownloadService } from '../file/service/single-file-download.service'; @Component({ selector: 'redaction-pdf-viewer-screen', @@ -22,7 +22,7 @@ export class PdfViewerScreenComponent implements OnInit { constructor( private readonly _activatedRoute: ActivatedRoute, private readonly _changeDetectorRef: ChangeDetectorRef, - private readonly _fileDownloadService: FileDownloadService + private readonly _fileDownloadService: SingleFileDownloadService ) { this._activatedRoute.params.subscribe((params) => { this._fileId = params.fileId; diff --git a/apps/red-ui/src/app/screens/project-overview-screen/bulk-actions/bulk-actions.component.html b/apps/red-ui/src/app/screens/project-overview-screen/bulk-actions/bulk-actions.component.html index 66aa96c0b..3e9b4e80d 100644 --- a/apps/red-ui/src/app/screens/project-overview-screen/bulk-actions/bulk-actions.component.html +++ b/apps/red-ui/src/app/screens/project-overview-screen/bulk-actions/bulk-actions.component.html @@ -15,13 +15,7 @@ icon="red:assign" > - + this._appStateService.getFileById(this._appStateService.activeProject.project.projectId, fileId)); } @@ -115,20 +119,6 @@ export class BulkActionsComponent { return this.selectedFiles.reduce((acc, file) => acc && this._permissionsService.canUndoApproval(file), true); } - get canDownloadRedactedFiles() { - return this.selectedFiles.reduce((acc, file) => acc && this._permissionsService.canDownloadRedactedFile(file), true); - } - - // Bulk Download - downloadRedactedFiles() { - this._fileDownloadService.downloadProjectFiles( - this.selectedFiles.map((file) => file.fileId), - this._appStateService.activeProject - ); - this._statusOverlayService.openDownloadStatusOverlay(); - this._changeDetectorRef.detectChanges(); - } - private _performBulkAction(obs: Observable) { this.loading = true; obs.subscribe().add(() => { diff --git a/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.html b/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.html index b32d7c631..01623d5e7 100644 --- a/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.html +++ b/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.html @@ -59,13 +59,8 @@ - + + file.fileId), - this.appStateService.activeProject - ); - this._statusOverlayService.openDownloadStatusOverlay(); - this._changeDetectorRef.detectChanges(); - } - - public get canDownloadRedactedFiles() { - return ( - this.appStateService.activeProject.files.length > 0 && - this.appStateService.activeProject.files.reduce((acc, file) => acc && this.permissionsService.canDownloadRedactedFile(file), true) - ); - } } diff --git a/apps/red-ui/src/app/upload-download/file-download.service.ts b/apps/red-ui/src/app/upload-download/file-download.service.ts index 720d70131..b4a3f4ea7 100644 --- a/apps/red-ui/src/app/upload-download/file-download.service.ts +++ b/apps/red-ui/src/app/upload-download/file-download.service.ts @@ -34,8 +34,8 @@ export class FileDownloadService { }); } - public downloadProjectFiles(fileIds: string[], project: ProjectWrapper): void { - const item = { project, fileIds, completed: false, error: null }; + public downloadProjectFiles(fileIds: string[], project: ProjectWrapper, type: 'REDACTED' | 'PREVIEW'): void { + const item = { project, fileIds, type, completed: false, error: null }; this.downloads.push(item); this.scheduleDownload(item); } @@ -68,12 +68,22 @@ export class FileDownloadService { private _createSubscription(downloadModel: ProjectDownloadModel) { this.activeDownloadsCnt++; - const obs = this._fileManagementControllerService.downloadRedactedFiles( - { fileIds: downloadModel.fileIds }, - downloadModel.project.projectId, - false, - 'response' - ); + let obs; + if (downloadModel.type === 'REDACTED') { + obs = this._fileManagementControllerService.downloadRedactedFiles( + { fileIds: downloadModel.fileIds }, + downloadModel.project.projectId, + false, + 'response' + ); + } else { + obs = this._fileManagementControllerService.downloadPreviewFiles( + { fileIds: downloadModel.fileIds }, + downloadModel.project.projectId, + false, + 'response' + ); + } const subscription = obs.subscribe( async (event) => { if (event.status < 300) { diff --git a/apps/red-ui/src/app/upload-download/model/project-download.model.ts b/apps/red-ui/src/app/upload-download/model/project-download.model.ts index 245a6f98a..d38651b24 100644 --- a/apps/red-ui/src/app/upload-download/model/project-download.model.ts +++ b/apps/red-ui/src/app/upload-download/model/project-download.model.ts @@ -5,4 +5,5 @@ export interface ProjectDownloadModel { project: ProjectWrapper; completed: boolean; error: any; + type: 'REDACTED' | 'PREVIEW'; } diff --git a/apps/red-ui/src/app/utils/pdf-coordinates.ts b/apps/red-ui/src/app/utils/pdf-coordinates.ts new file mode 100644 index 000000000..e4274eb82 --- /dev/null +++ b/apps/red-ui/src/app/utils/pdf-coordinates.ts @@ -0,0 +1,53 @@ +enum PageRotation { + E_0 = 0, + E_90 = 1, + E_180 = 2, + E_270 = 3 +} + +export function translateQuads(page: number, rotation: number, quads: any) { + let result; + switch (rotation) { + case PageRotation.E_90: + result = { + x1: quads.x2, + x2: quads.x3, + x3: quads.x4, + x4: quads.x1, + y1: quads.y2, + y2: quads.y3, + y3: quads.y4, + y4: quads.y1 + }; + break; + case PageRotation.E_180: + result = { + x1: quads.x3, + x2: quads.x4, + x3: quads.x1, + x4: quads.x2, + y1: quads.y3, + y2: quads.y4, + y3: quads.y1, + y4: quads.y2 + }; + break; + case PageRotation.E_270: + result = { + x1: quads.x4, + x2: quads.x1, + x3: quads.x2, + x4: quads.x3, + y1: quads.y4, + y2: quads.y1, + y3: quads.y2, + y4: quads.y3 + }; + break; + case PageRotation.E_0: + default: + result = quads; + } + console.log(quads, result); + return result; +} diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index 9d5979132..107ab7556 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -197,8 +197,9 @@ "upload-document": "Upload Document", "download-redacted-files": "Download Redacted Files" }, - "download-redacted-file": "Download Redacted File", - "download-redacted-files": "Download Redacted Files", + "download-file": "Download File(s)", + "download-redacted-file": "Download Redacted File(s)", + "download-redacted-file-preview": "Download Redacted File(s) Preview", "under-approval": "For Approval", "approve": "Approve", "under-review": "Under Review", diff --git a/libs/red-ui-http/src/lib/api/fileManagementController.service.ts b/libs/red-ui-http/src/lib/api/fileManagementController.service.ts index ab2ebafa0..a852c879e 100644 --- a/libs/red-ui-http/src/lib/api/fileManagementController.service.ts +++ b/libs/red-ui-http/src/lib/api/fileManagementController.service.ts @@ -146,6 +146,138 @@ export class FileManagementControllerService { }); } + /** + * Returns a downloadable byte stream of the redaction preview file with the specified fileId + * Use the optional \"inline\" request parameter to select, if this downloadAnnotated will be opened in the browser. + * @param fileId fileId + * @param inline inline + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public downloadPreviewFile(fileId: string, inline?: boolean, observe?: 'body', reportProgress?: boolean): Observable; + public downloadPreviewFile(fileId: string, inline?: boolean, observe?: 'response', reportProgress?: boolean): Observable>; + public downloadPreviewFile(fileId: string, inline?: boolean, observe?: 'events', reportProgress?: boolean): Observable>; + public downloadPreviewFile(fileId: string, inline?: boolean, observe: any = 'body', reportProgress: boolean = false): Observable { + if (fileId === null || fileId === undefined) { + throw new Error('Required parameter fileId was null or undefined when calling downloadPreviewFile.'); + } + + let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() }); + if (inline !== undefined && inline !== null) { + queryParameters = queryParameters.set('inline', inline); + } + + let headers = this.defaultHeaders; + + // authentication (RED-OAUTH) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken() : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = ['*/*']; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = []; + + return this.httpClient.request('get', `${this.basePath}/download/preview/${encodeURIComponent(String(fileId))}`, { + responseType: 'blob', + params: queryParameters, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + }); + } + + /** + * Returns a downloadable byte stream of the requested files in a zip format + * Use the optional \"inline\" request parameter to select, if this report will be opened in the browser. + * @param body bulkDownloadRedactedRequest + * @param projectId The projectId + * @param inline inline + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public downloadPreviewFiles( + body: BulkDownloadRedactedRequest, + projectId: string, + inline?: boolean, + observe?: 'body', + reportProgress?: boolean + ): Observable; + public downloadPreviewFiles( + body: BulkDownloadRedactedRequest, + projectId: string, + inline?: boolean, + observe?: 'response', + reportProgress?: boolean + ): Observable>; + public downloadPreviewFiles( + body: BulkDownloadRedactedRequest, + projectId: string, + inline?: boolean, + observe?: 'events', + reportProgress?: boolean + ): Observable>; + public downloadPreviewFiles( + body: BulkDownloadRedactedRequest, + projectId: string, + inline?: boolean, + observe: any = 'body', + reportProgress: boolean = false + ): Observable { + if (body === null || body === undefined) { + throw new Error('Required parameter body was null or undefined when calling downloadPreviewFiles.'); + } + + if (projectId === null || projectId === undefined) { + throw new Error('Required parameter projectId was null or undefined when calling downloadPreviewFiles.'); + } + + let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() }); + if (inline !== undefined && inline !== null) { + queryParameters = queryParameters.set('inline', inline); + } + + let headers = this.defaultHeaders; + + // authentication (RED-OAUTH) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken() : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = ['*/*']; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = ['application/json']; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + headers = headers.set('Content-Type', httpContentTypeSelected); + } + + return this.httpClient.request('post', `${this.basePath}/download/bulk/preview/${encodeURIComponent(String(projectId))}`, { + responseType: 'blob', + body: body, + params: queryParameters, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + }); + } + /** * Returns a downloadable byte stream of the annotated file with the specified fileId * Use the optional \"inline\" request parameter to select, if this downloadAnnotated will be opened in the browser.