kamrify commited on
Commit
35ff9ac
·
1 Parent(s): 4da4a2a

Handle preferred side functionality

Browse files
Files changed (1) hide show
  1. src/popover.ts +18 -7
src/popover.ts CHANGED
@@ -65,7 +65,7 @@ function getPopoverDimensions() {
65
  };
66
  }
67
 
68
- function calculatePopoverPositionForLeftRight(
69
  alignment: Alignment,
70
  config: {
71
  elementDimensions: DOMRect;
@@ -161,6 +161,7 @@ export function repositionPopover(element: Element) {
161
 
162
  // Configure the popover positioning
163
  const requiredAlignment: Alignment = "start";
 
164
  const popoverPadding = STAGE_PADDING;
165
 
166
  const popoverDimensions = getPopoverDimensions();
@@ -168,20 +169,30 @@ export function repositionPopover(element: Element) {
168
  const elementDimensions = element.getBoundingClientRect();
169
 
170
  const topValue = elementDimensions.top - popoverDimensions!.height;
171
- const isTopOptimal = topValue >= 0;
172
 
173
  const bottomValue = window.innerHeight - (elementDimensions.bottom + popoverDimensions!.height);
174
- const isBottomOptimal = bottomValue >= 0;
175
 
176
  const leftValue = elementDimensions.left - popoverDimensions!.width;
177
- const isLeftOptimal = leftValue >= 0;
178
 
179
  const rightValue = window.innerWidth - (elementDimensions.right + popoverDimensions!.width);
180
- const isRightOptimal = rightValue >= 0;
181
 
182
  const noneOptimal = !isTopOptimal && !isBottomOptimal && !isLeftOptimal && !isRightOptimal;
183
  let popoverRenderedSide: Side;
184
 
 
 
 
 
 
 
 
 
 
 
185
  if (noneOptimal) {
186
  const leftValue = window.innerWidth / 2 - popoverDimensions?.realWidth! / 2;
187
  const bottomValue = 10;
@@ -196,7 +207,7 @@ export function repositionPopover(element: Element) {
196
  window.innerWidth - popoverDimensions?.realWidth - popoverArrowDimensions.width
197
  );
198
 
199
- const topToSet = calculatePopoverPositionForLeftRight(requiredAlignment, {
200
  elementDimensions,
201
  popoverDimensions,
202
  popoverPadding,
@@ -214,7 +225,7 @@ export function repositionPopover(element: Element) {
214
  rightValue,
215
  window.innerWidth - popoverDimensions?.realWidth - popoverArrowDimensions.width
216
  );
217
- const topToSet = calculatePopoverPositionForLeftRight(requiredAlignment, {
218
  elementDimensions,
219
  popoverDimensions,
220
  popoverPadding,
 
65
  };
66
  }
67
 
68
+ function calculateTopForLeftRight(
69
  alignment: Alignment,
70
  config: {
71
  elementDimensions: DOMRect;
 
161
 
162
  // Configure the popover positioning
163
  const requiredAlignment: Alignment = "start";
164
+ const requiredSide: Side = "left";
165
  const popoverPadding = STAGE_PADDING;
166
 
167
  const popoverDimensions = getPopoverDimensions();
 
169
  const elementDimensions = element.getBoundingClientRect();
170
 
171
  const topValue = elementDimensions.top - popoverDimensions!.height;
172
+ let isTopOptimal = topValue >= 0;
173
 
174
  const bottomValue = window.innerHeight - (elementDimensions.bottom + popoverDimensions!.height);
175
+ let isBottomOptimal = bottomValue >= 0;
176
 
177
  const leftValue = elementDimensions.left - popoverDimensions!.width;
178
+ let isLeftOptimal = leftValue >= 0;
179
 
180
  const rightValue = window.innerWidth - (elementDimensions.right + popoverDimensions!.width);
181
+ let isRightOptimal = rightValue >= 0;
182
 
183
  const noneOptimal = !isTopOptimal && !isBottomOptimal && !isLeftOptimal && !isRightOptimal;
184
  let popoverRenderedSide: Side;
185
 
186
+ if (requiredSide === "top" && isTopOptimal) {
187
+ isRightOptimal = isLeftOptimal = isBottomOptimal = false;
188
+ } else if (requiredSide === "bottom" && isBottomOptimal) {
189
+ isRightOptimal = isLeftOptimal = isTopOptimal = false;
190
+ } else if (requiredSide === "left" && isLeftOptimal) {
191
+ isRightOptimal = isTopOptimal = isBottomOptimal = false;
192
+ } else if (requiredSide === "right" && isRightOptimal) {
193
+ isLeftOptimal = isTopOptimal = isBottomOptimal = false;
194
+ }
195
+
196
  if (noneOptimal) {
197
  const leftValue = window.innerWidth / 2 - popoverDimensions?.realWidth! / 2;
198
  const bottomValue = 10;
 
207
  window.innerWidth - popoverDimensions?.realWidth - popoverArrowDimensions.width
208
  );
209
 
210
+ const topToSet = calculateTopForLeftRight(requiredAlignment, {
211
  elementDimensions,
212
  popoverDimensions,
213
  popoverPadding,
 
225
  rightValue,
226
  window.innerWidth - popoverDimensions?.realWidth - popoverArrowDimensions.width
227
  );
228
+ const topToSet = calculateTopForLeftRight(requiredAlignment, {
229
  elementDimensions,
230
  popoverDimensions,
231
  popoverPadding,