download is added
This commit is contained in:
parent
d40523a674
commit
37cce9bfce
12
package-lock.json
generated
12
package-lock.json
generated
@ -2323,6 +2323,12 @@
|
|||||||
"@types/webpack": "*"
|
"@types/webpack": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@types/file-saver": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-g1QUuhYVVAamfCifK7oB7G3aIl4BbOyzDOqVyUfEr4tfBKrXfeH+M+Tg7HKCXSrbzxYdhyCP7z9WbKo0R2hBCw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/filesize": {
|
"@types/filesize": {
|
||||||
"version": "4.2.0",
|
"version": "4.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/filesize/-/filesize-4.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/filesize/-/filesize-4.2.0.tgz",
|
||||||
@ -6594,6 +6600,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"file-saver": {
|
||||||
|
"version": "2.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz",
|
||||||
|
"integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"fileset": {
|
"fileset": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
"@types/electron-devtools-installer": "^2.2.0",
|
"@types/electron-devtools-installer": "^2.2.0",
|
||||||
"@types/extract-text-webpack-plugin": "^3.0.4",
|
"@types/extract-text-webpack-plugin": "^3.0.4",
|
||||||
"@types/fs-extra": "^8.0.0",
|
"@types/fs-extra": "^8.0.0",
|
||||||
|
"@types/file-saver": "^2.0.1",
|
||||||
"@types/filesize": "^4.1.0",
|
"@types/filesize": "^4.1.0",
|
||||||
"@types/jasmine": "~3.3.8",
|
"@types/jasmine": "~3.3.8",
|
||||||
"@types/jasminewd2": "~2.0.3",
|
"@types/jasminewd2": "~2.0.3",
|
||||||
@ -75,6 +76,7 @@
|
|||||||
"electron-store": "^4.0.0",
|
"electron-store": "^4.0.0",
|
||||||
"electron-updater": "^4.1.2",
|
"electron-updater": "^4.1.2",
|
||||||
"electron-window-state": "^5.0.3",
|
"electron-window-state": "^5.0.3",
|
||||||
|
"file-saver": "^2.0.2",
|
||||||
"fs-extra": "^8.1.0",
|
"fs-extra": "^8.1.0",
|
||||||
"filesize": "^4.1.2",
|
"filesize": "^4.1.2",
|
||||||
"hammerjs": "^2.0.8",
|
"hammerjs": "^2.0.8",
|
||||||
|
@ -4,5 +4,6 @@
|
|||||||
[userSeq]="userSeq"
|
[userSeq]="userSeq"
|
||||||
[deviceType]="deviceType"
|
[deviceType]="deviceType"
|
||||||
[token]="token"
|
[token]="token"
|
||||||
|
(download)="onDownload($event)"
|
||||||
(closed)="onClosedViewer()"
|
(closed)="onClosedViewer()"
|
||||||
></ucap-file-viewer>
|
></ucap-file-viewer>
|
||||||
|
@ -10,6 +10,7 @@ import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
|
|||||||
import { NGXLogger } from 'ngx-logger';
|
import { NGXLogger } from 'ngx-logger';
|
||||||
import { FileEventJson } from '@ucap-webmessenger/protocol-event';
|
import { FileEventJson } from '@ucap-webmessenger/protocol-event';
|
||||||
import { DeviceType } from '@ucap-webmessenger/core';
|
import { DeviceType } from '@ucap-webmessenger/core';
|
||||||
|
import * as FileSaver from 'file-saver';
|
||||||
|
|
||||||
export interface FileViewerDialogData {
|
export interface FileViewerDialogData {
|
||||||
fileInfo: FileEventJson;
|
fileInfo: FileEventJson;
|
||||||
@ -52,6 +53,10 @@ export class FileViewerDialogComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
ngOnDestroy(): void {}
|
ngOnDestroy(): void {}
|
||||||
|
|
||||||
|
onDownload(blob: Blob): void {
|
||||||
|
FileSaver.saveAs(blob, this.fileInfo.fileName);
|
||||||
|
}
|
||||||
|
|
||||||
onClosedViewer(): void {
|
onClosedViewer(): void {
|
||||||
this.dialogRef.close();
|
this.dialogRef.close();
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
[userSeq]="userSeq"
|
[userSeq]="userSeq"
|
||||||
[deviceType]="deviceType"
|
[deviceType]="deviceType"
|
||||||
[token]="token"
|
[token]="token"
|
||||||
|
(download)="onDownload($event)"
|
||||||
(closed)="onClosedViewer()"
|
(closed)="onClosedViewer()"
|
||||||
></ucap-document-viewer>
|
></ucap-document-viewer>
|
||||||
<ucap-image-viewer
|
<ucap-image-viewer
|
||||||
@ -18,6 +19,7 @@
|
|||||||
[userSeq]="userSeq"
|
[userSeq]="userSeq"
|
||||||
[deviceType]="deviceType"
|
[deviceType]="deviceType"
|
||||||
[token]="token"
|
[token]="token"
|
||||||
|
(download)="onDownload($event)"
|
||||||
(closed)="onClosedViewer()"
|
(closed)="onClosedViewer()"
|
||||||
></ucap-image-viewer>
|
></ucap-image-viewer>
|
||||||
<ucap-sound-viewer
|
<ucap-sound-viewer
|
||||||
@ -27,6 +29,7 @@
|
|||||||
[userSeq]="userSeq"
|
[userSeq]="userSeq"
|
||||||
[deviceType]="deviceType"
|
[deviceType]="deviceType"
|
||||||
[token]="token"
|
[token]="token"
|
||||||
|
(download)="onDownload($event)"
|
||||||
(closed)="onClosedViewer()"
|
(closed)="onClosedViewer()"
|
||||||
></ucap-sound-viewer>
|
></ucap-sound-viewer>
|
||||||
<ucap-video-viewer
|
<ucap-video-viewer
|
||||||
@ -36,6 +39,7 @@
|
|||||||
[userSeq]="userSeq"
|
[userSeq]="userSeq"
|
||||||
[deviceType]="deviceType"
|
[deviceType]="deviceType"
|
||||||
[token]="token"
|
[token]="token"
|
||||||
|
(download)="onDownload($event)"
|
||||||
(closed)="onClosedViewer()"
|
(closed)="onClosedViewer()"
|
||||||
></ucap-video-viewer>
|
></ucap-video-viewer>
|
||||||
<ucap-binary-viewer
|
<ucap-binary-viewer
|
||||||
@ -45,6 +49,7 @@
|
|||||||
[userSeq]="userSeq"
|
[userSeq]="userSeq"
|
||||||
[deviceType]="deviceType"
|
[deviceType]="deviceType"
|
||||||
[token]="token"
|
[token]="token"
|
||||||
|
(download)="onDownload($event)"
|
||||||
(closed)="onClosedViewer()"
|
(closed)="onClosedViewer()"
|
||||||
></ucap-binary-viewer>
|
></ucap-binary-viewer>
|
||||||
</div>
|
</div>
|
||||||
|
@ -27,6 +27,9 @@ export class FileViewerComponent implements OnInit {
|
|||||||
@Input()
|
@Input()
|
||||||
token: string;
|
token: string;
|
||||||
|
|
||||||
|
@Output()
|
||||||
|
download = new EventEmitter<Blob>();
|
||||||
|
|
||||||
@Output()
|
@Output()
|
||||||
closed = new EventEmitter<void>();
|
closed = new EventEmitter<void>();
|
||||||
|
|
||||||
@ -48,6 +51,9 @@ export class FileViewerComponent implements OnInit {
|
|||||||
return FileViewerType.Binary;
|
return FileViewerType.Binary;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
onDownload(blob: Blob): void {
|
||||||
|
this.download.emit(blob);
|
||||||
|
}
|
||||||
|
|
||||||
onClosedViewer(): void {
|
onClosedViewer(): void {
|
||||||
this.closed.emit();
|
this.closed.emit();
|
||||||
|
@ -25,9 +25,19 @@ export class BinaryViewerComponent implements OnInit {
|
|||||||
@Input()
|
@Input()
|
||||||
token: string;
|
token: string;
|
||||||
|
|
||||||
|
@Output()
|
||||||
|
download = new EventEmitter<Blob>();
|
||||||
|
|
||||||
@Output()
|
@Output()
|
||||||
closed = new EventEmitter<void>();
|
closed = new EventEmitter<void>();
|
||||||
|
|
||||||
constructor() {}
|
constructor() {}
|
||||||
|
|
||||||
ngOnInit() {}
|
ngOnInit() {}
|
||||||
|
|
||||||
|
onClickDownload(): void {}
|
||||||
|
|
||||||
|
onClickClose(): void {
|
||||||
|
this.closed.emit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,9 +25,19 @@ export class DocumentViewerComponent implements OnInit {
|
|||||||
@Input()
|
@Input()
|
||||||
token: string;
|
token: string;
|
||||||
|
|
||||||
|
@Output()
|
||||||
|
download = new EventEmitter<Blob>();
|
||||||
|
|
||||||
@Output()
|
@Output()
|
||||||
closed = new EventEmitter<void>();
|
closed = new EventEmitter<void>();
|
||||||
|
|
||||||
constructor() {}
|
constructor() {}
|
||||||
|
|
||||||
ngOnInit() {}
|
ngOnInit() {}
|
||||||
|
|
||||||
|
onClickDownload(): void {}
|
||||||
|
|
||||||
|
onClickClose(): void {
|
||||||
|
this.closed.emit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<div class="ucap-image-viewer-container">
|
<div class="ucap-image-viewer-container">
|
||||||
<mat-toolbar color="primary" class="ucap-image-viewer-header">
|
<mat-toolbar color="accent" class="ucap-image-viewer-header">
|
||||||
<mat-icon class="ucap-image-viewer-icon">image</mat-icon>
|
<mat-icon class="ucap-image-viewer-icon">image</mat-icon>
|
||||||
<span class="ucap-image-viewer-title">{{ fileInfo.fileName }}</span>
|
<span class="ucap-image-viewer-title">{{ fileInfo.fileName }}</span>
|
||||||
<span class="ucap-image-viewer-spacer"></span>
|
<span class="ucap-image-viewer-spacer"></span>
|
||||||
@ -9,7 +9,7 @@
|
|||||||
class="ucap-image-viewer-action"
|
class="ucap-image-viewer-action"
|
||||||
matTooltip="이미지 크기 재설정"
|
matTooltip="이미지 크기 재설정"
|
||||||
matTooltipPosition="below"
|
matTooltipPosition="below"
|
||||||
aria-label="Button that displays a tooltip in various positions"
|
aria-label=""
|
||||||
>
|
>
|
||||||
<mat-icon>settings_overscan</mat-icon>
|
<mat-icon>settings_overscan</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
@ -18,7 +18,7 @@
|
|||||||
class="ucap-image-viewer-action"
|
class="ucap-image-viewer-action"
|
||||||
matTooltip="축소"
|
matTooltip="축소"
|
||||||
matTooltipPosition="below"
|
matTooltipPosition="below"
|
||||||
aria-label="Button that displays a tooltip in various positions"
|
aria-label=""
|
||||||
>
|
>
|
||||||
<mat-icon>zoom_out</mat-icon>
|
<mat-icon>zoom_out</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
@ -27,7 +27,7 @@
|
|||||||
class="ucap-image-viewer-action"
|
class="ucap-image-viewer-action"
|
||||||
matTooltip="확대"
|
matTooltip="확대"
|
||||||
matTooltipPosition="below"
|
matTooltipPosition="below"
|
||||||
aria-label="Button that displays a tooltip in various positions"
|
aria-label=""
|
||||||
>
|
>
|
||||||
<mat-icon>zoom_in</mat-icon>
|
<mat-icon>zoom_in</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
@ -36,7 +36,8 @@
|
|||||||
class="ucap-image-viewer-action"
|
class="ucap-image-viewer-action"
|
||||||
matTooltip="다운로드"
|
matTooltip="다운로드"
|
||||||
matTooltipPosition="below"
|
matTooltipPosition="below"
|
||||||
aria-label="Button that displays a tooltip in various positions"
|
aria-label=""
|
||||||
|
(click)="onClickDownload()"
|
||||||
>
|
>
|
||||||
<mat-icon>get_app</mat-icon>
|
<mat-icon>get_app</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
@ -56,7 +57,13 @@
|
|||||||
[value]="fileDownloadItem.downloadingProgress$ | async"
|
[value]="fileDownloadItem.downloadingProgress$ | async"
|
||||||
></mat-progress-bar>
|
></mat-progress-bar>
|
||||||
<div class="ucap-image-viewer-body">
|
<div class="ucap-image-viewer-body">
|
||||||
<div class="ucap-image-viewer-image-wrapper">
|
<div
|
||||||
|
class="ucap-image-viewer-image-wrapper"
|
||||||
|
fxLayout="row"
|
||||||
|
fxLayout.xs="column"
|
||||||
|
fxFlexFill
|
||||||
|
fxLayoutAlign="center center"
|
||||||
|
>
|
||||||
<img *ngIf="imageSrc" [src]="imageSrc" />
|
<img *ngIf="imageSrc" [src]="imageSrc" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -26,11 +26,6 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
.ucap-image-viewer-image-wrapper {
|
.ucap-image-viewer-image-wrapper {
|
||||||
position: absolute;
|
|
||||||
top: 10%;
|
|
||||||
left: 10%;
|
|
||||||
width: 80%;
|
|
||||||
height: 80%;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import {
|
|||||||
FileDownloadItem
|
FileDownloadItem
|
||||||
} from '@ucap-webmessenger/api-common';
|
} from '@ucap-webmessenger/api-common';
|
||||||
import { take, map } from 'rxjs/operators';
|
import { take, map } from 'rxjs/operators';
|
||||||
|
import { DomSanitizer } from '@angular/platform-browser';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ucap-image-viewer',
|
selector: 'ucap-image-viewer',
|
||||||
@ -33,11 +34,18 @@ export class ImageViewerComponent implements OnInit {
|
|||||||
@Output()
|
@Output()
|
||||||
closed = new EventEmitter<void>();
|
closed = new EventEmitter<void>();
|
||||||
|
|
||||||
|
@Output()
|
||||||
|
download = new EventEmitter<Blob>();
|
||||||
|
|
||||||
|
blob: Blob;
|
||||||
imageSrc: string | ArrayBuffer;
|
imageSrc: string | ArrayBuffer;
|
||||||
|
|
||||||
fileDownloadItem: FileDownloadItem;
|
fileDownloadItem: FileDownloadItem;
|
||||||
|
|
||||||
constructor(private commonApiService: CommonApiService) {
|
constructor(
|
||||||
|
private domSanitizer: DomSanitizer,
|
||||||
|
private commonApiService: CommonApiService
|
||||||
|
) {
|
||||||
this.fileDownloadItem = new FileDownloadItem();
|
this.fileDownloadItem = new FileDownloadItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,17 +64,21 @@ export class ImageViewerComponent implements OnInit {
|
|||||||
.pipe(
|
.pipe(
|
||||||
take(1),
|
take(1),
|
||||||
map(async blob => {
|
map(async blob => {
|
||||||
const b = blob.slice(
|
this.blob = blob.slice(
|
||||||
0,
|
0,
|
||||||
blob.size,
|
blob.size,
|
||||||
MimeUtil.getMimeFromExtension(this.fileInfo.fileExt)
|
MimeUtil.getMimeFromExtension(this.fileInfo.fileExt)
|
||||||
);
|
);
|
||||||
this.imageSrc = await FileUtil.toDataUrl(b);
|
this.imageSrc = await FileUtil.toDataUrl(this.blob);
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.subscribe();
|
.subscribe();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onClickDownload(): void {
|
||||||
|
this.download.emit(this.blob);
|
||||||
|
}
|
||||||
|
|
||||||
onClickClose(): void {
|
onClickClose(): void {
|
||||||
this.closed.emit();
|
this.closed.emit();
|
||||||
}
|
}
|
||||||
|
@ -25,9 +25,19 @@ export class SoundViewerComponent implements OnInit {
|
|||||||
@Input()
|
@Input()
|
||||||
token: string;
|
token: string;
|
||||||
|
|
||||||
|
@Output()
|
||||||
|
download = new EventEmitter<Blob>();
|
||||||
|
|
||||||
@Output()
|
@Output()
|
||||||
closed = new EventEmitter<void>();
|
closed = new EventEmitter<void>();
|
||||||
|
|
||||||
constructor() {}
|
constructor() {}
|
||||||
|
|
||||||
ngOnInit() {}
|
ngOnInit() {}
|
||||||
|
|
||||||
|
onClickDownload(): void {}
|
||||||
|
|
||||||
|
onClickClose(): void {
|
||||||
|
this.closed.emit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,9 +25,19 @@ export class VideoViewerComponent implements OnInit {
|
|||||||
@Input()
|
@Input()
|
||||||
token: string;
|
token: string;
|
||||||
|
|
||||||
|
@Output()
|
||||||
|
download = new EventEmitter<Blob>();
|
||||||
|
|
||||||
@Output()
|
@Output()
|
||||||
closed = new EventEmitter<void>();
|
closed = new EventEmitter<void>();
|
||||||
|
|
||||||
constructor() {}
|
constructor() {}
|
||||||
|
|
||||||
ngOnInit() {}
|
ngOnInit() {}
|
||||||
|
|
||||||
|
onClickDownload(): void {}
|
||||||
|
|
||||||
|
onClickClose(): void {
|
||||||
|
this.closed.emit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,7 @@ import {
|
|||||||
Output,
|
Output,
|
||||||
Input,
|
Input,
|
||||||
AfterViewInit,
|
AfterViewInit,
|
||||||
OnInit,
|
OnInit
|
||||||
HostListener
|
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
|
|
||||||
import { NGXLogger } from 'ngx-logger';
|
import { NGXLogger } from 'ngx-logger';
|
||||||
@ -28,7 +27,7 @@ export class ImageDirective implements OnInit, AfterViewInit {
|
|||||||
default: string;
|
default: string;
|
||||||
|
|
||||||
@Output()
|
@Output()
|
||||||
loaded = new EventEmitter<string>();
|
loaded = new EventEmitter<HTMLImageElement>();
|
||||||
|
|
||||||
imageSrc: string;
|
imageSrc: string;
|
||||||
|
|
||||||
@ -53,7 +52,7 @@ export class ImageDirective implements OnInit, AfterViewInit {
|
|||||||
ngAfterViewInit(): void {
|
ngAfterViewInit(): void {
|
||||||
if (this.imageSrc === this.default) {
|
if (this.imageSrc === this.default) {
|
||||||
this.elementRef.nativeElement.src = this.default;
|
this.elementRef.nativeElement.src = this.default;
|
||||||
this.loaded.emit(this.elementRef.nativeElement.src);
|
this.loaded.emit(this.elementRef.nativeElement);
|
||||||
} else {
|
} else {
|
||||||
this.elementRef.nativeElement.src = this.default;
|
this.elementRef.nativeElement.src = this.default;
|
||||||
|
|
||||||
@ -71,11 +70,11 @@ export class ImageDirective implements OnInit, AfterViewInit {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.elementRef.nativeElement.src = image.src;
|
this.elementRef.nativeElement.src = image.src;
|
||||||
this.loaded.emit(this.elementRef.nativeElement.src);
|
this.loaded.emit(image);
|
||||||
};
|
};
|
||||||
image.onerror = () => {
|
image.onerror = () => {
|
||||||
this.elementRef.nativeElement.src = this.default;
|
this.elementRef.nativeElement.src = this.default;
|
||||||
this.loaded.emit(this.elementRef.nativeElement.src);
|
this.loaded.emit(this.elementRef.nativeElement);
|
||||||
};
|
};
|
||||||
image.src = imageUrl;
|
image.src = imageUrl;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user