"use client"
import * as React from 'react';
import Box from '@mui/material/Box';
import Stack from '@mui/material/Stack';
import SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon';
import { styled } from '@mui/material/styles';
import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView';
import { TreeItem, treeItemClasses } from '@mui/x-tree-view/TreeItem';
import { Minus, MinusSquare, Plus, SquarePlus } from 'lucide-react';
import { Button } from "@/components/ui/button";
import { mainNav, additionalNav, MenuSection } from "@/config/menuConfig";
import { PermissionDialog } from './permissionDialog';
// ------------------- Custom TreeItem Style -------------------
const CustomTreeItem = styled(TreeItem)({
[`& .${treeItemClasses.iconContainer}`]: {
'& .close': {
opacity: 0.3,
},
},
});
function CloseSquare(props: SvgIconProps) {
return (
{/* tslint:disable-next-line: max-line-length */}
);
}
interface SelectedKey {
key: string;
title: string;
}
export default function PermissionsTree() {
const [expandedItems, setExpandedItems] = React.useState([]);
const [dialogOpen, setDialogOpen] = React.useState(false);
const [selectedKey, setSelectedKey] = React.useState(null);
const handleExpandedItemsChange = (
event: React.SyntheticEvent,
itemIds: string[],
) => {
setExpandedItems(itemIds);
};
const handleExpandClick = () => {
if (expandedItems.length === 0) {
// 모든 노드를 펼치기
// 실제로는 mainNav와 additionalNav를 순회해 itemId를 전부 수집하는 방식
setExpandedItems([...collectAllIds()]);
} else {
setExpandedItems([]);
}
};
// (4) 수동으로 "모든 TreeItem의 itemId"를 수집하는 함수
const collectAllIds = React.useCallback(() => {
const ids: string[] = [];
// mainNav: 상위 = section.title, 하위 = item.title
mainNav.forEach((section) => {
ids.push(section.title); // 상위
section.items.forEach((itm) => ids.push(itm.title));
});
// additionalNav를 "기타메뉴" 아래에 넣을 경우, "기타메뉴" 라는 itemId + each item
additionalNav.forEach((itm) => ids.push(itm.title));
return ids;
}, []);
function handleItemClick(key: SelectedKey) {
// 1) Dialog 열기
setSelectedKey(key); // 이 값은 Dialog에서 어떤 메뉴인지 식별에 사용
setDialogOpen(true);
}
// (5) 실제 렌더
return (
{/* (A) mainNav를 트리로 렌더 */}
{mainNav.map((section) => (
{section.items.map((itm) => {
const lastSegment = itm.href.split("/").pop() || itm.title;
const key = { key: lastSegment, title: itm.title }
return (
handleItemClick(key)}
/>
);
})}
))}
{additionalNav.map((itm) => {
const lastSegment = itm.href.split("/").pop() || itm.title;
const key = { key: lastSegment, title: itm.title }
return (
handleItemClick(key)}
/>
);
})}
);
}