Add admin dashboard pages and restructure admin route

Introduces new admin dashboard pages for alerts, bans, invites, orders, settings, status, and vendors under app/dashboard/admin/. Moves the main admin page to the new dashboard structure and adds a shared admin layout. Updates sidebar configuration and adds supporting components and hooks for admin features.
This commit is contained in:
NotII
2025-10-18 15:19:10 +01:00
parent 03a2e37502
commit bfc60012cf
16 changed files with 2074 additions and 13 deletions

View File

@@ -0,0 +1,333 @@
import React from "react";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Switch } from "@/components/ui/switch";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { Textarea } from "@/components/ui/textarea";
import { Separator } from "@/components/ui/separator";
import { Settings, Shield, Bell, Database, Globe, Key, Save } from "lucide-react";
export default function AdminSettingsPage() {
return (
<div className="space-y-6">
<div>
<h1 className="text-2xl font-semibold tracking-tight">Admin Settings</h1>
<p className="text-sm text-muted-foreground mt-1">Configure system settings and preferences</p>
</div>
<div className="grid gap-6 lg:grid-cols-2">
{/* General Settings */}
<Card>
<CardHeader>
<CardTitle className="flex items-center">
<Settings className="h-5 w-5 mr-2" />
General Settings
</CardTitle>
<CardDescription>
Basic platform configuration and preferences
</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<div className="space-y-2">
<Label htmlFor="siteName">Site Name</Label>
<Input id="siteName" defaultValue="Ember Market" />
</div>
<div className="space-y-2">
<Label htmlFor="siteDescription">Site Description</Label>
<Textarea
id="siteDescription"
defaultValue="A secure cryptocurrency marketplace for vendors and customers"
rows={3}
/>
</div>
<div className="space-y-2">
<Label htmlFor="defaultCurrency">Default Currency</Label>
<Select defaultValue="btc">
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="btc">Bitcoin (BTC)</SelectItem>
<SelectItem value="eth">Ethereum (ETH)</SelectItem>
<SelectItem value="ltc">Litecoin (LTC)</SelectItem>
<SelectItem value="usdt">Tether (USDT)</SelectItem>
</SelectContent>
</Select>
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label>Maintenance Mode</Label>
<p className="text-sm text-muted-foreground">
Temporarily disable public access
</p>
</div>
<Switch />
</div>
</CardContent>
</Card>
{/* Security Settings */}
<Card>
<CardHeader>
<CardTitle className="flex items-center">
<Shield className="h-5 w-5 mr-2" />
Security Settings
</CardTitle>
<CardDescription>
Configure security policies and authentication
</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label>Two-Factor Authentication</Label>
<p className="text-sm text-muted-foreground">
Require 2FA for all admin accounts
</p>
</div>
<Switch defaultChecked />
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label>Session Timeout</Label>
<p className="text-sm text-muted-foreground">
Auto-logout after inactivity
</p>
</div>
<Switch defaultChecked />
</div>
<div className="space-y-2">
<Label htmlFor="sessionDuration">Session Duration (minutes)</Label>
<Input id="sessionDuration" type="number" defaultValue="60" />
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label>IP Whitelist</Label>
<p className="text-sm text-muted-foreground">
Restrict admin access to specific IPs
</p>
</div>
<Switch />
</div>
<div className="space-y-2">
<Label htmlFor="allowedIPs">Allowed IP Addresses</Label>
<Textarea
id="allowedIPs"
placeholder="192.168.1.100&#10;10.0.0.50"
rows={3}
/>
</div>
</CardContent>
</Card>
{/* Notification Settings */}
<Card>
<CardHeader>
<CardTitle className="flex items-center">
<Bell className="h-5 w-5 mr-2" />
Notification Settings
</CardTitle>
<CardDescription>
Configure alert and notification preferences
</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label>Email Notifications</Label>
<p className="text-sm text-muted-foreground">
Send alerts via email
</p>
</div>
<Switch defaultChecked />
</div>
<div className="space-y-2">
<Label htmlFor="adminEmail">Admin Email</Label>
<Input id="adminEmail" type="email" defaultValue="admin@ember-market.com" />
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label>Security Alerts</Label>
<p className="text-sm text-muted-foreground">
Notify on security events
</p>
</div>
<Switch defaultChecked />
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label>System Alerts</Label>
<p className="text-sm text-muted-foreground">
Notify on system issues
</p>
</div>
<Switch defaultChecked />
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label>Order Alerts</Label>
<p className="text-sm text-muted-foreground">
Notify on high-value orders
</p>
</div>
<Switch />
</div>
</CardContent>
</Card>
{/* Database Settings */}
<Card>
<CardHeader>
<CardTitle className="flex items-center">
<Database className="h-5 w-5 mr-2" />
Database Settings
</CardTitle>
<CardDescription>
Database configuration and maintenance
</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<div className="space-y-2">
<Label htmlFor="backupFrequency">Backup Frequency</Label>
<Select defaultValue="daily">
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="hourly">Hourly</SelectItem>
<SelectItem value="daily">Daily</SelectItem>
<SelectItem value="weekly">Weekly</SelectItem>
<SelectItem value="monthly">Monthly</SelectItem>
</SelectContent>
</Select>
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label>Auto Backup</Label>
<p className="text-sm text-muted-foreground">
Automatically backup database
</p>
</div>
<Switch defaultChecked />
</div>
<div className="space-y-2">
<Label htmlFor="retentionPeriod">Backup Retention (days)</Label>
<Input id="retentionPeriod" type="number" defaultValue="30" />
</div>
<Separator />
<div className="space-y-2">
<Label>Database Actions</Label>
<div className="flex space-x-2">
<Button variant="outline" size="sm">
Create Backup
</Button>
<Button variant="outline" size="sm">
Optimize Database
</Button>
</div>
</div>
</CardContent>
</Card>
{/* API Settings */}
<Card>
<CardHeader>
<CardTitle className="flex items-center">
<Key className="h-5 w-5 mr-2" />
API Settings
</CardTitle>
<CardDescription>
API configuration and rate limiting
</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<div className="space-y-2">
<Label htmlFor="apiVersion">API Version</Label>
<Input id="apiVersion" defaultValue="v1" />
</div>
<div className="space-y-2">
<Label htmlFor="rateLimit">Rate Limit (requests/minute)</Label>
<Input id="rateLimit" type="number" defaultValue="1000" />
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label>API Logging</Label>
<p className="text-sm text-muted-foreground">
Log all API requests
</p>
</div>
<Switch defaultChecked />
</div>
<div className="space-y-2">
<Label htmlFor="apiKey">Master API Key</Label>
<Input id="apiKey" type="password" defaultValue="••••••••••••••••" />
</div>
</CardContent>
</Card>
{/* System Information */}
<Card>
<CardHeader>
<CardTitle className="flex items-center">
<Globe className="h-5 w-5 mr-2" />
System Information
</CardTitle>
<CardDescription>
Platform version and system details
</CardDescription>
</CardHeader>
<CardContent className="space-y-4">
<div className="flex justify-between">
<span className="text-sm font-medium">Platform Version</span>
<span className="text-sm text-muted-foreground">v2.1.0</span>
</div>
<div className="flex justify-between">
<span className="text-sm font-medium">Database Version</span>
<span className="text-sm text-muted-foreground">MongoDB 6.0</span>
</div>
<div className="flex justify-between">
<span className="text-sm font-medium">Node.js Version</span>
<span className="text-sm text-muted-foreground">v18.17.0</span>
</div>
<div className="flex justify-between">
<span className="text-sm font-medium">Last Updated</span>
<span className="text-sm text-muted-foreground">2024-01-15</span>
</div>
<div className="flex justify-between">
<span className="text-sm font-medium">Uptime</span>
<span className="text-sm text-muted-foreground">15 days, 3 hours</span>
</div>
</CardContent>
</Card>
</div>
{/* Save Button */}
<div className="flex justify-end">
<Button className="w-full sm:w-auto">
<Save className="h-4 w-4 mr-2" />
Save All Settings
</Button>
</div>
</div>
);
}