+ {/* Protokoll */}
+
+
+
+
+
+ {/* Host */}
+
+
+ update('host', e.target.value)}
+ />
+
+
+ {/* Port */}
+
+
+ update('port', e.target.value)}
+ />
+
+
+ {/* Verschlüsselung */}
+
+
+
+
+
+ {/* Ordner */}
+
+
+ update('folder', e.target.value)}
+ />
+
+
+ {/* Absenderfilter */}
+
+
+ update('senderFilter', e.target.value)}
+ />
+
+
+ {/* Abrufintervall */}
+
+
+
+ update('pollIntervalMin', e.target.value)}
+ />
+
+ {t('form.pollIntervalSuffix')}
+
+
+
+
+ {/* Benutzername */}
+
+
+ update('username', e.target.value)}
+ />
+
+
+ {/* Passwort — T-07-12: never pre-filled from server */}
+
+
+
+ update('password', e.target.value)}
+ />
+
+
+
+
+ {/* Export-Empfänger */}
+
+
+ update('exportRecipient', e.target.value)}
+ />
+
+
+ {/* Fahrzeug-Formatstring */}
+
+
+
update('vehicleFormatString', e.target.value)}
+ />
+
+ {t('form.vehicleFormatHelp')}
+
+
+
+ {/* Aktiv — toggle switch per UI-SPEC */}
+
+
+
+
+
+ {/* Form actions row per UI-SPEC */}
+
+
+
+
+
+ {/* Inline test feedback */}
+ {testResult !== null && (
+
+ {testResult.success
+ ? t('form.testSuccess')
+ : t('form.testFailed', {
+ error: testResult.message ?? 'Unbekannter Fehler',
+ })}
+
+ )}
+
+ {/* Inline save feedback */}
+ {saveSuccess && (
+
+ Einstellungen gespeichert.
+
+ )}
+ {saveError && (
+
{saveError}
+ )}
+
+ );
+}
diff --git a/apps/web/src/app/(portal)/modules/dkv-fleet/settings/page.tsx b/apps/web/src/app/(portal)/modules/dkv-fleet/settings/page.tsx
new file mode 100644
index 0000000..a581aab
--- /dev/null
+++ b/apps/web/src/app/(portal)/modules/dkv-fleet/settings/page.tsx
@@ -0,0 +1,56 @@
+'use client';
+
+import Link from 'next/link';
+import { useState } from 'react';
+import { useTranslations } from 'next-intl';
+import { InboxConfigForm } from './components/InboxConfigForm';
+
+type ActiveTab = 'inbox' | 'vehicles';
+
+/**
+ * DKV Fleet Module Settings Page (Surface B from 07-UI-SPEC).
+ * Renders a tab bar (Posteingang / Fahrzeuge) with InboxConfigForm on Tab 1.
+ * Tab 2 navigates to /modules/dkv-fleet/vehicles (separate route per plan split).
+ */
+export default function DkvFleetSettingsPage() {
+ const t = useTranslations('dkvFleet');
+ const [activeTab, setActiveTab] = useState