From 9080544caba5815759881c7e44d19c9ad68e181a Mon Sep 17 00:00:00 2001 From: "Ahmad K. Bawaneh" Date: Sun, 9 Mar 2025 14:46:49 +0300 Subject: [PATCH] fix #1014 SubMenu position goes off the screen --- .../org/dominokit/domino/ui/layout/AppLayout.java | 7 ++++++- .../ui/menu/direction/RightDownDropDirection.java | 13 ++++++++++--- .../domino/ui/menu/direction/SpaceChecker.java | 8 ++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/domino-ui/src/main/java/org/dominokit/domino/ui/layout/AppLayout.java b/domino-ui/src/main/java/org/dominokit/domino/ui/layout/AppLayout.java index 1b3e177a..d4885808 100644 --- a/domino-ui/src/main/java/org/dominokit/domino/ui/layout/AppLayout.java +++ b/domino-ui/src/main/java/org/dominokit/domino/ui/layout/AppLayout.java @@ -109,7 +109,12 @@ public AppLayout() { .addCss(dui_content) .setZIndexLayer(ZIndexLayer.Z_LAYER_1))); header = - LazyChild.of(header().addCss(dui_header).setZIndexLayer(ZIndexLayer.Z_LAYER_2), body) + LazyChild.of( + header() + .addCss(dui_header) + .setAttribute("dui-reserve-top-space", "true") + .setZIndexLayer(ZIndexLayer.Z_LAYER_2), + body) .whenInitialized(() -> layout.addCss(dui_has_header)); navBar = LazyChild.of(NavBar.create(), header); footer = diff --git a/domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/RightDownDropDirection.java b/domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/RightDownDropDirection.java index cccef470..7b8ee3c8 100644 --- a/domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/RightDownDropDirection.java +++ b/domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/RightDownDropDirection.java @@ -19,6 +19,7 @@ import static org.dominokit.domino.ui.utils.ElementsFactory.elements; import static org.dominokit.domino.ui.utils.Unit.px; +import elemental2.dom.DomGlobal; import elemental2.dom.Element; import org.dominokit.domino.ui.style.Style; @@ -34,13 +35,19 @@ public DropDirection position(Element source, Element target) { if (spaceChecker.hasSpaceBelow()) { double delta = 0; double availableSpace = spaceChecker.getAvailableSpaceOnTop(); + DomGlobal.console.info("availableSpace : " + availableSpace); if (availableSpace < spaceChecker.getSourceHeight()) { delta = spaceChecker.getSourceHeight() - availableSpace; } + DomGlobal.console.info("delta : " + delta); - Style.of(source) - .style - .setProperty("top", px.of((spaceChecker.getTargetTop() + window.pageYOffset - delta))); + double top = spaceChecker.getTargetTop() + window.pageYOffset - delta; + double thresholdTopSpace = spaceChecker.getThresholdTopSpace(); + + if (top < thresholdTopSpace) { + top = thresholdTopSpace; + } + Style.of(source).style.setProperty("top", px.of(top)); Style.of(source).style.setProperty("left", px.of(0)); diff --git a/domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/SpaceChecker.java b/domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/SpaceChecker.java index c7434f7e..3e4718ec 100644 --- a/domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/SpaceChecker.java +++ b/domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/SpaceChecker.java @@ -109,7 +109,7 @@ public boolean hasSpaceAbove() { return (topSpace - getThresholdHeightSpace("dui-reserve-top-space")) > sourceHeight; } - private double getThresholdSideSpace(String attribute) { + public double getThresholdSideSpace(String attribute) { List footerElements = DomGlobal.document.querySelectorAll("[" + attribute + "]").asList(); return footerElements.stream() @@ -122,7 +122,11 @@ private double getVisibleWidth(Element element) { return elements.elementOf(element).getVisibleWidth(); } - private double getThresholdHeightSpace(String attribute) { + public double getThresholdTopSpace() { + return getThresholdHeightSpace("dui-reserve-top-space"); + } + + public double getThresholdHeightSpace(String attribute) { List footerElements = DomGlobal.document.querySelectorAll("[" + attribute + "]").asList(); return footerElements.stream()