|
@@ -1,4 +1,5 @@
|
|
|
import { EventCallback, Template } from "./templateManager";
|
|
|
+import * as Handlebars from 'handlebars/dist/handlebars';
|
|
|
|
|
|
export interface IViewerTemplatePlugin {
|
|
|
|
|
@@ -12,13 +13,32 @@ export interface IViewerTemplatePlugin {
|
|
|
|
|
|
export abstract class AbstractViewerNavbarButton implements IViewerTemplatePlugin {
|
|
|
|
|
|
-
|
|
|
-
|
|
|
public readonly templateName: string = "navBar";
|
|
|
public readonly eventsToAttach: Array<string> = ['pointerdown'];
|
|
|
protected _prepend: boolean = true;
|
|
|
+ protected abstract _buttonClass: string;
|
|
|
+ protected abstract _htmlTemplate: string;
|
|
|
+
|
|
|
+ interactionPredicate(event: EventCallback): boolean {
|
|
|
+ let pointerDown = <PointerEvent>event.event;
|
|
|
+ if (pointerDown.button !== 0) return false;
|
|
|
+ var element = (<HTMLElement>event.event.target);
|
|
|
+
|
|
|
+ if (!element) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ let elementClasses = element.classList;
|
|
|
|
|
|
- abstract interactionPredicate(event: EventCallback): boolean;
|
|
|
+ for (let i = 0; i < elementClasses.length; ++i) {
|
|
|
+ let className = elementClasses[i];
|
|
|
+ if (className.indexOf(this._buttonClass) !== -1) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
abstract onEvent(event: EventCallback): void;
|
|
|
|
|
|
public addHTMLTemplate(template: Template): void {
|
|
@@ -33,5 +53,18 @@ export abstract class AbstractViewerNavbarButton implements IViewerTemplatePlugi
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- protected abstract _generateHTMLElement(template: Template): HTMLElement;
|
|
|
+ protected _generateHTMLElement(template: Template): Element | DocumentFragment {
|
|
|
+ let compiledTemplate = Handlebars.compile(this._htmlTemplate, { noEscape: (template.configuration.params && !!template.configuration.params.noEscape) });
|
|
|
+ let config = template.configuration.params || {};
|
|
|
+ let rawHtml = compiledTemplate(config);
|
|
|
+ let fragment: Element | DocumentFragment;
|
|
|
+ try {
|
|
|
+ fragment = document.createRange().createContextualFragment(rawHtml);
|
|
|
+ } catch (e) {
|
|
|
+ let test = document.createElement(this._buttonClass);
|
|
|
+ test.innerHTML = rawHtml;
|
|
|
+ fragment = test;
|
|
|
+ }
|
|
|
+ return fragment;
|
|
|
+ }
|
|
|
}
|