diff --git a/frontend/src/components/layout/Sidebar.tsx b/frontend/src/components/layout/Sidebar.tsx
index 42a375b..6222975 100644
--- a/frontend/src/components/layout/Sidebar.tsx
+++ b/frontend/src/components/layout/Sidebar.tsx
@@ -24,6 +24,7 @@ const navGroups = [
{ key: 'welcome', label: 'Willkommen', icon: },
{ key: 'birthday', label: 'Birthday', icon: },
{ key: 'events', label: 'Events', icon: },
+ { key: 'reactionroles', label: 'Reaction Roles', icon: },
]
},
{
@@ -38,7 +39,6 @@ const navGroups = [
label: 'Moderation',
items: [
{ key: 'automod', label: 'Automod', icon: },
- { key: 'reactionroles', label: 'Reaction Roles', icon: },
{ key: 'tasks', label: 'Team-Aufgaben', icon: },
{ key: 'watchlist', label: 'Watchlist', icon: },
]
@@ -48,6 +48,11 @@ const navGroups = [
items: [
{ key: 'dynamicvoice', label: 'Dynamic Voice', icon: },
{ key: 'music', label: 'Musik', icon: },
+ ]
+ },
+ {
+ label: 'Statistiken',
+ items: [
{ key: 'statuspage', label: 'Statuspage', icon: },
{ key: 'serverstats', label: 'Server Stats', icon: },
{ key: 'growth', label: 'Wachstum', icon: },
diff --git a/frontend/src/components/shared/ModuleActiveToggle.tsx b/frontend/src/components/shared/ModuleActiveToggle.tsx
new file mode 100644
index 0000000..5efd088
--- /dev/null
+++ b/frontend/src/components/shared/ModuleActiveToggle.tsx
@@ -0,0 +1,25 @@
+import type { ReactNode } from 'react';
+import { AppSwitch } from './AppSwitch';
+
+type Props = {
+ icon: ReactNode;
+ title: string;
+ description: string;
+ isSelected: boolean;
+ onChange: (value: boolean) => void;
+};
+
+export function ModuleActiveToggle({ icon, title, description, isSelected, onChange }: Props) {
+ return (
+
+
+ {icon}
+
+
+
{title}
+
{description}
+
+
+
+ );
+}
diff --git a/frontend/src/pages/Automod.tsx b/frontend/src/pages/Automod.tsx
index dcab63a..a41bb9c 100644
--- a/frontend/src/pages/Automod.tsx
+++ b/frontend/src/pages/Automod.tsx
@@ -6,6 +6,7 @@ import { SectionCard } from '../components/shared/SectionCard';
import { ChannelSelect, type ChannelOption } from '../components/shared/ChannelSelect';
import { RoleSelect, type RoleOption } from '../components/shared/RoleSelect';
import { AppSwitch } from '../components/shared/AppSwitch';
+import { ModuleActiveToggle } from '../components/shared/ModuleActiveToggle';
import { useGuildResources } from '../hooks/useGuildResources';
const FILTERS = [
@@ -206,20 +207,13 @@ export function Automod() {
Automod
-
-
-
-
-
-
Automod aktiv
-
Schaltet alle Filter unten gesammelt ein oder aus.
-
-
setSettings((s) => ({ ...s, automodEnabled: v }))}
- />
-
+ }
+ title="Automod aktiv"
+ description="Schaltet alle Filter unten gesammelt ein oder aus."
+ isSelected={settings.automodEnabled !== false}
+ onChange={(v) => setSettings((s) => ({ ...s, automodEnabled: v }))}
+ />
{FILTERS.map((f) => {
diff --git a/frontend/src/pages/Birthday.tsx b/frontend/src/pages/Birthday.tsx
index f7f2ae7..05358ef 100644
--- a/frontend/src/pages/Birthday.tsx
+++ b/frontend/src/pages/Birthday.tsx
@@ -3,7 +3,7 @@ import { CalendarDays, Save, Cake, Clock } from 'lucide-react';
import { useApp } from '../context/AppContext';
import { SectionCard } from '../components/shared/SectionCard';
import { ChannelSelect } from '../components/shared/ChannelSelect';
-import { AppSwitch } from '../components/shared/AppSwitch';
+import { ModuleActiveToggle } from '../components/shared/ModuleActiveToggle';
import { useGuildResources } from '../hooks/useGuildResources';
export function Birthday() {
@@ -18,10 +18,12 @@ export function Birthday() {
Konfiguration
- }
+ title="Birthday aktiv"
+ description="Speichert Geburtstage und sendet automatisch Glückwünsche."
isSelected={birthday.config?.enabled !== false}
onChange={(v) => setBirthday((s) => ({ ...s, config: { ...s.config, enabled: v } }))}
- label={ Birthday aktiv
}
/>
diff --git a/frontend/src/pages/DynamicVoice.tsx b/frontend/src/pages/DynamicVoice.tsx
index 161fc2b..be51656 100644
--- a/frontend/src/pages/DynamicVoice.tsx
+++ b/frontend/src/pages/DynamicVoice.tsx
@@ -3,7 +3,7 @@ import { AudioLines, Save, Mic, Users } from 'lucide-react';
import { useApp } from '../context/AppContext';
import { SectionCard } from '../components/shared/SectionCard';
import { ChannelSelect } from '../components/shared/ChannelSelect';
-import { AppSwitch } from '../components/shared/AppSwitch';
+import { ModuleActiveToggle } from '../components/shared/ModuleActiveToggle';
import { useGuildResources } from '../hooks/useGuildResources';
export function DynamicVoice() {
@@ -18,10 +18,12 @@ export function DynamicVoice() {
Konfiguration
- }
+ title="Dynamic Voice aktiv"
+ description="Erstellt private Voice-Channels aus der konfigurierten Lobby."
isSelected={settings.dynamicVoiceEnabled !== false}
onChange={(v) => setSettings((s) => ({ ...s, dynamicVoiceEnabled: v }))}
- label={}
/>
diff --git a/frontend/src/pages/ServerStats.tsx b/frontend/src/pages/ServerStats.tsx
index b2ea9de..98dd6c9 100644
--- a/frontend/src/pages/ServerStats.tsx
+++ b/frontend/src/pages/ServerStats.tsx
@@ -2,7 +2,7 @@ import { Card, CardContent, CardHeader, Input, Button, Chip, Separator, TextFiel
import { Activity, Save, Trash2, Plus, BarChart3 } from 'lucide-react';
import { useApp } from '../context/AppContext';
import { SectionCard } from '../components/shared/SectionCard';
-import { AppSwitch } from '../components/shared/AppSwitch';
+import { ModuleActiveToggle } from '../components/shared/ModuleActiveToggle';
export function ServerStats() {
const { statsDraft, setStatsDraft, saveServerStats, statsItemDraft, setStatsItemDraft, addStatsItem, deleteStatsItem } = useApp();
@@ -17,10 +17,12 @@ export function ServerStats() {
Konfiguration
- }
+ title="Server Stats aktiv"
+ description="Zeigt Mitglieder-/Channel-Zahlen als Voice-Statistiken an."
isSelected={statsDraft?.enabled === true}
onChange={(v) => setStatsDraft((s) => ({ ...(s || {}), enabled: v }))}
- label={ Server Stats aktiv
}
/>
diff --git a/frontend/src/pages/Statuspage.tsx b/frontend/src/pages/Statuspage.tsx
index 72fecdd..6fb490b 100644
--- a/frontend/src/pages/Statuspage.tsx
+++ b/frontend/src/pages/Statuspage.tsx
@@ -4,7 +4,7 @@ import { useApp } from '../context/AppContext';
import { SectionCard } from '../components/shared/SectionCard';
import type { StatusService } from '../types';
import { ChannelSelect } from '../components/shared/ChannelSelect';
-import { AppSwitch } from '../components/shared/AppSwitch';
+import { ModuleActiveToggle } from '../components/shared/ModuleActiveToggle';
import { useGuildResources } from '../hooks/useGuildResources';
export function Statuspage() {
@@ -21,10 +21,12 @@ export function Statuspage() {
Konfiguration
- }
+ title="Statuspage aktiv"
+ description="Postet und aktualisiert die Statusseite mit deinen Services."
isSelected={statusDraft?.enabled !== false}
onChange={(v) => setStatusDraft((s) => ({ ...(s || {}), enabled: v }))}
- label={ Statuspage aktiv
}
/>
diff --git a/frontend/src/pages/Welcome.tsx b/frontend/src/pages/Welcome.tsx
index 0ec2e80..494a21a 100644
--- a/frontend/src/pages/Welcome.tsx
+++ b/frontend/src/pages/Welcome.tsx
@@ -4,7 +4,7 @@ import { useApp } from '../context/AppContext';
import { SectionCard } from '../components/shared/SectionCard';
import { DiscordPreview } from '../components/shared/DiscordPreview';
import { ChannelSelect } from '../components/shared/ChannelSelect';
-import { AppSwitch } from '../components/shared/AppSwitch';
+import { ModuleActiveToggle } from '../components/shared/ModuleActiveToggle';
import { useGuildResources } from '../hooks/useGuildResources';
export function Welcome() {
@@ -22,10 +22,12 @@ export function Welcome() {
- }
+ title="Welcome aktiv"
+ description="Sendet ein Begrüßungs-Embed, wenn neue Mitglieder beitreten."
isSelected={settings.welcomeConfig?.enabled !== false}
onChange={(v) => setSettings((s) => ({ ...s, welcomeConfig: { ...(s.welcomeConfig || {}), enabled: v } }))}
- label={ Welcome aktiv
}
/>