@paperbits/core
Version:
Paperbits core components.
68 lines (55 loc) • 2.27 kB
text/typescript
import * as ko from "knockout";
import template from "./blogSelector.html";
import { IResourceSelector } from "@paperbits/common/ui";
import { BlogPostItem } from "./blogPostItem";
import { IBlogService, BlogPostContract } from "@paperbits/common/blogs";
import { Component, Param, Event, OnMounted } from "@paperbits/common/ko/decorators";
import { ChangeRateLimit } from "@paperbits/common/ko/consts";
import { HyperlinkModel } from "@paperbits/common/permalinks";
export class BlogSelector implements IResourceSelector<BlogPostContract> {
public readonly searchPattern: ko.Observable<string>;
public readonly posts: ko.ObservableArray<BlogPostItem>;
public readonly working: ko.Observable<boolean>;
constructor(private readonly blogService: IBlogService) {
this.posts = ko.observableArray();
this.selectedPost = ko.observable();
this.searchPattern = ko.observable();
this.working = ko.observable();
this.posts = ko.observableArray();
this.searchPattern = ko.observable();
this.working = ko.observable();
}
public selectedPost: ko.Observable<BlogPostItem>;
public onSelect: (blog: BlogPostContract) => void;
public onHyperlinkSelect: (selection: HyperlinkModel) => void;
public async onMounted(): Promise<void> {
await this.searchPosts();
this.searchPattern
.extend(ChangeRateLimit)
.subscribe(this.searchPosts);
}
public async searchPosts(searchPattern: string = ""): Promise<void> {
this.working(true);
const blogs = await this.blogService.search(searchPattern);
const blogItems = blogs.map(blog => new BlogPostItem(blog));
this.posts(blogItems);
this.working(false);
}
public async selectPost(blogPost: BlogPostItem): Promise<void> {
this.selectedPost(blogPost);
if (this.onSelect) {
this.onSelect(blogPost.toBlogPost());
}
if (this.onHyperlinkSelect) {
this.onHyperlinkSelect(blogPost.getHyperlink());
}
}
}