From a718fe13aa0620b6b3e43d006a214e441af8fce0 Mon Sep 17 00:00:00 2001 From: Romulo Gatto Date: Sun, 9 Aug 2026 13:01:33 -0300 Subject: [PATCH] fix: keep chart tooltips within visible bounds --- monoscope.cabal | 1 + src/Pkg/Components/Widget.hs | 5 ++++- test/unit/Pkg/WidgetTooltipSpec.hs | 28 ++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 test/unit/Pkg/WidgetTooltipSpec.hs diff --git a/monoscope.cabal b/monoscope.cabal index 1634bf897..1bfece5ff 100644 --- a/monoscope.cabal +++ b/monoscope.cabal @@ -1126,6 +1126,7 @@ test-suite unit-tests Pkg.ParserSpec Pkg.QueryCacheSpec Pkg.WidgetLazySpec + Pkg.WidgetTooltipSpec RequestMessagesSpec Spec System.ServerSpec diff --git a/src/Pkg/Components/Widget.hs b/src/Pkg/Components/Widget.hs index 38692beeb..dd223087d 100644 --- a/src/Pkg/Components/Widget.hs +++ b/src/Pkg/Components/Widget.hs @@ -877,7 +877,10 @@ widgetToECharts widget = AE..= AE.object [ "show" AE..= fromMaybe True widget.showTooltip , "trigger" AE..= ("axis" :: Text) - , "appendToBody" AE..= True + , "appendToBody" AE..= False + , "confine" AE..= True + , "enterable" AE..= True + , "extraCssText" AE..= ("box-sizing: border-box; max-height: calc(100% - 16px); overflow-y: auto; overscroll-behavior: contain;" :: Text) , "axisPointer" AE..= AE.object ["type" AE..= ("shadow" :: Text)] diff --git a/test/unit/Pkg/WidgetTooltipSpec.hs b/test/unit/Pkg/WidgetTooltipSpec.hs new file mode 100644 index 000000000..3519b7bcd --- /dev/null +++ b/test/unit/Pkg/WidgetTooltipSpec.hs @@ -0,0 +1,28 @@ +module Pkg.WidgetTooltipSpec (spec) where + +import Data.Aeson qualified as AE +import Data.Aeson.Key qualified as K +import Data.Aeson.KeyMap qualified as KM +import Data.Default (def) +import Pkg.Components.Widget qualified as Widget +import Relude +import Test.Hspec + + +tooltipField :: Text -> Maybe AE.Value +tooltipField key = do + AE.Object root <- pure $ Widget.widgetToECharts def + AE.Object tooltip <- KM.lookup "tooltip" root + KM.lookup (K.fromText key) tooltip + + +spec :: Spec +spec = describe "widget tooltip viewport containment" do + it "renders tooltips inside the chart and confines them to its visible bounds" do + tooltipField "appendToBody" `shouldBe` Just (AE.Bool False) + tooltipField "confine" `shouldBe` Just (AE.Bool True) + + it "keeps tall multi-series tooltips scrollable and enterable" do + tooltipField "enterable" `shouldBe` Just (AE.Bool True) + tooltipField "extraCssText" + `shouldBe` Just (AE.String "box-sizing: border-box; max-height: calc(100% - 16px); overflow-y: auto; overscroll-behavior: contain;")