Skip to content

Commit 5b643bf

Browse files
author
Michael Mrowetz
committed
#188 basic outer tabing working
1 parent ebeb95b commit 5b643bf

File tree

6 files changed

+122
-23
lines changed

6 files changed

+122
-23
lines changed

Diff for: src/ts/typing/context.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import {OverlayChangeEvent, OverlayChangeSubscriber} from "./open-overlay";
2-
import {ChartRenderOption} from "./options";
3-
import {WaterfallEntry} from "./waterfall";
1+
import { OverlayManager } from "../waterfall/details-overlay/overlay-manager";
2+
import { OverlayChangeEvent, OverlayChangeSubscriber } from "./open-overlay";
3+
import { ChartRenderOption } from "./options";
4+
import { WaterfallEntry } from "./waterfall";
45

56
/**
67
* Context object that is passed to (usually stateless) child-functions
@@ -10,7 +11,7 @@ export interface Context {
1011
/** Publish and Subscribe instance for overlay updates */
1112
pubSub: PubSubClass;
1213
/** Overlay (popup) instance manager */
13-
overlayManager: OverlayManagerClass;
14+
overlayManager: OverlayManager;
1415
/** horizontal unit (duration in ms of 1%) */
1516
unit: number;
1617
/** height of the requests part of the diagram in px */
@@ -21,6 +22,7 @@ export interface Context {
2122

2223
export interface PubSubClass {
2324
subscribeToOverlayChanges: (fn: OverlayChangeSubscriber) => void;
25+
subscribeToSpecificOverlayChanges: (index: number, fn: OverlayChangeSubscriber) => void;
2426
publishToOverlayChanges: (change: OverlayChangeEvent) => void;
2527
}
2628

@@ -30,10 +32,10 @@ export interface OverlayManagerClass {
3032

3133
/** Opens an overlay - rerenders others */
3234
openOverlay: (index: number, y: number, detailsHeight: number, entry: WaterfallEntry,
33-
barEls: SVGGElement[]) => void;
35+
barEls: SVGGElement[]) => void;
3436
/** toggles an overlay - rerenders others */
3537
toggleOverlay: (index: number, y: number, detailsHeight: number, entry: WaterfallEntry,
36-
barEls: SVGGElement[]) => void;
38+
barEls: SVGGElement[]) => void;
3739

3840
/** closes on overlay - rerenders others internally */
3941
closeOverlay: (index: number, detailsHeight: number, barEls: SVGGElement[]) => void;

Diff for: src/ts/typing/open-overlay.ts

+3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ export interface OverlayChangeEvent {
2424
type: EventType;
2525
/** list of currenly open overlays */
2626
openOverlays: OpenOverlay[];
27+
/** index that triggerd the change */
28+
changedIndex?: number;
29+
changedOverlay: OpenOverlay;
2730
combinedOverlayHeight: number;
2831
}
2932

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

+15-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { WaterfallEntry } from "../../typing/waterfall";
55
import { createRowInfoOverlay } from "./svg-details-overlay";
66

