import { HTMLWidget, Widget } from "@hpcc-js/common"; export class Popup extends HTMLWidget { _surfaceButtons; _originalPosition; constructor() { super(); this._tag = "div"; this._surfaceButtons = []; } updateState(visible) { visible = visible || !this.popupState(); this.popupState(visible).render(); } enter(domNode, element) { super.enter(domNode, element); this.widget() .target(domNode) ; this._originalPosition = this.position(); } update(domNode, element) { super.update(domNode, element); element .style("visibility", this.popupState() ? null : "hidden") .style("opacity", this.popupState() ? null : 0) .style("width", this.shrinkWrap() ? this.widget().width() + "px" : this._size.width + "px") .style("height", this.shrinkWrap() ? this.widget().height() + "px" : this._size.height + "px") ; if (this.widget().size().height === 0) { this.widget().resize(this.size()); } } postUpdate(domNode, element) { let left; let top; switch (this.centerPopup()) { case "container": if (this._placeholderElement) { left = parseInt(this._placeholderElement.style("width")) / 2 - this.widget().width() / 2; top = parseInt(this._placeholderElement.style("height")) / 2 - this.widget().height() / 2; } this.position("absolute"); break; case "window": left = window.innerWidth / 2 - this.widget().width() / 2; top = window.innerHeight / 2 - this.widget().height() / 2; this.position("fixed"); break; default: left = 0; top = 0; this.position(this._originalPosition); break; } this.pos({ x: left, y: top }); super.postUpdate(domNode, element); element .style("position", this.position()) .style("left", this.left() + "px") .style("right", this.right() + "px") .style("top", this.top() + "px") .style("bottom", this.bottom() + "px") ; } exit(domNode, element) { if (this.widget()) { this.widget().target(null); } super.exit(domNode, element); } click(obj) { } } Popup.prototype._class += " layout_Popup"; export interface Popup { popupState(): boolean; popupState(_: boolean): this; shrinkWrap(): boolean; shrinkWrap(_: boolean): this; centerPopup(): "none" | "container" | "window"; centerPopup(_: "none" | "container" | "window"): this; top(): number; top(_: number): this; bottom(): number; bottom(_: number): this; left(): number; left(_: number): this; right(): number; right(_: number): this; position(): string; position(_: string): this; widget(): Widget; widget(_: Widget): this; } Popup.prototype.publish("popupState", false, "boolean", "State of the popup, visible (true) or hidden (false)", null, {}); Popup.prototype.publish("shrinkWrap", false, "boolean", "The popup parent container either shrinks to the size of its contents (true) or expands to fit thge popup's parentDiv (false)", null, {}); Popup.prototype.publish("centerPopup", "none", "set", "Center the widget in its container element (target) or in the window", ["none", "container", "window"], {}); Popup.prototype.publish("top", null, "number", "Top position property of popup", null, {}); Popup.prototype.publish("bottom", null, "number", "Bottom position property of popup", null, {}); Popup.prototype.publish("left", null, "number", "Left position property of popup", null, {}); Popup.prototype.publish("right", null, "number", "Right position property of popup", null, {}); Popup.prototype.publish("position", "relative", "set", "Value of the 'position' property", ["absolute", "relative", "fixed", "static", "initial", "inherit"], { tags: ["Private"] }); Popup.prototype.publish("widget", null, "widget", "Widget", null, { tags: ["Private"] });