From 69c405c7cc330b4ff8bda4a4f35f5343a80705ba Mon Sep 17 00:00:00 2001 From: rubikscraft Date: Thu, 1 Sep 2022 13:38:33 +0200 Subject: [PATCH] add delete button to image view layout --- .../src/app/routes/view/view.component.html | 7 +- .../src/app/routes/view/view.component.ts | 85 ++++++++++++++++++- 2 files changed, 87 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/routes/view/view.component.html b/frontend/src/app/routes/view/view.component.html index 05da2c4..7158559 100644 --- a/frontend/src/app/routes/view/view.component.html +++ b/frontend/src/app/routes/view/view.component.html @@ -57,9 +57,12 @@ (main-click)="download()" > + diff --git a/frontend/src/app/routes/view/view.component.ts b/frontend/src/app/routes/view/view.component.ts index 237e82d..608c1bc 100644 --- a/frontend/src/app/routes/view/view.component.ts +++ b/frontend/src/app/routes/view/view.component.ts @@ -1,20 +1,26 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; +import { AutoUnsubscribe } from 'ngx-auto-unsubscribe-decorator'; import { ImageLinks } from 'picsur-shared/dist/dto/image-links.class'; import { AnimFileType, FileType, FileType2Ext, - ImageFileType, SupportedFileTypeCategory, + ImageFileType, + SupportedFileTypeCategory, SupportedFileTypes } from 'picsur-shared/dist/dto/mimes.dto'; +import { Permission } from 'picsur-shared/dist/dto/permissions.enum'; import { EImage } from 'picsur-shared/dist/entities/image.entity'; import { EUser } from 'picsur-shared/dist/entities/user.entity'; import { HasFailed, HasSuccess } from 'picsur-shared/dist/types'; import { UUIDRegex } from 'picsur-shared/dist/util/common-regex'; import { ParseFileType } from 'picsur-shared/dist/util/parse-mime'; +import { SnackBarType } from 'src/app/models/dto/snack-bar-type.dto'; import { ImageService } from 'src/app/services/api/image.service'; +import { PermissionService } from 'src/app/services/api/permission.service'; +import { UserService } from 'src/app/services/api/user.service'; import { UtilService } from 'src/app/util/util-module/util.service'; import { CustomizeDialogComponent, @@ -31,6 +37,8 @@ export class ViewComponent implements OnInit { private readonly router: Router, private readonly imageService: ImageService, private readonly utilService: UtilService, + private readonly permissionService: PermissionService, + private readonly userService: UserService, ) {} private id: string; @@ -54,7 +62,12 @@ export class ViewComponent implements OnInit { public image: EImage | null = null; public imageUser: EUser | null = null; + public canDelete: boolean = false; + async ngOnInit() { + this.subscribePermissions(); + + // Extract and verify params const params = this.route.snapshot.paramMap; this.id = params.get('id') ?? ''; @@ -62,10 +75,12 @@ export class ViewComponent implements OnInit { return this.utilService.quitError('Invalid image link'); } + // Get metadata const metadata = await this.imageService.GetImageMeta(this.id); if (HasFailed(metadata)) return this.utilService.quitError(metadata.getReason()); + // Populate fields with metadata this.previewLink = this.imageService.GetImageURL( this.id, metadata.fileTypes.master, @@ -76,6 +91,7 @@ export class ViewComponent implements OnInit { this.imageUser = metadata.user; this.image = metadata.image; + // Populate default selected format const masterFiletype = ParseFileType(metadata.fileTypes.master); if (HasSuccess(masterFiletype)) { this.masterFileType = masterFiletype; @@ -93,6 +109,7 @@ export class ViewComponent implements OnInit { this.selectedFormat(this.setSelectedFormat); this.updateFormatOptions(); + this.updatePermissions(); } selectedFormat(format: string) { @@ -115,6 +132,45 @@ export class ViewComponent implements OnInit { this.utilService.shareFile(this.imageLinks.source); } + goBackHome() { + this.router.navigate(['/']); + } + + async deleteImage() { + const pressedButton = await this.utilService.showDialog({ + title: `Are you sure you want to delete the image?`, + description: 'This action cannot be undone.', + buttons: [ + { + name: 'cancel', + text: 'Cancel', + }, + { + color: 'warn', + name: 'delete', + text: 'Delete', + }, + ], + }); + + if (pressedButton === 'delete') { + const result = await this.imageService.DeleteImage(this.id); + if (HasFailed(result)) { + return this.utilService.showSnackBar( + 'Failed to delete image', + SnackBarType.Error, + ); + } + + this.utilService.showSnackBar( + 'Image deleted', + SnackBarType.Success, + ); + + this.router.navigate(['/']); + } + } + async customize() { const options: CustomizeDialogData = { imageID: this.id, @@ -131,8 +187,31 @@ export class ViewComponent implements OnInit { }); } - goBackHome() { - this.router.navigate(['/']); + @AutoUnsubscribe() + private subscribePermissions() { + return this.permissionService.live.subscribe( + this.updatePermissions.bind(this), + ); + } + + private updatePermissions() { + const permissions = this.permissionService.snapshot; + if (permissions.includes(Permission.ImageAdmin)) { + this.canDelete = true; + return; + } + + if (this.imageUser === null) return; + + if ( + permissions.includes(Permission.ImageUpload) && + this.imageUser.id === this.userService.snapshot?.id + ) { + this.canDelete = true; + return; + } + + this.canDelete = false; } private updateFormatOptions() {