import React, {useEffect, useState} from "react"; import {useClickAway} from "./useClickAway"; import {FilterOptions, true_type_of} from "./utils"; export function SummaryPopup({id, options, data}) { const [show, setShow] = useState(false); const [position, setPosition] = useState({x: 0, y: 0}); const [size, setSize] = useState({w: 0, h: 0}); let display_options = FilterOptions(options, data); const close = () => { setShow(false); document.removeEventListener("scroll", handleScroll, true); } const ref = useClickAway(close); const reposition = () => { let popup_button = document.getElementById(id + "img"); if (!popup_button) { document.removeEventListener("scroll", handleScroll, true); return; } let rect = popup_button.getBoundingClientRect() let pos_x = (rect.left + rect.right) / 2; let pos_y = (rect.top + rect.bottom) / 2; if (pos_x + size.w > window.innerWidth) { setPosition({x: pos_x - size.w - 20, y: pos_y - size.h / 2}); } else { setPosition({x: pos_x - size.w / 2, y: pos_y - size.h - 20}); } } const handleScroll = (e) => { if (e.target !== document.getElementById(id)) { close(); } } useEffect(() => { if (show) { let popup = document.getElementById(id); let width = popup.offsetWidth; let height = popup.offsetHeight; setSize({w: width, h: height}); reposition() } }, [show]) useEffect(() => { if (show) { reposition(); } }, [show, size]) const handleClick = (_event) => { setShow(!show); if (!show) { document.addEventListener("scroll", handleScroll, true); } }; const stringify = (value) => { let value_type = true_type_of(value); if (value_type === "string") { return value; } else if (value_type === "object") { if (value.checked === false) { return "off"; } else if (value.checked === true && value.text) { return value.text; } } return JSON.stringify(value); } return (
{Array.from(Object.entries(display_options) .filter(([key, value], _) => key !== "ext_data") .map(([key, value], _) => { return (

{key}: {stringify(value)}

); }))}
); }