Skip to content

Commit 25fd22c

Browse files
palbizuPatricio Albizu
andauthored
fix: Unable to click topology (#731)
* fix: Unable to click topology * fix: running lintern * fix: modify bounding element * fix: fixing lint * fix: fixing lintern * fix: refactoring of popover positioning * fix: refactoring of popover positioning Co-authored-by: Patricio Albizu <albizupatricio@github.com>
1 parent 11efdfb commit 25fd22c

File tree

3 files changed

+35
-25
lines changed

3 files changed

+35
-25
lines changed

projects/observability/src/shared/components/topology/d3/d3-topology.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ export class D3Topology implements Topology {
318318
this.neighborhoodFinder.neighborhoodForNode(hoverEvent.source.userNode),
319319
this.neighborhoodFinder.singleNodeNeighborhood(hoverEvent.source.userNode)
320320
);
321-
this.tooltip && this.tooltip.showWithNodeData(hoverEvent.source.userNode);
321+
this.showNodeTooltip(hoverEvent.source, false);
322322
}
323323
}
324324

@@ -328,7 +328,7 @@ export class D3Topology implements Topology {
328328
this.tooltip && this.tooltip.hide();
329329
} else {
330330
this.emphasizeTopologyNeighborhood(this.neighborhoodFinder.neighborhoodForEdge(hoverEvent.source.userEdge));
331-
this.tooltip && this.tooltip.showWithEdgeData(hoverEvent.source.userEdge);
331+
this.showEdgeTooltip(hoverEvent.source, false);
332332
}
333333
}
334334

@@ -386,7 +386,7 @@ export class D3Topology implements Topology {
386386
);
387387
if (this.tooltip) {
388388
// TODO - a modal tooltip disables the interactions like hover (which is good), but doesn't allow clicking another element without an extra click
389-
this.tooltip.showWithNodeData(node.userNode, { modal: true });
389+
this.showNodeTooltip(node, true);
390390
this.tooltip.hidden$.pipe(take(1)).subscribe(() => this.resetVisibility());
391391
}
392392
}
@@ -395,7 +395,7 @@ export class D3Topology implements Topology {
395395
this.emphasizeTopologyNeighborhood(this.neighborhoodFinder.neighborhoodForEdge(edge.userEdge));
396396
if (this.tooltip) {
397397
// TODO - a modal tooltip disables the interactions like hover (which is good), but doesn't allow clicking another element without an extra click
398-
this.tooltip.showWithEdgeData(edge.userEdge, { modal: true });
398+
this.showEdgeTooltip(edge, true);
399399
this.tooltip.hidden$.pipe(take(1)).subscribe(() => this.resetVisibility());
400400
}
401401
}
@@ -422,5 +422,20 @@ export class D3Topology implements Topology {
422422
private select<T extends Element>(selector: string | T): Selection<T, unknown, null, undefined> {
423423
return this.d3Util.select<T>(selector, this.domRenderer);
424424
}
425-
// tslint:disable-next-line: max-file-line-count
425+
426+
private showNodeTooltip(node: RenderableTopologyNode, modal: boolean): void {
427+
const originEl = this.nodeRenderer.getElementForNode(node);
428+
if (!originEl || !this.tooltip) {
429+
return;
430+
}
431+
this.tooltip.showWithNodeData(node.userNode, new ElementRef(originEl), { modal: modal });
432+
}
433+
434+
private showEdgeTooltip(edge: RenderableTopologyEdge, modal: boolean): void {
435+
const originEl = this.edgeRenderer.getElementForEdge(edge);
436+
if (!originEl || !this.tooltip) {
437+
return;
438+
}
439+
this.tooltip.showWithEdgeData(edge.userEdge, new ElementRef(originEl), { modal: modal });
440+
}
426441
}

