This commit is contained in:
2026-06-26 09:25:48 +08:00
parent 6fcc3f8a0c
commit abc53234f1
3 changed files with 45 additions and 39 deletions
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -28,7 +28,7 @@
} }
})(); })();
</script> </script>
<script type="module" crossorigin src="/assets/index-COnmuf9j.js"></script> <script type="module" crossorigin src="/assets/index-BjAuFGyZ.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-eLRg4pQk.css"> <link rel="stylesheet" crossorigin href="/assets/index-eLRg4pQk.css">
</head> </head>
<body> <body>
@@ -434,15 +434,26 @@ const AppLayout: React.FC = () => {
</div> </div>
)} */} )} */}
{(() => { {(() => {
const groups = menuItems.filter(m => (m.menu_type ?? m.menuType) === 'group'); // Build child map for all menu items
const pages = menuItems.filter(m => (m.menu_type ?? m.menuType) !== 'group');
const childMap: Record<string, MenuConfig[]> = {}; const childMap: Record<string, MenuConfig[]> = {};
pages.filter(m => m.parent_id ?? m.parentId).forEach(m => { menuItems.forEach(m => {
const pid = (m.parent_id ?? m.parentId) as string; const pid = m.parent_id ?? m.parentId;
if (!childMap[pid]) childMap[pid] = []; if (pid) {
childMap[pid].push(m); if (!childMap[pid]) childMap[pid] = [];
childMap[pid].push(m);
}
}); });
const topLevel = pages.filter(m => !(m.parent_id ?? m.parentId));
// Get top-level items (parent_id is null/undefined)
const topLevelItems = menuItems.filter(m => !(m.parent_id ?? m.parentId));
// Sort top-level items by sort_order
topLevelItems.sort((a, b) => {
const orderA = typeof a.sortOrder === 'number' ? a.sortOrder : Infinity;
const orderB = typeof b.sortOrder === 'number' ? b.sortOrder : Infinity;
return orderA - orderB;
});
const items: React.ReactNode[] = []; const items: React.ReactNode[] = [];
const renderMenuItem = (item: MenuConfig, depth: number = 0) => { const renderMenuItem = (item: MenuConfig, depth: number = 0) => {
@@ -470,37 +481,32 @@ const AppLayout: React.FC = () => {
); );
}; };
// Render groups with children // Render top-level items and their children in order
groups.sort((a, b) => { topLevelItems.forEach(item => {
const orderA = typeof a.sortOrder === 'number' ? a.sortOrder : Infinity; const menuType = item.menu_type ?? item.menuType;
const orderB = typeof b.sortOrder === 'number' ? b.sortOrder : Infinity;
return orderA - orderB; if (menuType === 'group') {
}).forEach(g => { // Render group with its children
const children = (childMap[g.id] || []).sort((a, b) => { const children = (childMap[item.id] || []).sort((a, b) => {
const orderA = typeof a.sortOrder === 'number' ? a.sortOrder : Infinity; const orderA = typeof a.sortOrder === 'number' ? a.sortOrder : Infinity;
const orderB = typeof b.sortOrder === 'number' ? b.sortOrder : Infinity; const orderB = typeof b.sortOrder === 'number' ? b.sortOrder : Infinity;
return orderA - orderB; return orderA - orderB;
}); });
items.push( items.push(
<div key={g.id}> <div key={item.id}>
<div style={{ <div style={{
color: '#94a3b8', fontSize: 12, fontWeight: 600, color: '#94a3b8', fontSize: 12, fontWeight: 600,
padding: '12px 16px 6px', letterSpacing: 0.5, textTransform: 'uppercase', padding: '12px 16px 6px', letterSpacing: 0.5, textTransform: 'uppercase',
}}> }}>
{g.label} {item.label}
</div>
{children.map(c => renderMenuItem(c, 1))}
</div> </div>
{children.map(c => renderMenuItem(c, 1))} );
</div> } else {
); // Render standalone page
}); items.push(renderMenuItem(item));
}
// Render top-level pages
topLevel.sort((a, b) => {
const orderA = typeof a.sortOrder === 'number' ? a.sortOrder : Infinity;
const orderB = typeof b.sortOrder === 'number' ? b.sortOrder : Infinity;
return orderA - orderB;
}).forEach(m => {
items.push(renderMenuItem(m));
}); });
return items; return items;