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

+16 -2
View File
@@ -97,7 +97,7 @@ export const createUser = adminAction(
});
notify({
action: "user_edit",
action: "user_create",
actor: ctx.session.user.username,
target: username,
targetId: user.id,
@@ -450,6 +450,13 @@ export const muteUser = adminAction(
after: { duration: ctx.data.duration },
});
notify({
action: "hotel_alert",
actor: ctx.session.user.username,
target: _target.username,
details: "Muted",
});
return actionOk();
},
);
@@ -463,7 +470,7 @@ const unmuteSchema = z.object({
export const unmuteUser = adminAction(
{ permission: PERMS.USERS_EDIT, schema: unmuteSchema },
async (ctx) => {
await guardRank(ctx.data.userId, ctx.session.user.rank);
const target = await guardRank(ctx.data.userId, ctx.session.user.rank);
const success = await rcon.unmuteUser(ctx.data.userId);
if (!success)
throw new ActionError("Failed to unmute. Is the emulator running?");
@@ -475,6 +482,13 @@ export const unmuteUser = adminAction(
targetId: ctx.data.userId,
});
notify({
action: "hotel_alert",
actor: ctx.session.user.username,
target: target.username,
details: "Unmuted",
});
return actionOk();
},
);