Skip to content

Commit 2871a43

Browse files
author
Michael Mrowetz
committed
#188 remove re-query of rows and fix type
1 parent bdb9510 commit 2871a43

File tree

4 files changed

+23
-38
lines changed

4 files changed

+23
-38
lines changed

src/ts/helpers/dom.ts

-14
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,3 @@ export function getLastItemOfNodeList<T extends Node>(list: NodeListOf<T>) {
6767
}
6868
return list.item(list.length - 1);
6969
}
70-
71-
/**
72-
* Helper to make `NodeListOf` iterable
73-
* @param list NodeListOf e.g. return value of `getElementsByClassName`
74-
* @param fn Function called for
75-
*/
76-
export function forEachNodeList<T extends Node>(list: NodeListOf<T>, fn: {(el: T, index: number): void}): void {
77-
if (!list || list.length === 0) {
78-
return undefined;
79-
}
80-
for (let i = 0, len = list.length; i < len; i ++) {
81-
fn(list.item(i), i);
82-
}
83-
}

src/ts/typing/context.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ export interface OverlayManagerClass {
3232

3333
/** Opens an overlay - rerenders others */
3434
openOverlay: (index: number, y: number, detailsHeight: number, entry: WaterfallEntry,
35-
barEls: SVGGElement[]) => void;
35+
rowItems: SVGAElement[]) => void;
3636
/** toggles an overlay - rerenders others */
3737
toggleOverlay: (index: number, y: number, detailsHeight: number, entry: WaterfallEntry,
38-
barEls: SVGGElement[]) => void;
38+
rowItems: SVGAElement[]) => void;
3939

4040
/** closes on overlay - rerenders others internally */
41-
closeOverlay: (index: number, detailsHeight: number, barEls: SVGGElement[]) => void;
41+
closeOverlay: (index: number, detailsHeight: number, rowItems: SVGAElement[]) => void;
4242

4343
// constructor(context: Context, overlayHolder: SVGGElement);
4444
}

src/ts/waterfall/details-overlay/overlay-manager.ts

