diff --git a/public/app/core/components/AppChrome/MegaMenu/utils.ts b/public/app/core/components/AppChrome/MegaMenu/utils.ts index b83d420aa94..ab41e68dee6 100644 --- a/public/app/core/components/AppChrome/MegaMenu/utils.ts +++ b/public/app/core/components/AppChrome/MegaMenu/utils.ts @@ -130,3 +130,17 @@ export function getEditionAndUpdateLinks(): NavModelItem[] { return links; } + +export function findByUrl(nodes: NavModelItem[], url: string): NavModelItem | null { + for (const item of nodes) { + if (item.url === url) { + return item; + } else if (item.children?.length) { + const found = findByUrl(item.children, url); + if (found) { + return found; + } + } + } + return null; +} diff --git a/public/app/core/components/Bookmarks/BookmarksPage.tsx b/public/app/core/components/Bookmarks/BookmarksPage.tsx new file mode 100644 index 00000000000..8674b7a11c9 --- /dev/null +++ b/public/app/core/components/Bookmarks/BookmarksPage.tsx @@ -0,0 +1,49 @@ +import { css } from '@emotion/css'; + +import { GrafanaTheme2 } from '@grafana/data'; +import { useStyles2 } from '@grafana/ui'; +import { Page } from 'app/core/components/Page/Page'; +import { useSelector } from 'app/types'; + +import { usePinnedItems } from '../AppChrome/MegaMenu/hooks'; +import { findByUrl } from '../AppChrome/MegaMenu/utils'; +import { NavLandingPageCard } from '../NavLandingPage/NavLandingPageCard'; + +export function BookmarksPage() { + const styles = useStyles2(getStyles); + const pinnedItems = usePinnedItems(); + const navTree = useSelector((state) => state.navBarTree); + + return ( + + +
+ {pinnedItems.map((url) => { + const item = findByUrl(navTree, url); + if (!item) { + return null; + } + return ( + + ); + })} +
+
+
+ ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + grid: css({ + display: 'grid', + gap: theme.spacing(3), + gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', + gridAutoRows: '138px', + padding: theme.spacing(2, 0), + }), +}); diff --git a/public/app/routes/routes.tsx b/public/app/routes/routes.tsx index 552a3431479..a52aafa5eeb 100644 --- a/public/app/routes/routes.tsx +++ b/public/app/routes/routes.tsx @@ -20,6 +20,7 @@ import { getAppPluginRoutes } from 'app/features/plugins/routes'; import { getProfileRoutes } from 'app/features/profile/routes'; import { AccessControlAction, DashboardRoutes } from 'app/types'; +import { BookmarksPage } from '../core/components/Bookmarks/BookmarksPage'; import { SafeDynamicImport } from '../core/components/DynamicImports/SafeDynamicImport'; import { RouteDescriptor } from '../core/navigation/types'; import { getPublicDashboardRoutes } from '../features/dashboard/routes'; @@ -513,7 +514,7 @@ export function getAppRoutes(): RouteDescriptor[] { }, { path: '/bookmarks', - component: () => , + component: () => , }, ...getPluginCatalogRoutes(), ...getSupportBundleRoutes(),