From f2e3e7b4d84b9aac078b649ac9057dc2736d7395 Mon Sep 17 00:00:00 2001 From: Benjamin Klein Date: Tue, 27 Jun 2023 11:36:34 +0200 Subject: [PATCH 1/3] Add boolean property to config This property is later used to prevent the popup of a new page. When set to true, it will alter all _blank targets for links to empty. A utils function is provided. Signed-off-by: Benjamin Klein --- .../SearchResults/ResultItemTitle.tsx | 3 +- .../SearchTracePage/SearchResults/index.tsx | 3 +- .../TraceDiffHeader/TraceTimelineLink.tsx | 8 +++- .../TracePageHeader/AltViewOptions.tsx | 5 ++- .../TracePageHeader/TracePageHeader.tsx | 3 +- .../TracePage/TraceSpanView/index.tsx | 3 +- .../src/constants/default-config.tsx | 1 + packages/jaeger-ui/src/types/config.tsx | 4 ++ .../src/utils/config/get-target.test.js | 45 +++++++++++++++++++ .../jaeger-ui/src/utils/config/get-target.tsx | 23 ++++++++++ 10 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 packages/jaeger-ui/src/utils/config/get-target.test.js create mode 100644 packages/jaeger-ui/src/utils/config/get-target.tsx diff --git a/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ResultItemTitle.tsx b/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ResultItemTitle.tsx index 9ed127ab4a..705fce5517 100644 --- a/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ResultItemTitle.tsx +++ b/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ResultItemTitle.tsx @@ -25,6 +25,7 @@ import { FetchedState, TNil } from '../../../types'; import { ApiError } from '../../../types/api-error'; import './ResultItemTitle.css'; +import { getTargetEmptyOrBlank } from '../../../utils/config/get-target'; type Props = { duration?: number; @@ -80,7 +81,7 @@ export default class ResultItemTitle extends React.PureComponent { wrapperProps.to = linkTo; WrapperComponent = Link; if (targetBlank) { - wrapperProps.target = '_blank'; + wrapperProps.target = getTargetEmptyOrBlank(); wrapperProps.rel = 'noopener noreferrer'; } } diff --git a/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/index.tsx b/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/index.tsx index e1a599cf1c..53d09aba7c 100644 --- a/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/index.tsx +++ b/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/index.tsx @@ -43,6 +43,7 @@ import { SearchQuery } from '../../../types/search'; import { KeyValuePair, Trace, TraceData } from '../../../types/trace'; import './index.css'; +import { getTargetEmptyOrBlank } from '../../../utils/config/get-target'; type SearchResultsProps = { cohortAddTrace: (traceId: string) => void; @@ -200,7 +201,7 @@ export class UnconnectedSearchResults extends React.PureComponent diff --git a/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.tsx b/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.tsx index 9c80958a21..d54880f21a 100644 --- a/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.tsx +++ b/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.tsx @@ -16,6 +16,7 @@ import * as React from 'react'; import { getUrl } from '../../TracePage/url'; import NewWindowIcon from '../../common/NewWindowIcon'; +import { getTargetEmptyOrBlank } from '../../../utils/config/get-target'; type PropsType = { traceID: string; @@ -27,7 +28,12 @@ function stopPropagation(event: React.MouseEvent) { export default function TraceTimelineLink({ traceID }: PropsType) { return ( - + ); diff --git a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/AltViewOptions.tsx b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/AltViewOptions.tsx index 8cfaf04c0e..f8da8f2c94 100644 --- a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/AltViewOptions.tsx +++ b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/AltViewOptions.tsx @@ -27,6 +27,7 @@ import { } from './TracePageHeader.track'; import prefixUrl from '../../../utils/prefix-url'; import { ETraceViewType } from '../types'; +import { getTargetBlankOrTop } from '../../../utils/config/get-target'; type Props = { onTraceViewChange: (viewType: ETraceViewType) => void; @@ -88,7 +89,7 @@ export default function AltViewOptions(props: Props) { Trace JSON @@ -100,7 +101,7 @@ export default function AltViewOptions(props: Props) { Trace JSON (unadjusted) diff --git a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx index 9c120a4d20..dbb1d79368 100644 --- a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx +++ b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx @@ -38,6 +38,7 @@ import { getTraceLinks } from '../../../model/link-patterns'; import './TracePageHeader.css'; import ExternalLinks from '../../common/ExternalLinks'; +import { getTargetEmptyOrBlank } from '../../../utils/config/get-target'; type TracePageHeaderEmbedProps = { canCollapse: boolean; @@ -210,7 +211,7 @@ export function TracePageHeaderFn(props: TracePageHeaderEmbedProps & { forwarded diff --git a/packages/jaeger-ui/src/components/TracePage/TraceSpanView/index.tsx b/packages/jaeger-ui/src/components/TracePage/TraceSpanView/index.tsx index 2176bf2aa4..2f70c0daf6 100644 --- a/packages/jaeger-ui/src/components/TracePage/TraceSpanView/index.tsx +++ b/packages/jaeger-ui/src/components/TracePage/TraceSpanView/index.tsx @@ -22,6 +22,7 @@ import { TNil } from '../../../types'; import { Trace, Span } from '../../../types/trace'; import { timeConversion } from '../../../utils/date'; import prefixUrl from '../../../utils/prefix-url'; +import { getTargetEmptyOrBlank } from '../../../utils/config/get-target'; const Option = Select.Option; @@ -149,7 +150,7 @@ export default class TraceSpanView extends Component { return ( {text} diff --git a/packages/jaeger-ui/src/constants/default-config.tsx b/packages/jaeger-ui/src/constants/default-config.tsx index 910eb6ad00..56a4708033 100644 --- a/packages/jaeger-ui/src/constants/default-config.tsx +++ b/packages/jaeger-ui/src/constants/default-config.tsx @@ -103,6 +103,7 @@ const defaultConfig: Config = { }, disableFileUploadControl: false, disableJsonView: false, + forbidNewPage: false, traceGraph: { layoutManagerMemory: undefined, }, diff --git a/packages/jaeger-ui/src/types/config.tsx b/packages/jaeger-ui/src/types/config.tsx index e1fe3a0cd5..1d3f909585 100644 --- a/packages/jaeger-ui/src/types/config.tsx +++ b/packages/jaeger-ui/src/types/config.tsx @@ -172,6 +172,10 @@ export type Config = { // Disables the json view. disableJsonView: boolean; + // Alters all targets of links to empty or top to + // prevent the creation of a new page. + forbidNewPage: boolean; + // The following features are experimental / undocumented. deepDependencies?: { diff --git a/packages/jaeger-ui/src/utils/config/get-target.test.js b/packages/jaeger-ui/src/utils/config/get-target.test.js new file mode 100644 index 0000000000..1cbcbf72f8 --- /dev/null +++ b/packages/jaeger-ui/src/utils/config/get-target.test.js @@ -0,0 +1,45 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as getConfig from './get-config'; +import { getTargetBlankOrTop, getTargetEmptyOrBlank } from './get-target'; + +let getConfigValueSpy; + +beforeAll(() => { + getConfigValueSpy = jest.spyOn(getConfig, 'getConfigValue'); +}); + +describe('getTarget', () => { + it('getTargetEmptyOrBlank returns empty because forbidNewPage is true', () => { + getConfigValueSpy.mockReturnValue(true); + const target = getTargetEmptyOrBlank(); + expect(target).toBe(''); + }); + it('getTargetEmptyOrBlank returns _blank because forbidNewPage is true', () => { + getConfigValueSpy.mockReturnValue(false); + const target = getTargetEmptyOrBlank(); + expect(target).toBe('_blank'); + }); + it('getTargetBlankOrTop returns _top because forbidNewPage is true', () => { + getConfigValueSpy.mockReturnValue(true); + const target = getTargetBlankOrTop(); + expect(target).toBe('_top'); + }); + it('getTargetBlankOrTop returns _blank because forbidNewPage is true', () => { + getConfigValueSpy.mockReturnValue(false); + const target = getTargetBlankOrTop(); + expect(target).toBe('_blank'); + }); +}); diff --git a/packages/jaeger-ui/src/utils/config/get-target.tsx b/packages/jaeger-ui/src/utils/config/get-target.tsx new file mode 100644 index 0000000000..71ddba6341 --- /dev/null +++ b/packages/jaeger-ui/src/utils/config/get-target.tsx @@ -0,0 +1,23 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { getConfigValue } from './get-config'; + +export function getTargetEmptyOrBlank() { + return getConfigValue('forbidNewPage') ? '' : '_blank'; +} + +export function getTargetBlankOrTop() { + return getConfigValue('forbidNewPage') ? '_top' : '_blank'; +} From 00a68f3ef95bedbec502884485362fd303f57c14 Mon Sep 17 00:00:00 2001 From: Benjamin Klein <45211351+Binrix@users.noreply.github.com> Date: Tue, 27 Jun 2023 15:47:53 +0200 Subject: [PATCH 2/3] Update packages/jaeger-ui/src/utils/config/get-target.test.js Co-authored-by: Yuri Shkuro Signed-off-by: Benjamin Klein <45211351+Binrix@users.noreply.github.com> --- packages/jaeger-ui/src/utils/config/get-target.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jaeger-ui/src/utils/config/get-target.test.js b/packages/jaeger-ui/src/utils/config/get-target.test.js index 1cbcbf72f8..965cf197cf 100644 --- a/packages/jaeger-ui/src/utils/config/get-target.test.js +++ b/packages/jaeger-ui/src/utils/config/get-target.test.js @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Uber Technologies, Inc. +// Copyright (c) 2023 The Jaeger Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. From fcefb6a781b21d92c000af53abdf4f61069f35c2 Mon Sep 17 00:00:00 2001 From: Benjamin Klein <45211351+Binrix@users.noreply.github.com> Date: Tue, 27 Jun 2023 15:47:58 +0200 Subject: [PATCH 3/3] Update packages/jaeger-ui/src/utils/config/get-target.tsx Co-authored-by: Yuri Shkuro Signed-off-by: Benjamin Klein <45211351+Binrix@users.noreply.github.com> --- packages/jaeger-ui/src/utils/config/get-target.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jaeger-ui/src/utils/config/get-target.tsx b/packages/jaeger-ui/src/utils/config/get-target.tsx index 71ddba6341..e2a206ede4 100644 --- a/packages/jaeger-ui/src/utils/config/get-target.tsx +++ b/packages/jaeger-ui/src/utils/config/get-target.tsx @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Uber Technologies, Inc. +// Copyright (c) 2023 The Jaeger Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License.