add delete button to image view layout

This commit is contained in:
rubikscraft 2022-09-01 13:38:33 +02:00
parent d1419e67cf
commit 69c405c7cc
No known key found for this signature in database
GPG key ID: 1463EBE9200A5CD4
2 changed files with 87 additions and 5 deletions

View file

@ -57,9 +57,12 @@
(main-click)="download()" (main-click)="download()"
> >
<button mat-mini-fab matTooltip="Customize Image" (click)="customize()"> <button mat-mini-fab matTooltip="Customize Image" (click)="customize()">
<mat-icon> tune </mat-icon> <mat-icon fontSet="material-icons-outlined"> tune </mat-icon>
</button> </button>
<button mat-mini-fab matTooltip="Share image" (click)="share()"> <button mat-mini-fab matTooltip="Share image" (click)="share()">
<mat-icon> share </mat-icon> <mat-icon fontSet="material-icons-outlined"> share </mat-icon>
</button>
<button *ngIf="canDelete" mat-mini-fab matTooltip="Delete image" (click)="deleteImage()">
<mat-icon fontSet="material-icons-outlined"> delete </mat-icon>
</button> </button>
</speed-dial> </speed-dial>

View file

@ -1,20 +1,26 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { AutoUnsubscribe } from 'ngx-auto-unsubscribe-decorator';
import { ImageLinks } from 'picsur-shared/dist/dto/image-links.class'; import { ImageLinks } from 'picsur-shared/dist/dto/image-links.class';
import { import {
AnimFileType, AnimFileType,
FileType, FileType,
FileType2Ext, FileType2Ext,
ImageFileType, SupportedFileTypeCategory, ImageFileType,
SupportedFileTypeCategory,
SupportedFileTypes SupportedFileTypes
} from 'picsur-shared/dist/dto/mimes.dto'; } 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 { EImage } from 'picsur-shared/dist/entities/image.entity';
import { EUser } from 'picsur-shared/dist/entities/user.entity'; import { EUser } from 'picsur-shared/dist/entities/user.entity';
import { HasFailed, HasSuccess } from 'picsur-shared/dist/types'; import { HasFailed, HasSuccess } from 'picsur-shared/dist/types';
import { UUIDRegex } from 'picsur-shared/dist/util/common-regex'; import { UUIDRegex } from 'picsur-shared/dist/util/common-regex';
import { ParseFileType } from 'picsur-shared/dist/util/parse-mime'; 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 { 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 { UtilService } from 'src/app/util/util-module/util.service';
import { import {
CustomizeDialogComponent, CustomizeDialogComponent,
@ -31,6 +37,8 @@ export class ViewComponent implements OnInit {
private readonly router: Router, private readonly router: Router,
private readonly imageService: ImageService, private readonly imageService: ImageService,
private readonly utilService: UtilService, private readonly utilService: UtilService,
private readonly permissionService: PermissionService,
private readonly userService: UserService,
) {} ) {}
private id: string; private id: string;
@ -54,7 +62,12 @@ export class ViewComponent implements OnInit {
public image: EImage | null = null; public image: EImage | null = null;
public imageUser: EUser | null = null; public imageUser: EUser | null = null;
public canDelete: boolean = false;
async ngOnInit() { async ngOnInit() {
this.subscribePermissions();
// Extract and verify params
const params = this.route.snapshot.paramMap; const params = this.route.snapshot.paramMap;
this.id = params.get('id') ?? ''; this.id = params.get('id') ?? '';
@ -62,10 +75,12 @@ export class ViewComponent implements OnInit {
return this.utilService.quitError('Invalid image link'); return this.utilService.quitError('Invalid image link');
} }
// Get metadata
const metadata = await this.imageService.GetImageMeta(this.id); const metadata = await this.imageService.GetImageMeta(this.id);
if (HasFailed(metadata)) if (HasFailed(metadata))
return this.utilService.quitError(metadata.getReason()); return this.utilService.quitError(metadata.getReason());
// Populate fields with metadata
this.previewLink = this.imageService.GetImageURL( this.previewLink = this.imageService.GetImageURL(
this.id, this.id,
metadata.fileTypes.master, metadata.fileTypes.master,
@ -76,6 +91,7 @@ export class ViewComponent implements OnInit {
this.imageUser = metadata.user; this.imageUser = metadata.user;
this.image = metadata.image; this.image = metadata.image;
// Populate default selected format
const masterFiletype = ParseFileType(metadata.fileTypes.master); const masterFiletype = ParseFileType(metadata.fileTypes.master);
if (HasSuccess(masterFiletype)) { if (HasSuccess(masterFiletype)) {
this.masterFileType = masterFiletype; this.masterFileType = masterFiletype;
@ -93,6 +109,7 @@ export class ViewComponent implements OnInit {
this.selectedFormat(this.setSelectedFormat); this.selectedFormat(this.setSelectedFormat);
this.updateFormatOptions(); this.updateFormatOptions();
this.updatePermissions();
} }
selectedFormat(format: string) { selectedFormat(format: string) {
@ -115,6 +132,45 @@ export class ViewComponent implements OnInit {
this.utilService.shareFile(this.imageLinks.source); 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() { async customize() {
const options: CustomizeDialogData = { const options: CustomizeDialogData = {
imageID: this.id, imageID: this.id,
@ -131,8 +187,31 @@ export class ViewComponent implements OnInit {
}); });
} }
goBackHome() { @AutoUnsubscribe()
this.router.navigate(['/']); 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() { private updateFormatOptions() {