From fdaa759afa0b0515caefff0e0027163bf590c31a Mon Sep 17 00:00:00 2001
From: Anton Kulyk <kuliks.anton@gmail.com>
Date: Mon, 12 Sep 2022 18:50:51 +0100
Subject: [PATCH] Group nav sidebar files (#25359)

* Move `DataAppNavbar` to its own directory

* Move `MainNavbarContainer` to its own directory

* Move `BookmarksList` to `MainNavbarContainer`

* Extract `getSelectedItems`

* Extract `DataAppActionPanel`
---
 .../DataAppNavbar/DataAppActionPanel.tsx      | 47 ++++++++++
 .../DataAppNavbarContainer.tsx                |  5 +-
 .../{ => DataAppNavbar}/DataAppNavbarView.tsx | 34 ++------
 .../MainNavbar/DataAppNavbar/index.tsx        |  1 +
 .../nav/containers/MainNavbar/MainNavbar.tsx  | 76 +++-------------
 .../BookmarkList/BookmarkList.styled.tsx      |  3 +-
 .../BookmarkList/BookmarkList.tsx             |  5 +-
 .../BookmarkList/index.ts                     |  0
 .../BookmarkList/sortable.css                 |  0
 .../MainNavbarContainer.tsx                   |  5 +-
 .../MainNavbarView.tsx                        | 10 ++-
 .../MainNavbar/MainNavbarContainer/index.ts   |  1 +
 .../containers/MainNavbar/getSelectedItems.ts | 87 +++++++++++++++++++
 13 files changed, 172 insertions(+), 102 deletions(-)
 create mode 100644 frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppActionPanel.tsx
 rename frontend/src/metabase/nav/containers/MainNavbar/{ => DataAppNavbar}/DataAppNavbarContainer.tsx (98%)
 rename frontend/src/metabase/nav/containers/MainNavbar/{ => DataAppNavbar}/DataAppNavbarView.tsx (62%)
 create mode 100644 frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/index.tsx
 rename frontend/src/metabase/nav/containers/MainNavbar/{ => MainNavbarContainer}/BookmarkList/BookmarkList.styled.tsx (95%)
 rename frontend/src/metabase/nav/containers/MainNavbar/{ => MainNavbarContainer}/BookmarkList/BookmarkList.tsx (97%)
 rename frontend/src/metabase/nav/containers/MainNavbar/{ => MainNavbarContainer}/BookmarkList/index.ts (100%)
 rename frontend/src/metabase/nav/containers/MainNavbar/{ => MainNavbarContainer}/BookmarkList/sortable.css (100%)
 rename frontend/src/metabase/nav/containers/MainNavbar/{ => MainNavbarContainer}/MainNavbarContainer.tsx (97%)
 rename frontend/src/metabase/nav/containers/MainNavbar/{ => MainNavbarContainer}/MainNavbarView.tsx (98%)
 create mode 100644 frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/index.ts
 create mode 100644 frontend/src/metabase/nav/containers/MainNavbar/getSelectedItems.ts

diff --git a/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppActionPanel.tsx b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppActionPanel.tsx
new file mode 100644
index 00000000000..d59861c3a0d
--- /dev/null
+++ b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppActionPanel.tsx
@@ -0,0 +1,47 @@
+import React from "react";
+import _ from "underscore";
+import { t } from "ttag";
+
+import ButtonGroup from "metabase/core/components/ButtonGroup";
+import Link from "metabase/core/components/Link";
+import Tooltip from "metabase/components/Tooltip";
+
+import * as Urls from "metabase/lib/urls";
+
+import type { DataApp } from "metabase-types/api";
+
+import {
+  DataAppActionsContainer,
+  DataAppActionButton,
+  ExitDataAppButton,
+} from "../MainNavbar.styled";
+
+interface Props {
+  dataApp: DataApp;
+  onEditAppSettings: () => void;
+}
+
+function DataAppActionPanel({ dataApp, onEditAppSettings }: Props) {
+  return (
+    <DataAppActionsContainer>
+      <ButtonGroup>
+        <Tooltip tooltip={t`Add`}>
+          <DataAppActionButton icon="add" onlyIcon />
+        </Tooltip>
+        <Tooltip tooltip={t`Settings`}>
+          <DataAppActionButton
+            icon="gear"
+            onClick={onEditAppSettings}
+            onlyIcon
+          />
+        </Tooltip>
+      </ButtonGroup>
+      <ExitDataAppButton
+        as={Link}
+        to={Urls.dataApp(dataApp, { mode: "preview" })}
+      >{t`Exit app`}</ExitDataAppButton>
+    </DataAppActionsContainer>
+  );
+}
+
+export default DataAppActionPanel;
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbarContainer.tsx b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarContainer.tsx
similarity index 98%
rename from frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbarContainer.tsx
rename to frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarContainer.tsx
index a4db1246fce..0cb84c5dc9a 100644
--- a/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbarContainer.tsx
+++ b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarContainer.tsx
@@ -13,8 +13,9 @@ import Search from "metabase/entities/search";
 import type { DataApp, Dashboard } from "metabase-types/api";
 import type { State } from "metabase-types/store";
 
-import { MainNavbarProps, MainNavbarOwnProps, SelectedItem } from "./types";
-import NavbarLoadingView from "./NavbarLoadingView";
+import { MainNavbarProps, MainNavbarOwnProps, SelectedItem } from "../types";
+import NavbarLoadingView from "../NavbarLoadingView";
+
 import DataAppNavbarView from "./DataAppNavbarView";
 
 const FETCHING_SEARCH_MODELS = ["page"];
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbarView.tsx b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarView.tsx
similarity index 62%
rename from frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbarView.tsx
rename to frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarView.tsx
index 58de052fbaa..1cc84f8a765 100644
--- a/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbarView.tsx
+++ b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarView.tsx
@@ -2,26 +2,20 @@ import React from "react";
 import _ from "underscore";
 import { t } from "ttag";
 
-import ButtonGroup from "metabase/core/components/ButtonGroup";
-import Link from "metabase/core/components/Link";
-import Tooltip from "metabase/components/Tooltip";
-
 import * as Urls from "metabase/lib/urls";
 
 import type { DataApp } from "metabase-types/api";
 
-import { MainNavbarProps, SelectedItem } from "./types";
+import { MainNavbarProps, SelectedItem } from "../types";
+import DataAppActionPanel from "./DataAppActionPanel";
 import {
-  DataAppActionsContainer,
-  DataAppActionButton,
   DataAppNewButton,
-  ExitDataAppButton,
   PaddedSidebarLink,
   SidebarContentRoot,
   SidebarHeading,
   SidebarHeadingWrapper,
   SidebarSection,
-} from "./MainNavbar.styled";
+} from "../MainNavbar.styled";
 
 interface Props extends MainNavbarProps {
   dataApp: DataApp;
@@ -69,24 +63,10 @@ function DataAppNavbarView({
           >{t`Add new page`}</DataAppNewButton>
         </div>
       </div>
-      <DataAppActionsContainer>
-        <ButtonGroup>
-          <Tooltip tooltip={t`Add`}>
-            <DataAppActionButton icon="add" onlyIcon />
-          </Tooltip>
-          <Tooltip tooltip={t`Settings`}>
-            <DataAppActionButton
-              icon="gear"
-              onClick={onEditAppSettings}
-              onlyIcon
-            />
-          </Tooltip>
-        </ButtonGroup>
-        <ExitDataAppButton
-          as={Link}
-          to={Urls.dataApp(dataApp, { mode: "preview" })}
-        >{t`Exit app`}</ExitDataAppButton>
-      </DataAppActionsContainer>
+      <DataAppActionPanel
+        dataApp={dataApp}
+        onEditAppSettings={onEditAppSettings}
+      />
     </SidebarContentRoot>
   );
 }
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/index.tsx b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/index.tsx
new file mode 100644
index 00000000000..a7bd3d39353
--- /dev/null
+++ b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/index.tsx
@@ -0,0 +1 @@
+export { default } from "./DataAppNavbarContainer";
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx
index 4e68f7669b1..ed2bc06d971 100644
--- a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx
+++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx
@@ -6,8 +6,6 @@ import { LocationDescriptor } from "history";
 import * as Urls from "metabase/lib/urls";
 import { closeNavbar, openNavbar } from "metabase/redux/app";
 
-import { coerceCollectionId } from "metabase/collections/utils";
-
 import { getQuestion } from "metabase/query_builder/selectors";
 import { getDashboard } from "metabase/dashboard/selectors";
 
@@ -15,7 +13,7 @@ import type Question from "metabase-lib/lib/Question";
 import type { Dashboard } from "metabase-types/api";
 import type { State } from "metabase-types/store";
 
-import DataAppNavbarContainer from "./DataAppNavbarContainer";
+import DataAppNavbarContainer from "./DataAppNavbar";
 import MainNavbarContainer from "./MainNavbarContainer";
 
 import {
@@ -24,6 +22,7 @@ import {
   MainNavbarDispatchProps,
   SelectedItem,
 } from "./types";
+import getSelectedItems from "./getSelectedItems";
 import { NavRoot, Sidebar } from "./MainNavbar.styled";
 
 interface StateProps {
@@ -78,67 +77,16 @@ function MainNavbar({
     };
   }, [isOpen, openNavbar, closeNavbar]);
 
-  const selectedItems = useMemo<SelectedItem[]>(() => {
-    const { pathname } = location;
-    const { slug } = params;
-    const isCollectionPath = pathname.startsWith("/collection");
-    const isUsersCollectionPath = pathname.startsWith("/collection/users");
-    const isQuestionPath = pathname.startsWith("/question");
-    const isModelPath = pathname.startsWith("/model");
-    const isDataAppPath = Urls.isDataAppPath(pathname);
-    const isDataAppPagePath = Urls.isDataAppPagePath(pathname);
-    const isDashboardPath = pathname.startsWith("/dashboard");
-
-    if (isCollectionPath) {
-      return [
-        {
-          id: isUsersCollectionPath ? "users" : Urls.extractCollectionId(slug),
-          type: "collection",
-        },
-      ];
-    }
-    if (isDataAppPagePath) {
-      return [
-        {
-          id: parseInt(params.pageId as string),
-          type: "data-app-page",
-        },
-      ];
-    }
-    if (isDataAppPath) {
-      return [
-        {
-          id: Urls.extractEntityId(slug),
-          type: "data-app",
-        },
-      ];
-    }
-    if (isDashboardPath && dashboard) {
-      return [
-        {
-          id: dashboard.id,
-          type: "dashboard",
-        },
-        {
-          id: coerceCollectionId(dashboard.collection_id),
-          type: "collection",
-        },
-      ];
-    }
-    if ((isQuestionPath || isModelPath) && question) {
-      return [
-        {
-          id: question.id(),
-          type: "card",
-        },
-        {
-          id: coerceCollectionId(question.collectionId()),
-          type: "collection",
-        },
-      ];
-    }
-    return [{ url: pathname, type: "non-entity" }];
-  }, [location, params, question, dashboard]);
+  const selectedItems = useMemo<SelectedItem[]>(
+    () =>
+      getSelectedItems({
+        pathname: location.pathname,
+        params,
+        question,
+        dashboard,
+      }),
+    [location, params, question, dashboard],
+  );
 
   return (
     <Sidebar className="Nav" isOpen={isOpen} aria-hidden={!isOpen}>
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/BookmarkList/BookmarkList.styled.tsx b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.styled.tsx
similarity index 95%
rename from frontend/src/metabase/nav/containers/MainNavbar/BookmarkList/BookmarkList.styled.tsx
rename to frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.styled.tsx
index e31a81fe457..4f76a194448 100644
--- a/frontend/src/metabase/nav/containers/MainNavbar/BookmarkList/BookmarkList.styled.tsx
+++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.styled.tsx
@@ -4,7 +4,8 @@ import { css } from "@emotion/react";
 import { color } from "metabase/lib/colors";
 
 import Icon from "metabase/components/Icon";
-import { SidebarLink } from "../SidebarItems";
+
+import { SidebarLink } from "../../SidebarItems";
 
 type SidebarBookmarkItem = {
   isSorting: boolean;
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/BookmarkList/BookmarkList.tsx b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.tsx
similarity index 97%
rename from frontend/src/metabase/nav/containers/MainNavbar/BookmarkList/BookmarkList.tsx
rename to frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.tsx
index 0df162262dc..1f4f9dc23ee 100644
--- a/frontend/src/metabase/nav/containers/MainNavbar/BookmarkList/BookmarkList.tsx
+++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.tsx
@@ -17,8 +17,9 @@ import { PLUGIN_COLLECTIONS } from "metabase/plugins";
 import Bookmarks, { isDataAppBookmark } from "metabase/entities/bookmarks";
 import * as Urls from "metabase/lib/urls";
 
-import { SelectedItem } from "../types";
-import { SidebarHeading } from "../MainNavbar.styled";
+import { SelectedItem } from "../../types";
+import { SidebarHeading } from "../../MainNavbar.styled";
+
 import { DragIcon, SidebarBookmarkItem } from "./BookmarkList.styled";
 
 const mapDispatchToProps = {
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/BookmarkList/index.ts b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/index.ts
similarity index 100%
rename from frontend/src/metabase/nav/containers/MainNavbar/BookmarkList/index.ts
rename to frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/index.ts
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/BookmarkList/sortable.css b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/sortable.css
similarity index 100%
rename from frontend/src/metabase/nav/containers/MainNavbar/BookmarkList/sortable.css
rename to frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/sortable.css
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer.tsx b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarContainer.tsx
similarity index 97%
rename from frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer.tsx
rename to frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarContainer.tsx
index 90518a6a8a8..276d02223dc 100644
--- a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer.tsx
+++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarContainer.tsx
@@ -31,9 +31,10 @@ import {
   nonPersonalOrArchivedCollection,
 } from "metabase/collections/utils";
 
-import { MainNavbarProps, SelectedItem } from "./types";
+import { MainNavbarProps, SelectedItem } from "../types";
+import NavbarLoadingView from "../NavbarLoadingView";
+
 import MainNavbarView from "./MainNavbarView";
-import NavbarLoadingView from "./NavbarLoadingView";
 
 type NavbarModal = "MODAL_NEW_COLLECTION" | null;
 
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarView.tsx b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarView.tsx
similarity index 98%
rename from frontend/src/metabase/nav/containers/MainNavbar/MainNavbarView.tsx
rename to frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarView.tsx
index 62ac47caf9b..0098e0d1ba4 100644
--- a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarView.tsx
+++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarView.tsx
@@ -15,13 +15,13 @@ import * as Urls from "metabase/lib/urls";
 
 import type { Bookmark, Collection, DataApp, User } from "metabase-types/api";
 
-import { SelectedItem } from "./types";
-import BookmarkList from "./BookmarkList";
+import { SelectedItem } from "../types";
 import {
   SidebarCollectionLink,
   SidebarDataAppLink,
   SidebarLink,
-} from "./SidebarItems";
+} from "../SidebarItems";
+
 import {
   AddYourOwnDataLink,
   CollectionMenuList,
@@ -32,7 +32,9 @@ import {
   SidebarHeading,
   SidebarHeadingWrapper,
   SidebarSection,
-} from "./MainNavbar.styled";
+} from "../MainNavbar.styled";
+
+import BookmarkList from "./BookmarkList";
 
 interface CollectionTreeItem extends Collection {
   icon: string | IconProps;
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/index.ts b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/index.ts
new file mode 100644
index 00000000000..07e4d8d03dc
--- /dev/null
+++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/index.ts
@@ -0,0 +1 @@
+export { default } from "./MainNavbarContainer";
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/getSelectedItems.ts b/frontend/src/metabase/nav/containers/MainNavbar/getSelectedItems.ts
new file mode 100644
index 00000000000..aa94b2d73ba
--- /dev/null
+++ b/frontend/src/metabase/nav/containers/MainNavbar/getSelectedItems.ts
@@ -0,0 +1,87 @@
+import * as Urls from "metabase/lib/urls";
+
+import { coerceCollectionId } from "metabase/collections/utils";
+
+import type Question from "metabase-lib/lib/Question";
+import type { Dashboard } from "metabase-types/api";
+
+import { SelectedItem } from "./types";
+
+type Opts = {
+  pathname: string;
+  params: {
+    slug?: string;
+    pageId?: string;
+  };
+  question?: Question;
+  dashboard?: Dashboard;
+};
+
+function getSelectedItems({
+  pathname,
+  params,
+  question,
+  dashboard,
+}: Opts): SelectedItem[] {
+  const { slug } = params;
+
+  const isCollectionPath = pathname.startsWith("/collection");
+  const isUsersCollectionPath = pathname.startsWith("/collection/users");
+  const isQuestionPath = pathname.startsWith("/question");
+  const isModelPath = pathname.startsWith("/model");
+  const isDataAppPath = Urls.isDataAppPath(pathname);
+  const isDataAppPagePath = Urls.isDataAppPagePath(pathname);
+  const isDashboardPath = pathname.startsWith("/dashboard");
+
+  if (isCollectionPath) {
+    return [
+      {
+        id: isUsersCollectionPath ? "users" : Urls.extractCollectionId(slug),
+        type: "collection",
+      },
+    ];
+  }
+  if (isDataAppPagePath) {
+    return [
+      {
+        id: parseInt(params.pageId as string),
+        type: "data-app-page",
+      },
+    ];
+  }
+  if (isDataAppPath) {
+    return [
+      {
+        id: Urls.extractEntityId(slug),
+        type: "data-app",
+      },
+    ];
+  }
+  if (isDashboardPath && dashboard) {
+    return [
+      {
+        id: dashboard.id,
+        type: "dashboard",
+      },
+      {
+        id: coerceCollectionId(dashboard.collection_id),
+        type: "collection",
+      },
+    ];
+  }
+  if ((isQuestionPath || isModelPath) && question) {
+    return [
+      {
+        id: question.id(),
+        type: "card",
+      },
+      {
+        id: coerceCollectionId(question.collectionId()),
+        type: "collection",
+      },
+    ];
+  }
+  return [{ url: pathname, type: "non-entity" }];
+}
+
+export default getSelectedItems;
-- 
GitLab