@paperbits/core
Version:
Paperbits core components.
108 lines (92 loc) • 3.62 kB
text/typescript
import * as ko from "knockout";
import * as FileSaver from "file-saver";
import template from "./mediaDetails.html";
import { IMediaService } from "@paperbits/common/media";
import { ViewManager } from "@paperbits/common/ui";
import { MediaItem } from "./mediaItem";
import { Component, Param, Event, OnMounted } from "@paperbits/common/ko/decorators";
import { ChangeRateLimit } from "@paperbits/common/ko/consts";
import { MimeTypes } from "@paperbits/common";
export class MediaDetailsWorkshop {
public contentTypes: string[] = [
MimeTypes.imageGif,
MimeTypes.imageJpeg,
MimeTypes.imagePng,
MimeTypes.imageTiff,
MimeTypes.imageIcon,
MimeTypes.imageSvg,
MimeTypes.videoMpeg,
MimeTypes.videoMp4,
MimeTypes.videoQt,
MimeTypes.videoWmv,
MimeTypes.videoFlv,
MimeTypes.videoWebm
];
public readonly mediaItem: MediaItem;
private readonly onDeleteCallback: () => void;
constructor(
private readonly mediaService: IMediaService,
private readonly viewManager: ViewManager
) { }
public async onMounted(): Promise<void> {
this.mediaItem.fileName
.extend(ChangeRateLimit)
.extend(<any>{ required: true, onlyValid: true })
.subscribe(this.updateMedia);
this.mediaItem.downloadUrl
.extend(ChangeRateLimit)
.extend(<any>{ required: true, onlyValid: true })
.subscribe(this.updateMediaUrl);
this.mediaItem.mimeType
.extend(ChangeRateLimit)
.extend(<any>{ required: true, onlyValid: true })
.subscribe(this.updateMedia);
this.mediaItem.description
.extend(ChangeRateLimit)
.subscribe(this.updateMedia);
this.mediaItem.keywords
.extend(ChangeRateLimit)
.subscribe(this.updateMedia);
this.mediaItem.permalink
.extend(<any>{ required: true, isValidPermalink: true, onlyValid: true })
.subscribe(this.updateMedia);
}
private async updateMediaUrl(): Promise<void> {
if (this.mediaItem.isDefaultFileName() && !this.mediaItem.isDefaultUrl()) {
const newName = this.mediaItem.downloadUrl().split("/").pop();
this.mediaItem.updateDefault(newName);
}
await this.updateMedia();
}
private async updateMedia(): Promise<void> {
await this.mediaService.updateMedia(this.mediaItem.toMedia());
}
public async deleteMedia(): Promise<void> {
await this.mediaService.deleteMedia(this.mediaItem.toMedia());
this.viewManager.notifySuccess("Media library", `File "${this.mediaItem.fileName()}" was deleted.`);
this.viewManager.closeWorkshop("media-details-workshop");
if (this.onDeleteCallback) {
this.onDeleteCallback();
}
}
public downloadMedia(): void {
FileSaver.saveAs(this.mediaItem.downloadUrl(), this.mediaItem.fileName(), { type: this.mediaItem.mimeType() });
}
public openCropper(): void {
this.viewManager.openViewAsPopup({
heading: "Edit picture",
component: {
name: "picture-cropper",
params: { mediaItem: this.mediaItem }
},
resizing: "vertically horizontally"
});
}
}