@paperbits/core
Version:
Paperbits core components.
103 lines (83 loc) • 3.32 kB
text/typescript
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";
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();
}
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();
}
}
}