diff --git a/pkg/services/navtree/navtreeimpl/navtree.go b/pkg/services/navtree/navtreeimpl/navtree.go index 602080c53d9..f82a6f164e0 100644 --- a/pkg/services/navtree/navtreeimpl/navtree.go +++ b/pkg/services/navtree/navtreeimpl/navtree.go @@ -342,7 +342,7 @@ func (s *ServiceImpl) buildStarredItemsNavLinks(c *models.ReqContext) ([]*navtre }) for _, starredItem := range starredDashboards { starredItemsChildNavs = append(starredItemsChildNavs, &navtree.NavLink{ - Id: starredItem.Uid, + Id: "starred/" + starredItem.Uid, Text: starredItem.Title, Url: starredItem.GetUrl(), }) diff --git a/public/app/core/reducers/navBarTree.ts b/public/app/core/reducers/navBarTree.ts index 6907d7af6b9..bd47059bf3c 100644 --- a/public/app/core/reducers/navBarTree.ts +++ b/public/app/core/reducers/navBarTree.ts @@ -5,6 +5,9 @@ import { config } from '@grafana/runtime'; export const initialState: NavModelItem[] = config.bootData?.navTree ?? []; +// this matches the prefix set in the backend navtree +export const ID_PREFIX = 'starred/'; + const navTreeSlice = createSlice({ name: 'navBarTree', initialState, @@ -18,14 +21,14 @@ const navTreeSlice = createSlice({ starredItems.children = []; } const newStarredItem: NavModelItem = { - id, + id: ID_PREFIX + id, text: title, url, }; starredItems.children.push(newStarredItem); starredItems.children.sort((a, b) => a.text.localeCompare(b.text)); } else { - const index = starredItems.children?.findIndex((item) => item.id === id) ?? -1; + const index = starredItems.children?.findIndex((item) => item.id === ID_PREFIX + id) ?? -1; if (index > -1) { starredItems?.children?.splice(index, 1); } diff --git a/public/app/core/reducers/navModel.ts b/public/app/core/reducers/navModel.ts index aed934b7931..5110af5c7af 100644 --- a/public/app/core/reducers/navModel.ts +++ b/public/app/core/reducers/navModel.ts @@ -10,14 +10,13 @@ export function buildInitialState(): NavIndex { const navIndex: NavIndex = {}; const rootNodes = cloneDeep(config.bootData.navTree); const homeNav = rootNodes.find((node) => node.id === HOME_NAV_ID); + const otherRootNodes = rootNodes.filter((node) => node.id !== HOME_NAV_ID); - // set home as parent for the rootNodes - buildNavIndex(navIndex, rootNodes, homeNav); - - // remove circular parent reference on the home node - if (navIndex[HOME_NAV_ID]) { - delete navIndex[HOME_NAV_ID].parentItem; + if (homeNav) { + buildNavIndex(navIndex, [homeNav]); } + // set home as parent for the other rootNodes + buildNavIndex(navIndex, otherRootNodes, homeNav); return navIndex; } @@ -26,7 +25,9 @@ function buildNavIndex(navIndex: NavIndex, children: NavModelItem[], parentItem? for (const node of children) { node.parentItem = parentItem; - navIndex[node.id!] = node; + if (node.id) { + navIndex[node.id] = node; + } if (node.children) { buildNavIndex(navIndex, node.children, node);