Skip to content

Commit cb4861c

Browse files
Merge pull request #27 from digma-ai/feature/zoom
Add zoom controls to the Trace Details Page
2 parents 261159e + 547108e commit cb4861c

File tree

8 files changed

+113
-15
lines changed

8 files changed

+113
-15
lines changed

packages/jaeger-ui/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
window.embeddedMode;
4545
window.isUserDefinedJaegerQueryURL;
4646
window.staticPath;
47+
window.enableZoomControls;
4748
</script>
4849
</head>
4950
<body>

packages/jaeger-ui/src/Contexts.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { createContext } from 'react';
2+
import ZoomManager from './utils/ZoomManager';
3+
4+
export const ZoomContext = createContext<null | ZoomManager>(null);

packages/jaeger-ui/src/components/App/index.jsx

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ import configureStore from '../../utils/configure-store';
3939
import processScripts from '../../utils/config/process-scripts';
4040
import prefixUrl from '../../utils/prefix-url';
4141
import { isString } from '../../utils/ts/typeGuards/isString';
42+
import ZoomManager from '../../utils/ZoomManager';
43+
import { ZoomContext } from '../../Contexts';
4244

4345
import '../common/vars.css';
4446
import '../common/utils.css';
@@ -52,6 +54,30 @@ export default class JaegerUIApp extends Component {
5254
this.store = configureStore(history);
5355
JaegerAPI.apiRoot = DEFAULT_API_ROOT;
5456
processScripts();
57+
this.zoomManager = new ZoomManager();
58+
this._handleZoomKeyboardShortcuts = this._handleZoomKeyboardShortcuts.bind(this);
59+
}
60+
61+
componentDidMount() {
62+
document.addEventListener('keydown', this._handleZoomKeyboardShortcuts);
63+
}
64+
65+
componentWillUnmount() {
66+
document.removeEventListener('keydown', this._handleZoomKeyboardShortcuts);
67+
}
68+
69+
_handleZoomKeyboardShortcuts(e) {
70+
if (window.enableZoomControls && (e.metaKey || e.ctrlKey)) {
71+
switch (e.key) {
72+
case '-':
73+
this.zoomManager.zoomOut();
74+
break;
75+
case '=':
76+
this.zoomManager.zoomIn();
77+
break;
78+
default:
79+
}
80+
}
5581
}
5682

5783
render() {
@@ -65,23 +91,25 @@ export default class JaegerUIApp extends Component {
6591
return (
6692
<Provider store={this.store}>
6793
<ConnectedRouter history={history}>
68-
<Page>
69-
<Switch>
70-
<Route path={searchPath} component={SearchTracePage} />
71-
<Route path={traceDiffPath} component={TraceDiff} />
72-
<Route path={tracePath} component={TracePage} />
73-
<Route path={dependenciesPath} component={DependencyGraph} />
74-
<Route path={deepDependenciesPath} component={DeepDependencies} />
75-
<Route path={qualityMetricsPath} component={QualityMetrics} />
76-
<Route path={monitorATMPath} component={MonitorATMPage} />
94+
<ZoomContext.Provider value={this.zoomManager}>
95+
<Page>
96+
<Switch>
97+
<Route path={searchPath} component={SearchTracePage} />
98+
<Route path={traceDiffPath} component={TraceDiff} />
99+
<Route path={tracePath} component={TracePage} />
100+
<Route path={dependenciesPath} component={DependencyGraph} />
101+
<Route path={deepDependenciesPath} component={DeepDependencies} />
102+
<Route path={qualityMetricsPath} component={QualityMetrics} />
103+
<Route path={monitorATMPath} component={MonitorATMPage} />
77104

78-
<Redirect exact path="/" to={searchPath} />
79-
<Redirect exact path={prefixUrl()} to={searchPath} />
80-
<Redirect exact path={prefixUrl('/')} to={searchPath} />
105+
<Redirect exact path="/" to={searchPath} />
106+
<Redirect exact path={prefixUrl()} to={searchPath} />
107+
<Redirect exact path={prefixUrl('/')} to={searchPath} />
81108

82-
<Route component={NotFound} />
83-
</Switch>
84-
</Page>
109+
<Route component={NotFound} />
110+
</Switch>
111+
</Page>
112+
</ZoomContext.Provider>
85113
</ConnectedRouter>
86114
</Provider>
87115
);

packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,7 @@ limitations under the License.
108108
font-size: 1.78em;
109109
margin-right: 0.15em;
110110
}
111+
112+
.TracePageHeader--zoomControls {
113+
margin-left: 0.5em;
114+
}

packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import { getTraceLinks } from '../../../model/link-patterns';
3838

3939
import './TracePageHeader.css';
4040
import ExternalLinks from '../../common/ExternalLinks';
41+
import ZoomControls from './ZoomControls';
4142

4243
type TracePageHeaderEmbedProps = {
4344
canCollapse: boolean;
@@ -199,6 +200,7 @@ export function TracePageHeaderFn(props: TracePageHeaderEmbedProps & { forwarded
199200
Archive Trace
200201
</Button>
201202
)}
203+
{window.enableZoomControls && <ZoomControls className="TracePageHeader--zoomControls" />}
202204
{showStandaloneLink && (
203205
<Link
204206
className="u-tx-inherit ub-nowrap ub-mx2"
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { Button } from 'antd';
2+
import React, { useContext } from 'react';
3+
import ButtonGroup from 'antd/lib/button/button-group';
4+
import { ZoomContext } from '../../../Contexts';
5+
6+
type ZoomControlsProps = {
7+
className?: string;
8+
};
9+
10+
const ZoomControls = (props: ZoomControlsProps) => {
11+
const zoomManager = useContext(ZoomContext);
12+
13+
return (
14+
<ButtonGroup className={props.className}>
15+
<Button
16+
onClick={() => {
17+
zoomManager?.zoomOut();
18+
}}
19+
htmlType="button"
20+
icon="zoom-out"
21+
/>
22+
<Button
23+
onClick={() => {
24+
zoomManager?.zoomIn();
25+
}}
26+
htmlType="button"
27+
icon="zoom-in"
28+
/>
29+
</ButtonGroup>
30+
);
31+
};
32+
33+
export default ZoomControls;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const MIN_ZOOM_LEVEL = 0.7;
2+
const MAX_ZOOM_LEVEL = 1.5;
3+
const ZOOM_FACTOR = 0.1;
4+
5+
export default class ZoomManager {
6+
zoomLevel: number;
7+
8+
constructor() {
9+
this.zoomLevel = document.body.style.zoom || 1;
10+
}
11+
12+
updateStyles = () => {
13+
document.body.style.zoom = this.zoomLevel;
14+
};
15+
16+
zoomIn = () => {
17+
this.zoomLevel = Math.min(this.zoomLevel + ZOOM_FACTOR, MAX_ZOOM_LEVEL);
18+
this.updateStyles();
19+
};
20+
21+
zoomOut = () => {
22+
this.zoomLevel = Math.max(this.zoomLevel - ZOOM_FACTOR, MIN_ZOOM_LEVEL);
23+
this.updateStyles();
24+
};
25+
}

packages/jaeger-ui/typings/custom.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ declare interface Window {
3939
embeddedMode?: unknown;
4040
isUserDefinedJaegerQueryURL?: unknown;
4141
staticPath?: unknown;
42+
enableZoomControls?: unknown
4243
}
4344

4445
declare const __REACT_APP_GA_DEBUG__: string | undefined;

0 commit comments

Comments
 (0)