UNPKG

@paperbits/core

Version:
103 lines (83 loc) 3.32 kB
import * as ko from "knockout"; import template from "./blogs.html"; import { IBlogService } from "@paperbits/common/blogs"; import { Router } from "@paperbits/common/routing"; import { ViewManager, View } from "@paperbits/common/ui"; import { Keys } from "@paperbits/common/keyboard"; import { Component, OnMounted } from "@paperbits/common/ko/decorators"; import { BlogPostItem } from "./blogPostItem"; import { ChangeRateLimit } from "@paperbits/common/ko/consts"; @Component({ selector: "blogs", template: template }) export class BlogWorkshop { public readonly searchPattern: ko.Observable<string>; public readonly blogPosts: ko.ObservableArray<BlogPostItem>; public readonly working: ko.Observable<boolean>; public readonly selectedBlogPost: ko.Observable<BlogPostItem>; constructor( private readonly blogService: IBlogService, private readonly router: Router, private readonly viewManager: ViewManager, ) { this.blogPosts = ko.observableArray(); this.selectedBlogPost = ko.observable(); this.searchPattern = ko.observable<string>(""); this.working = ko.observable(); } @OnMounted() public async initialize(): Promise<void> { await this.searchPosts(); this.searchPattern .extend(ChangeRateLimit) .subscribe(this.searchPosts); } public async searchPosts(searchPattern: string = ""): Promise<void> { this.working(true); const blogposts = await this.blogService.search(searchPattern); const blogpostItems = blogposts.map(blogPost => new BlogPostItem(blogPost)); this.blogPosts(blogpostItems); this.working(false); } public selectBlogPost(blogPostItem: BlogPostItem): void { const prev = this.selectedBlogPost(); // if (prev) { // prev.isSelected(false); // } this.selectedBlogPost(blogPostItem); // blogPostItem.isSelected(true); const view: View = { heading: "Blog post", component: { name: "blog-post-details-workshop", params: { blogPostItem: blogPostItem, onDeleteCallback: () => { this.searchPosts(); } } } }; this.viewManager.openViewAsWorkshop(view); } public async addBlogPost(): Promise<void> { this.working(true); const postUrl = "/blog/new"; const post = await this.blogService.createBlogPost(postUrl, "New blog post", "", ""); const postItem = new BlogPostItem(post); this.blogPosts.push(postItem); this.selectBlogPost(postItem); this.working(false); } public async deleteSelectedBlogPost(): Promise<void> { // TODO: Show confirmation dialog according to mockup await this.blogService.deleteBlogPost(this.selectedBlogPost().toBlogPost()); this.router.navigateTo("/"); } public keydown(item: BlogPostItem, event: KeyboardEvent): void { if (event.key === Keys.Delete) { this.deleteSelectedBlogPost(); } } }