+17-18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
forEachNodeList,
32
getLastItemOfNodeList,
43
getParentByClassName,
54
removeChildren,
@@ -87,7 +86,7 @@ class OverlayManager implements OverlayManagerClass {
8786
* Opens an overlay - rerenders others internaly
8887
*/
8988
public openOverlay(index: number, y: number, detailsHeight: number,
90-
entry: WaterfallEntry, barEls: SVGGElement[]) {
89+
entry: WaterfallEntry, rowItems: SVGAElement[]) {
9190
if (this.openOverlays.some((o) => o.index === index)) {
9291
return;
9392
}
@@ -97,61 +96,61 @@ class OverlayManager implements OverlayManagerClass {
9796
"entry": entry,
9897
"index": index,
9998
"onClose": () => {
100-
self.closeOverlay(index, detailsHeight, barEls);
99+
self.closeOverlay(index, detailsHeight, rowItems);
101100
},
102101
"openTabIndex": 0,
103102
};
104103
this.openOverlays.push(newOverlay);
105104
this.openOverlays = this.openOverlays.sort((a, b) => a.index > b.index ? 1 : -1);
106105

107-
this.renderOverlays(detailsHeight);
106+
this.renderOverlays(detailsHeight, rowItems);
108107
this.context.pubSub.publishToOverlayChanges({
109108
"changedIndex": index,
110109
"changedOverlay": newOverlay,
111110
"combinedOverlayHeight": self.getCombinedOverlayHeight(),
112111
"openOverlays": self.openOverlays,
113112
"type": "open",
114113
} as OverlayChangeEvent);
115-
this.realignBars(barEls);
114+
this.realignBars(rowItems);
116115
}
117116

118117
/**
119118
* Toggles an overlay - rerenders others
120119
*/
121120
public toggleOverlay(index: number, y: number, detailsHeight: number,
122-
entry: WaterfallEntry, barEls: SVGGElement[]) {
121+
entry: WaterfallEntry, rowItems: SVGAElement[]) {
123122
if (this.openOverlays.some((o) => o.index === index)) {
124-
this.closeOverlay(index, detailsHeight, barEls);
123+
this.closeOverlay(index, detailsHeight, rowItems);
125124
} else {
126-
this.openOverlay(index, y, detailsHeight, entry, barEls);
125+
this.openOverlay(index, y, detailsHeight, entry, rowItems);
127126
}
128127
}
129128

130129
/**
131130
* closes on overlay - rerenders others internally
132131
*/
133-
public closeOverlay(index: number, detailsHeight: number, barEls: SVGGElement[]) {
132+
public closeOverlay(index: number, detailsHeight: number, rowItems: SVGAElement[]) {
134133
const self = this;
135134
this.openOverlays.splice(this.openOverlays.reduce((prev: number, curr, i) => {
136135
return (curr.index === index) ? i : prev;
137136
}, -1), 1);
138137

139-
this.renderOverlays(detailsHeight);
138+
this.renderOverlays(detailsHeight, rowItems);
140139
this.context.pubSub.publishToOverlayChanges({
141140
"changedIndex": index,
142141
"combinedOverlayHeight": self.getCombinedOverlayHeight(),
143142
"openOverlays": self.openOverlays,
144143
"type": "closed",
145144
} as OverlayChangeEvent);
146-
this.realignBars(barEls);
145+
this.realignBars(rowItems);
147146
}
148147

149148
/**
150149
* sets the offset for request-bars
151-
* @param {SVGGElement[]} barEls
150+
* @param {SVGAElement[]} rowItems
152151
*/
153-
private realignBars(barEls: SVGGElement[]) {
154-
barEls.forEach((bar, j) => {
152+
private realignBars(rowItems: SVGAElement[]) {
153+
rowItems.forEach((bar, j) => {
155154
let offset = this.getOverlayOffset(j);
156155
bar.setAttribute("transform", `translate(0, ${offset})`);
157156
});
@@ -173,9 +172,9 @@ class OverlayManager implements OverlayManagerClass {
173172
* @summary this is to re-set the "y" position since there is a bug in chrome with
174173
* tranform of an SVG and positioning/scoll of a foreignObjects
175174
* @param {number} detailsHeight
176-
* @param {SVGGElement} overlayHolder
175+
* @param {SVGAElement[]} rowItems
177176
*/
178-
private renderOverlays(detailsHeight: number) {
177+
private renderOverlays(detailsHeight: number, rowItems: SVGAElement[]) {
179178
/** shared variable to keep track of heigth */
180179
let currY = 0;
181180
let updateHeight = (overlay, y, currHeight) => {
@@ -200,8 +199,8 @@ class OverlayManager implements OverlayManagerClass {
200199
updateHeight(overlay, y, infoOverlay.getBoundingClientRect().height);
201200
};
202201

203-
const rowItems = this.rowHolder.getElementsByClassName("row-item") as NodeListOf<SVGAElement>;
204-
forEachNodeList(rowItems, (rowItem, index) => {
202+
// const rowItems = this.rowHolder.getElementsByClassName("row-item") as NodeListOf<SVGAElement>;
203+
rowItems.forEach((rowItem, index) => {
205204
const overlay = find(this.openOverlays, (o) => o.index === index);
206205
const overlayEl = rowItem.nextElementSibling.firstElementChild as SVGGElement;
207206
if (overlay === undefined) {

src/ts/waterfall/svg-chart.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ export function createWaterfallSvg(data: WaterfallData, options: ChartRenderOpti
137137
const widestRequestNumber = getWidestDigitString(entriesToShow.length);
138138
const maxNumberWidth = svg.getNodeTextWidth(svg.newTextEl(`${widestRequestNumber}`), true);
139139

140-
let barEls: SVGGElement[] = [];
140+
let rowItems: SVGAElement[] = [];
141141

142142
function getChartHeight(): number {
143143
return chartHolderHeight + context.overlayManager.getCombinedOverlayHeight();
@@ -169,12 +169,12 @@ export function createWaterfallSvg(data: WaterfallData, options: ChartRenderOpti
169169
} as RectData;
170170

171171
let showDetailsOverlay = () => {
172-
context.overlayManager.toggleOverlay(i, y + options.rowHeight, detailsHeight, entry, barEls);
172+
context.overlayManager.toggleOverlay(i, y + options.rowHeight, detailsHeight, entry, rowItems);
173173
};
174174

175175
let rowItem = row.createRow(context, i, maxIconsWidth, maxNumberWidth, rectData, entry, showDetailsOverlay);
176176

177-
barEls.push(rowItem);
177+
rowItems.push(rowItem);
178178
rowHolder.appendChild(rowItem);
179179
rowHolder.appendChild(svg.newG("row-overlay-holder"));
180180
}

0 commit comments

Comments
 (0)