@paperbits/core
Version:
Paperbits core components.
82 lines (67 loc) • 2.9 kB
text/typescript
import * as ko from "knockout";
import template from "./urlDetails.html";
import * as Utils from "@paperbits/common/utils";
import { IUrlService } from "@paperbits/common/urls";
import { Router } from "@paperbits/common/routing";
import { ViewManager } from "@paperbits/common/ui";
import { Component, Param, Event, OnMounted } from "@paperbits/common/ko/decorators";
import { UrlItem } from "./urlItem";
import { BackgroundModel } from "@paperbits/common/widgets/background";
import { ILocaleService } from "@paperbits/common/localization";
export class UrlDetailsWorkshop {
public readonly isReserved: ko.Observable<boolean>;
public readonly isSeoEnabled: ko.Observable<boolean>;
public readonly socialShareImage: ko.Observable<BackgroundModel>;
constructor(
private readonly urlService: IUrlService,
private readonly router: Router,
private readonly viewManager: ViewManager,
private readonly reservedPermalinks: string[],
private readonly localeService: ILocaleService
) {
this.isReserved = ko.observable(false);
this.isSeoEnabled = ko.observable(false);
this.socialShareImage = ko.observable();
}
public urlItem: UrlItem;
private readonly onDeleteCallback: () => void;
public async onMounted(): Promise<void> {
this.urlItem.title
.extend(<any>{ required: true, onlyValid: true })
.subscribe(this.applyChanges);
this.urlItem.description
.subscribe(this.applyChanges);
let validPermalink = this.urlItem.permalink;
if (this.reservedPermalinks.includes(this.urlItem.permalink())) {
this.isReserved(true);
}
else {
validPermalink = validPermalink.extend(<any>{ required: true, isValidUrl: true, onlyValid: true });
validPermalink.subscribe(this.applyChanges);
}
const locale = await this.localeService.getCurrentLocaleCode();
const defaultLocale = await this.localeService.getDefaultLocaleCode();
if (locale !== defaultLocale) {
this.isReserved(true);
}
}
private async applyChanges(): Promise<void> {
await this.urlService.updateUrl(this.urlItem.toContract());
}
public async deleteUrl(): Promise<void> {
await this.urlService.deleteUrl(this.urlItem.toContract());
this.viewManager.notifySuccess("URLs", `URL "${Utils.truncate(this.urlItem.title(), 50)}" was deleted.`);
this.viewManager.closeWorkshop("url-details-workshop");
if (this.onDeleteCallback) {
this.onDeleteCallback();
}
this.router.navigateTo("/");
}
}