Files
task-manager/client/src/pages/SetupWizard.tsx
T
paul 9819d8db0b
continuous-integration/drone/push Build is failing
feat: Notifications page, Sidebar layout fixes, and Achievements enhancements
- implemented /notifications page with overdue/upcoming alerts
- Fixed sidebar scrolling in collapsed mode
- Moved notification button to sidebar footer
- Enhanced Achievements page with streak stats and tooltips
- Improved XP history to show task titles
- Added missing translations (en/de)
- Removed top bar header
- Fixed Docker environment routing
2025-12-17 10:06:36 +01:00

114 lines
5.1 KiB
TypeScript

import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { insertUserSchema } from "@shared/schema";
import { useLocation } from "wouter";
import { useMutation } from "@tanstack/react-query";
import { apiRequest, queryClient } from "@/lib/queryClient";
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { useToast } from "@/hooks/use-toast";
import { ShieldCheck } from "lucide-react";
export default function SetupWizard() {
const [, setLocation] = useLocation();
const { toast } = useToast();
const form = useForm({
resolver: zodResolver(insertUserSchema),
defaultValues: {
username: "",
email: "",
password: "",
},
});
const setupMutation = useMutation({
mutationFn: async (data: any) => {
const res = await apiRequest("POST", "/api/setup", data);
return res.json();
},
onSuccess: (user) => {
queryClient.setQueryData(["/api/user"], user);
queryClient.invalidateQueries({ queryKey: ["/api/setup/status"] });
setLocation("/");
toast({
title: "Setup Complete",
description: "Super Administrator created successfully.",
});
},
onError: (error: Error) => {
toast({
title: "Setup Failed",
description: error.message,
variant: "destructive"
});
}
});
return (
<div className="min-h-screen flex flex-col items-center justify-center p-4 bg-gradient-to-br from-background to-muted">
<Card className="w-full max-w-md border-2 border-primary/20 shadow-xl">
<CardHeader className="text-center">
<div className="mx-auto bg-primary/10 p-3 rounded-full w-fit mb-4">
<ShieldCheck className="w-10 h-10 text-primary" />
</div>
<CardTitle className="text-2xl">First-Time Setup</CardTitle>
<CardDescription>
Create your Super Administrator account to get started.
</CardDescription>
</CardHeader>
<CardContent>
<Form {...form}>
<form onSubmit={form.handleSubmit((data) => setupMutation.mutate(data))} className="space-y-4">
<FormField
control={form.control}
name="username"
render={({ field }) => (
<FormItem>
<FormLabel>Admin Username</FormLabel>
<FormControl>
<Input placeholder="admin" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>Admin Email</FormLabel>
<FormControl>
<Input type="email" placeholder="admin@example.com" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="password"
render={({ field }) => (
<FormItem>
<FormLabel>Password</FormLabel>
<FormControl>
<Input type="password" placeholder="••••••••" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit" className="w-full" disabled={setupMutation.isPending}>
{setupMutation.isPending ? "Creating Admin..." : "Create Administrator"}
</Button>
</form>
</Form>
</CardContent>
</Card>
</div>
);
}