feat: navigation restructure + drag-and-drop menu ordering

Navigation:
- Remove Plugins header from sidebar
- Merge static items and plugin items into unified sorted list
- Group related menu items (Dateien, E-Mail, Kalender, Automation)
- German labels for all menu items
- Sort by order field, alphabetical fallback for ties

Drag-and-Drop Menu:
- New backend endpoints: GET/PUT /api/v1/users/me/menu-order
- Store menu order in user preferences JSONB field
- New SettingsMenuOrder page with @dnd-kit drag-and-drop
- New Settings tab: Menu ordering
- Sidebar reads saved menu order and sorts accordingly
- Reset to default option
This commit is contained in:
Agent Zero
2026-07-24 21:46:27 +02:00
parent 4b9cb5a098
commit e017da9d12
17 changed files with 608 additions and 142 deletions
+24 -1
View File
@@ -3,7 +3,7 @@
*/
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { apiGet, apiPost, apiPatch, apiDelete } from './client';
import { apiGet, apiPost, apiPut, apiPatch, apiDelete } from './client';
import { PaginatedResponse } from './types';
// ── Types matching backend schemas ──
@@ -80,6 +80,29 @@ export function useUpdateUser() {
});
}
// ── Menu Order ──
export interface MenuOrderResponse {
menu_order: string[];
}
export function useMenuOrder() {
return useQuery({
queryKey: ['menu-order'],
queryFn: () => apiGet<MenuOrderResponse>('/users/me/menu-order'),
});
}
export function useUpdateMenuOrder() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (menu_order: string[]) => apiPut('/users/me/menu-order', { menu_order }),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['menu-order'] });
},
});
}
export function useDeleteUser() {
const queryClient = useQueryClient();
return useMutation({