UNPKG

@paperbits/core

Version:
90 lines (71 loc) 3.11 kB
import * as ko from "knockout"; import template from "./blogPostDetails.html"; import { IBlogService } from "@paperbits/common/blogs"; import { Router } from "@paperbits/common/routing"; import { ViewManager } from "@paperbits/common/ui"; import { Component, Param, Event, OnMounted } from "@paperbits/common/ko/decorators"; import { BlogPostItem } from "./blogPostItem"; @Component({ selector: "blog-post-details-workshop", template: template }) export class BlogPostDetailsWorkshop { public readonly isReserved: ko.Observable<boolean>; constructor( private readonly blogService: IBlogService, private readonly router: Router, private readonly viewManager: ViewManager, private readonly reservedPermalinks: string[] ) { this.isReserved = ko.observable(false); } @Param() public readonly blogPostItem: BlogPostItem; @Event() public readonly onDeleteCallback: () => void; @OnMounted() public async onMounted(): Promise<void> { this.blogPostItem.title .extend(<any>{ required: true }) .subscribe(this.updateBlogPost); this.blogPostItem.description .subscribe(this.updateBlogPost); this.blogPostItem.keywords .subscribe(this.updateBlogPost); this.blogPostItem.permalink .extend(<any>{ validPermalink: this.blogPostItem.permalink, required: true, onlyValid: true }) .subscribe(this.updatePermlaink); let validPermalink = this.blogPostItem.permalink; if (this.reservedPermalinks.includes(this.blogPostItem.permalink())) { this.isReserved(true); } else { validPermalink = validPermalink.extend(<any>{ required: true, validPermalink: this.blogPostItem.key, onlyValid: true }); validPermalink.subscribe(this.updatePermlaink); } await this.router.navigateTo(validPermalink()); this.viewManager.setHost({ name: "blog-post-host" }); } private async updateBlogPost(): Promise<void> { if ((<any>this.blogPostItem.title).isValid()) { await this.blogService.updateBlogPost(this.blogPostItem.toBlogPost()); } } private async updatePermlaink(): Promise<void> { const permalink = this.blogPostItem.permalink(); this.router.notifyListeners = false; // this.router.navigateTo(permalink); this.router.notifyListeners = true; this.updateBlogPost(); } public async deleteBlogPost(): Promise<void> { // TODO: Show confirmation dialog according to mockup await this.blogService.deleteBlogPost(this.blogPostItem.toBlogPost()); this.viewManager.notifySuccess("Blog", `Post "${this.blogPostItem.title()}" was deleted.`); this.viewManager.closeWorkshop("blog-post-details-workshop"); if (this.onDeleteCallback) { this.onDeleteCallback(); } this.router.navigateTo("/"); } }