Files
biblical-guide.com/components/admin/layout/admin-layout.tsx
Andrei 2074ee3bda Complete admin dashboard implementation with comprehensive features
🚀 Major Update: v2.0.0 - Complete Administrative Dashboard

## Phase 1: Dashboard Overview & Authentication 
- Secure admin authentication with JWT tokens
- Beautiful overview dashboard with key metrics
- Role-based access control (admin, moderator permissions)
- Professional MUI design with responsive layout

## Phase 2: User Management & Content Moderation 
- Complete user management with advanced data grid
- Prayer request content moderation system
- User actions: view, suspend, activate, promote, delete
- Content approval/rejection workflows

## Phase 3: Analytics Dashboard 
- Comprehensive analytics with interactive charts (Recharts)
- User activity analytics with retention tracking
- Content engagement metrics and trends
- Real-time statistics and performance monitoring

## Phase 4: Chat Monitoring & System Administration 
- Advanced conversation monitoring with content analysis
- System health monitoring and backup management
- Security oversight and automated alerts
- Complete administrative control panel

## Key Features Added:
 **32 new API endpoints** for complete admin functionality
 **Material-UI DataGrid** with advanced filtering and pagination
 **Interactive Charts** using Recharts library
 **Real-time Monitoring** with auto-refresh capabilities
 **System Health Dashboard** with performance metrics
 **Database Backup System** with automated scheduling
 **Content Filtering** with automated moderation alerts
 **Role-based Permissions** with granular access control
 **Professional UI/UX** with consistent MUI design
 **Visit Website Button** in admin header for easy navigation

## Technical Implementation:
- **Frontend**: Material-UI components with responsive design
- **Backend**: 32 new API routes with proper authentication
- **Database**: Optimized queries with proper indexing
- **Security**: Admin-specific JWT authentication
- **Performance**: Efficient data loading with pagination
- **Charts**: Interactive visualizations with Recharts

The Biblical Guide application now provides world-class administrative capabilities for complete platform management!

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-23 12:01:34 +00:00

240 lines
6.4 KiB
TypeScript

'use client';
import { useState } from 'react';
import { useRouter } from 'next/navigation';
import {
Box,
Drawer,
AppBar,
Toolbar,
List,
Typography,
Divider,
ListItem,
ListItemButton,
ListItemIcon,
ListItemText,
IconButton,
Menu,
MenuItem,
Avatar,
Chip,
Button
} from '@mui/material';
import {
Dashboard,
People,
Gavel,
Analytics,
Chat,
Settings,
Logout,
AccountCircle,
AdminPanelSettings,
Launch as LaunchIcon
} from '@mui/icons-material';
interface AdminLayoutProps {
children: React.ReactNode;
user?: {
id: string;
email: string;
name: string | null;
role: string;
};
}
const drawerWidth = 280;
const menuItems = [
{ text: 'Dashboard', icon: Dashboard, href: '/admin' },
{ text: 'Users', icon: People, href: '/admin/users' },
{ text: 'Content Moderation', icon: Gavel, href: '/admin/content' },
{ text: 'Analytics', icon: Analytics, href: '/admin/analytics' },
{ text: 'Chat Monitoring', icon: Chat, href: '/admin/chat' },
{ text: 'Settings', icon: Settings, href: '/admin/settings' },
];
export function AdminLayout({ children, user }: AdminLayoutProps) {
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
const router = useRouter();
const handleMenu = (event: React.MouseEvent<HTMLElement>) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
const handleLogout = async () => {
try {
await fetch('/api/admin/auth/logout', {
method: 'POST',
credentials: 'include'
});
router.push('/admin/login');
router.refresh();
} catch (error) {
console.error('Logout error:', error);
}
handleClose();
};
const currentPath = typeof window !== 'undefined' ? window.location.pathname : '';
return (
<Box sx={{ display: 'flex' }}>
<AppBar
position="fixed"
sx={{
width: `calc(100% - ${drawerWidth}px)`,
ml: `${drawerWidth}px`,
backgroundColor: 'primary.main'
}}
>
<Toolbar>
<AdminPanelSettings sx={{ mr: 2 }} />
<Typography variant="h6" noWrap component="div" sx={{ flexGrow: 1 }}>
Biblical Guide Admin
</Typography>
{user && (
<Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
<Button
variant="outlined"
startIcon={<LaunchIcon />}
onClick={() => window.open('/', '_blank')}
sx={{
color: 'white',
borderColor: 'white',
'&:hover': {
borderColor: 'white',
backgroundColor: 'rgba(255, 255, 255, 0.1)'
}
}}
>
Visit Website
</Button>
<Chip
label={user.role}
color={user.role === 'admin' ? 'error' : 'warning'}
size="small"
variant="outlined"
sx={{ color: 'white', borderColor: 'white' }}
/>
<IconButton
size="large"
aria-label="account of current user"
aria-controls="menu-appbar"
aria-haspopup="true"
onClick={handleMenu}
color="inherit"
>
<Avatar sx={{ width: 32, height: 32 }}>
{user.name?.[0] || user.email[0]}
</Avatar>
</IconButton>
<Menu
id="menu-appbar"
anchorEl={anchorEl}
anchorOrigin={{
vertical: 'top',
horizontal: 'right',
}}
keepMounted
transformOrigin={{
vertical: 'top',
horizontal: 'right',
}}
open={Boolean(anchorEl)}
onClose={handleClose}
>
<MenuItem disabled>
<Box>
<Typography variant="body2" fontWeight="bold">
{user.name || 'Admin User'}
</Typography>
<Typography variant="caption" color="text.secondary">
{user.email}
</Typography>
</Box>
</MenuItem>
<Divider />
<MenuItem onClick={handleLogout}>
<ListItemIcon>
<Logout fontSize="small" />
</ListItemIcon>
Logout
</MenuItem>
</Menu>
</Box>
)}
</Toolbar>
</AppBar>
<Drawer
sx={{
width: drawerWidth,
flexShrink: 0,
'& .MuiDrawer-paper': {
width: drawerWidth,
boxSizing: 'border-box',
},
}}
variant="permanent"
anchor="left"
>
<Toolbar>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
<AdminPanelSettings color="primary" />
<Typography variant="h6" noWrap>
Admin Panel
</Typography>
</Box>
</Toolbar>
<Divider />
<List>
{menuItems.map((item) => (
<ListItem key={item.text} disablePadding>
<ListItemButton
selected={currentPath === item.href}
onClick={() => router.push(item.href)}
sx={{
'&.Mui-selected': {
backgroundColor: 'primary.main',
color: 'white',
'&:hover': {
backgroundColor: 'primary.dark',
},
'& .MuiListItemIcon-root': {
color: 'white',
},
},
}}
>
<ListItemIcon>
<item.icon />
</ListItemIcon>
<ListItemText primary={item.text} />
</ListItemButton>
</ListItem>
))}
</List>
</Drawer>
<Box
component="main"
sx={{
flexGrow: 1,
bgcolor: 'background.default',
p: 3,
minHeight: '100vh'
}}
>
<Toolbar />
{children}
</Box>
</Box>
);
}