diff --git a/frontend/src/components/MemberTransferDialog.vue b/frontend/src/components/MemberTransferDialog.vue index c39855b..0ac0b62 100644 --- a/frontend/src/components/MemberTransferDialog.vue +++ b/frontend/src/components/MemberTransferDialog.vue @@ -12,160 +12,81 @@
-
-

Server-Konfiguration

- -
- - - Aus Einstellungen geladen (nur lesend) -
+
+

Keine Konfiguration gefunden

+

Bitte konfigurieren Sie zuerst die Mitgliederübertragung in den Einstellungen.

+ + Zu den Einstellungen +
-
-

Login-Konfiguration

- -
- - - Optional: Relativer Pfad zum Login-Endpoint -
- -
- - -
- -
- -
-
- - +
+
+

Übertragungskonfiguration

+
+
+ Server: + {{ config.server }}
-
- - +
+ Endpoint: + {{ config.transferEndpoint }} +
+
+ Methode: + {{ config.transferMethod }} +
+
+ Format: + {{ config.transferFormat }} +
+
+ Modus: + {{ config.useBulkMode ? 'Bulk-Import' : 'Einzeln' }}
- Zusätzliche Felder werden nur verwendet, wenn sie ausgefüllt sind -
-
- -
-

Übertragungs-Konfiguration

- -
- - - Relativer Pfad zum Übertragungs-Endpoint -
- -
-
- - -
- -
- - -
+ + Konfiguration bearbeiten +
-
- - Wenn aktiviert, werden alle Mitglieder in einem Request als Array übertragen. Das Template definiert das Format für ein einzelnes Mitglied. -
- -
- - -
- Verfügbare Platzhalter: -
    -
  • {{firstName}} - Vorname
  • -
  • {{lastName}} - Nachname
  • -
  • {{fullName}} - Vollständiger Name
  • -
  • {{email}} - E-Mail-Adresse
  • -
  • {{phone}} - Telefonnummer
  • -
  • {{street}} - Straße
  • -
  • {{city}} - Ort
  • -
  • {{birthDate}} - Geburtsdatum (YYYY-MM-DD)
  • -
  • {{geburtsdatum}} - Geburtsdatum (YYYY-MM-DD, alternativ)
  • -
  • {{address}} - Kombinierte Adresse (Straße, Ort)
  • -
  • {{ttr}} - TTR-Wert
  • -
  • {{qttr}} - QTTR-Wert
  • -
  • {{gender}} - Geschlecht
  • -
-

Beispiel JSON (für einzelnes Mitglied):

-
{{ jsonExample }}
-

- Bulk-Modus aktiv: Das Template wird für jedes Mitglied angewendet und automatisch in {"members": [...]} gewrappt. -

+
+

Login-Daten (optional überschreiben)

+

Die Login-Daten werden aus den Einstellungen verwendet. Sie können sie hier überschreiben, falls nötig.

+ +
+ +
+
+ + +
+
+ + +
+
+ Nur ausfüllen, wenn Sie die gespeicherten Login-Daten überschreiben möchten. Leere Felder verwenden die gespeicherten Werte.
@@ -204,6 +125,10 @@ export default { ...mapGetters(['currentClub']), isValid() { + return this.hasConfig && !!(this.config.server && this.config.transferEndpoint && this.config.transferTemplate); + }, + + hasConfig() { return !!(this.config.server && this.config.transferEndpoint && this.config.transferTemplate); }, @@ -219,17 +144,6 @@ export default { return 'Feldname: Wert (z.B. client_secret: xyz789)'; } return 'Zusätzliches Feld (z.B. client_secret)'; - }, - - jsonExample() { - return JSON.stringify({ - firstName: "{{firstName}}", - lastName: "{{lastName}}", - geburtsdatum: "{{geburtsdatum}}", - email: "{{email}}", - phone: "{{phone}}", - address: "{{address}}" - }, null, 2); } }, data() { @@ -242,7 +156,8 @@ export default { transferMethod: 'POST', transferFormat: 'json', transferTemplate: '', - useBulkMode: false + useBulkMode: false, + bulkWrapperTemplate: '' }, loginCredentials: { username: '', @@ -283,14 +198,15 @@ export default { this.config.transferFormat = savedConfig.transferFormat || 'json'; this.config.transferTemplate = savedConfig.transferTemplate || ''; this.config.useBulkMode = savedConfig.useBulkMode || false; + this.config.bulkWrapperTemplate = savedConfig.bulkWrapperTemplate || ''; - // Login-Credentials (Passwort wird nicht zurückgegeben, nur wenn vorhanden) - if (savedConfig.loginCredentials) { - this.loginCredentials.username = savedConfig.loginCredentials.username || ''; - this.loginCredentials.password = ''; // Passwort wird nicht zurückgegeben - // Zusätzliche Felder können nicht direkt zugewiesen werden, da sie verschlüsselt sind - // Benutzer muss diese neu eingeben - } + // Login-Credentials zurücksetzen (werden nur verwendet, wenn im Dialog eingegeben) + this.loginCredentials = { + username: '', + password: '', + additionalField1: '', + additionalField2: '' + }; } } catch (error) { // Keine Konfiguration vorhanden - das ist OK, Dialog bleibt leer @@ -315,7 +231,8 @@ export default { transferMethod: 'POST', transferFormat: 'json', transferTemplate: '', - useBulkMode: false + useBulkMode: false, + bulkWrapperTemplate: '' }; this.loginCredentials = { username: '', @@ -367,7 +284,8 @@ export default { transferMethod: this.config.transferMethod, transferFormat: this.config.transferFormat, transferTemplate: this.config.transferTemplate, - useBulkMode: this.config.useBulkMode + useBulkMode: this.config.useBulkMode, + bulkWrapperTemplate: this.config.bulkWrapperTemplate || null }; // Login-Konfiguration nur hinzufügen, wenn Endpoint vorhanden @@ -578,6 +496,92 @@ export default { color: #666; } +.config-missing { + text-align: center; + padding: 2rem; + background-color: #fff3cd; + border: 1px solid #ffc107; + border-radius: 6px; + color: #856404; +} + +.config-missing p { + margin: 0.5rem 0; +} + +.btn-link { + display: inline-block; + margin-top: 1rem; + padding: 0.75rem 1.5rem; + background-color: #007bff; + color: white; + text-decoration: none; + border-radius: 4px; + font-weight: 500; + transition: background-color 0.2s; +} + +.btn-link:hover { + background-color: #0056b3; +} + +.config-summary { + background-color: #f8f9fa; + border: 1px solid #dee2e6; + border-radius: 6px; + padding: 1.5rem; + margin-bottom: 1.5rem; +} + +.config-summary h4 { + margin: 0 0 1rem 0; + color: #333; + font-size: 1.1em; +} + +.summary-info { + display: flex; + flex-direction: column; + gap: 0.5rem; + margin-bottom: 1rem; +} + +.summary-row { + display: flex; + gap: 1rem; +} + +.summary-label { + font-weight: 600; + color: #555; + min-width: 100px; +} + +.summary-value { + color: #333; + font-family: 'Courier New', monospace; + font-size: 0.9em; +} + +.btn-link-small { + display: inline-block; + color: #007bff; + text-decoration: none; + font-size: 0.9em; + font-weight: 500; +} + +.btn-link-small:hover { + text-decoration: underline; +} + +.section-hint { + margin: 0 0 1rem 0; + font-size: 0.9em; + color: #666; + font-style: italic; +} + .btn-primary { background-color: #007bff; color: white;