Skip to content
Snippets Groups Projects
Unverified Commit 020f98c2 authored by Nemanja Glumac's avatar Nemanja Glumac Committed by GitHub
Browse files

Prevent opening data source in a new tab for embedding SDK (#46743)

* Prevent opening data source in a new tab for embedding SDK

* Add unit tests for embedding SDK context
parent 63295cef
Branches
Tags
No related merge requests found
......@@ -7,10 +7,11 @@ import {
getDataPickerValue,
} from "metabase/common/components/DataPicker";
import { METAKEY } from "metabase/lib/browser";
import { useDispatch, useStore } from "metabase/lib/redux";
import { useDispatch, useSelector, useStore } from "metabase/lib/redux";
import { checkNotNull } from "metabase/lib/types";
import * as Urls from "metabase/lib/urls";
import { loadMetadataForTable } from "metabase/questions/actions";
import { getIsEmbeddingSdk } from "metabase/selectors/embed";
import { getMetadata } from "metabase/selectors/metadata";
import type { IconName } from "metabase/ui";
import { Group, Icon, UnstyledButton, Tooltip } from "metabase/ui";
......@@ -52,6 +53,8 @@ export function NotebookDataPicker({
const dispatch = useDispatch();
const onChangeRef = useLatest(onChange);
const isEmbeddingSdk = useSelector(getIsEmbeddingSdk);
const tableInfo = useMemo(
() => table && Lib.displayInfo(query, stageIndex, table),
[query, stageIndex, table],
......@@ -86,20 +89,24 @@ export function NotebookDataPicker({
const isCtrlOrMetaClick =
(event.ctrlKey || event.metaKey) && event.button === 0;
isCtrlOrMetaClick ? openDataSourceInNewTab() : setIsOpen(true);
isCtrlOrMetaClick && !isEmbeddingSdk
? openDataSourceInNewTab()
: setIsOpen(true);
};
const handleAuxClick = (event: MouseEvent<HTMLButtonElement>) => {
const isMiddleClick = event.button === 1;
isMiddleClick ? openDataSourceInNewTab() : setIsOpen(true);
isMiddleClick && !isEmbeddingSdk
? openDataSourceInNewTab()
: setIsOpen(true);
};
return (
<>
<Tooltip
label={t`${METAKEY}+click to open in new tab`}
hidden={!table}
hidden={!table || isEmbeddingSdk}
events={{
hover: true,
focus: false,
......
......@@ -23,6 +23,10 @@ import {
createSavedStructuredCard,
SAMPLE_DB_ID,
} from "metabase-types/api/mocks/presets";
import {
createMockEmbedState,
createMockState,
} from "metabase-types/store/mocks";
import { createMockNotebookStep } from "../../test-utils";
......@@ -52,7 +56,10 @@ const createQueryWithBreakout = () => {
const setup = (
step = createMockNotebookStep(),
{ readOnly = false }: { readOnly?: boolean } = {},
{
readOnly = false,
isEmbeddingSdk = false,
}: { readOnly?: boolean; isEmbeddingSdk?: boolean } = {},
) => {
const mockWindowOpen = jest.spyOn(window, "open").mockImplementation();
......@@ -61,6 +68,10 @@ const setup = (
setupSearchEndpoints([]);
setupRecentViewsAndSelectionsEndpoints([], ["selections"]);
const storeInitialState = createMockState({
embed: createMockEmbedState({ isEmbeddingSdk }),
});
renderWithProviders(
<DataStep
step={step}
......@@ -72,6 +83,7 @@ const setup = (
reportTimezone="UTC"
updateQuery={updateQuery}
/>,
{ storeInitialState },
);
const getNextQuery = (): Lib.Query => {
......@@ -365,5 +377,52 @@ describe("DataStep", () => {
).toBeInTheDocument();
expect(mockWindowOpen).not.toHaveBeenCalled();
});
describe("embedding SDK context", () => {
it("should not show the tooltip", async () => {
setup(createMockNotebookStep(), { isEmbeddingSdk: true });
await userEvent.hover(screen.getByText("Orders"));
expect(screen.queryByRole("tooltip")).not.toBeInTheDocument();
});
it.each([{ metaKey: true }, { ctrlKey: true }])(
"meta/ctrl click should not open the data source",
async clickConfig => {
const { mockWindowOpen } = setup(createMockNotebookStep(), {
isEmbeddingSdk: true,
});
const dataSource = screen.getByText("Orders");
fireEvent.click(dataSource, clickConfig);
expect(
await screen.findByTestId("entity-picker-modal"),
).toBeInTheDocument();
expect(mockWindowOpen).not.toHaveBeenCalled();
mockWindowOpen.mockClear();
},
);
it("middle click should not open the data source", async () => {
const { mockWindowOpen } = setup(createMockNotebookStep(), {
isEmbeddingSdk: true,
});
const dataSource = screen.getByText("Orders");
const middleClick = new MouseEvent("auxclick", {
bubbles: true,
button: 1,
});
fireEvent(dataSource, middleClick);
expect(
await screen.findByTestId("entity-picker-modal"),
).toBeInTheDocument();
expect(mockWindowOpen).not.toHaveBeenCalled();
mockWindowOpen.mockClear();
});
});
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment