@paperbits/core
Version:
Paperbits core components.
53 lines (43 loc) • 2.36 kB
text/typescript
import * as ko from "knockout";
import { IHtmlEditor } from "@paperbits/common/editing/IHtmlEditor";
import { EventManager, Events } from "@paperbits/common/events";
import { BlockModel } from "@paperbits/common/text/models";
import { TextblockViewModel } from "../../textblock/ko/textblockViewModel";
export class TextblockBindingHandler {
constructor(
eventManager: EventManager,
htmlEditorFactory: any
) {
ko.bindingHandlers["textblock"] = {
init(element: HTMLElement, valueAccessor: () => BlockModel[], allBindings: any, viewModel: TextblockViewModel): void {
const config = valueAccessor();
const htmlEditor: IHtmlEditor = htmlEditorFactory.createHtmlEditor();
htmlEditor.onStateChange = (newContent: BlockModel[]) => {
viewModel["widgetBinding"].model.content = newContent;
eventManager.dispatchEvent(Events.ContentUpdate); // TODO: Move this event emit to TextblockEditor
};
const onEscapeKeyPressed = () => htmlEditor.detachFromElement();
eventManager.addEventListener("onEscape", onEscapeKeyPressed);
const onViewClose = () => htmlEditor.detachFromElement();
eventManager.addEventListener("onViewClose", onViewClose);
const onHtmlEditorRequested = (model) => {
if (viewModel["widgetBinding"].model == model) {
htmlEditor.enable(element);
}
else {
htmlEditor.enable();
}
}
htmlEditor.attachToElement(element);
htmlEditor.setState(ko.unwrap(config));
eventManager.addEventListener("enableHtmlEditor", onHtmlEditorRequested);
ko.utils.domNodeDisposal.addDisposeCallback(element, () => {
eventManager.removeEventListener("onEscape", onEscapeKeyPressed);
eventManager.removeEventListener("onViewClose", onViewClose);
eventManager.removeEventListener("enableHtmlEditor", onHtmlEditorRequested);
htmlEditor.detachFromElement();
});
}
};
}
}