projects/observability/src/shared/components/topology/renderers/tooltip/topology-tooltip-popover.ts

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
import { ElementRef, Injector } from '@angular/core';
2-
import {
3-
PopoverBackdrop,
4-
PopoverPositionType,
5-
PopoverRef,
6-
PopoverRelativePositionLocation,
7-
PopoverService
8-
} from '@hypertrace/components';
2+
import { PopoverBackdrop, PopoverPositionType, PopoverRef, PopoverService } from '@hypertrace/components';
93
import { BehaviorSubject, merge, Observable, ReplaySubject, Subject } from 'rxjs';
104
import { switchMap } from 'rxjs/operators';
115
import { TopologyEdge, TopologyNode, TopologyTooltip, TopologyTooltipOptions } from '../../topology';
@@ -26,12 +20,12 @@ export class TopologyTooltipPopover implements TopologyTooltip {
2620
private readonly injector: Injector,
2721
private readonly popoverService: PopoverService
2822
) {
29-
this.popoverSubject = new BehaviorSubject(this.buildPopover(false));
23+
this.popoverSubject = new BehaviorSubject(this.buildPopover(false, this.container));
3024
this.hidden$ = this.popoverSubject.pipe(switchMap(popover => merge(popover.hidden$, popover.closed$)));
3125
}
3226

33-
public showWithNodeData(node: TopologyNode, options: TopologyTooltipOptions = {}): void {
34-
this.rebuildPopoverIfNeeded(options);
27+
public showWithNodeData(node: TopologyNode, origin: ElementRef, options: TopologyTooltipOptions = {}): void {
28+
this.rebuildPopoverIfNeeded(origin, options);
3529
this.dataSubject.next({
3630
type: 'node',
3731
node: node,
@@ -40,8 +34,8 @@ export class TopologyTooltipPopover implements TopologyTooltip {
4034
this.popover.show();
4135
}
4236

43-
public showWithEdgeData(edge: TopologyEdge, options: TopologyTooltipOptions = {}): void {
44-
this.rebuildPopoverIfNeeded(options);
37+
public showWithEdgeData(edge: TopologyEdge, origin: ElementRef, options: TopologyTooltipOptions = {}): void {
38+
this.rebuildPopoverIfNeeded(origin, options);
4539
this.dataSubject.next({
4640
type: 'edge',
4741
edge: edge,
@@ -60,17 +54,17 @@ export class TopologyTooltipPopover implements TopologyTooltip {
6054
this.popoverSubject.complete();
6155
}
6256

63-
private rebuildPopoverIfNeeded(options: TopologyTooltipOptions): void {
57+
private rebuildPopoverIfNeeded(origin: ElementRef, options: TopologyTooltipOptions): void {
6458
const modal = !!options.modal;
6559
if (modal === this.popover.hasBackdrop()) {
6660
return;
6761
}
6862

6963
this.popover.close(); // Close existing popover
70-
this.popoverSubject.next(this.buildPopover(modal));
64+
this.popoverSubject.next(this.buildPopover(!!options.modal, origin));
7165
}
7266

73-
private buildPopover(modal: boolean): PopoverRef {
67+
private buildPopover(modal: boolean, origin: ElementRef): PopoverRef {
7468
const popover = this.popoverService.drawPopover({
7569
componentOrTemplate: this.tooltipDefinition.class,
7670
position: {
@@ -86,9 +80,10 @@ export class TopologyTooltipPopover implements TopologyTooltip {
8680
}
8781

8882
popover.updatePositionStrategy({
89-
type: PopoverPositionType.Relative,
90-
locationPreferences: [PopoverRelativePositionLocation.InsideTopLeft],
91-
origin: this.container
83+
type: PopoverPositionType.FollowMouse,
84+
boundingElement: modal ? origin.nativeElement : this.container.nativeElement,
85+
offsetX: 50,
86+
offsetY: 30
9287
});
9388

9489
return popover;

projects/observability/src/shared/components/topology/topology.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,8 @@ export interface TopologyTooltipRenderer {
179179
}
180180

181181
export interface TopologyTooltip {
182-
showWithNodeData(node: TopologyNode, options?: TopologyTooltipOptions): void;
183-
showWithEdgeData(edge: TopologyEdge, options?: TopologyTooltipOptions): void;
182+
showWithNodeData(node: TopologyNode, origin: ElementRef, options?: TopologyTooltipOptions): void;
183+
showWithEdgeData(edge: TopologyEdge, origin: ElementRef, options?: TopologyTooltipOptions): void;
184184
hide(): void;
185185
destroy(): void;
186186
hidden$: Observable<void>;

0 commit comments

Comments
 (0)