import XNode from "@web-atoms/core/dist/core/XNode"; import type { IAnchorPopover } from "./elements/AtomPopover"; import { AtomControl } from "@web-atoms/core/dist/web/controls/AtomControl"; import { App } from "@web-atoms/core/dist/App"; import AtomPopover from "./elements/AtomPopover"; export type PopupFactory = (data) => XNode; export interface IPopupButton extends IAnchorPopover { icon?: string; text?: string; label?: string; popup?: PopupFactory; closeOnClick?: boolean; [k: string]: any; } export default function InlinePopupButton( { icon, text, label, closeOnClick = true, popup, ... a }: IPopupButton, ... nodes: XNode[]) { if(!a["anchor-right"]) { a["anchor-left"] ??= "parent-right"; } if (!a["anchor-bottom"]) { a["anchor-top"] ??= "parent-top"; } a["data-atom-popup-button"] = "popup-button"; if (!popup) { const copy = nodes; const div =
{ ... copy }
; popup = () => div; nodes = []; } a["popupFactory"] = popup; if (closeOnClick) { a["data-close-on-click"] = true; } if(!a["data-layout"]) { if (icon && text) { a["data-layout"] = "icon-button"; } else { a["data-layout"] = "button"; } } return ; } document.body.addEventListener("click", (e) => { let start = e.target as HTMLElement; while(start) { if(start.hasAttribute("data-atom-popup-button")) { break; } start = start.parentElement as HTMLElement; } if (!start) { return; } const pf = start["popupFactory"] as PopupFactory; if (!pf) { return; } const control = AtomControl.from(start) as any; const app = control.app as App; const target = start; const element = control.element; const dataFactory = () => { let itemIndex; let data; if (control.items && control.itemRenderer) { // this is atom repeater while (start && start !== element) { itemIndex ??= start.getAttribute("data-item-index"); if (itemIndex) { data = control.items[~~itemIndex]; break; } start = start.parentElement; } } if (!data) { data = new Proxy(target, { get(t, p, receiver) { let s = target; while (s) { const v = s.dataset[p as string]; if (v !== void 0) { return v; } s = s.parentElement; } }, }); } return data; }; let closeOnClick = void 0; const dataCloseOnClick = target.getAttribute("data-close-on-click"); if (dataCloseOnClick) { closeOnClick = /^(true|yes|1)$/i.test(dataCloseOnClick); } AtomPopover.create(target, { nodeFactory: (data) => pf(data), dataFactory, closeOnClick, "anchor-bottom": target.getAttribute("anchor-bottom") as any, "anchor-top": target.getAttribute("anchor-top") as any, "anchor-left": target.getAttribute("anchor-left") as any, "anchor-right": target.getAttribute("anchor-right") as any, }); })