mirror of
https://github.com/Tzahi12345/YoutubeDL-Material.git
synced 2026-03-26 06:30:58 +03:00
105 lines
3.3 KiB
TypeScript
105 lines
3.3 KiB
TypeScript
import { Component, OnInit, Inject } from '@angular/core';
|
|
import { filesize } from 'filesize';
|
|
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
import { PostsService } from 'app/posts.services';
|
|
import { Category, DatabaseFile } from 'api-types';
|
|
import { DatePipe } from '@angular/common';
|
|
|
|
@Component({
|
|
selector: 'app-video-info-dialog',
|
|
templateUrl: './video-info-dialog.component.html',
|
|
styleUrls: ['./video-info-dialog.component.scss']
|
|
})
|
|
export class VideoInfoDialogComponent implements OnInit {
|
|
file: DatabaseFile;
|
|
new_file: DatabaseFile;
|
|
filesize;
|
|
window = window;
|
|
upload_date: Date;
|
|
category: Category;
|
|
editing = false;
|
|
initialized = false;
|
|
retrieving_file = false;
|
|
write_access = false;
|
|
|
|
constructor(@Inject(MAT_DIALOG_DATA) public data: any, public postsService: PostsService, private datePipe: DatePipe) { }
|
|
|
|
ngOnInit(): void {
|
|
this.filesize = filesize;
|
|
if (this.data) {
|
|
this.initializeFile(this.data.file);
|
|
}
|
|
this.postsService.reloadCategories();
|
|
this.write_access = !this.file.user_uid || (this.file.user_uid && this.postsService.user?.uid === this.file.user_uid);
|
|
}
|
|
|
|
initializeFile(file: DatabaseFile): void {
|
|
this.file = file;
|
|
this.new_file = JSON.parse(JSON.stringify(file));
|
|
|
|
// use UTC for the date picker. not the cleanest approach but it allows it to match the upload date
|
|
this.upload_date = new Date(this.new_file.upload_date);
|
|
this.upload_date.setMinutes( this.upload_date.getMinutes() + this.upload_date.getTimezoneOffset() );
|
|
|
|
this.category = this.file.category ? this.file.category : {};
|
|
|
|
// we need to align whether missing category is null or undefined. this line helps with that.
|
|
if (!this.file.category) { this.new_file.category = null; this.file.category = null; }
|
|
this.initialized = true;
|
|
}
|
|
|
|
saveChanges(): void {
|
|
const change_obj = {};
|
|
const keys = Object.keys(this.new_file);
|
|
keys.forEach(key => {
|
|
if (this.file[key] !== this.new_file[key]) change_obj[key] = this.new_file[key];
|
|
});
|
|
|
|
this.postsService.updateFile(this.file.uid, change_obj).subscribe(res => {
|
|
this.getFile();
|
|
});
|
|
}
|
|
|
|
getFile(): void {
|
|
this.retrieving_file = true;
|
|
this.postsService.getFile(this.file.uid).subscribe(res => {
|
|
this.retrieving_file = false;
|
|
this.file = res['file'];
|
|
this.initializeFile(this.file);
|
|
}, err => {
|
|
this.retrieving_file = false;
|
|
console.error(err);
|
|
});
|
|
}
|
|
|
|
uploadDateChanged(event): void {
|
|
this.new_file.upload_date = this.datePipe.transform(event.value, 'yyyy-MM-dd');
|
|
}
|
|
|
|
categoryChanged(event): void {
|
|
const new_category = event.value;
|
|
this.new_file.category = Object.keys(new_category).length ? {uid: new_category.uid, name: new_category.name} : null;
|
|
}
|
|
|
|
categoryComparisonFunction(option: Category, value: Category): boolean {
|
|
// can't access properties of null/undefined values, prehandle these
|
|
if (!option && !value) return true;
|
|
else if (!option || !value) return false;
|
|
|
|
return option.uid === value.uid;
|
|
}
|
|
|
|
metadataChanged(): boolean {
|
|
return JSON.stringify(this.file) !== JSON.stringify(this.new_file);
|
|
}
|
|
|
|
toggleFavorite(): void {
|
|
this.file.favorite = !this.file.favorite;
|
|
this.retrieving_file = true;
|
|
this.postsService.updateFile(this.file.uid, {favorite: this.file.favorite}).subscribe(res => {
|
|
this.getFile();
|
|
});
|
|
}
|
|
|
|
}
|