refactor(housekeeping): split client, add loading states, URL persistence, fix dead code
Local Build and Deploy / deploy (push) Failing after 48s
Local Build and Deploy / deploy (push) Failing after 48s
- Split ManageClient into ManageSection, PresetsSection, TestSection, ImportSection, ExportSection - each tab only renders what it needs - Add loading/disabled states to preset, import, export, clear buttons - Persist search and group filter via URL searchParams (survives refresh) - Remove dead getAuditHistory export from actions - Fix testRankPermission - remove unnecessary revalidatePath with JSON result - Clean up unused errors/count variables in bulkImportPermissions - Add 'loading' translation key to housekeeping section (en/nl)
This commit is contained in:
1 parent
0a350a354e
commit
70f5e37373
7 files changed
+319
-309
No files matched your search
Binary file not shown.
Binary file not shown.
@@ -131,9 +131,6 @@ export async function bulkImportPermissions(formData: FormData): Promise<void> {
|
||||
await requirePermission(PERMS.SETTINGS_EDIT);
|
||||
|
||||
const raw = sanitize(String(formData.get("json") ?? ""));
|
||||
const errors: string[] = [];
|
||||
let count = 0;
|
||||
|
||||
if (!raw) return;
|
||||
|
||||
let parsed: unknown;
|
||||
@@ -157,7 +154,6 @@ export async function bulkImportPermissions(formData: FormData): Promise<void> {
|
||||
const dependsOn = sanitize(String(item.dependsOn ?? "")) || null;
|
||||
|
||||
if (!permission || !Number.isFinite(minRank) || minRank < 0) {
|
||||
errors.push("Invalid entry: " + JSON.stringify(item));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -180,9 +176,8 @@ export async function bulkImportPermissions(formData: FormData): Promise<void> {
|
||||
updatedBy: userId ?? undefined,
|
||||
},
|
||||
});
|
||||
count++;
|
||||
} catch {
|
||||
errors.push("Failed to upsert: " + permission);
|
||||
// Failed to upsert
|
||||
}
|
||||
}
|
||||
|
||||
@@ -881,17 +876,7 @@ export async function testRankPermission(formData: FormData): Promise<void> {
|
||||
});
|
||||
|
||||
const granted = perms.map((p) => p.permission);
|
||||
// Result is displayed via the revalidated page
|
||||
revalidatePath(
|
||||
"/admin/housekeeping?tab=test&result=" +
|
||||
encodeURIComponent(JSON.stringify({ rank, permissions: granted })),
|
||||
);
|
||||
revalidatePath("/admin/housekeeping");
|
||||
}
|
||||
|
||||
export async function getAuditHistory(): Promise<unknown[]> {
|
||||
await requirePermission(PERMS.SETTINGS_VIEW);
|
||||
|
||||
const { getAuditLogs } = await import("@/lib/services/audit");
|
||||
const result = await getAuditLogs({ search: "housekeeping", perPage: 50 });
|
||||
return result.rows;
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -3,35 +3,21 @@ import { redirect } from "next/navigation";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
import { canAccess, getAdminContext, PERMS } from "@/lib/permissions";
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { ManageClient } from "./client";
|
||||
import {
|
||||
ExportSection,
|
||||
ImportSection,
|
||||
ManageSection,
|
||||
PresetsSection,
|
||||
TestSection,
|
||||
} from "./client";
|
||||
|
||||
export const dynamic = "force-dynamic";
|
||||
|
||||
const GROUPS = [
|
||||
"Core",
|
||||
"Users",
|
||||
"Rooms",
|
||||
"Bans",
|
||||
"News",
|
||||
"Logs",
|
||||
"Settings",
|
||||
"Wordfilter",
|
||||
"Catalog",
|
||||
"Shop",
|
||||
"Events",
|
||||
"Tickets",
|
||||
"Moderation",
|
||||
"Polls",
|
||||
"Analytics",
|
||||
"DevOps",
|
||||
"Prefixes",
|
||||
"Banners",
|
||||
"Radio",
|
||||
"RCON",
|
||||
"Assets",
|
||||
"Export",
|
||||
"Notifications",
|
||||
"CMS Pages",
|
||||
"Core", "Users", "Rooms", "Bans", "News", "Logs", "Settings",
|
||||
"Wordfilter", "Catalog", "Shop", "Events", "Tickets", "Moderation",
|
||||
"Polls", "Analytics", "DevOps", "Prefixes", "Banners", "Radio",
|
||||
"RCON", "Assets", "Export", "Notifications", "CMS Pages",
|
||||
];
|
||||
|
||||
export default async function AdminHousekeeping({
|
||||
@@ -241,7 +227,7 @@ export default async function AdminHousekeeping({
|
||||
)}
|
||||
|
||||
{tab === "manage" && (
|
||||
<ManageClient
|
||||
<ManageSection
|
||||
permissions={allPermissions}
|
||||
groups={allGroups}
|
||||
groupCounts={groupCounts}
|
||||
@@ -250,31 +236,17 @@ export default async function AdminHousekeeping({
|
||||
)}
|
||||
|
||||
{tab === "import" && (
|
||||
<ManageClient
|
||||
permissions={allPermissions}
|
||||
groups={allGroups}
|
||||
groupCounts={groupCounts}
|
||||
permSet={permSet}
|
||||
/>
|
||||
<>
|
||||
<ImportSection />
|
||||
<div className="mt-8">
|
||||
<ExportSection />
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
|
||||
{tab === "presets" && (
|
||||
<ManageClient
|
||||
permissions={allPermissions}
|
||||
groups={allGroups}
|
||||
groupCounts={groupCounts}
|
||||
permSet={permSet}
|
||||
/>
|
||||
)}
|
||||
{tab === "presets" && <PresetsSection />}
|
||||
|
||||
{tab === "test" && (
|
||||
<ManageClient
|
||||
permissions={allPermissions}
|
||||
groups={allGroups}
|
||||
groupCounts={groupCounts}
|
||||
permSet={permSet}
|
||||
/>
|
||||
)}
|
||||
{tab === "test" && <TestSection permissions={allPermissions} />}
|
||||
|
||||
{tab === "ranks" && (
|
||||
<section>
|
||||
|
||||
@@ -1881,6 +1881,7 @@
|
||||
"invalidRank": "Invalid rank",
|
||||
"testDone": "Test done: {count} permissions found",
|
||||
"testing": "Testing...",
|
||||
"loading": "Loading...",
|
||||
"prev": "Previous",
|
||||
"next": "Next",
|
||||
"form": {
|
||||
|
||||
@@ -1881,6 +1881,7 @@
|
||||
"invalidRank": "Ongeldige rang",
|
||||
"testDone": "Test voltooid: {count} permissies gevonden",
|
||||
"testing": "Testen...",
|
||||
"loading": "Laden...",
|
||||
"prev": "Vorige",
|
||||
"next": "Volgende",
|
||||
"form": {
|
||||
|
||||
Reference in new issue
Block a user