@paperbits/core
Version:
Paperbits core components.
92 lines (71 loc) • 3.42 kB
text/typescript
import * as ko from "knockout";
import template from "./layoutDetails.html";
import { ViewManager } from "@paperbits/common/ui";
import { ILayoutService } from "@paperbits/common/layouts/";
import { LayoutItem } from "./layoutItem";
import { Component, Param, Event, OnMounted } from "@paperbits/common/ko/decorators";
import { EventManager, Events } from "@paperbits/common/events";
export class LayoutDetails {
public isDefaultLayout: ko.Computed<boolean>;
public canDelete: ko.Computed<boolean>;
public readonly permalinkTemplate: ko.Observable<string>;
constructor(
private readonly layoutService: ILayoutService,
private readonly viewManager: ViewManager,
private readonly eventManager: EventManager
) {
this.permalinkTemplate = ko.observable();
}
public readonly layoutItem: LayoutItem;
public readonly onDeleteCallback: () => void;
private readonly onCopyCallback: (layoutItem: LayoutItem) => void;
public async onMounted(): Promise<void> {
this.layoutItem.title
.extend(<any>{ required: true, onlyValid: true })
.subscribe(this.updateLayout);
this.permalinkTemplate(this.layoutItem.permalinkTemplate());
const validPermalinkTemplate = this.permalinkTemplate
.extend(<any>{ uniqueLayoutUri: this.layoutItem.key, required: true, onlyValid: true });
validPermalinkTemplate.subscribe(this.updateLayout);
this.layoutItem.description
.subscribe(this.updateLayout);
this.isDefaultLayout = ko.pureComputed(() => {
return validPermalinkTemplate() === "/";
});
this.canDelete = ko.computed(() => {
return !this.isDefaultLayout();
});
this.viewManager.setHost({ name: "layout-host", params: { layoutKey: this.layoutItem.key } });
this.eventManager.dispatchEvent(Events.HintRequest, {
key: "48f5",
content: `<p>You may have different page layouts for different parts of your website. Which layout gets applied at a given moment is determined by matching its URL template to URL of the current page.</p><p>Press Escape button to get back to the page editing.</p>`
});
}
private async updateLayout(): Promise<void> {
this.layoutItem.permalinkTemplate(this.permalinkTemplate());
await this.layoutService.updateLayout(this.layoutItem.toContract());
}
public async deleteLayout(): Promise<void> {
await this.layoutService.deleteLayout(this.layoutItem.toContract());
this.viewManager.notifySuccess("Layouts", `Page "${this.layoutItem.title()}" was deleted.`);
this.viewManager.closeWorkshop("layout-details-workshop");
if (this.onDeleteCallback) {
this.onDeleteCallback();
}
this.viewManager.setHost({ name: "page-host" }); // Returning to editing current page.
}
public async copyLayout(): Promise<void> {
const copiedLayout = await this.layoutService.copyLayout(this.layoutItem.key);
if (this.onCopyCallback) {
this.onCopyCallback(new LayoutItem(copiedLayout));
}
}
}