|
import { SideDown } from '@/assets/icon/Icon'; |
|
import { Card, CardContent } from '@/components/ui/card'; |
|
import { |
|
Collapsible, |
|
CollapsibleContent, |
|
CollapsibleTrigger, |
|
} from '@/components/ui/collapsible'; |
|
import { |
|
Sidebar, |
|
SidebarContent, |
|
SidebarGroup, |
|
SidebarGroupContent, |
|
SidebarGroupLabel, |
|
SidebarHeader, |
|
SidebarMenu, |
|
} from '@/components/ui/sidebar'; |
|
import { useMemo } from 'react'; |
|
import { |
|
AgentOperatorList, |
|
Operator, |
|
componentMenuList, |
|
operatorMap, |
|
} from './constant'; |
|
import OperatorIcon from './operator-icon'; |
|
|
|
type OperatorItem = { |
|
name: Operator; |
|
}; |
|
|
|
function OperatorCard({ name }: OperatorItem) { |
|
return ( |
|
<Card className="bg-colors-background-inverse-weak border-colors-outline-neutral-standard"> |
|
<CardContent className="p-2 flex items-center gap-2"> |
|
<OperatorIcon |
|
name={name} |
|
color={operatorMap[name].color} |
|
></OperatorIcon> |
|
{name} |
|
</CardContent> |
|
</Card> |
|
); |
|
} |
|
|
|
type OperatorCollapsibleProps = { operatorList: OperatorItem[]; title: string }; |
|
|
|
function OperatorCollapsible({ |
|
operatorList, |
|
title, |
|
}: OperatorCollapsibleProps) { |
|
return ( |
|
<Collapsible defaultOpen className="group/collapsible"> |
|
<SidebarGroup> |
|
<SidebarGroupLabel asChild className="mb-1"> |
|
<CollapsibleTrigger> |
|
<span className="font-bold text-base">{title}</span> |
|
<SideDown className="ml-auto" /> |
|
</CollapsibleTrigger> |
|
</SidebarGroupLabel> |
|
<CollapsibleContent className="px-2"> |
|
<SidebarGroupContent> |
|
<SidebarMenu className="gap-2"> |
|
{operatorList.map((item) => ( |
|
<OperatorCard key={item.name} name={item.name}></OperatorCard> |
|
))} |
|
</SidebarMenu> |
|
</SidebarGroupContent> |
|
</CollapsibleContent> |
|
</SidebarGroup> |
|
</Collapsible> |
|
); |
|
} |
|
|
|
export function AgentSidebar() { |
|
const agentOperatorList = useMemo(() => { |
|
return componentMenuList.filter((x) => |
|
AgentOperatorList.some((y) => y === x.name), |
|
); |
|
}, []); |
|
|
|
const thirdOperatorList = useMemo(() => { |
|
return componentMenuList.filter( |
|
(x) => !AgentOperatorList.some((y) => y === x.name), |
|
); |
|
}, []); |
|
|
|
return ( |
|
<Sidebar variant={'floating'} className="top-16"> |
|
<SidebarHeader> |
|
<p className="font-bold text-2xl">All nodes</p> |
|
</SidebarHeader> |
|
<SidebarContent> |
|
<OperatorCollapsible |
|
title="Agent operator" |
|
operatorList={agentOperatorList} |
|
></OperatorCollapsible> |
|
<OperatorCollapsible |
|
title="Third-party tools" |
|
operatorList={thirdOperatorList} |
|
></OperatorCollapsible> |
|
</SidebarContent> |
|
</Sidebar> |
|
); |
|
} |
|
|