feat(mod): help-center tickets queue with reduced PII
Deploy / release (push) Skipped
Deploy / deploy (push) Successful in 1m35s

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
SimoandCursor committed 2026-07-28 20:26:57 +02:00
1 parent 01126207dc
commit b6b8625246
31 files changed
+502 -82

No files matched your search

+7 -3
View File
@@ -25,12 +25,16 @@ function revalidateHelpCenterTicketPaths(ticketId: bigint) {
const id = String(ticketId); const id = String(ticketId);
revalidatePath("/admin/help-tickets"); revalidatePath("/admin/help-tickets");
revalidatePath(`/admin/help-tickets/${id}`); revalidatePath(`/admin/help-tickets/${id}`);
revalidatePath("/mod/help-tickets");
revalidatePath(`/mod/help-tickets/${id}`);
revalidatePath("/help/tickets"); revalidatePath("/help/tickets");
revalidatePath(`/help/tickets/${id}`); revalidatePath(`/help/tickets/${id}`);
} }
const HELP_TICKET_EDIT = [PERMS.TICKETS_EDIT, PERMS.MOD_TICKETS_EDIT] as const;
export const replyHelpCenterTicket = adminAction( export const replyHelpCenterTicket = adminAction(
{ permission: PERMS.TICKETS_EDIT, schema: replyHelpCenterTicketSchema }, { permission: HELP_TICKET_EDIT, schema: replyHelpCenterTicketSchema },
async (ctx) => { async (ctx) => {
const ticketId = ctx.data.ticketId; const ticketId = ctx.data.ticketId;
const ticket = await prisma.websiteHelpCenterTickets.findUnique({ const ticket = await prisma.websiteHelpCenterTickets.findUnique({
@@ -72,7 +76,7 @@ export const replyHelpCenterTicket = adminAction(
); );
export const closeHelpCenterTicket = adminAction( export const closeHelpCenterTicket = adminAction(
{ permission: PERMS.TICKETS_EDIT, schema: helpCenterTicketIdSchema }, { permission: HELP_TICKET_EDIT, schema: helpCenterTicketIdSchema },
async (ctx) => { async (ctx) => {
const ticketId = ctx.data.ticketId; const ticketId = ctx.data.ticketId;
const ticket = await prisma.websiteHelpCenterTickets.findUnique({ const ticket = await prisma.websiteHelpCenterTickets.findUnique({
@@ -104,7 +108,7 @@ export const closeHelpCenterTicket = adminAction(
); );
export const reopenHelpCenterTicket = adminAction( export const reopenHelpCenterTicket = adminAction(
{ permission: PERMS.TICKETS_EDIT, schema: helpCenterTicketIdSchema }, { permission: HELP_TICKET_EDIT, schema: helpCenterTicketIdSchema },
async (ctx) => { async (ctx) => {
const ticketId = ctx.data.ticketId; const ticketId = ctx.data.ticketId;
const ticket = await prisma.websiteHelpCenterTickets.findUnique({ const ticket = await prisma.websiteHelpCenterTickets.findUnique({
@@ -42,10 +42,15 @@ export function AdminHelpTicketDetail({
ticket, ticket,
messages: initialMessages, messages: initialMessages,
canEdit, canEdit,
listHref = "/admin/help-tickets",
hideRequesterContact = false,
}: { }: {
ticket: HelpTicketInfo; ticket: HelpTicketInfo;
messages: ThreadMessage[]; messages: ThreadMessage[];
canEdit: boolean; canEdit: boolean;
listHref?: string;
/** Hide email/IP-style contact for mod-lite surfaces. */
hideRequesterContact?: boolean;
}) { }) {
const t = useTranslations("pages.admin.helpTickets"); const t = useTranslations("pages.admin.helpTickets");
const [messages, setMessages] = useState(initialMessages); const [messages, setMessages] = useState(initialMessages);
@@ -92,7 +97,7 @@ export function AdminHelpTicketDetail({
return ( return (
<div className="space-y-6"> <div className="space-y-6">
<div className="flex items-start gap-4"> <div className="flex items-start gap-4">
<Link href="/admin/help-tickets"> <Link href={listHref}>
<Button variant="ghost" size="icon" aria-label={t("backToList")}> <Button variant="ghost" size="icon" aria-label={t("backToList")}>
<ArrowLeft className="h-4 w-4" /> <ArrowLeft className="h-4 w-4" />
</Button> </Button>
@@ -241,7 +246,11 @@ export function AdminHelpTicketDetail({
</CardHeader> </CardHeader>
<CardContent className="space-y-2"> <CardContent className="space-y-2">
<Link <Link
href={`/admin/users/show/${ticket.creator.id}`} href={
hideRequesterContact
? `/u/${encodeURIComponent(ticket.creator.username)}`
: `/admin/users/show/${ticket.creator.id}`
}
className="flex items-center gap-2 text-sm font-medium hover:text-primary" className="flex items-center gap-2 text-sm font-medium hover:text-primary"
> >
<User className="h-3.5 w-3.5" /> <User className="h-3.5 w-3.5" />
@@ -250,7 +259,7 @@ export function AdminHelpTicketDetail({
{t("rankLabel", { rank: ticket.creator.rank })} {t("rankLabel", { rank: ticket.creator.rank })}
</Badge> </Badge>
</Link> </Link>
{ticket.creator.mail ? ( {!hideRequesterContact && ticket.creator.mail ? (
<div className="flex items-center gap-2 text-xs text-muted-foreground"> <div className="flex items-center gap-2 text-xs text-muted-foreground">
<Mail className="h-3 w-3" /> <Mail className="h-3 w-3" />
{ticket.creator.mail} {ticket.creator.mail}
+3 -3
View File
@@ -1,4 +1,5 @@
import { notFound, redirect } from "next/navigation"; import { notFound, redirect } from "next/navigation";
import { getMinStaffRank } from "@/lib/admin/min-staff-rank";
import { positiveBigInt } from "@/lib/api"; import { positiveBigInt } from "@/lib/api";
import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions";
import { prisma } from "@/lib/prisma"; import { prisma } from "@/lib/prisma";
@@ -6,8 +7,6 @@ import { AdminHelpTicketDetail } from "./admin-help-ticket-detail";
export const dynamic = "force-dynamic"; export const dynamic = "force-dynamic";
const STAFF_RANK_THRESHOLD = 4;
export default async function AdminHelpTicketDetailPage({ export default async function AdminHelpTicketDetailPage({
params, params,
}: { }: {
@@ -70,6 +69,7 @@ export default async function AdminHelpTicketDetailPage({
const userById = new Map(users.map((u) => [u.id, u])); const userById = new Map(users.map((u) => [u.id, u]));
const openerId = ticket.userId; const openerId = ticket.userId;
const minStaffRank = await getMinStaffRank();
const messages = [ const messages = [
{ {
@@ -86,7 +86,7 @@ export default async function AdminHelpTicketDetailPage({
...replies.map((r) => { ...replies.map((r) => {
const user = userById.get(r.userId); const user = userById.get(r.userId);
const isStaff = const isStaff =
r.userId !== openerId && (user?.rank ?? 0) >= STAFF_RANK_THRESHOLD; r.userId !== openerId && (user?.rank ?? 0) >= minStaffRank;
return { return {
key: String(r.id), key: String(r.id),
userId: r.userId, userId: r.userId,
@@ -19,8 +19,10 @@ export interface HelpTicketRow {
export function HelpTicketsTable({ export function HelpTicketsTable({
data, data,
basePath = "/admin/help-tickets",
}: { }: {
data: PaginatedResult<HelpTicketRow>; data: PaginatedResult<HelpTicketRow>;
basePath?: string;
}) { }) {
const t = useTranslations("pages.admin.helpTickets"); const t = useTranslations("pages.admin.helpTickets");
@@ -36,7 +38,7 @@ export function HelpTicketsTable({
#{row.id} #{row.id}
</span> </span>
<Link <Link
href={`/admin/help-tickets/${row.id}`} href={`${basePath}/${row.id}`}
className="font-medium truncate hover:underline" className="font-medium truncate hover:underline"
> >
{row.title} {row.title}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+16 -1
View File
@@ -1,4 +1,13 @@
import { Ban, Gavel, LogOut, Radio, Shield, Ticket, Users } from "lucide-react"; import {
Ban,
Gavel,
LifeBuoy,
LogOut,
Radio,
Shield,
Ticket,
Users,
} from "lucide-react";
import Link from "next/link"; import Link from "next/link";
import { redirect } from "next/navigation"; import { redirect } from "next/navigation";
import { getTranslations } from "next-intl/server"; import { getTranslations } from "next-intl/server";
@@ -59,6 +68,12 @@ export default async function ModLayout({ children }: { children: ReactNode }) {
icon: Ticket, icon: Ticket,
show: showTickets, show: showTickets,
}, },
{
href: "/mod/help-tickets",
label: t("nav.helpTickets"),
icon: LifeBuoy,
show: showTickets,
},
{ {
href: "/mod/actions", href: "/mod/actions",
label: t("nav.actions"), label: t("nav.actions"),
+59 -27
View File
File diff suppressed because it is too large. Load diff
@@ -49,6 +49,7 @@ const MOD_ROUTES: Array<[string, string]> = [
["actions", "PERMS.MOD_ACTIONS"], ["actions", "PERMS.MOD_ACTIONS"],
["bans", "PERMS.MOD_BANS_VIEW"], ["bans", "PERMS.MOD_BANS_VIEW"],
["tickets", "PERMS.MOD_TICKETS_VIEW"], ["tickets", "PERMS.MOD_TICKETS_VIEW"],
["help-tickets", "PERMS.MOD_TICKETS_VIEW"],
["team", "PERMS.MOD_TEAM_VIEW"], ["team", "PERMS.MOD_TEAM_VIEW"],
]; ];
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3008,7 +3008,8 @@
"bans": "Bans", "bans": "Bans",
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "CMS tickets",
"helpTickets": "Help-center tickets",
"team": "Team" "team": "Team"
}, },
"stats": { "stats": {
@@ -3017,7 +3018,8 @@
"modsOnline": "Mods online", "modsOnline": "Mods online",
"quickActions": "Quick actions", "quickActions": "Quick actions",
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open CMS tickets",
"openHelpTickets": "Open help tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload"
} }
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3015,7 +3015,8 @@
"bans": "Ban", "bans": "Ban",
"fullAdmin": "Admin completo", "fullAdmin": "Admin completo",
"backToSite": "Torna al sito", "backToSite": "Torna al sito",
"tickets": "Ticket", "tickets": "Ticket CMS",
"helpTickets": "Ticket help center",
"team": "Team" "team": "Team"
}, },
"stats": { "stats": {
@@ -3024,7 +3025,8 @@
"modsOnline": "Mod online", "modsOnline": "Mod online",
"quickActions": "Azioni rapide", "quickActions": "Azioni rapide",
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Ticket aperti", "openTickets": "Ticket CMS aperti",
"openHelpTickets": "Help ticket aperti",
"team": "Team mod", "team": "Team mod",
"teamHint": "Staff online e carico" "teamHint": "Staff online e carico"
} }
+4 -2
View File
@@ -3013,7 +3013,8 @@
"bans": "Bans", "bans": "Bans",
"fullAdmin": "Volledige admin", "fullAdmin": "Volledige admin",
"backToSite": "Terug naar site", "backToSite": "Terug naar site",
"tickets": "Tickets", "tickets": "CMS-tickets",
"helpTickets": "Helpcenter-tickets",
"team": "Team" "team": "Team"
}, },
"stats": { "stats": {
@@ -3022,7 +3023,8 @@
"modsOnline": "Mods online", "modsOnline": "Mods online",
"quickActions": "Snelle acties", "quickActions": "Snelle acties",
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open CMS-tickets",
"openHelpTickets": "Open help-tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & werklast" "teamHint": "Online staff & werklast"
} }
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3005,7 +3005,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3015,7 +3016,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },
+4 -2
View File
@@ -3007,7 +3007,8 @@
"fullAdmin": "Full admin", "fullAdmin": "Full admin",
"backToSite": "Back to site", "backToSite": "Back to site",
"tickets": "Tickets", "tickets": "Tickets",
"team": "Team" "team": "Team",
"helpTickets": "Help-center tickets"
}, },
"stats": { "stats": {
"openCfh": "Open CFH", "openCfh": "Open CFH",
@@ -3017,7 +3018,8 @@
"quickActionsHint": "Kick, mute, alert", "quickActionsHint": "Kick, mute, alert",
"openTickets": "Open tickets", "openTickets": "Open tickets",
"team": "Mod team", "team": "Mod team",
"teamHint": "Online staff & workload" "teamHint": "Online staff & workload",
"openHelpTickets": "Open help tickets"
} }
} }
}, },