feat: user data purge, breadcrumbs, first-login dialog, widget consolidation, bookkeeping cascade
- Admin can purge all personal data for a user (POST /api/admin/users/:userId/purge-data) while keeping the account; clears profile, notifications, bookings, ical tokens, preferences - Add isNewUser flag to auth callback response; first-login dialog prompts for Standesbuchnummer - Add PageBreadcrumbs component and apply to 18 sub-pages across the app - Cascade budget_typ changes from parent pot to all children recursively, converting amounts (detailliert→einfach: sum into budget_gesamt; einfach→detailliert: zero all for redistribution) - Migrate NextcloudTalkWidget to use shared WidgetCard template for consistent header styling Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -31,4 +31,5 @@ export const adminApi = {
|
||||
fdiskSyncLogs: () => api.get<ApiResponse<FdiskSyncLogsResponse>>('/api/admin/fdisk-sync/logs').then(r => r.data.data),
|
||||
fdiskSyncTrigger: (force = false) => api.post<ApiResponse<{ started: boolean }>>('/api/admin/fdisk-sync/trigger', { force }).then(r => r.data.data),
|
||||
purgeFdiskData: (userId: string) => api.delete<ApiResponse<{ profileFieldsCleared: number; ausbildungen: number; befoerderungen: number; untersuchungen: number; fahrgenehmigungen: number }>>(`/api/admin/users/${userId}/fdisk-data`).then(r => r.data.data),
|
||||
purgeUserData: (userId: string) => api.post<ApiResponse<Record<string, number>>>(`/api/admin/users/${userId}/purge-data`).then(r => r.data.data),
|
||||
};
|
||||
|
||||
@@ -8,6 +8,7 @@ export interface AuthCallbackResponse {
|
||||
token: string;
|
||||
refreshToken: string;
|
||||
user: User;
|
||||
isNewUser?: boolean;
|
||||
}
|
||||
|
||||
// The backend returns camelCase field names; map them to the snake_case User type.
|
||||
@@ -45,7 +46,7 @@ export const authService = {
|
||||
const response = await api.post<{
|
||||
success: boolean;
|
||||
message: string;
|
||||
data: { accessToken: string; refreshToken: string; user: Record<string, unknown> };
|
||||
data: { accessToken: string; refreshToken: string; isNewUser?: boolean; user: Record<string, unknown> };
|
||||
}>('/api/auth/callback', {
|
||||
code,
|
||||
redirect_uri: REDIRECT_URI,
|
||||
@@ -54,6 +55,7 @@ export const authService = {
|
||||
token: response.data.data.accessToken,
|
||||
refreshToken: response.data.data.refreshToken,
|
||||
user: mapBackendUser(response.data.data.user),
|
||||
isNewUser: response.data.data.isNewUser,
|
||||
};
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user