From aaf93a0be53492ebad1f4da9599a432cadddc80f Mon Sep 17 00:00:00 2001
From: Anton Kulyk <kuliks.anton@gmail.com>
Date: Mon, 12 Sep 2022 19:45:51 +0100
Subject: [PATCH] Respect data app homepage setting (#25368)

---
 .../src/metabase/entities/data-apps/utils.ts  |  5 ++-
 .../entities/data-apps/utils.unit.spec.ts     | 43 +++++++++++++++----
 .../DataAppNavbar/DataAppNavbarContainer.tsx  |  4 +-
 .../writeback/containers/DataAppLanding.tsx   |  2 +-
 4 files changed, 42 insertions(+), 12 deletions(-)

diff --git a/frontend/src/metabase/entities/data-apps/utils.ts b/frontend/src/metabase/entities/data-apps/utils.ts
index 6e91410f0b8..90b1628b204 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 200c38aab46..47cb2c587ba 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 0cb84c5dc9a..1b158c056a5 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 3a5e48f79e3..d30ea81023e 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}
-- 
GitLab