feat(dashboard): ability to locate new admin route under existing route (#10587)

This PR add ability to locate new admin route under existing route in sidebar.

For example, new route Brands
![image](https://github.com/user-attachments/assets/1b297fb0-296c-4e94-a4cb-f84f4c676c53)
![image](https://github.com/user-attachments/assets/80336909-1c0a-49c9-b8e1-3b1137ae2e48)

https://github.com/user-attachments/assets/b46b1813-e92e-4b67-84a1-84660023ac7c
This commit is contained in:
Eugene Pro
2024-12-19 14:23:21 +02:00
committed by GitHub
parent 16ae192456
commit 3efd25d06d
11 changed files with 131 additions and 26 deletions

View File

@@ -284,6 +284,19 @@ const Searchbar = () => {
const CoreRouteSection = () => {
const coreRoutes = useCoreRoutes()
const { getMenu } = useDashboardExtension()
const menuItems = getMenu("coreExtensions")
menuItems.forEach((item) => {
if (item.nested) {
const route = coreRoutes.find((route) => route.to === item.nested)
if (route) {
route.items?.push(item)
}
}
})
return (
<nav className="flex flex-col gap-y-1 py-3">
<Searchbar />
@@ -298,7 +311,7 @@ const ExtensionRouteSection = () => {
const { t } = useTranslation()
const { getMenu } = useDashboardExtension()
const menuItems = getMenu("coreExtensions")
const menuItems = getMenu("coreExtensions").filter((item) => !item.nested)
if (!menuItems.length) {
return null

View File

@@ -26,6 +26,7 @@ export type INavItem = {
items?: NestedItemProps[]
type?: ItemType
from?: string
nested?: string
}
const BASE_NAV_LINK_CLASSES =

View File

@@ -4,6 +4,7 @@ import {
CustomFieldFormZone,
CustomFieldModel,
InjectionZone,
NESTED_ROUTE_POSITIONS,
} from "@medusajs/admin-shared"
import * as React from "react"
import { INavItem } from "../../components/layout/nav-item"
@@ -112,11 +113,31 @@ export class DashboardExtensionManager {
return // Skip this item entirely
}
// Find the parent item if it exists
const parentItem = menuItems.find(
(menuItem) => menuItem.path === parentPath
)
// Check if parent item is a nested route under existing route
if (
parentItem?.nested &&
NESTED_ROUTE_POSITIONS.includes(parentItem?.nested) &&
pathParts.length > 1
) {
if (process.env.NODE_ENV === "development") {
console.warn(
`[@medusajs/dashboard] Nested menu item "${item.path}" can't be added to the sidebar as it is nested under "${parentItem.nested}".`
)
}
return
}
const navItem: INavItem = {
label: item.label,
to: item.path,
icon: item.icon ? <item.icon /> : undefined,
items: [],
nested: item.nested,
}
if (parentPath !== "/" && tempRegistry[parentPath]) {

View File

@@ -4,6 +4,7 @@ import {
CustomFieldFormZone,
CustomFieldModel,
InjectionZone,
NestedRoutePosition,
} from "@medusajs/admin-shared"
import { ComponentType } from "react"
import { LoaderFunction } from "react-router-dom"
@@ -19,6 +20,7 @@ export type MenuItemExtension = {
label: string
path: string
icon?: ComponentType
nested?: NestedRoutePosition
}
export type WidgetExtension = {