Merge pull request 'fix: sidebar drag-and-drop persistence + CSP warning' (#10) from dev into main
Deploy Dashboard / deploy (push) Successful in 1m2s

This commit was merged in pull request #10.
This commit is contained in:
2026-03-01 17:52:08 +08:00
4 changed files with 18 additions and 11 deletions
+14 -6
View File
@@ -378,13 +378,21 @@ async def get_preferences(current_user = Depends(auth.get_current_user)):
@router.put("/preferences") @router.put("/preferences")
async def save_preferences(request: Request, current_user = Depends(auth.get_current_user)): async def save_preferences(request: Request, current_user = Depends(auth.get_current_user)):
import traceback
from rbac import save_sidebar_order from rbac import save_sidebar_order
body = await request.json() try:
order = body.get("sidebar_order") body = await request.json()
if order is None or not isinstance(order, dict): order = body.get("sidebar_order")
raise HTTPException(status_code=400, detail="Missing sidebar_order dict") if order is None or not isinstance(order, dict):
save_sidebar_order(current_user.username, order) raise HTTPException(status_code=400, detail="Missing sidebar_order dict")
return {"ok": True} save_sidebar_order(current_user.username, order)
return {"ok": True}
except HTTPException:
raise
except Exception as e:
print(f"Error saving preferences: {e}")
traceback.print_exc()
raise HTTPException(status_code=500, detail=str(e))
@router.delete("/rbac/overrides/{username}") @router.delete("/rbac/overrides/{username}")
async def rbac_delete_override(username: str, current_user = Depends(auth.get_current_user)): async def rbac_delete_override(username: str, current_user = Depends(auth.get_current_user)):
-3
View File
@@ -6,9 +6,6 @@
<meta name="description" content="Personal NAS Dashboard — manage Docker, Git repos, files, and media from one place"> <meta name="description" content="Personal NAS Dashboard — manage Docker, Git repos, files, and media from one place">
<title>NAS Dashboard</title> <title>NAS Dashboard</title>
<link rel="icon" type="image/svg+xml" href="/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>
+3 -1
View File
@@ -43,7 +43,9 @@
sidebarOrder = newOrder; sidebarOrder = newOrder;
clearTimeout(orderSaveTimer); clearTimeout(orderSaveTimer);
orderSaveTimer = setTimeout(() => { orderSaveTimer = setTimeout(() => {
savePreferences({ sidebar_order: newOrder }).catch(() => {}); savePreferences({ sidebar_order: newOrder }).catch((e) => {
console.error("Failed to save sidebar order:", e);
});
}, 500); }, 500);
} }
+1 -1
View File
@@ -3,7 +3,7 @@
@custom-variant dark (&:where(.dark, .dark *)); @custom-variant dark (&:where(.dark, .dark *));
@theme { @theme {
--font-sans: "Inter", system-ui, -apple-system, sans-serif; --font-sans: system-ui, -apple-system, "Segoe UI", sans-serif;
--color-primary-50: #eef2ff; --color-primary-50: #eef2ff;
--color-primary-100: #e0e7ff; --color-primary-100: #e0e7ff;