Skip to content

Commit d1239a5

Browse files
committed
bug: popup within floating panel
1 parent 22deb85 commit d1239a5

File tree

3 files changed

+61
-47
lines changed

3 files changed

+61
-47
lines changed

packages/dockview-core/src/dockview/components/popupService.ts

Lines changed: 4 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,11 @@
1+
import { shiftAbsoluteElementIntoView } from '../../dom';
12
import { addDisposableListener } from '../../events';
23
import {
34
CompositeDisposable,
45
Disposable,
56
MutableDisposable,
67
} from '../../lifecycle';
78

8-
function shiftAbsoluteElementIntoView(element: HTMLElement, root: HTMLElement) {
9-
const rect = element.getBoundingClientRect();
10-
const rootRect = element.getBoundingClientRect();
11-
12-
const viewportWidth = root.clientWidth;
13-
const viewportHeight = root.clientHeight;
14-
15-
// const viewportWidth =
16-
// window.innerWidth || document.documentElement.clientWidth;
17-
// const viewportHeight =
18-
// window.innerHeight || document.documentElement.clientHeight;
19-
20-
const buffer = 10; // 10px buffer
21-
22-
let translateX = 0;
23-
let translateY = 0;
24-
25-
const left = rect.left - rootRect.left;
26-
const top = rect.top - rootRect.top;
27-
const bottom = rect.bottom - rootRect.bottom;
28-
const right = rect.right - rootRect.right;
29-
30-
// Check horizontal overflow
31-
if (left < buffer) {
32-
translateX = buffer - left;
33-
} else if (right > viewportWidth - buffer) {
34-
translateX = viewportWidth - right - buffer;
35-
}
36-
37-
// Check vertical overflow
38-
if (top < buffer) {
39-
translateY = buffer - top;
40-
} else if (bottom > viewportHeight - buffer) {
41-
translateY = viewportHeight - bottom - buffer;
42-
}
43-
44-
// Apply the translation if needed
45-
if (translateX !== 0 || translateY !== 0) {
46-
element.style.transform = `translate(${translateX}px, ${translateY}px)`;
47-
}
48-
}
49-
509
export class PopupService extends CompositeDisposable {
5110
private readonly _element: HTMLElement;
5211
private _active: HTMLElement | null = null;
@@ -71,13 +30,13 @@ export class PopupService extends CompositeDisposable {
7130

7231
openPopover(
7332
element: HTMLElement,
74-
position: { x: number; y: number }
33+
position: { x: number; y: number; zIndex?: string }
7534
): void {
7635
this.close();
7736

7837
const wrapper = document.createElement('div');
7938
wrapper.style.position = 'absolute';
80-
wrapper.style.zIndex = '99';
39+
wrapper.style.zIndex = position.zIndex ?? 'var(--dv-overlay-z-index)';
8140
wrapper.appendChild(element);
8241

8342
const anchorBox = this._element.getBoundingClientRect();
@@ -92,7 +51,7 @@ export class PopupService extends CompositeDisposable {
9251
this._active = wrapper;
9352

9453
this._activeDisposable.value = new CompositeDisposable(
95-
addDisposableListener(window, 'pointerdown', (event) => {
54+
addDisposableListener(window, 'pointerdown', (event) => {
9655
const target = event.target;
9756

9857
if (!(target instanceof HTMLElement)) {

packages/dockview-core/src/dockview/components/titlebar/tabsContainer.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { addDisposableListener, Emitter, Event } from '../../../events';
88
import { Tab } from '../tab/tab';
99
import { DockviewGroupPanel } from '../../dockviewGroupPanel';
1010
import { VoidContainer } from './voidContainer';
11-
import { toggleClass } from '../../../dom';
11+
import { findRelativeZIndexParent, toggleClass } from '../../../dom';
1212
import { IDockviewPanel } from '../../dockviewPanel';
1313
import { DockviewComponent } from '../../dockviewComponent';
1414
import { WillShowOverlayLocationEvent } from '../../dockviewGroupPanelModel';
@@ -378,7 +378,7 @@ export class TabsContainer
378378
!panelObject.api.isActive
379379
);
380380

381-
wrapper.addEventListener('mousedown', () => {
381+
wrapper.addEventListener('pointerdown', () => {
382382
this.accessor.popupService.close();
383383
tab.element.scrollIntoView();
384384
tab.panel.api.setActive();
@@ -388,9 +388,14 @@ export class TabsContainer
388388
el.appendChild(wrapper);
389389
}
390390

391+
const relativeParent = findRelativeZIndexParent(root);
392+
391393
this.accessor.popupService.openPopover(el, {
392394
x: event.clientX,
393395
y: event.clientY,
396+
zIndex: relativeParent?.style.zIndex
397+
? `calc(${relativeParent.style.zIndex} * 2)`
398+
: undefined,
394399
});
395400
})
396401
);

packages/dockview-core/src/dom.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,3 +451,53 @@ export function onDidWindowResizeEnd(element: Window, cb: () => void) {
451451

452452
return disposable;
453453
}
454+
455+
export function shiftAbsoluteElementIntoView(
456+
element: HTMLElement,
457+
root: HTMLElement,
458+
options: { buffer: number } = { buffer: 10 }
459+
) {
460+
const buffer = options.buffer;
461+
const rect = element.getBoundingClientRect();
462+
const rootRect = element.getBoundingClientRect();
463+
464+
const viewportWidth = root.clientWidth;
465+
const viewportHeight = root.clientHeight;
466+
467+
let translateX = 0;
468+
let translateY = 0;
469+
470+
const left = rect.left - rootRect.left;
471+
const top = rect.top - rootRect.top;
472+
const bottom = rect.bottom - rootRect.bottom;
473+
const right = rect.right - rootRect.right;
474+
475+
// Check horizontal overflow
476+
if (left < buffer) {
477+
translateX = buffer - left;
478+
} else if (right > viewportWidth - buffer) {
479+
translateX = viewportWidth - right - buffer;
480+
}
481+
482+
// Check vertical overflow
483+
if (top < buffer) {
484+
translateY = buffer - top;
485+
} else if (bottom > viewportHeight - buffer) {
486+
translateY = viewportHeight - bottom - buffer;
487+
}
488+
489+
// Apply the translation if needed
490+
if (translateX !== 0 || translateY !== 0) {
491+
element.style.transform = `translate(${translateX}px, ${translateY}px)`;
492+
}
493+
}
494+
495+
export function findRelativeZIndexParent(el: HTMLElement): HTMLElement | null {
496+
let tmp: HTMLElement | null = el;
497+
498+
while (tmp && (tmp.style.zIndex === 'auto' || tmp.style.zIndex === '')) {
499+
tmp = tmp.parentElement;
500+
}
501+
502+
return tmp;
503+
}

0 commit comments

Comments
 (0)