feat: 實現版本號自動化更新與修復側邊欄 RWD 問題
All checks were successful
Koori-ERP-Deploy-System / deploy-demo (push) Has been skipped
Koori-ERP-Deploy-System / deploy-production (push) Successful in 50s

This commit is contained in:
2026-02-13 14:46:26 +08:00
parent 77a7d31dc1
commit 2e9ff6c832
6 changed files with 123 additions and 130 deletions

View File

@@ -386,13 +386,15 @@ export default function AuthenticatedLayout({
});
};
const renderMenuItem = (item: MenuItem, level: number = 0) => {
const renderMenuItem = (item: MenuItem, level: number = 0, forceExpand: boolean = false) => {
const hasChildren = item.children && item.children.length > 0;
const isExpanded = expandedItems.includes(item.id);
const isActive = item.route
? (item.route === '/' ? url === '/' : url.startsWith(item.route))
: false;
const effectivelyCollapsed = isCollapsed && !forceExpand;
return (
<div key={item.id} className="mb-1">
{hasChildren ? (
@@ -401,21 +403,21 @@ export default function AuthenticatedLayout({
className={cn(
"w-full flex items-center transition-all rounded-lg group",
level === 0 ? "px-3 py-2.5" : "px-3 py-2 pl-10",
level === 0 && !isCollapsed && "hover:bg-slate-100",
isCollapsed && level === 0 && "justify-center px-0 h-10 w-10 mx-auto hover:bg-slate-100"
level === 0 && !effectivelyCollapsed && "hover:bg-slate-100",
effectivelyCollapsed && level === 0 && "justify-center px-0 h-10 w-10 mx-auto hover:bg-slate-100"
)}
title={isCollapsed ? item.label : ""}
title={effectivelyCollapsed ? item.label : ""}
>
{level === 0 && (
<span className={cn(
"flex-shrink-0 transition-all",
isCollapsed ? "mr-0" : "mr-3 text-slate-500 group-hover:text-slate-900"
effectivelyCollapsed ? "mr-0" : "mr-3 text-slate-500 group-hover:text-slate-900"
)}>
{item.icon}
</span>
)}
{!isCollapsed && (
{!effectivelyCollapsed && (
<>
<span className="flex-1 text-left text-base font-medium text-slate-700 group-hover:text-slate-900 truncate">
{item.label}
@@ -438,22 +440,22 @@ export default function AuthenticatedLayout({
className={cn(
"w-full flex items-center transition-all rounded-lg group",
level === 0 ? "px-3 py-2.5" : "px-3 py-2",
level > 0 && !isCollapsed && "pl-11",
level > 0 && !effectivelyCollapsed && "pl-11",
isActive ? "bg-primary-lightest text-primary-main" : "text-slate-600 hover:bg-slate-100 hover:text-slate-900",
isCollapsed && level === 0 && "justify-center px-0 h-10 w-10 mx-auto"
effectivelyCollapsed && level === 0 && "justify-center px-0 h-10 w-10 mx-auto"
)}
title={isCollapsed ? item.label : ""}
title={effectivelyCollapsed ? item.label : ""}
>
{item.icon && (
<span className={cn(
"flex-shrink-0 transition-all",
isCollapsed ? "mr-0" : "mr-3",
effectivelyCollapsed ? "mr-0" : "mr-3",
isActive ? "text-primary-main" : "text-slate-500 group-hover:text-slate-900"
)}>
{item.icon}
</span>
)}
{!isCollapsed && (
{!effectivelyCollapsed && (
<span className="text-base font-medium truncate">
{item.label}
</span>
@@ -461,9 +463,9 @@ export default function AuthenticatedLayout({
</Link>
)}
{hasChildren && isExpanded && !isCollapsed && (
{hasChildren && isExpanded && !effectivelyCollapsed && (
<div className="mt-1 space-y-1">
{item.children?.map((child) => renderMenuItem(child, level + 1))}
{item.children?.map((child) => renderMenuItem(child, level + 1, forceExpand))}
</div>
)}
</div>
@@ -573,7 +575,7 @@ export default function AuthenticatedLayout({
</div>
<div className="p-4 border-t border-slate-100 flex items-center justify-between">
{!isCollapsed && <p className="text-[10px] font-medium text-slate-400 uppercase tracking-wider px-2">Version 1.0.0</p>}
{!isCollapsed && <p className="text-[10px] font-medium text-slate-400 uppercase tracking-wider px-2">Version {props.app_version || '1.0.0'}</p>}
<button
onClick={() => setIsCollapsed(!isCollapsed)}
className={cn(
@@ -613,7 +615,7 @@ export default function AuthenticatedLayout({
</div>
<div className="flex-1 overflow-y-auto p-4" scroll-region="true">
<nav className="space-y-1">
{menuItems.map((item) => renderMenuItem(item))}
{menuItems.map((item) => renderMenuItem(item, 0, true))}
</nav>
</div>
</aside>