Skip to content

Commit 2bf411e

Browse files
author
Michael Mrowetz
committed
#188 fix re-render bg bug
1 parent 2871a43 commit 2bf411e

File tree

4 files changed

+22
-64
lines changed

4 files changed

+22
-64
lines changed

Diff for: src/css-raw/perf-cascade.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
.block-undefined {fill: #0f0;}
9696

9797
/* Info overlay SVG - wrapper */
98-
.info-overlay {fill: #fff; stroke: #cdcdcd;}
98+
.info-overlay-bg {fill: #fff; stroke: #cdcdcd;}
9999
.info-overlay-close-btn {fill: rgba(205, 205, 205, 0.8); transform: translate(-23px, -23px); cursor: pointer;}
100100
.info-overlay-close-btn text {fill: #111; pointer-events: none;}
101101
.info-overlay-close-btn:focus {border: solid 1px #36c;}

Diff for: src/ts/waterfall/details-overlay/overlay-manager.ts

+13-50
Original file line numberDiff line numberDiff line change
@@ -48,40 +48,14 @@ class OverlayManager implements OverlayManagerClass {
4848
/** Collection of currely open overlays */
4949
private openOverlays: OpenOverlay[] = [];
5050

51-
constructor(private context: Context, private rowHolder: SVGGElement) {
51+
constructor(private context: Context) {
5252
}
5353

5454
/** all open overlays height combined */
5555
public getCombinedOverlayHeight(): number {
5656
return this.openOverlays.reduce((pre, curr) => pre + curr.height, 0);
5757
}
5858

59-
/**
60-
* Get ref to Overlay SVG Element in DOM.
61-
*
62-
* _Item might be re-drawn, when another Overlay is changed_
63-
*/
64-
public getOpenOverlayDomEl(overlay: OpenOverlay) {
65-
return this.rowHolder.querySelector(`.overlay-index-${overlay.index}`) as SVGGElement;
66-
}
67-
68-
/**
69-
* Get ref to the last (DOM element wise) Overlay SVG Element in DOM.
70-
*
71-
* _Item might be re-drawn, when another Overlay is changed_
72-
*/
73-
public getLastOpenOverlayDomEl() {
74-
const overlays = this.rowHolder.querySelectorAll(".info-overlay-holder");
75-
return overlays.item(overlays.length - 1) as SVGGElement;
76-
}
77-
78-
/**
79-
* Are any overlays currently open?
80-
*/
81-
public hasOpenOverlays() {
82-
return this.openOverlays.length > 0;
83-
}
84-
8559
/**
8660
* Opens an overlay - rerenders others internaly
8761
*/
@@ -111,7 +85,6 @@ class OverlayManager implements OverlayManagerClass {
11185
"openOverlays": self.openOverlays,
11286
"type": "open",
11387
} as OverlayChangeEvent);
114-
this.realignBars(rowItems);
11588
}
11689

11790
/**
@@ -142,32 +115,19 @@ class OverlayManager implements OverlayManagerClass {
142115
"openOverlays": self.openOverlays,
143116
"type": "closed",
144117
} as OverlayChangeEvent);
145-
this.realignBars(rowItems);
146118
}
147119

148120
/**
149-
* sets the offset for request-bars
150-
* @param {SVGAElement[]} rowItems
121+
* Sets the offset for a request-bar
122+
* @param {SVGAElement[]} rowItems
123+
* @param {number} offset
151124
*/
152-
private realignBars(rowItems: SVGAElement[]) {
153-
rowItems.forEach((bar, j) => {
154-
let offset = this.getOverlayOffset(j);
155-
bar.setAttribute("transform", `translate(0, ${offset})`);
156-
});
157-
}
158-
159-
/** y offset to it's default y position */
160-
private getOverlayOffset(rowIndex: number): number {
161-
return this.openOverlays.reduce((col, overlay) => {
162-
if (overlay.index < rowIndex) {
163-
return col + overlay.height;
164-
}
165-
return col;
166-
}, 0);
125+
private realignRow = (rowItem: SVGAElement, offset: number) => {
126+
rowItem.setAttribute("transform", `translate(0, ${offset})`);
167127
}
168128

169129
/**
170-
* removes all overlays and renders them again
130+
* Renders / Adjusts Overlays
171131
*
172132
* @summary this is to re-set the "y" position since there is a bug in chrome with
173133
* tranform of an SVG and positioning/scoll of a foreignObjects
@@ -178,6 +138,7 @@ class OverlayManager implements OverlayManagerClass {
178138
/** shared variable to keep track of heigth */
179139
let currY = 0;
180140
let updateHeight = (overlay, y, currHeight) => {
141+
// console.log(currY, currHeight);
181142
currY += currHeight;
182143
overlay.actualY = y;
183144
overlay.height = currHeight;
@@ -198,11 +159,11 @@ class OverlayManager implements OverlayManagerClass {
198159
overlayHolder.appendChild(infoOverlay);
199160
updateHeight(overlay, y, infoOverlay.getBoundingClientRect().height);
200161
};
201-
202-
// const rowItems = this.rowHolder.getElementsByClassName("row-item") as NodeListOf<SVGAElement>;
203162
rowItems.forEach((rowItem, index) => {
204163
const overlay = find(this.openOverlays, (o) => o.index === index);
205164
const overlayEl = rowItem.nextElementSibling.firstElementChild as SVGGElement;
165+
this.realignRow(rowItem, currY);
166+
206167
if (overlay === undefined) {
207168
if (overlayEl) {
208169
// remove closed overlay
@@ -216,8 +177,10 @@ class OverlayManager implements OverlayManagerClass {
216177
}
217178
if (overlayEl) {
218179
updateHeight(overlay, overlay.defaultY + currY, overlay.height);
219-
const fo = overlayEl.getElementsByTagName("foreignObject").item(0) as SVGForeignObjectElement;
180+
const fo = overlayEl.querySelector("foreignObject");
181+
const bg = overlayEl.querySelector(".info-overlay-bg");
220182
fo.setAttribute("y", overlay.actualY.toString());
183+
bg.setAttribute("y", overlay.actualY.toString());
221184
return;
222185
}
223186
addNewOverlay(rowItem.nextElementSibling as SVGGElement, overlay);

Diff for: src/ts/waterfall/details-overlay/svg-details-overlay.ts

+5-10
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,22 @@ function createCloseButtonSvg(y: number): SVGGElement {
2929
}
3030

3131
function createHolder(y: number, detailsHeight: number) {
32-
33-
let innerHolder = svg.newG("info-overlay-holder");
34-
32+
let holder = svg.newG("info-overlay-holder");
3533
let bg = svg.newRect({
3634
"height": detailsHeight,
3735
"rx": 2,
3836
"ry": 2,
3937
"width": "100%",
4038
"x": "0",
4139
"y": y,
42-
}, "info-overlay");
40+
}, "info-overlay-bg");
4341

44-
innerHolder.appendChild(bg);
45-
return innerHolder;
42+
holder.appendChild(bg);
43+
return holder;
4644
}
4745

4846
export function createRowInfoOverlay(overlay: OpenOverlay, y: number, detailsHeight: number): SVGGElement {
4947
const requestID = overlay.index + 1;
50-
let wrapper = svg.newG(`outer-info-overlay-holder overlay-index-${overlay.index}`);
5148
let holder = createHolder(y, detailsHeight);
5249

5350
let foreignObject = svg.newForeignObject({
@@ -82,7 +79,5 @@ export function createRowInfoOverlay(overlay: OpenOverlay, y: number, detailsHei
8279
holder.appendChild(foreignObject);
8380
holder.appendChild(closeBtn);
8481

85-
wrapper.appendChild(holder);
86-
87-
return wrapper;
82+
return holder;
8883
}

Diff for: src/ts/waterfall/svg-chart.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ function getSvgHeight(marks: Mark[], diagramHeight: number): number {
5151
* @return {Context} Context object
5252
*/
5353
function createContext(data: WaterfallData, options: ChartRenderOption,
54-
entriesToShow: WaterfallEntry[], rowHolder: SVGGElement): Context {
54+
entriesToShow: WaterfallEntry[]): Context {
5555
const unit = data.durationMs / 100;
5656
const diagramHeight = (entriesToShow.length + 1) * options.rowHeight;
5757
let context = {
@@ -62,7 +62,7 @@ function createContext(data: WaterfallData, options: ChartRenderOption,
6262
options,
6363
};
6464
// `overlayManager` needs the `context` reference, so it's attached later
65-
context.overlayManager = new OverlayManager(context, rowHolder);
65+
context.overlayManager = new OverlayManager(context);
6666

6767
return context;
6868
}
@@ -85,7 +85,7 @@ export function createWaterfallSvg(data: WaterfallData, options: ChartRenderOpti
8585
/** Holds all rows */
8686
let rowHolder = svg.newG("rows-holder");
8787

88-
const context = createContext(data, options, entriesToShow, rowHolder);
88+
const context = createContext(data, options, entriesToShow);
8989

9090
/** full height of the SVG chart in px */
9191
const chartHolderHeight = getSvgHeight(data.marks, context.diagramHeight);

0 commit comments

Comments
 (0)