Skip to content

Commit 515ab3c

Browse files
committed
fix #897 add BestRight{Up/Down}DropDirection
1 parent 843a21e commit 515ab3c

18 files changed

+130
-69
lines changed

domino-ui/src/main/java/org/dominokit/domino/ui/menu/AbstractMenuItem.java

+6
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,12 @@ public <T extends AbstractMenuItem<V>> T setSearchFilter(MenuSearchFilter search
602602
return (T) this;
603603
}
604604

605+
/**
606+
* Check if the menu item text starts with a specific string
607+
*
608+
* @param character the text to check against.
609+
* @return boolean, <b>true</b> if the menu item starts with the text, <b>false</b> otherwise.
610+
*/
605611
public boolean startsWith(String character) {
606612
return false;
607613
}

domino-ui/src/main/java/org/dominokit/domino/ui/menu/CustomMenuItem.java

+15
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
import static java.util.Objects.isNull;
1919
import static java.util.Objects.nonNull;
2020

21+
import org.dominokit.domino.ui.elements.AnchorElement;
22+
import org.dominokit.domino.ui.utils.ChildHandler;
23+
2124
/**
2225
* A custom menu item that extends the {@link AbstractMenuItem} with the capability to apply custom
2326
* search filters to menu items.
@@ -46,6 +49,18 @@ public CustomMenuItem() {
4649
this.searchFilter = (token, caseSensitive) -> false;
4750
}
4851

52+
/**
53+
* Applies a custom child handler to the link element of this menu item
54+
*
55+
* @param handler The child handler to apply.
56+
* @return This menu item instance.
57+
*/
58+
public CustomMenuItem<V> withClickableElement(
59+
ChildHandler<CustomMenuItem<V>, AnchorElement> handler) {
60+
handler.apply(this, linkElement);
61+
return this;
62+
}
63+
4964
/**
5065
* Invoked during a search operation. Displays the menu item if the token is found using the
5166
* provided {@link MenuSearchFilter}.

domino-ui/src/main/java/org/dominokit/domino/ui/menu/MenuItem.java

+13
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
import java.util.Arrays;
2323
import java.util.Optional;
2424
import java.util.stream.Collectors;
25+
import org.dominokit.domino.ui.elements.AnchorElement;
2526
import org.dominokit.domino.ui.elements.SmallElement;
2627
import org.dominokit.domino.ui.elements.SpanElement;
28+
import org.dominokit.domino.ui.utils.ChildHandler;
2729

2830
/**
2931
* Represents a menu item that can be added to a menu. Each menu item can have a text and an
@@ -71,6 +73,17 @@ public MenuItem(String text) {
7173
this.searchFilter = this::containsToken;
7274
}
7375

76+
/**
77+
* Applies a custom child handler to the link element of this menu item
78+
*
79+
* @param handler The child handler to apply.
80+
* @return This menu item instance.
81+
*/
82+
public MenuItem<V> withClickableElement(ChildHandler<MenuItem<V>, AnchorElement> handler) {
83+
handler.apply(this, linkElement);
84+
return this;
85+
}
86+
7487
/**
7588
* Constructs a menu item with the specified text and description.
7689
*

domino-ui/src/main/java/org/dominokit/domino/ui/menu/MenuItemsGroup.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.util.ArrayList;
2222
import java.util.List;
23+
import org.dominokit.domino.ui.elements.AnchorElement;
2324
import org.dominokit.domino.ui.elements.DivElement;
2425
import org.dominokit.domino.ui.elements.UListElement;
2526
import org.dominokit.domino.ui.layout.NavBar;
@@ -62,7 +63,9 @@ public MenuItemsGroup(Menu<V> menu) {
6263
linkElement.removeCss(dui_menu_item_anchor);
6364
linkElement.addCss(dui_menu_group_header);
6465
root.appendChild(groupElement = div().addCss(dui_flex, dui_flex_col));
65-
groupHeader = LazyChild.of(NavBar.create().addCss(dui_order_first), bodyElement);
66+
groupHeader =
67+
LazyChild.of(
68+
NavBar.create().addCss(dui_menu_group_header_nav).addCss(dui_order_first), bodyElement);
6669
itemsListElement = LazyChild.of(ul().addCss(dui_menu_items_list, dui_order_last), groupElement);
6770
}
6871

@@ -129,6 +132,18 @@ public MenuItemsGroup<V> withItemsMenu(ChildHandler<MenuItemsGroup<V>, UListElem
129132
return this;
130133
}
131134

135+
/**
136+
* Applies a custom child handler to the link element of this menu item
137+
*
138+
* @param handler The child handler to apply.
139+
* @return This menu item instance.
140+
*/
141+
public MenuItemsGroup<V> withClickableElement(
142+
ChildHandler<MenuItemsGroup<V>, AnchorElement> handler) {
143+
handler.apply(this, linkElement);
144+
return this;
145+
}
146+
132147
/**
133148
* Invoked during a search operation across all the menu items in this group.
134149
*

domino-ui/src/main/java/org/dominokit/domino/ui/menu/MenuStyles.java

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public interface MenuStyles {
4444
CssClass dui_menu_item_hint = () -> "dui-menu-item-hint";
4545
CssClass dui_menu_group = () -> "dui-menu-group";
4646
CssClass dui_menu_group_header = () -> "dui-menu-group-header";
47+
CssClass dui_menu_group_header_nav = () -> "dui-menu-group-header-nav";
4748
CssClass dui_menu_drop = () -> "dui-menu-drop";
4849

4950
CssClass dui_menu_item_prefix = () -> "dui-menu-item-prefix";

domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/BottomLeftDropDirection.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,15 @@ public void position(Element source, Element target) {
4848
delta = newRect.width - availableSpace;
4949
}
5050

51+
double left = (targetRect.left - (newRect.left - targetRect.left))
52+
- (sourceRect.width - targetRect.width)
53+
+ delta;
5154
Style.of(source)
5255
.style
5356
.setProperty(
5457
"left",
5558
px.of(
56-
(targetRect.left - (newRect.left - targetRect.left))
57-
- (sourceRect.width - targetRect.width)
58-
+ delta));
59+
Math.max(left, 0)));
5960
}
6061

6162
/** {@inheritDoc} */

domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/BottomMiddleDropDirection.java

+10-8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.dominokit.domino.ui.utils.Unit.px;
2323

2424
import elemental2.dom.DOMRect;
25+
import elemental2.dom.DomGlobal;
2526
import elemental2.dom.Element;
2627
import org.dominokit.domino.ui.style.Style;
2728

@@ -49,24 +50,25 @@ public void position(Element source, Element target) {
4950
int innerWidth = window.innerWidth;
5051

5152
double delta = 0;
52-
double availableSpace = innerWidth - newTargetRect.right - window.pageXOffset;
53+
double availableSpace = innerWidth - newTargetRect.right + (newTargetRect.width / 2) - window.pageXOffset;
5354
if (availableSpace < (newRect.width / 2)) {
54-
delta = (newRect.width / 2) - availableSpace;
55+
delta = (newRect.width / 2) - (newTargetRect.width / 2) - availableSpace;
5556
}
5657

5758
elements.elementOf(source).setCssProperty("--dui-menu-drop-pin-offset", delta + "px");
59+
double left = newTargetRect.left
60+
- (newRect.width / 2)
61+
+ (newTargetRect.width / 2)
62+
+ window.pageXOffset
63+
- Math.abs(delta)
64+
- elements.body().element().getBoundingClientRect().left;
5865

5966
Style.of(source)
6067
.style
6168
.setProperty(
6269
"left",
6370
px.of(
64-
newTargetRect.left
65-
- (newRect.width / 2)
66-
+ (newTargetRect.width / 2)
67-
+ window.pageXOffset
68-
- delta
69-
- elements.body().element().getBoundingClientRect().left));
71+
Math.max(left, 0)));
7072
}
7173

7274
/** {@inheritDoc} */

domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/BottomRightDropDirection.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,13 @@ public void position(Element source, Element target) {
4747
dui_dd_bottom_right.apply(source);
4848
elements.elementOf(source).setCssProperty("--dui-menu-drop-min-width", targetRect.width + "px");
4949
DOMRect newRect = source.getBoundingClientRect();
50+
double left = (targetRect.left - (newRect.left - targetRect.left)) + window.pageXOffset - delta;
5051
Style.of(source)
5152
.style
5253
.setProperty(
5354
"left",
5455
px.of(
55-
(targetRect.left - (newRect.left - targetRect.left)) + window.pageXOffset - delta));
56+
Math.max(left, 0)));
5657
}
5758

