From 2485a3cb4d6b3e1050e5ab69c13b4f3972f66d03 Mon Sep 17 00:00:00 2001 From: Anton Kulyk <kuliks.anton@gmail.com> Date: Thu, 22 Sep 2022 11:41:34 +0100 Subject: [PATCH] Fix user-created pages don't show up in app nav (#25557) --- frontend/src/metabase-types/api/data-app.ts | 1 + .../DataAppNavbar/DataAppNavbarView.tsx | 41 +++++++++++++------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/frontend/src/metabase-types/api/data-app.ts b/frontend/src/metabase-types/api/data-app.ts index 02b2356a654..f0428feb265 100644 --- a/frontend/src/metabase-types/api/data-app.ts +++ b/frontend/src/metabase-types/api/data-app.ts @@ -9,6 +9,7 @@ import { WritebackAction } from "./writeback"; import { FormType } from "./writeback-form-settings"; export type DataAppId = number; +export type DataAppPage = Dashboard; export type DataAppPageId = Dashboard["id"]; export interface DataAppNavItem { diff --git a/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarView.tsx b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarView.tsx index b49354f7832..c45f954405a 100644 --- a/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarView.tsx +++ b/frontend/src/metabase/nav/containers/MainNavbar/DataAppNavbar/DataAppNavbarView.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useMemo } from "react"; import _ from "underscore"; -import type { DataApp, DataAppNavItem } from "metabase-types/api"; +import type { DataApp, DataAppPage, DataAppNavItem } from "metabase-types/api"; import { MainNavbarProps, SelectedItem } from "../types"; import { @@ -38,6 +38,28 @@ function DataAppNavbarView({ const pageMap = useMemo(() => _.indexBy(pages, "id"), [pages]); + const pagesWithoutNavItems = useMemo(() => { + const pageIds = pages.map(page => page.id); + const navItemPageIds = dataApp.nav_items + .filter(navItem => navItem.page_id) + .map(navItem => navItem.page_id); + const pagesWithoutNavItems = _.difference(pageIds, navItemPageIds); + return pagesWithoutNavItems.map(pageId => pageMap[pageId]); + }, [dataApp.nav_items, pages, pageMap]); + + const renderPage = useCallback( + (page: DataAppPage, indent = 0) => ( + <DataAppPageSidebarLink + key={page.id} + dataApp={dataApp} + page={page} + isSelected={dataAppPage?.id === page.id} + indent={indent} + /> + ), + [dataApp, dataAppPage], + ); + const renderNavItem = useCallback( (navItem: DataAppNavItem) => { const page = pageMap[navItem.page_id]; @@ -46,17 +68,9 @@ function DataAppNavbarView({ return null; } - return ( - <DataAppPageSidebarLink - key={page.id} - dataApp={dataApp} - page={page} - isSelected={dataAppPage?.id === page.id} - indent={navItem.indent} - /> - ); + return renderPage(page, navItem.indent); }, - [dataApp, pageMap, dataAppPage], + [pageMap, renderPage], ); return ( @@ -65,7 +79,10 @@ function DataAppNavbarView({ <SidebarHeadingWrapper> <SidebarHeading>{dataApp.collection.name}</SidebarHeading> </SidebarHeadingWrapper> - <ul>{dataApp.nav_items.map(renderNavItem)}</ul> + <ul> + {dataApp.nav_items.map(renderNavItem)} + {pagesWithoutNavItems.map(page => renderPage(page))} + </ul> </SidebarSection> <DataAppActionPanel dataApp={dataApp} -- GitLab