All checks were successful
Docker Deploy / build-and-push (push) Successful in 4m6s
104 lines
3.2 KiB
Plaintext
104 lines
3.2 KiB
Plaintext
---
|
|
import DashboardLayout from '../../layouts/DashboardLayout.astro';
|
|
import Avatar from '../../components/Avatar.astro';
|
|
import { db } from '../../db';
|
|
import { siteSettings, users } from '../../db/schema';
|
|
import { eq } from 'drizzle-orm';
|
|
|
|
const user = Astro.locals.user;
|
|
if (!user || !user.isSiteAdmin) {
|
|
return Astro.redirect('/dashboard');
|
|
}
|
|
|
|
const registrationSetting = await db.select()
|
|
.from(siteSettings)
|
|
.where(eq(siteSettings.key, 'registration_enabled'))
|
|
.get();
|
|
|
|
const registrationEnabled = registrationSetting?.value === 'true';
|
|
|
|
const allUsers = await db.select().from(users).all();
|
|
---
|
|
|
|
<DashboardLayout title="Site Admin - Chronus">
|
|
<h1 class="text-3xl font-bold mb-6">Site Administration</h1>
|
|
|
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6">
|
|
<!-- Statistics -->
|
|
<div class="stats shadow border border-base-200">
|
|
<div class="stat">
|
|
<div class="stat-title">Total Users</div>
|
|
<div class="stat-value">{allUsers.length}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Settings -->
|
|
<div class="card bg-base-100 shadow-xl border border-base-200 mb-6">
|
|
<div class="card-body">
|
|
<h2 class="card-title mb-4">Site Settings</h2>
|
|
|
|
<form method="POST" action="/api/admin/settings">
|
|
<div class="form-control">
|
|
<label class="label cursor-pointer items-start gap-4">
|
|
<span class="label-text flex-1 min-w-0">
|
|
<div class="font-semibold">Allow New Registrations</div>
|
|
<div class="text-sm text-gray-500">When disabled, only existing users can log in</div>
|
|
</span>
|
|
<input
|
|
type="checkbox"
|
|
name="registration_enabled"
|
|
class="toggle toggle-primary shrink-0 mt-1"
|
|
checked={registrationEnabled}
|
|
/>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="card-actions justify-end mt-6">
|
|
<button type="submit" class="btn btn-primary">Save Settings</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Users List -->
|
|
<div class="card bg-base-100 shadow-xl border border-base-200">
|
|
<div class="card-body">
|
|
<h2 class="card-title mb-4">All Users</h2>
|
|
<div class="overflow-x-auto">
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th>Name</th>
|
|
<th>Email</th>
|
|
<th>Site Admin</th>
|
|
<th>Created</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{allUsers.map(u => (
|
|
<tr>
|
|
<td>
|
|
<div class="flex items-center gap-3">
|
|
<Avatar name={u.name} />
|
|
<div class="font-bold">{u.name}</div>
|
|
</div>
|
|
</td>
|
|
<td>{u.email}</td>
|
|
<td>
|
|
{u.isSiteAdmin ? (
|
|
<span class="badge badge-primary">Yes</span>
|
|
) : (
|
|
<span class="badge badge-ghost">No</span>
|
|
)}
|
|
</td>
|
|
<td>{u.createdAt?.toLocaleDateString() ?? 'N/A'}</td>
|
|
</tr>
|
|
))}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</DashboardLayout>
|