77
/** Overlay (popup) instance manager */
8-
export default class OverlayManager implements OverlayManagerClass {
8+
class OverlayManager implements OverlayManagerClass {
99
/** Collection of currely open overlays */
1010
private openOverlays: OpenOverlay[] = [];
1111

@@ -19,6 +19,10 @@ export default class OverlayManager implements OverlayManagerClass {
1919
return this.openOverlays.reduce((pre, curr) => pre + curr.height, 0);
2020
}
2121

22+
public getOpenOverlays() {
23+
return this.openOverlays;
24+
}
25+
2226
/**
2327
* Opens an overlay - rerenders others internaly
2428
*/
@@ -28,19 +32,21 @@ export default class OverlayManager implements OverlayManagerClass {
2832
return;
2933
}
3034
const self = this;
31-
32-
this.openOverlays.push({
35+
const newOverlay: OpenOverlay = {
3336
"defaultY": y,
3437
"entry": entry,
3538
"index": index,
3639
"onClose": () => {
3740
self.closeOverlay(index, detailsHeight, barEls);
3841
},
3942
"openTabIndex": 0,
40-
});
43+
};
44+
this.openOverlays.push(newOverlay);
4145

4246
this.renderOverlays(detailsHeight);
4347
this.context.pubSub.publishToOverlayChanges({
48+
"changedIndex": index,
49+
"changedOverlay": newOverlay,
4450
"combinedOverlayHeight": self.getCombinedOverlayHeight(),
4551
"openOverlays": self.openOverlays,
4652
"type": "open",
@@ -71,6 +77,7 @@ export default class OverlayManager implements OverlayManagerClass {
7177

7278
this.renderOverlays(detailsHeight);
7379
this.context.pubSub.publishToOverlayChanges({
80+
"changedIndex": index,
7481
"combinedOverlayHeight": self.getCombinedOverlayHeight(),
7582
"openOverlays": self.openOverlays,
7683
"type": "closed",
@@ -131,3 +138,7 @@ export default class OverlayManager implements OverlayManagerClass {
131138
});
132139
}
133140
};
141+
export {
142+
OverlayManager
143+
};
144+
export default OverlayManager;

Diff for: src/ts/waterfall/details-overlay/pub-sub.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// simple pub/sub for change to the overlay
2-
import {PubSubClass} from "../../typing/context";
3-
import {OverlayChangeEvent, OverlayChangeSubscriber} from "../../typing/open-overlay";
2+
import { PubSubClass } from "../../typing/context";
3+
import { OverlayChangeEvent, OverlayChangeSubscriber } from "../../typing/open-overlay";
44

55
export default class PubSub implements PubSubClass {
66
private subscribers: OverlayChangeSubscriber[] = [];
@@ -9,6 +9,14 @@ export default class PubSub implements PubSubClass {
99
this.subscribers.push(fn);
1010
}
1111

12+
public subscribeToSpecificOverlayChanges(index: number, fn: OverlayChangeSubscriber) {
13+
this.subscribers.push((evt) => {
14+
if (evt.changedIndex === index) {
15+
fn(evt);
16+
}
17+
});
18+
}
19+
1220
public publishToOverlayChanges(change: OverlayChangeEvent) {
1321
this.subscribers.forEach((fn) => fn(change));
1422
}

Diff for: src/ts/waterfall/row/svg-row-subcomponents.ts

+2-7
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,7 @@ export function createBgStripe(y: number, height: number, isEven: boolean): SVGR
223223
}, className);
224224
}
225225

226-
export function createNameRowBg(y: number, rowHeight: number,
227-
onClick: EventListener): SVGGElement {
226+
export function createNameRowBg(y: number, rowHeight: number): SVGGElement {
228227
let rowFixed = svg.newG("row row-fixed");
229228

230229
rowFixed.appendChild(svg.newRect({
@@ -237,12 +236,10 @@ export function createNameRowBg(y: number, rowHeight: number,
237236
"opacity": 0,
238237
}));
239238

240-
rowFixed.addEventListener("click", onClick);
241-
242239
return rowFixed;
243240
}
244241

245-
export function createRowBg(y: number, rowHeight: number, onClick: EventListener): SVGGElement {
242+
export function createRowBg(y: number, rowHeight: number): SVGGElement {
246243
let rowFixed = svg.newG("row row-flex");
247244

248245
rowFixed.appendChild(svg.newRect({
@@ -255,7 +252,5 @@ export function createRowBg(y: number, rowHeight: number, onClick: EventListener
255252
"opacity": 0,
256253
}));
257254

258-
rowFixed.addEventListener("click", onClick);
259-
260255
return rowFixed;
261256
}

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

+84-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as icons from "../../helpers/icons";
22
import * as misc from "../../helpers/misc";
33
import * as svg from "../../helpers/svg";
44
import { Context } from "../../typing/context";
5+
import { OpenOverlay } from "../../typing/open-overlay";
56
import { RectData } from "../../typing/rect-data";
67
import { WaterfallEntry } from "../../typing/waterfall";
78
import { getIndicatorIcons } from "./svg-indicators";
@@ -20,12 +21,13 @@ const ROW_LEFT_MARGIN = 3;
2021
export function createRow(context: Context, index: number,
2122
maxIconsWidth: number, maxNumberWidth: number,
2223
rectData: RectData, entry: WaterfallEntry,
23-
onDetailsOverlayShow: EventListener): SVGGElement {
24+
onDetailsOverlayShow: EventListener): SVGAElement {
2425

2526
const y = rectData.y;
2627
const rowHeight = rectData.height;
2728
const leftColumnWith = context.options.leftColumnWith;
28-
let rowItem = svg.newG(entry.responseDetails.rowClass);
29+
let rowItem = svg.newA(entry.responseDetails.rowClass);
30+
rowItem.setAttribute("href", "javascript:void(0)");
2931
let leftFixedHolder = svg.newSvg("left-fixed-holder", {
3032
"width": `${leftColumnWith}%`,
3133
"x": "0",
@@ -36,8 +38,8 @@ export function createRow(context: Context, index: number,
3638
});
3739

3840
let rect = rowSubComponents.createRect(rectData, entry.segments, entry.total);
39-
let rowName = rowSubComponents.createNameRowBg(y, rowHeight, onDetailsOverlayShow);
40-
let rowBar = rowSubComponents.createRowBg(y, rowHeight, onDetailsOverlayShow);
41+
let rowName = rowSubComponents.createNameRowBg(y, rowHeight);
42+
let rowBar = rowSubComponents.createRowBg(y, rowHeight);
4143
let bgStripe = rowSubComponents.createBgStripe(y, rowHeight, (index % 2 === 0));
4244

4345
let x = ROW_LEFT_MARGIN + maxIconsWidth;
@@ -73,6 +75,84 @@ export function createRow(context: Context, index: number,
7375

7476
rowSubComponents.appendRequestLabels(rowName, requestNumberLabel, shortLabel, fullLabel);
7577

78+
// const onOpenOverlayFocusOut = (evt: KeyboardEvent) => {
79+
// if (evt.which !== 9) {
80+
// return; // only handle tabs
81+
// }
82+
// const isUpward = evt.shiftKey;
83+
// console.log("onActiveFocusOut", isUpward);
84+
// };
85+
86+
// accordeon a11y guide
87+
// https://www.w3.org/TR/wai-aria-practices-1.1/#accordion
88+
context.pubSub.subscribeToSpecificOverlayChanges(index, (change) => {
89+
console.log("onOverlayChange", change.type);
90+
if (change.type === "open") {
91+
openOverlay = change.changedOverlay;
92+
} else {
93+
openOverlay = undefined;
94+
}
95+
});
96+
97+
let isPoinerClick = false;
98+
let openOverlay: OpenOverlay;
99+
// let showDetailsTimeout: number;
100+
// triggered before click by touch and mouse devices
101+
rowItem.addEventListener("mouseup", () => {
102+
isPoinerClick = true;
103+
});
104+
rowItem.addEventListener("click", (evt: MouseEvent) => {
105+
isPoinerClick = false;
106+
onDetailsOverlayShow(evt);
107+
});
108+
rowItem.addEventListener("keydown", (evt: KeyboardEvent) => {
109+
if (evt.which === 32) {
110+
evt.preventDefault();
111+
onDetailsOverlayShow(evt);
112+
}
113+
if (evt.which === 9) {
114+
if (openOverlay) {
115+
// const overlayCount = context.overlayManager.getOpenOverlays().length;
116+
// if(openOverlay.index){
117+
118+
// }
119+
// openOverlay.
120+
} else {
121+
let nextRowItem = evt.shiftKey ? rowItem.previousSibling : rowItem.nextSibling;
122+
nextRowItem.lastChild.lastChild.dispatchEvent(new MouseEvent("mouseenter"));
123+
}
124+
}
125+
});
126+
127+
// rowItem.addEventListener("keyup", (evt: KeyboardEvent) => {
128+
// if (evt.which === 9) {
129+
// //document.activeElement === rowItem
130+
// console.log("keydown");
131+
// rowName.dispatchEvent(new MouseEvent("mouseenter"));
132+
// window["eventsStore"]["key"].push(evt);
133+
// }
134+
// });
135+
136+
137+
// rowItem.addEventListener("focusin", (evt: FocusEvent) => {
138+
// console.log("in", isPoinerClick);
139+
// // const test = new MouseEvent("mouseenter");
140+
// rowName.dispatchEvent(new MouseEvent("mouseenter"));
141+
// window["eventsStore"]["mouse"].push(evt);
142+
// });
143+
144+
145+
rowItem.addEventListener("focusout", () => {
146+
console.log("out");
147+
rowName.dispatchEvent(new MouseEvent("mouseleave"));
148+
});
149+
150+
// rowItem.addEventListener("click", (evt) => {
151+
// console.log("click", evt);
152+
// onDetailsOverlayShow(evt);
153+
// });
154+
155+
76156
flexScaleHolder.appendChild(rowBar);
77157
leftFixedHolder.appendChild(clipPathElProto.cloneNode(true));
78158
leftFixedHolder.appendChild(rowName);

0 commit comments

Comments
 (0)