5859
/** {@inheritDoc} */

domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/LeftDownDropDirection.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,18 @@ public void position(Element source, Element target) {
5151
elements.elementOf(source).setCssProperty("--dui-menu-drop-min-width", targetRect.width + "px");
5252

5353
DOMRect newRect = source.getBoundingClientRect();
54+
double left = targetRect.left
55+
- (newRect.left - targetRect.left)
56+
+ window.pageXOffset
57+
- sourceRect.width
58+
- (source.hasAttribute("dui-position-x-offset")
59+
? Double.parseDouble(source.getAttribute("dui-position-x-offset"))
60+
: 0);
5461
Style.of(source)
5562
.style
5663
.setProperty(
5764
"left",
58-
px.of(
59-
targetRect.left
60-
- (newRect.left - targetRect.left)
61-
+ window.pageXOffset
62-
- sourceRect.width
63-
- (source.hasAttribute("dui-position-x-offset")
64-
? Double.parseDouble(source.getAttribute("dui-position-x-offset"))
65-
: 0)));
65+
px.of(Math.max(left, 0)));
6666
}
6767

6868
/** {@inheritDoc} */

domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/LeftMiddleDropDirection.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ public void position(Element source, Element target) {
4545
delta = ((sourceRect.height / 2) - availableUpSpace);
4646
}
4747

48+
double left = targetRect.top
49+
+ window.pageYOffset
50+
- ((sourceRect.height - targetRect.height) / 2)
51+
+ delta;
4852
Style.of(source)
4953
.style
5054
.setProperty(
5155
"top",
52-
px.of(
53-
targetRect.top
54-
+ window.pageYOffset
55-
- ((sourceRect.height - targetRect.height) / 2)
56-
+ delta));
56+
px.of(Math.max(left, 0)));
5757

5858
Style.of(source).style.setProperty("left", px.of(targetRect.left));
5959

domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/LeftUpDropDirection.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,18 @@ public void position(Element source, Element target) {
5151
elements.elementOf(source).setCssProperty("--dui-menu-drop-min-width", targetRect.width + "px");
5252

5353
DOMRect newRect = source.getBoundingClientRect();
54+
double left = targetRect.left
55+
- (newRect.left - targetRect.left)
56+
+ window.pageXOffset
57+
- sourceRect.width
58+
- (source.hasAttribute("dui-position-x-offset")
59+
? Double.parseDouble(source.getAttribute("dui-position-x-offset"))
60+
: 0);
5461
Style.of(source)
5562
.style
5663
.setProperty(
5764
"left",
58-
px.of(
59-
targetRect.left
60-
- (newRect.left - targetRect.left)
61-
+ window.pageXOffset
62-
- sourceRect.width
63-
- (source.hasAttribute("dui-position-x-offset")
64-
? Double.parseDouble(source.getAttribute("dui-position-x-offset"))
65-
: 0)));
65+
px.of(Math.max(left, 0)));
6666
}
6767

6868
/** {@inheritDoc} */

domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/RightDownDropDirection.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,17 @@ public void position(Element source, Element target) {
5252
elements.elementOf(source).setCssProperty("--dui-menu-drop-min-width", targetRect.width + "px");
5353

5454
DOMRect newRect = source.getBoundingClientRect();
55+
double left = (targetRect.left - (newRect.left - targetRect.left))
56+
+ window.pageXOffset
57+
+ targetRect.width
58+
+ (source.hasAttribute("dui-position-x-offset")
59+
? Double.parseDouble(source.getAttribute("dui-position-x-offset"))
60+
: 0);
5561
Style.of(source)
5662
.style
5763
.setProperty(
5864
"left",
59-
px.of(
60-
(targetRect.left - (newRect.left - targetRect.left))
61-
+ window.pageXOffset
62-
+ targetRect.width
63-
+ (source.hasAttribute("dui-position-x-offset")
64-
? Double.parseDouble(source.getAttribute("dui-position-x-offset"))
65-
: 0)));
65+
px.of(Math.max(left, 0)));
6666
}
6767

6868
/** {@inheritDoc} */

domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/RightMiddleDropDirection.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,17 @@ public void position(Element source, Element target) {
6464
elements.elementOf(source).setCssProperty("--dui-menu-drop-min-width", targetRect.width + "px");
6565

6666
DOMRect newRect = source.getBoundingClientRect();
67+
double left = (targetRect.left - (newRect.left - targetRect.left))
68+
+ window.pageXOffset
69+
+ targetRect.width
70+
+ (source.hasAttribute("dui-position-x-offset")
71+
? Double.parseDouble(source.getAttribute("dui-position-x-offset"))
72+
: 0);
6773
Style.of(source)
6874
.style
6975
.setProperty(
7076
"left",
71-
px.of(
72-
(targetRect.left - (newRect.left - targetRect.left))
73-
+ window.pageXOffset
74-
+ targetRect.width
75-
+ (source.hasAttribute("dui-position-x-offset")
76-
? Double.parseDouble(source.getAttribute("dui-position-x-offset"))
77-
: 0)));
77+
px.of(Math.max(left, 0)));
7878
}
7979

8080
/** {@inheritDoc} */

domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/RightUpDropDirection.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,17 @@ public void position(Element source, Element target) {
5959
.setCssProperty("--dui-dd-position-delta", ((targetRect.top - sourceRect.top)) + "px");
6060
elements.elementOf(source).setCssProperty("--dui-menu-drop-min-width", targetRect.width + "px");
6161
DOMRect newRect = source.getBoundingClientRect();
62+
double left = (targetRect.left - (newRect.left - targetRect.left))
63+
+ window.pageXOffset
64+
+ targetRect.width
65+
+ (source.hasAttribute("dui-position-x-offset")
66+
? Double.parseDouble(source.getAttribute("dui-position-x-offset"))
67+
: 0);
6268
Style.of(source)
6369
.style
6470
.setProperty(
6571
"left",
66-
px.of(
67-
(targetRect.left - (newRect.left - targetRect.left))
68-
+ window.pageXOffset
69-
+ targetRect.width
70-
+ (source.hasAttribute("dui-position-x-offset")
71-
? Double.parseDouble(source.getAttribute("dui-position-x-offset"))
72-
: 0)));
72+
px.of(Math.max(left, 0)));
7373
}
7474

7575
/** {@inheritDoc} */

domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/TopLeftDropDirection.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,14 @@ public void position(Element source, Element target) {
5050
elements.elementOf(source).setCssProperty("--dui-menu-drop-min-width", targetRect.width + "px");
5151

5252
DOMRect newRect = source.getBoundingClientRect();
53+
double left = (targetRect.left - (newRect.left - targetRect.left))
54+
- (sourceRect.width - targetRect.width)
55+
+ delta;
5356
Style.of(source)
5457
.style
5558
.setProperty(
5659
"left",
57-
px.of(
58-
(targetRect.left - (newRect.left - targetRect.left))
59-
- (sourceRect.width - targetRect.width)
60-
+ delta));
60+
px.of(Math.max(left, 0)));
6161
}
6262

6363
/** {@inheritDoc} */

domino-ui/src/main/java/org/dominokit/domino/ui/menu/direction/TopMiddleDropDirection.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -49,23 +49,23 @@ public void position(Element source, Element target) {
4949
DOMRect newTargetRect = target.getBoundingClientRect();
5050

5151
double delta = 0;
52-
double availableSpace = innerWidth - newTargetRect.right - window.pageXOffset;
52+
double availableSpace = innerWidth - newTargetRect.right + (newTargetRect.width / 2) - window.pageXOffset;
5353
if (availableSpace < (newRect.width / 2)) {
54-
delta = (newRect.width / 2) - availableSpace;
54+
delta = (newRect.width / 2) - (newTargetRect.width / 2) - availableSpace;
5555
}
5656
elements.elementOf(source).setCssProperty("--dui-menu-drop-pin-offset", delta + "px");
5757

58+
double left = newTargetRect.left
59+
- (newRect.width / 2)
60+
+ (newTargetRect.width / 2)
61+
+ window.pageXOffset
62+
- Math.abs(delta)
63+
- elements.body().element().getBoundingClientRect().left;
5864
Style.of(source)
5965
.style
6066
.setProperty(
6167
"left",
62-
px.of(
63-
newTargetRect.left
64-
- (newRect.width / 2)
65-
+ (newTargetRect.width / 2)
66-
+ window.pageXOffset
67-
- delta
68-
- elements.body().element().getBoundingClientRect().left));
68+
px.of(Math.max(left, 0)));
6969
}
7070

7171
/** {@inheritDoc} */

0 commit comments

Comments
 (0)