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

+2 -2
View File
@@ -46,8 +46,8 @@ export function DiscordVerifyForm() {
)}
<p className="text-sm" style={{ color: "var(--color-text-muted)" }}>
Open Discord, ga naar <strong>Instellingen → Geavanceerd → Ontwikkelaarsmodus</strong> (aan).
Klik met rechts op je eigen naam en kies <strong>ID kopiëren</strong>. Plak dat hier:
Open Discord, ga naar <strong>Instellingen → Geavanceerd → Ontwikkelaarsmodus</strong> (aan). Klik met
rechts op je eigen naam en kies <strong>ID kopiëren</strong>. Plak dat hier:
</p>
<div className="flex gap-2">
+5 -4
View File
@@ -45,7 +45,10 @@ export function HomeLoginForm() {
}
return (
<form onSubmit={onSubmit} className="relative flex flex-col gap-6 rounded-lg bg-gray-100 p-3 dark:bg-gray-800">
<form
onSubmit={onSubmit}
className="relative flex flex-col gap-6 rounded-lg bg-gray-100 p-3 dark:bg-gray-800"
>
<fieldset className="flex w-full flex-col gap-1">
<label className="block font-semibold text-gray-700 dark:text-gray-200">Username</label>
<input
@@ -87,9 +90,7 @@ export function HomeLoginForm() {
/>
</fieldset>
) : null}
{error ? (
<p className="m-0 text-center text-sm text-red-600 dark:text-red-400">{error}</p>
) : null}
{error ? <p className="m-0 text-center text-sm text-red-600 dark:text-red-400">{error}</p> : null}
<button
type="submit"
disabled={pending}
+60 -22
View File
@@ -12,11 +12,7 @@ interface RegisterFormProps {
error?: string;
}
export function RegisterForm({
hotelName,
captcha,
error,
}: RegisterFormProps) {
export function RegisterForm({ hotelName, captcha, error }: RegisterFormProps) {
const t = useTranslations("pages.register");
const showCaptcha = captcha.provider !== "none" && !!captcha.siteKey;
const [serverError, formAction, isPending] = useActionState(register, null);
@@ -37,18 +33,31 @@ export function RegisterForm({
<div className="relative flex items-center justify-center w-full h-full z-20">
<div className="relative" style={{ width: "140px", height: "140px" }}>
<div className="absolute inset-0 rounded-full overflow-hidden" style={{ zIndex: -1 }}>
<div className="w-full h-full" style={{ background: "black", filter: "blur(8px)", transform: "scale(1.2)", opacity: 0.6 }} />
<div
className="w-full h-full"
style={{ background: "black", filter: "blur(8px)", transform: "scale(1.2)", opacity: 0.6 }}
/>
</div>
<Image src="/assets/images/FrankwithBag.gif" alt="" fill className="!static" style={{ objectFit: "contain", objectPosition: "center", width: "100%", height: "100%" }} />
<Image
src="/assets/images/FrankwithBag.gif"
alt=""
fill
className="!static"
style={{ objectFit: "contain", objectPosition: "center", width: "100%", height: "100%" }}
/>
</div>
</div>
</div>
{/* Form */}
<form action={formAction} className="p-4 flex flex-col gap-6" style={{
backgroundColor: "color-mix(in srgb, var(--color-background) 50%, var(--color-surface))",
borderRadius: "0 0 8px 8px",
}}>
<form
action={formAction}
className="p-4 flex flex-col gap-6"
style={{
backgroundColor: "color-mix(in srgb, var(--color-background) 50%, var(--color-surface))",
borderRadius: "0 0 8px 8px",
}}
>
{error && (
<div className="p-3 rounded-md text-sm" style={{ backgroundColor: "#ef4444", color: "white" }}>
{error}
@@ -64,7 +73,11 @@ export function RegisterForm({
<div className="w-full flex flex-col md:flex-row gap-4">
<div className="w-full md:w-1/2">
<fieldset className="flex flex-col w-full gap-1">
<label htmlFor="username" className="block font-semibold text-sm" style={{ color: "var(--color-text)" }}>
<label
htmlFor="username"
className="block font-semibold text-sm"
style={{ color: "var(--color-text)" }}
>
{t("username")}
</label>
<input
@@ -85,7 +98,11 @@ export function RegisterForm({
</div>
<div className="w-full md:w-1/2">
<fieldset className="flex flex-col w-full gap-1">
<label htmlFor="mail" className="block font-semibold text-sm" style={{ color: "var(--color-text)" }}>
<label
htmlFor="mail"
className="block font-semibold text-sm"
style={{ color: "var(--color-text)" }}
>
{t("email")}
</label>
<input
@@ -112,7 +129,11 @@ export function RegisterForm({
<div className="w-full flex flex-col md:flex-row gap-4">
<div className="w-full md:w-1/2">
<fieldset className="flex flex-col w-full gap-1">
<label htmlFor="password" className="block font-semibold text-sm" style={{ color: "var(--color-text)" }}>
<label
htmlFor="password"
className="block font-semibold text-sm"
style={{ color: "var(--color-text)" }}
>
{t("password")}
</label>
<input
@@ -133,7 +154,11 @@ export function RegisterForm({
</div>
<div className="w-full md:w-1/2">
<fieldset className="flex flex-col w-full gap-1">
<label htmlFor="password_confirmation" className="block font-semibold text-sm" style={{ color: "var(--color-text)" }}>
<label
htmlFor="password_confirmation"
className="block font-semibold text-sm"
style={{ color: "var(--color-text)" }}
>
{t("confirmPassword")}
</label>
<input
@@ -155,9 +180,12 @@ export function RegisterForm({
</div>
{/* Terms */}
<div className="rounded-md p-3 flex flex-col gap-3" style={{
backgroundColor: "color-mix(in srgb, var(--color-background) 50%, var(--color-surface))",
}}>
<div
className="rounded-md p-3 flex flex-col gap-3"
style={{
backgroundColor: "color-mix(in srgb, var(--color-background) 50%, var(--color-surface))",
}}
>
<div className="flex items-center gap-3 text-sm">
<button
type="button"
@@ -166,7 +194,9 @@ export function RegisterForm({
onClick={() => setTermsAccepted(!termsAccepted)}
className="w-5 h-5 rounded border-2 flex items-center justify-center shrink-0 transition-colors"
style={{
borderColor: termsAccepted ? "#27a44d" : "color-mix(in srgb, var(--color-text-muted) 30%, transparent)",
borderColor: termsAccepted
? "#27a44d"
: "color-mix(in srgb, var(--color-text-muted) 30%, transparent)",
backgroundColor: termsAccepted ? "#27a44d" : "transparent",
}}
>
@@ -177,7 +207,11 @@ export function RegisterForm({
)}
</button>
<input type="hidden" name="terms" value={termsAccepted ? "1" : ""} />
<span className="font-semibold cursor-pointer" style={{ color: "var(--color-text)" }} onClick={() => setTermsAccepted(!termsAccepted)}>
<span
className="font-semibold cursor-pointer"
style={{ color: "var(--color-text)" }}
onClick={() => setTermsAccepted(!termsAccepted)}
>
{t("termsAccept", { hotel: hotelName })}
</span>
</div>
@@ -205,11 +239,15 @@ export function RegisterForm({
</button>
<div className="text-center">
<Link href="/login" className="text-sm font-semibold hover:underline" style={{ color: "var(--color-primary)" }}>
<Link
href="/login"
className="text-sm font-semibold hover:underline"
style={{ color: "var(--color-primary)" }}
>
{t("alreadyHaveAccount")}
</Link>
</div>
</form>
</div>
);
}
}