diff --git a/frontend/src/metabase/visualizations/visualizations/LinkViz/LinkViz.tsx b/frontend/src/metabase/visualizations/visualizations/LinkViz/LinkViz.tsx index 624ab4f4d22543408f3d70dc8d6091d200a909a5..e397c88acc5aa300c243b2544973a1a0f83618f4 100644 --- a/frontend/src/metabase/visualizations/visualizations/LinkViz/LinkViz.tsx +++ b/frontend/src/metabase/visualizations/visualizations/LinkViz/LinkViz.tsx @@ -5,6 +5,7 @@ import _ from "underscore"; import TippyPopover from "metabase/components/Popover/TippyPopover"; import Search from "metabase/entities/search"; import { useToggle } from "metabase/hooks/use-toggle"; +import { getUrlTarget } from "metabase/lib/dom"; import { SearchResults } from "metabase/nav/components/search/SearchResults"; import type { LinkCardSettings, @@ -181,7 +182,11 @@ function LinkVizInner({ data-testid="custom-view-text-link" fade={isEditingParameter} > - <ExternalLink href={url ?? ""} target="_blank" rel="noreferrer"> + <ExternalLink + href={url ?? ""} + target={getUrlTarget(url)} + rel="noreferrer" + > <UrlLinkDisplay url={url} /> </ExternalLink> </DisplayLinkCardWrapper> diff --git a/frontend/src/metabase/visualizations/visualizations/LinkViz/LinkViz.unit.spec.tsx b/frontend/src/metabase/visualizations/visualizations/LinkViz/LinkViz.unit.spec.tsx index 4fc891dc31ec2f490be5e25a701a1bb58e1d7616..c6cf0d67d2f79c933f56ae6b7951cadcca296387 100644 --- a/frontend/src/metabase/visualizations/visualizations/LinkViz/LinkViz.unit.spec.tsx +++ b/frontend/src/metabase/visualizations/visualizations/LinkViz/LinkViz.unit.spec.tsx @@ -159,6 +159,41 @@ describe("LinkViz", () => { expect(screen.getByText("https://example23.com")).toBeInTheDocument(); expect(screen.getByRole("link")).toHaveAttribute("target", "_blank"); }); + + it("should open absolute links to question in the same tab", () => { + const dashcard = createMockLinkDashboardCard({ + url: "http://localhost/question/1-example", + }); + + setup({ + isEditing: false, + dashcard, + settings: dashcard.visualization_settings as LinkCardVizSettings, + }); + + expect(window.location.origin).toBe("http://localhost"); + + expect( + screen.getByText("http://localhost/question/1-example"), + ).toBeInTheDocument(); + + expect(screen.getByRole("link")).toHaveAttribute("target", "_self"); + }); + + it("should open relative links to question in the same tab", () => { + const dashcard = createMockLinkDashboardCard({ + url: "question/2-example", + }); + + setup({ + isEditing: false, + dashcard, + settings: dashcard.visualization_settings as LinkCardVizSettings, + }); + + expect(screen.getByText("question/2-example")).toBeInTheDocument(); + expect(screen.getByRole("link")).toHaveAttribute("target", "_self"); + }); }); describe("entity links", () => {