From 266326c40c4059b2fe9ded19ef96ef2812c84656 Mon Sep 17 00:00:00 2001 From: Davide Passoni Date: Mon, 31 Mar 2025 11:29:00 +0200 Subject: [PATCH] fix: Added callback to close all tooltips on click --- .../react/src/ui/components/olbuttongroup.tsx | 9 +- .../src/ui/components/olcoalitiontoggle.tsx | 123 +++++++++--------- .../react/src/ui/components/oldropdown.tsx | 15 ++- .../react/src/ui/components/ollabeltoggle.tsx | 8 +- .../react/src/ui/components/olnumberinput.tsx | 8 +- .../react/src/ui/components/olstatebutton.tsx | 20 ++- frontend/react/src/ui/components/oltoggle.tsx | 8 +- .../react/src/ui/components/olunitsummary.tsx | 40 +++--- 8 files changed, 144 insertions(+), 87 deletions(-) diff --git a/frontend/react/src/ui/components/olbuttongroup.tsx b/frontend/react/src/ui/components/olbuttongroup.tsx index 5d5bf819..e23210d4 100644 --- a/frontend/react/src/ui/components/olbuttongroup.tsx +++ b/frontend/react/src/ui/components/olbuttongroup.tsx @@ -1,6 +1,6 @@ import { IconProp } from "@fortawesome/fontawesome-svg-core"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import React, { useRef, useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import { OlTooltip } from "./oltooltip"; export function OlButtonGroup(props: { @@ -12,6 +12,13 @@ export function OlButtonGroup(props: { const [hover, setHover] = useState(false); const [hoverTimeout, setHoverTimeout] = useState(null as number | null); var buttonRef = useRef(null); + + useEffect(() => { + window.addEventListener("click", (e) => { + setHover(false); + }); + }, []); + return ( <>
{ + window.addEventListener("click", (e) => { + setHover(false); + }); + }, []); + return ( <> -
{ - e.stopPropagation(); - props.onClick(); - props.onClick ?? setHover(false); - }} - onMouseEnter={() => { - setHoverTimeout( - window.setTimeout(() => { - setHover(true); - setHoverTimeout(null); - }, 400) - ); - }} - onMouseLeave={() => { - setHover(false); - if (hoverTimeout) { - window.clearTimeout(hoverTimeout); - setHoverTimeout(null); - } - }} - ref={buttonRef} - > -
+ {props.showLabel && ( + + {props.coalition ? `${props.coalition[0].toLocaleUpperCase() + props.coalition.substring(1)}` : "Diff. values"} + + )} +
+ {hover && props.tooltip && ( { + window.addEventListener("click", (e) => { + setHover(false); + }); + }, []); + function setPosition(content: HTMLDivElement, button: HTMLButtonElement) { /* Reset the position of the content */ content.style.left = "0px"; @@ -126,12 +132,9 @@ export function OlDropdown(props: { } }} > - {props.leftIcon && ( - - )} + {props.leftIcon && } {props.label ?? ""} { + window.addEventListener("click", (e) => { + setHover(false); + }); + }, []); + return ( <>
{ + window.addEventListener("click", (e) => { + setHover(false); + }); + }, []); + const className = (props.className ?? "") + ` @@ -109,6 +115,12 @@ export function OlRoundStateButton(props: { const [hoverTimeout, setHoverTimeout] = useState(null as number | null); var buttonRef = useRef(null); + useEffect(() => { + window.addEventListener("click", (e) => { + setHover(false); + }); + }, []); + const className = (props.className ?? "") + ` @@ -169,6 +181,12 @@ export function OlLockStateButton(props: { const [hoverTimeout, setHoverTimeout] = useState(null as number | null); var buttonRef = useRef(null); + useEffect(() => { + window.addEventListener("click", (e) => { + setHover(false); + }); + }, []); + const className = (props.className ?? "") + ` diff --git a/frontend/react/src/ui/components/oltoggle.tsx b/frontend/react/src/ui/components/oltoggle.tsx index 0500a8c3..ae34abfb 100644 --- a/frontend/react/src/ui/components/oltoggle.tsx +++ b/frontend/react/src/ui/components/oltoggle.tsx @@ -1,4 +1,4 @@ -import React, { useRef, useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import { OlTooltip } from "./oltooltip"; export function OlToggle(props: { @@ -12,6 +12,12 @@ export function OlToggle(props: { const [hoverTimeout, setHoverTimeout] = useState(null as number | null); var buttonRef = useRef(null); + useEffect(() => { + window.addEventListener("click", (e) => { + setHover(false); + }); + }, []); + return ( <>
{ + window.addEventListener("click", (e) => { + setHover(false); + }); + }, []); + useEffect(() => { getWikipediaImage(props.blueprint.label).then((url) => { setImageUrl(url); @@ -63,9 +67,7 @@ export function OlUnitSummary(props: { blueprint: UnitBlueprint; coalition: Coal
{imageUrl && (
- +
Hover to show image
)} @@ -82,17 +84,21 @@ export function OlUnitSummary(props: { blueprint: UnitBlueprint; coalition: Coal
{props.blueprint.abilities?.split(" ").map((ability) => { - return <>{ ability.replaceAll(" ", "") !== "" && -
- {ability} -
- } + return ( + <> + {ability.replaceAll(" ", "") !== "" && ( +
+ {ability} +
+ )} + + ); })}