Skip to content

Commit 27774e2

Browse files
committed
feat(popover): new verticalPosition parameter to force popover vertical positioning
1 parent 406fc3d commit 27774e2

File tree

6 files changed

+34
-6
lines changed

6 files changed

+34
-6
lines changed

src/core/components/popover/popover-class.js

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ class Popover extends Modal {
185185
resize() {
186186
const popover = this;
187187
const { app, $el, $targetEl, $angleEl } = popover;
188-
const { targetX, targetY } = popover.params;
188+
const { targetX, targetY, verticalPosition } = popover.params;
189189
$el.css({ left: '', top: '' });
190190
const [width, height] = [$el.width(), $el.height()];
191191
let angleSize = 0;
@@ -233,13 +233,20 @@ class Popover extends Modal {
233233

234234
let [left, top, diff] = [0, 0, 0];
235235
// Top Position
236-
let position = app.theme === 'md' ? 'bottom' : 'top';
236+
const forcedPosition = verticalPosition === 'auto' ? false : verticalPosition;
237+
let position = forcedPosition || (app.theme === 'md' ? 'bottom' : 'top');
237238
if (app.theme === 'md') {
238-
if (height < app.height - targetOffsetTop - targetHeight) {
239+
if (
240+
forcedPosition === 'bottom' ||
241+
(!forcedPosition && height < app.height - targetOffsetTop - targetHeight)
242+
) {
239243
// On bottom
240244
position = 'bottom';
241245
top = targetOffsetTop + targetHeight;
242-
} else if (height < targetOffsetTop - safeAreaTop) {
246+
} else if (
247+
forcedPosition === 'top' ||
248+
(!forcedPosition && height < targetOffsetTop - safeAreaTop)
249+
) {
243250
// On top
244251
top = targetOffsetTop - height;
245252
position = 'top';
@@ -264,10 +271,16 @@ class Popover extends Modal {
264271
$el.addClass(`popover-on-${position} popover-on-${hPosition}`);
265272
} else {
266273
// ios and aurora
267-
if (height + angleSize < targetOffsetTop - safeAreaTop) {
274+
if (
275+
forcedPosition === 'top' ||
276+
(!forcedPosition && height + angleSize < targetOffsetTop - safeAreaTop)
277+
) {
268278
// On top
269279
top = targetOffsetTop - height - angleSize;
270-
} else if (height + angleSize < app.height - targetOffsetTop - targetHeight) {
280+
} else if (
281+
forcedPosition === 'bottom' ||
282+
(!forcedPosition && height + angleSize < app.height - targetOffsetTop - targetHeight)
283+
) {
271284
// On bottom
272285
position = 'bottom';
273286
top = targetOffsetTop + targetHeight + angleSize;

src/core/components/popover/popover.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ export namespace Popover {
4545
targetHeight?: number;
4646
/** Element to mount modal to. (default app.el) */
4747
containerEl?: HTMLElement | CSSSelector;
48+
/** Force popover vertical position, can be 'auto', 'top' or 'bottom' (default 'auto') */
49+
verticalPosition?: string;
4850
/** Object with events handlers.. */
4951
on?: {
5052
[event in keyof Events]?: Events[event];

src/core/components/popover/popover.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export default {
77
name: 'popover',
88
params: {
99
popover: {
10+
verticalPosition: 'auto',
1011
backdrop: true,
1112
backdropEl: undefined,
1213
backdropUnique: false,

src/react/components/popover.jsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { Popover } from 'framework7/types';
2323
closeByOutsideClick? : boolean
2424
closeOnEscape? : boolean
2525
containerEl? : string | object
26+
verticalPosition?: string
2627
COLOR_PROPS
2728
onPopoverOpen? : (instance?: Popover.Popover) => void
2829
onPopoverOpened? : (instance?: Popover.Popover) => void
@@ -47,6 +48,7 @@ const Popover = forwardRef((props, ref) => {
4748
closeByOutsideClick,
4849
closeOnEscape,
4950
containerEl,
51+
verticalPosition,
5052
} = props;
5153

5254
const extraAttrs = getExtraAttrs(props);
@@ -109,6 +111,7 @@ const Popover = forwardRef((props, ref) => {
109111
if ('backdropEl' in props) popoverParams.backdropEl = backdropEl;
110112
if ('animate' in props) popoverParams.animate = animate;
111113
if ('containerEl' in props) popoverParams.containerEl = containerEl;
114+
if ('verticalPosition' in props) popoverParams.verticalPosition = verticalPosition;
112115

113116
f7ready(() => {
114117
f7Popover.current = f7.popover.create(popoverParams);

src/svelte/components/popover.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
export let closeByOutsideClick = undefined;
2121
export let closeOnEscape = undefined;
2222
export let containerEl = undefined;
23+
export let verticalPosition = undefined;
2324
2425
let el;
2526
let f7Popover;
@@ -95,6 +96,7 @@
9596
if (typeof backdrop !== 'undefined') params.backdrop = backdrop;
9697
if (typeof backdropEl !== 'undefined') params.backdropEl = backdropEl;
9798
if (typeof containerEl !== 'undefined') params.containerEl = containerEl;
99+
if (typeof verticalPosition !== 'undefined') params.verticalPosition = verticalPosition;
98100
99101
f7ready(() => {
100102
f7Popover = app.f7.popover.create(params);

src/vue/components/popover.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ export default {
4747
type: [String, Object],
4848
default: undefined,
4949
},
50+
verticalPosition: {
51+
type: String,
52+
default: undefined,
53+
},
5054
...colorProps,
5155
},
5256
emits: ['popover:open', 'popover:opened', 'popover:close', 'popover:closed', 'update:opened'],
@@ -108,6 +112,7 @@ export default {
108112
backdrop,
109113
backdropEl,
110114
containerEl,
115+
verticalPosition,
111116
} = props;
112117
if (typeof targetEl !== 'undefined') popoverParams.targetEl = targetEl;
113118
if (typeof closeByBackdropClick !== 'undefined')
@@ -118,6 +123,8 @@ export default {
118123
if (typeof backdrop !== 'undefined') popoverParams.backdrop = backdrop;
119124
if (typeof backdropEl !== 'undefined') popoverParams.backdropEl = backdropEl;
120125
if (typeof containerEl !== 'undefined') popoverParams.containerEl = containerEl;
126+
if (typeof verticalPosition !== 'undefined')
127+
popoverParams.verticalPosition = verticalPosition;
121128
122129
f7ready(() => {
123130
f7Popover.value = f7.popover.create(popoverParams);

0 commit comments

Comments
 (0)