Add missing admin action files and navigation links

- Add 11 missing server action files: badges, bulk-users, catalog, catalog-bc, catalog-items, import-badges, import-furni, multi-account-detect, permissions, rooms, soundtracks
- Add missing admin navigation links: tickets, sounds, translations, import, radio sub-pages
- Add translation keys for all new navigation items
This commit is contained in:
openhands committed 2026-07-11 12:01:05 +02:00
1 parent 7e1ae17a3b
commit 41be6835bf
347 files changed
+28378 -6091

No files matched your search

+75
View File
@@ -0,0 +1,75 @@
import { notFound, redirect } from 'next/navigation'
import { AdminBreadcrumb } from '@/components/admin/admin-breadcrumb'
import { getAdminContext } from '@/lib/permissions'
import { prisma } from '@/lib/prisma'
import { fetchEmulatorRankForEdit } from '@/lib/services/permission-ranks'
import { RankEditClient } from './rank-edit-client'
export default async function RankEditPage({
params,
}: {
params: Promise<{ locale: string; id: string }>
}) {
const { id: rawId } = await params
const { permissions } = await getAdminContext()
if (!permissions.isSuperAdmin) redirect('/admin')
const rankId = parseInt(rawId, 10)
if (Number.isNaN(rankId)) notFound()
const rank = await fetchEmulatorRankForEdit(prisma, rankId)
if (!rank) notFound()
// Fetch users with this rank (limit 200)
const users = await prisma.user.findMany({
where: { rank: rankId },
select: { id: true, username: true, look: true },
orderBy: { username: 'asc' },
take: 200,
})
const totalUsers = await prisma.user.count({ where: { rank: rankId } })
// Fetch all CMS permissions
const allCmsPermissions = await prisma.aclPermission.findMany({
orderBy: { slug: 'asc' },
})
// Auto-create CMS role for rank >= 4
let cmsRole: { id: number; slug: string; title: string; permissionSlugs: string[] } | null = null
if (rankId >= 4) {
const role = await prisma.aclRole.upsert({
where: { slug: `rank_${rankId}` },
create: { slug: `rank_${rankId}`, title: rank.rank_name || `Rank ${rankId}` },
update: {},
include: {
rolePermissions: { include: { permission: true } },
},
})
cmsRole = {
id: role.id,
slug: role.slug,
title: role.title,
permissionSlugs: role.rolePermissions.map((rp) => rp.permission.slug),
}
}
return (
<div className="space-y-6">
<AdminBreadcrumb
items={[
{ label: 'Permissions', href: '/admin/permissions' },
{ label: rank.rank_name || `Rank ${rankId}` },
]}
/>
<RankEditClient
rank={rank}
users={users}
totalUsers={totalUsers}
cmsRole={cmsRole}
allCmsPermissions={allCmsPermissions}
/>
</div>
)
}