@@ -14,80 +14,108 @@ import { MenuItem } from "@/screens/layout/menu-navigation/types";
1414import { classNames } from "@/utils/common" ;
1515import { constructPath } from "@/utils/fetch" ;
1616import { Icon } from "@iconify-icon/react" ;
17+ import React from "react" ;
1718import { Link } from "react-router-dom" ;
1819
1920export interface MenuSectionObjectsProps {
2021 items : MenuItem [ ] ;
2122 isCollapsed ?: boolean ;
2223}
2324
24- export function MenuSectionObject ( { isCollapsed, items } : MenuSectionObjectsProps ) {
25+ const MenuItemIcon : React . FC < { item : MenuItem } > = ( { item } ) => {
26+ if ( item . icon ) {
27+ return < Icon icon = { item . icon } className = "text-md m-1 min-h-4 min-w-4" /> ;
28+ }
29+ return < ObjectAvatar name = { item . label } /> ;
30+ } ;
31+
32+ const RenderMenuItem : React . FC < {
33+ item : MenuItem ;
34+ isCollapsed ?: boolean ;
35+ level ?: number ;
36+ } > = ( { item, isCollapsed, level = 0 } ) => {
37+ const commonProps = {
38+ key : item . identifier ,
39+ className : menuNavigationItemStyle ,
40+ style : { marginLeft : level * 20 } ,
41+ } ;
42+
43+ if ( ! item . children ?. length ) {
44+ return (
45+ < DropdownMenuItem { ...commonProps } >
46+ < Link to = { constructPath ( item . path ) } >
47+ < Icon icon = { item . icon } className = "w-5 shrink-0 inline-flex justify-center items-center" />
48+ { item . label }
49+ </ Link >
50+ </ DropdownMenuItem >
51+ ) ;
52+ }
53+
2554 return (
26- < div className = "flex flex-col w-full overflow-auto" >
27- { items . map ( ( item ) => {
28- if ( ! item . children || item . children . length === 0 ) {
29- return (
30- < Link to = { constructPath ( item . path ) } className = { menuNavigationItemStyle } >
31- { item . icon ? (
32- < Icon icon = { item . icon } className = "text-md m-1 min-h-4 min-w-4" />
33- ) : (
34- < ObjectAvatar name = { item . label } />
35- ) }
36- < span className = { classNames ( "text-sm" , isCollapsed && "hidden" ) } > { item . label } </ span >
37- </ Link >
38- ) ;
39- }
55+ < DropdownMenuAccordion value = { item . identifier } >
56+ < DropdownMenuAccordionTrigger { ...commonProps } >
57+ { item . path ? < Link to = { constructPath ( item . path ) } > { item . label } </ Link > : item . label }
58+ </ DropdownMenuAccordionTrigger >
59+ < DropdownMenuAccordionContent >
60+ { item . children . map ( ( child ) => (
61+ < RenderMenuItem
62+ key = { child . identifier }
63+ item = { child }
64+ isCollapsed = { isCollapsed }
65+ level = { level + 1 }
66+ />
67+ ) ) }
68+ </ DropdownMenuAccordionContent >
69+ </ DropdownMenuAccordion >
70+ ) ;
71+ } ;
4072
41- return (
42- < DropdownMenu key = { item . identifier } >
43- < Tooltip enabled = { isCollapsed } content = { item . label } side = "right" >
44- < DropdownMenuTrigger className = { menuNavigationItemStyle } >
45- { item . icon ? (
46- < Icon icon = { item . icon } className = "text-md m-1 min-h-4 min-w-4" />
47- ) : (
48- < ObjectAvatar name = { item . label } />
49- ) }
50- < span className = { classNames ( "text-sm" , isCollapsed && "hidden" ) } > { item . label } </ span >
51- </ DropdownMenuTrigger >
52- </ Tooltip >
73+ const TopLevelMenuItem : React . FC < {
74+ item : MenuItem ;
75+ isCollapsed ?: boolean ;
76+ } > = ( { item , isCollapsed } ) => {
77+ if ( ! item . children ?. length ) {
78+ return (
79+ < Link key = { item . identifier } to = { constructPath ( item . path ) } className = { menuNavigationItemStyle } >
80+ < MenuItemIcon item = { item } />
81+ < span className = { classNames ( "text-sm" , isCollapsed && "hidden" ) } > { item . label } </ span >
82+ </ Link >
83+ ) ;
84+ }
5385
54- < DropdownMenuContent
55- side = "left"
56- align = "start"
57- sideOffset = { 12 }
58- className = "h-[calc(100vh-57px)] mt-[57px] min-w-[224px] px-4 py-5 bg-white border rounded-r-lg rounded-l-none shadow-none relative -top-px overflow-auto data-[side=right]:slide-in-from-left-[100px]"
59- >
60- < h3 className = "text-xl font-medium text-neutral-800 mb-5" > { item . label } </ h3 >
61- { item . children . map ( ( child ) => {
62- if ( ! child . children || child . children . length === 0 ) {
63- return (
64- < DropdownMenuItem key = { child . identifier } className = "px-3" asChild >
65- < Link to = { constructPath ( child . path ) } >
66- < Icon icon = { child . icon } className = "w-5" />
67- { child . label }
68- </ Link >
69- </ DropdownMenuItem >
70- ) ;
71- }
86+ return (
87+ < DropdownMenu key = { item . identifier } >
88+ < DropdownMenuTrigger className = { classNames ( menuNavigationItemStyle , isCollapsed && "p-2" ) } >
89+ < Tooltip enabled = { isCollapsed } content = { item . label } side = "right" >
90+ < span className = "flex" >
91+ < MenuItemIcon item = { item } />
92+ </ span >
93+ </ Tooltip >
7294
73- return (
74- < DropdownMenuAccordion key = { child . identifier } value = { child . identifier } >
75- < DropdownMenuAccordionTrigger className = { menuNavigationItemStyle } >
76- { child . label }
77- </ DropdownMenuAccordionTrigger >
95+ < span className = { classNames ( "text-sm truncate" , isCollapsed && "hidden" ) } >
96+ { item . label }
97+ </ span >
98+ </ DropdownMenuTrigger >
7899
79- < DropdownMenuAccordionContent >
80- < DropdownMenuItem key = { child . identifier } className = "pl-10" asChild >
81- < Link to = { constructPath ( child . path ) } > { child . label } </ Link >
82- </ DropdownMenuItem >
83- </ DropdownMenuAccordionContent >
84- </ DropdownMenuAccordion >
85- ) ;
86- } ) }
87- </ DropdownMenuContent >
88- </ DropdownMenu >
89- ) ;
90- } ) }
91- </ div >
100+ < DropdownMenuContent
101+ side = "left"
102+ align = "start"
103+ sideOffset = { isCollapsed ? 6 : 12 }
104+ className = "h-[calc(100vh-57px)] mt-[57px] min-w-[224px] px-4 py-5 bg-white border rounded-r-lg rounded-l-none shadow-none relative -top-px overflow-auto data-[side=right]:slide-in-from-left-[100px]"
105+ >
106+ < h3 className = "text-xl font-medium text-neutral-800 mb-5" > { item . label } </ h3 >
107+ { item . children . map ( ( child ) => (
108+ < RenderMenuItem key = { child . identifier } item = { child } isCollapsed = { isCollapsed } />
109+ ) ) }
110+ </ DropdownMenuContent >
111+ </ DropdownMenu >
92112 ) ;
93- }
113+ } ;
114+
115+ export const MenuSectionObject : React . FC < MenuSectionObjectsProps > = ( { isCollapsed, items } ) => (
116+ < div className = "flex flex-col w-full overflow-auto" >
117+ { items . map ( ( item ) => (
118+ < TopLevelMenuItem key = { item . identifier } item = { item } isCollapsed = { isCollapsed } />
119+ ) ) }
120+ </ div >
121+ ) ;
0 commit comments