feat: comprehensive CMS improvements
CI / runtime-diagnostics (push) Skipped
CI / release (push) Skipped
CI / check (push) Failing after 0s
CI / deploy (push) Skipped

- Fix DOMPurify SSR crash (use isomorphic-dompurify)
- Fix SanitizedHtml to sanitize by default
- Add auth guards to studio/catalog maintenance pages
- Add update/edit to vouchers CRUD
- Add update/edit to rare-values CRUD
- Add approve workflow to applications page
- Add edit form to guilds detail page
- Add SEO metadata to all public pages (21 pages)
- Fix mobile nav accessibility (focus trap, aria attributes)
- Fix missing labels and table accessibility
- Add dynamic imports for heavy client components (6 components)
- Fix silent error swallowing (40+ locations)
- Add content scheduling for articles (publishAt, status)
- Wire up 12 missing webhook notification triggers
- Add global search to admin panel
- Add bulk actions to admin users table
- Fix JSON formatting and a11y issues
This commit is contained in:
openhands committed 2026-09-03 16:00:32 +02:00
1 parent b810b16672
commit 30c95b1a5c
78 files changed
+2252 -134

No files matched your search

+10 -2
View File
@@ -2,6 +2,7 @@ import { existsSync, promises as fs } from "node:fs";
import os from "node:os";
import { sql } from "drizzle-orm";
import { db } from "@/lib/db";
import { logServerError } from "@/lib/server-log";
import { extractFurniIconPng } from "@/lib/services/clone-icon";
import {
type CloneSource,
@@ -152,7 +153,10 @@ export async function repairMissingIcons(
if (gamedataRoot) {
const badgeFiles = await fs
.readdir(getRuntimePath(gamedataRoot, "album1584"))
.catch(() => [] as string[]);
.catch((error) => {
logServerError("repair_icons.readdir_album_failed", error);
return [] as string[];
});
const albumBadgeSet = new Set(
badgeFiles.filter((f) => f.endsWith(".gif")).map((f) => f.slice(0, -4)),
);
@@ -373,7 +377,11 @@ export async function repairMissingIcons(
`extract from ${source.name} .nitro failed: ${(err as Error).message}`,
);
} finally {
await fs.unlink(nitroTmp).catch(() => {});
await fs
.unlink(nitroTmp)
.catch((error) =>
logServerError("repair_icons.cleanup_failed", error),
);
}
if (ok) break;
}