diff --git a/frontend/src/metabase/entities/data-apps/utils.ts b/frontend/src/metabase/entities/data-apps/utils.ts index 6e91410f0b88f3d9065106f66ba8e0d6450644e0..90b1628b204a22b127d6d24245bf4cf02b3e248a 100644 --- a/frontend/src/metabase/entities/data-apps/utils.ts +++ b/frontend/src/metabase/entities/data-apps/utils.ts @@ -9,7 +9,10 @@ export function isDataAppCollection(collection: Collection) { return typeof collection.app_id === "number"; } -export function getDataAppHomePageId(pages: Dashboard[]) { +export function getDataAppHomePageId(dataApp: DataApp, pages: Dashboard[]) { + if (dataApp.dashboard_id) { + return dataApp.dashboard_id; + } const [firstPage] = _.sortBy(pages, "name"); return firstPage?.id; } diff --git a/frontend/src/metabase/entities/data-apps/utils.unit.spec.ts b/frontend/src/metabase/entities/data-apps/utils.unit.spec.ts index 200c38aab463bc0094d3213eef612433038ec552..47cb2c587ba4e08b513ebfdfe963d71be1295e6a 100644 --- a/frontend/src/metabase/entities/data-apps/utils.unit.spec.ts +++ b/frontend/src/metabase/entities/data-apps/utils.unit.spec.ts @@ -1,18 +1,45 @@ -import { createMockDataAppPage } from "metabase-types/api/mocks"; +import { + createMockDataApp, + createMockDataAppPage, +} from "metabase-types/api/mocks"; import { getDataAppHomePageId } from "./utils"; describe("data app utils", () => { + const dataAppWithoutHomepage = createMockDataApp({ dashboard_id: null }); + const dataAppWithHomepage = createMockDataApp({ dashboard_id: 3 }); + + const page1 = createMockDataAppPage({ id: 1, name: "A" }); + const page2 = createMockDataAppPage({ id: 2, name: "B" }); + const page3 = createMockDataAppPage({ id: 3, name: "C" }); + const pages = [page1, page2, page3]; + describe("getDataAppHomePageId", () => { - it("returns fist page in alphabetical order", () => { - const page1 = createMockDataAppPage({ id: 1, name: "A" }); - const page2 = createMockDataAppPage({ id: 2, name: "B" }); - const page3 = createMockDataAppPage({ id: 3, name: "C" }); + describe("with explicit homepage", () => { + it("returns data app's dashboard_id", () => { + expect(getDataAppHomePageId(dataAppWithHomepage, pages)).toEqual( + dataAppWithHomepage.dashboard_id, + ); + }); - expect(getDataAppHomePageId([page2, page1, page3])).toEqual(page1.id); + it("returns data app's dashboard_id even if page list is empty", () => { + expect(getDataAppHomePageId(dataAppWithHomepage, [])).toEqual( + dataAppWithHomepage.dashboard_id, + ); + }); }); - it("returns undefined when there're no pages", () => { - expect(getDataAppHomePageId([])).toBeUndefined(); + describe("without explicit homepage", () => { + it("returns fist page in alphabetical order", () => { + expect(getDataAppHomePageId(dataAppWithoutHomepage, pages)).toEqual( + page1.id, + ); + }); + + it("returns undefined when there're no pages", () => { + expect( + getDataAppHomePageId(dataAppWithoutHomepage, []), + ).toBeUndefined(); + }); }); }); }); diff --git a/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarContainer.tsx b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarContainer.tsx index 0cb84c5dc9acb7750e12120c284fa7e0073b7919..1b158c056a5b4321762b69ff55c917f8a0ab6748 100644 --- a/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarContainer.tsx +++ b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarContainer.tsx @@ -64,13 +64,13 @@ function DataAppNavbarContainer({ return [ { type: "data-app-page", - id: getDataAppHomePageId(pages), + id: getDataAppHomePageId(dataApp, pages), }, ]; } return selectedItems; - }, [pages, selectedItems]); + }, [dataApp, pages, selectedItems]); const onEditAppSettings = useCallback(() => { setModal("MODAL_APP_SETTINGS"); diff --git a/frontend/src/metabase/writeback/containers/DataAppLanding.tsx b/frontend/src/metabase/writeback/containers/DataAppLanding.tsx index 3a5e48f79e32a2fa87c7a399202d01e2ce95a0a5..d30ea81023e2b006e0498ca861b2f5b4fe2d1e80 100644 --- a/frontend/src/metabase/writeback/containers/DataAppLanding.tsx +++ b/frontend/src/metabase/writeback/containers/DataAppLanding.tsx @@ -47,7 +47,7 @@ const DataAppLanding = ({ loadingAndErrorWrapper={false} > {({ list: pages = [] }: { list: any[] }) => { - const homepageId = getDataAppHomePageId(pages); + const homepageId = getDataAppHomePageId(dataApp, pages); return homepageId ? ( <DashboardApp dashboardId={homepageId}