Compare commits

...

1 Commits

Author SHA1 Message Date
Ryan Laurie
a9b31a0c85 fix question link 2024-10-07 11:50:37 -06:00
3 changed files with 68 additions and 10 deletions

View File

@@ -15,7 +15,10 @@ import { getMetadata } from "metabase/selectors/metadata";
import { QuestionPublicLinkPopover } from "metabase/sharing/components/PublicLinkPopover";
import { Box, Flex, FixedSizeIcon as Icon, Text } from "metabase/ui";
import type Question from "metabase-lib/v1/Question";
import type { Database } from "metabase-types/api";
import {
getQuestionIdFromVirtualTableId,
isVirtualCardId,
} from "metabase-lib/v1/metadata/utils/saved-questions";
import SidebarStyles from "./QuestionInfoSidebar.module.css";
@@ -87,11 +90,15 @@ function SourceDisplay({ question }: { question: Question }) {
return null;
}
const model = String(sourceInfo.id).includes("card__") ? "card" : "table";
const model = isVirtualCardId(sourceInfo.id) ? "card" : "table";
const sourceUrl =
model === "card"
? Urls.browseDatabase(sourceInfo.db as Database)
? Urls.question({
...sourceInfo,
name: sourceInfo.display_name,
id: getQuestionIdFromVirtualTableId(sourceInfo.id) as number,
})
: getTableUrl(sourceInfo, metadata);
return (
@@ -100,10 +107,7 @@ function SourceDisplay({ question }: { question: Question }) {
{sourceInfo.db && (
<>
<Text>
<Link
to={`/browse/databases/${sourceInfo.db.id}`}
variant="brand"
>
<Link to={Urls.browseDatabase(sourceInfo.db)} variant="brand">
{sourceInfo.db.name}
</Link>
</Text>

View File

@@ -113,7 +113,7 @@ describe("QuestionInfoSidebar", () => {
);
});
it("should show source information", () => {
it("should show table source information", () => {
const card = createMockCard({
name: "Question",
});
@@ -124,6 +124,34 @@ describe("QuestionInfoSidebar", () => {
expect(screen.getByText("Products")).toBeInTheDocument();
});
it("should show card source information", async () => {
const card = createMockCard({
name: "My Question",
dataset_query: {
type: "query",
database: 1,
query: {
"source-table": "card__2",
},
},
});
const sourceCard = createMockCard({
name: "My Source Question",
id: 2,
});
setup({ card, sourceCard });
expect(await screen.findByText("Sample Database")).toBeInTheDocument();
expect(screen.getByText("/")).toBeInTheDocument();
expect(screen.getByText("My Source Question")).toBeInTheDocument();
expect(screen.getByText("My Source Question")).toHaveAttribute(
"href",
"/question/2-my-source-question",
);
});
it("should not show entity id", () => {
const card = createMockCard({
name: "Question",

View File

@@ -12,7 +12,8 @@ import { createMockEntitiesState } from "__support__/store";
import { renderWithProviders, waitForLoaderToBeRemoved } from "__support__/ui";
import { checkNotNull } from "metabase/lib/types";
import { getMetadata } from "metabase/selectors/metadata";
import type { Card, Settings } from "metabase-types/api";
import { convertSavedQuestionToVirtualTable } from "metabase-lib/v1/metadata/utils/saved-questions";
import type { Card, NormalizedTable, Settings } from "metabase-types/api";
import {
createMockCard,
createMockSettings,
@@ -27,10 +28,12 @@ export interface SetupOpts {
card?: Card;
settings?: Settings;
hasEnterprisePlugins?: boolean;
sourceCard?: Card;
}
export const setup = async ({
card = createMockCard(),
sourceCard,
settings = createMockSettings(),
hasEnterprisePlugins,
}: SetupOpts) => {
@@ -45,9 +48,32 @@ export const setup = async ({
settings: mockSettings(settings),
entities: createMockEntitiesState({
databases: [createSampleDatabase()],
questions: [card],
questions: sourceCard ? [card, sourceCard] : [card],
}),
});
// 😫 all this is necessary to test a card as a question source
if (sourceCard) {
const virtualTable = convertSavedQuestionToVirtualTable(sourceCard);
state.entities = {
...state.entities,
tables: {
...(state.entities.tables as Record<number, NormalizedTable>),
[virtualTable.id]: virtualTable,
},
databases: {
[state.entities.databases[1].id]: {
...state.entities.databases[1],
tables: [
...(state.entities.databases[1].tables ?? []),
virtualTable.id,
],
},
},
};
}
const metadata = getMetadata(state);
const question = checkNotNull(metadata.question(card.id));
const onSave = jest.fn();