Skip to content

Commit ef6b0cd

Browse files
chore: calc resizeHandlePlacement
1 parent ae3b66b commit ef6b0cd

1 file changed

Lines changed: 74 additions & 10 deletions

File tree

packages/main/src/Popover.ts

Lines changed: 74 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,6 @@ class Popover extends Popup {
199199
@property()
200200
actualPlacement: `${PopoverActualPlacement}` = "Right";
201201

202-
@property()
203-
_resizeHandlePlacement: `${ResizeHandlePlacement}` = "BottomRight";
204-
205202
@property({ type: Number, noAttribute: true })
206203
_maxHeight?: number;
207204

@@ -246,6 +243,8 @@ class Popover extends Popup {
246243
_cachedMinHeight?: number;
247244
_draggedOrResized = false;
248245

246+
_resizeHandlePlacement?: `${ResizeHandlePlacement}`;
247+
249248
static get VIEWPORT_MARGIN() {
250249
return 10; // px
251250
}
@@ -888,7 +887,22 @@ class Popover extends Popup {
888887
const allClasses = super.classes;
889888
allClasses.root["ui5-popover-root"] = true;
890889

891-
allClasses.root["ui5-popover-resize-handle-bottom-right"] = this.resizable;
890+
if (this.resizable) {
891+
switch (this._getResizeHandlePlacement()) {
892+
case ResizeHandlePlacement.BottomLeft:
893+
allClasses.root["ui5-popover-resize-handle-bottom-left"] = true;
894+
break;
895+
case ResizeHandlePlacement.BottomRight:
896+
allClasses.root["ui5-popover-resize-handle-bottom-right"] = true;
897+
break;
898+
case ResizeHandlePlacement.TopLeft:
899+
allClasses.root["ui5-popover-resize-handle-top-left"] = true;
900+
break;
901+
case ResizeHandlePlacement.TopRight:
902+
allClasses.root["ui5-popover-resize-handle-top-right"] = true;
903+
break;
904+
}
905+
}
892906

893907
return allClasses;
894908
}
@@ -929,6 +943,57 @@ class Popover extends Popup {
929943
return this.resizable && this.onDesktop;
930944
}
931945

946+
_getResizeHandlePlacement() {
947+
if (this._resizeHandlePlacement) {
948+
return this._resizeHandlePlacement;
949+
}
950+
951+
const offset = 2;
952+
953+
const opener = this.getOpenerHTMLElement(this.opener);
954+
const openerRect = opener!.getBoundingClientRect();
955+
const popoverWrapperRect = this.getBoundingClientRect();
956+
957+
let openerCX = Math.floor(openerRect.x + openerRect.width / 2);
958+
const openerCY = Math.floor(openerRect.y + openerRect.height / 2);
959+
960+
let popoverCX = Math.floor(popoverWrapperRect.x + popoverWrapperRect.width / 2);
961+
const popoverCY = Math.floor(popoverWrapperRect.y + popoverWrapperRect.height / 2);
962+
963+
if (this.isRtl) {
964+
openerCX = -openerCX;
965+
popoverCX = -popoverCX;
966+
}
967+
968+
switch (this.getActualPlacement(openerRect)) {
969+
case PopoverActualPlacement.Left:
970+
if (popoverCY > openerCY + offset) {
971+
return ResizeHandlePlacement.BottomLeft;
972+
}
973+
974+
return ResizeHandlePlacement.TopLeft;
975+
case PopoverActualPlacement.Right:
976+
if (popoverCY + offset < openerCY) {
977+
return ResizeHandlePlacement.TopRight;
978+
}
979+
980+
return ResizeHandlePlacement.BottomRight;
981+
case PopoverActualPlacement.Bottom:
982+
if (popoverCX + offset < openerCX) {
983+
return ResizeHandlePlacement.BottomLeft;
984+
}
985+
986+
return ResizeHandlePlacement.BottomRight;
987+
case PopoverActualPlacement.Top:
988+
default:
989+
if (popoverCX + offset < openerCX) {
990+
return ResizeHandlePlacement.TopLeft;
991+
}
992+
993+
return ResizeHandlePlacement.TopRight;
994+
}
995+
}
996+
932997
_onResizeMouseDown(e: MouseEvent) {
933998
if (!this.resizable) {
934999
return;
@@ -940,6 +1005,7 @@ class Popover extends Popup {
9401005
top,
9411006
left,
9421007
} = this.getBoundingClientRect();
1008+
9431009
const {
9441010
width,
9451011
height,
@@ -955,6 +1021,8 @@ class Popover extends Popup {
9551021
this._minWidth = Number.parseFloat(minWidth);
9561022
// this._cachedMinHeight = this._minHeight;
9571023

1024+
this._resizeHandlePlacement = this._getResizeHandlePlacement();
1025+
9581026
Object.assign(this.style, {
9591027
top: `${top}px`,
9601028
left: `${left}px`,
@@ -1021,13 +1089,9 @@ class Popover extends Popup {
10211089
delete this._minWidth;
10221090
delete this._cachedMinHeight;
10231091

1024-
this._detachMouseResizeHandlers();
1025-
}
1092+
delete this._resizeHandlePlacement;
10261093

1027-
_handleDragStart(e: DragEvent) {
1028-
if (this.draggable) {
1029-
e.preventDefault();
1030-
}
1094+
this._detachMouseResizeHandlers();
10311095
}
10321096

10331097
_attachMouseResizeHandlers() {

0 commit comments

Comments
 (0)