Merge branch '309-Transaction-details-design' of https://github.com/gradido/gradido into 309-Transaction-details-design

This commit is contained in:
ogerly 2021-07-08 15:59:24 +02:00
commit 1d029deb7a
42 changed files with 1997 additions and 1022 deletions

View File

@ -206,7 +206,7 @@ jobs:
report_name: Coverage Frontend
type: lcov
result_path: ./coverage/lcov.info
min_coverage: 32
min_coverage: 46
token: ${{ github.token }}
##############################################################################

Binary file not shown.

View File

@ -7,409 +7,505 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-28 10:50+0200\n"
"PO-Revision-Date: 2020-05-28 10:54+0200\n"
"POT-Creation-Date: 2021-06-21 13:37+0200\n"
"PO-Revision-Date: 2021-06-21 13:38+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.3.1\n"
"X-Generator: Poedit 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:85
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:124
#: build/http_pages/LoginPage.cpp:196 build/http_pages/LoginPage.cpp:275
msgid "Login"
msgstr "Anmeldung"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:85
#: build/http_pages/LoginPage.cpp:196
msgid "E-Mail or password isn't right, please try again!"
msgstr ""
"E-Mail und Passwort Kombination stimmen nicht, bitte versuche es erneut. "
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:88
#, fuzzy
#| msgid "Password"
#: build/http_pages/LoginPage.cpp:205
msgid "Passwort"
msgstr "Passwort"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:88
#: build/http_pages/LoginPage.cpp:205
msgid ""
"Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:91
msgid "Account"
msgstr "Konto"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:91
msgid "E-Mail Address not checked, do you already get one?"
#: build/http_pages/LoginPage.cpp:208 build/http_pages/LoginPage.cpp:211
msgid "User"
msgstr ""
"E-Mail Adresse wurde noch nicht überprüft. Hast du schon in deine E-Mails "
"geschaut? Bitte schau auch in dein Spam-Verzeichnis nach."
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:124
#: build/http_pages/LoginPage.cpp:208
msgid "Error in saved data, the server admin will look at it."
msgstr ""
#: build/http_pages/LoginPage.cpp:211
msgid "Benutzer ist deaktiviert, kein Login möglich!"
msgstr ""
#: build/http_pages/LoginPage.cpp:275
msgid "Username and password are needed!"
msgstr "E-Mail und Passwort werden benötigt!"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:175
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:50
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:54
#: model/Session.cpp:163 model/Session.cpp:170 model/Session.cpp:209
#: model/Session.cpp:234
#: build/http_pages/LoginPage.cpp:376 src/cpp/model/Session.cpp:161
#: src/cpp/model/Session.cpp:168 src/cpp/model/Session.cpp:220
#: src/cpp/model/Session.cpp:231
msgid "E-Mail"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:178
#: build/http_pages/LoginPage.cpp:381
#: src/cpp/SingletonManager/SessionManager.cpp:603
#: src/cpp/SingletonManager/SessionManager.cpp:609
#: src/cpp/SingletonManager/SessionManager.cpp:614
#: src/cpp/SingletonManager/SessionManager.cpp:619
#: src/cpp/SingletonManager/SessionManager.cpp:624
#: src/cpp/SingletonManager/SessionManager.cpp:629
msgid "Password"
msgstr "Passwort"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:180
#: build/http_pages/LoginPage.cpp:384
msgid " Login "
msgstr "Anmeldung"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:182
#: build/http_pages/LoginPage.cpp:391
msgid "You haven't any account yet? Please follow the link to create one."
msgstr "Du hast noch kein Gradido-Konto?"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:183
#: build/http_pages/LoginPage.cpp:395
msgid "Create New Account"
msgstr "Neues Konto erstellen"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:186
#: build/http_pages/LoginPage.cpp:403
msgid "Passwort vergessen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:97
msgid "Bitte gebe deinen E-Mail Verification Code ein:"
#: build/http_pages/CheckEmailPage.cpp:155
msgid "E-Mail verifizieren"
msgstr "E-Mail überprüfen"
#: build/http_pages/CheckEmailPage.cpp:165
msgid ""
"Deine E-Mail wurde erfolgreich bestätigt. Du kannst nun Gradidos versenden."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:98
#: model/Session.cpp:186
#, fuzzy
#| msgid "E-Mail Verification"
#: build/http_pages/CheckEmailPage.cpp:170
msgid "Zur Startseite"
msgstr ""
#: build/http_pages/CheckEmailPage.cpp:175
msgid "Bitte gib deinen E-Mail Verification Code ein:"
msgstr "Bitte gib deinen E-Mail Verification Code ein:"
#: build/http_pages/CheckEmailPage.cpp:178 src/cpp/model/Session.cpp:184
msgid "Email Verification Code"
msgstr "E-Mail Überprüfung"
msgstr "Email Verification Code"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:100
#: build/http_pages/CheckEmailPage.cpp:185
msgid "Überprüfe Code"
msgstr ""
msgstr "Überprüfe Code"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:104
#: build/http_pages/CheckEmailPage.cpp:190
msgid "Du hast bisher keinen Code erhalten?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:105
#: build/http_pages/CheckEmailPage.cpp:193
msgid "E-Mail erneut zuschicken (in Arbeit)"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:108
#: build/http_pages/CheckEmailPage.cpp:198
msgid "Funktioniert dein E-Mail Verification Code nicht?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:109
#: build/http_pages/CheckEmailPage.cpp:201
msgid "Schicke uns eine E-Mail und wir kümmern uns darum: "
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:110
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:133
#: build/http_pages/CheckEmailPage.cpp:208
#: build/http_pages/ResetPasswordPage.cpp:273
msgid "E-Mail an Support schicken"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:50
msgid "E-Mail Adresse konnte nicht gefunden werden oder ist nicht aktiviert."
#: build/http_pages/ResetPasswordPage.cpp:174
#: build/http_pages/ResetPasswordPage.cpp:217
msgid "Gib bitte hier deine E-Mail Adresse an:"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:54
msgid "E-Mail Adresse nicht angegeben."
#: build/http_pages/ResetPasswordPage.cpp:183
msgid "Bestätigen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:59
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:74
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:26
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:94
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:114
#: model/Session.cpp:495 model/Session.cpp:507 model/Session.cpp:515
msgid "Passphrase"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:59
msgid "Bitte wähle eine Option aus."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:74
msgid "Ungültige Option"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:107
msgid "Gebe bitte hier deine E-Mail Adresse an:"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:109
#: build/http_pages/ResetPasswordPage.cpp:225
msgid "Hast du dir deine Passphrase notiert oder gemerkt?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:113
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:196
#: build/http_pages/ResetPasswordPage.cpp:234
#: build/http_pages/PassphrasePage.cpp:373
msgid "Ja"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:118
#: build/http_pages/ResetPasswordPage.cpp:241
msgid "Nein"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:123
#: build/http_pages/ResetPasswordPage.cpp:247
msgid "Absenden"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:127
#: build/http_pages/ResetPasswordPage.cpp:255
msgid "Dir wird eine E-Mail zugeschickt um dein Passwort zurückzusetzen."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:129
#: build/http_pages/ResetPasswordPage.cpp:260
msgid "Der Admin hat eine E-Mail bekommen und wird sich bei dir melden."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:131
#: build/http_pages/ResetPasswordPage.cpp:265
msgid ""
"Du hast bereits eine E-Mail bekommen. Bitte schau auch in dein Spam-"
"Verzeichnis nach. "
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:132
#: build/http_pages/ResetPasswordPage.cpp:268
msgid ""
"Du hast wirklich keine E-Mail erhalten und auch schon ein paar Minuten "
"gewartet?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:27
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:256
#: build/http_pages/PassphrasePage.cpp:41
#: build/http_pages/PassphrasePage.cpp:111
#: build/http_pages/PassphrasePage.cpp:132 src/cpp/model/Session.cpp:465
#: src/cpp/model/Session.cpp:477 src/cpp/model/Session.cpp:491
msgid "Passphrase"
msgstr ""
#: build/http_pages/PassphrasePage.cpp:42
#: build/http_pages/PassphrasePage.cpp:451
msgid "Neues Konto anlegen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:28
#: build/http_pages/PassphrasePage.cpp:43
msgid "2/3"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:94
#: build/http_pages/PassphrasePage.cpp:111
msgid ""
"Diese Passphrase ist ungültig, bitte überprüfen oder neu "
"generieren (lassen)."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:114
#: build/http_pages/PassphrasePage.cpp:132
msgid "intern error please try again later"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:129
#: build/http_pages/PassphrasePage.cpp:147
msgid "3/3"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:132
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:135
#: build/http_pages/PassphrasePage.cpp:150
#: build/http_pages/PassphrasePage.cpp:153
msgid "1/3"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:134
#: build/http_pages/PassphrasePage.cpp:152
msgid "Neues Passwort anlegen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:153
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:188
msgid "Was zu tun ist:"
#: build/http_pages/PassphrasePage.cpp:270
msgid "Passphrase abschreiben"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:154
msgid ""
"Schreibe dir deine Passphrase auf und packe sie gut weg. Du brauchst sie um "
"deine Adresse wiederherzustellen. Wenn du sie verlierst, sind auch deine "
"Gradidos verloren."
msgstr ""
"Schreibe dir deine Passphrase auf oder drucke sie aus und bewahre sie <b>in "
"Papier-Form</b> an einem sicheren Ort auf (speichere sie nicht auf deinem "
"Rechner oder Mobilgerät)! Du brauchst deine Passphrase um dein Konto "
"wiederherzustellen, wenn du mal dein Passort vergessen haben solltest. "
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:157
msgid "Deine Passphrase (Groß/Kleinschreibung beachten)"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:161
#: build/http_pages/PassphrasePage.cpp:287
msgid "Was ist eine Passphrase?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:162
msgid ""
"Die Passphrase kommt aus dem Crypto-Bereich und ist ein Weg einen "
"komplizierte kryptografischen Schlüssel in einer lesbaren Form darzustellen."
#: build/http_pages/PassphrasePage.cpp:290
msgid "Deine Passphrase besteht aus den im grünen Feld angezeigten Wörtern."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:163
msgid ""
"Der neue Gradido basiert technisch auf einer Kryptowährung (wie z.B. "
"Bitcoin) um maximale Sicherheit zu erreichen."
#: build/http_pages/PassphrasePage.cpp:293
msgid "Sie dient deiner Sicherheit."
msgstr ""
"Der neue Gradido basiert technisch auf einer Kryptowährung (wie z.B. "
"Bitcoin) um für dich die maximale Sicherheit zu gewährleisten."
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:165
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:275
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:280
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:293
#: build/http_pages/PassphrasePage.cpp:296
msgid ""
"Du brauchst deine Passphrase um dein Konto wiederherzustellen, wenn du mal "
"dein Passwort vergessen haben solltest."
msgstr ""
#: build/http_pages/PassphrasePage.cpp:300
msgid "Deine Passphrase (Groß/Kleinschreibung beachten)"
msgstr ""
#: build/http_pages/PassphrasePage.cpp:309
#: build/http_pages/PassphrasePage.cpp:352
msgid "Was zu tun ist:"
msgstr ""
#: build/http_pages/PassphrasePage.cpp:312
msgid ""
"Schreibe dir die obenstehende Passphrase <b>von Hand</b> auf ein Blatt "
"Papier!"
msgstr ""
#: build/http_pages/PassphrasePage.cpp:315
msgid "Speichere sie auf keinen Fall auf deinem Rechner oder Mobilgerät!!"
msgstr ""
#: build/http_pages/PassphrasePage.cpp:318
msgid "Bewahre sie an einem sicheren Ort auf!"
msgstr ""
#: build/http_pages/PassphrasePage.cpp:322
#: build/http_pages/PassphrasePage.cpp:478
#: build/http_pages/PassphrasePage.cpp:487
#: build/http_pages/PassphrasePage.cpp:511
msgid "Weiter"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:189
#: build/http_pages/PassphrasePage.cpp:355
msgid "Hast du dir deine Passphrase gemerkt?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:190
#: build/http_pages/PassphrasePage.cpp:358
msgid ""
"Dann zeig es mir. Zur Unterstützung gebe ich dir deine Wörter aber in "
"anderer Reihenfolge."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:191
#: build/http_pages/PassphrasePage.cpp:361
msgid "Klicke sie an um sie einzusetzen."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:195
#: build/http_pages/PassphrasePage.cpp:364
msgid "Überprüfe dabei, ob du alle Wörter richtig geschrieben hast!"
msgstr ""
#: build/http_pages/PassphrasePage.cpp:370
msgid ""
"Weil du kein Javascript verwendest geht es direkt weiter. Hast du dir deine "
"Passphrase gemerkt oder aufgeschrieben?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:242
#: build/http_pages/PassphrasePage.cpp:429
msgid "Deine E-Mail Adresse wurde erfolgreich bestätigt."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:246
#: build/http_pages/PassphrasePage.cpp:437
msgid "Neue Gradido Adresse anlegen / wiederherstellen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:247
#: build/http_pages/PassphrasePage.cpp:440
msgid ""
"Möchtest du ein neues Gradido-Konto anlegen oder ein bestehendes "
"wiederherstellen?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:263
#: build/http_pages/PassphrasePage.cpp:460
msgid "Bestehendes Konto wiederherstellen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:270
#: build/http_pages/PassphrasePage.cpp:469
msgid ""
"Falls du ein bestehendes Konto wiederherstellen willst, gib hier deine "
"Passphrase ein:"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:288
#: build/http_pages/PassphrasePage.cpp:497
msgid "Konto wiederherstellen / Neues Passwort anlegen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:289
#: build/http_pages/PassphrasePage.cpp:501
msgid ""
"Um dein Konto wiederherzustellen, dir ein Neues Passwort auswählen zu "
"Um dein Konto wiederherzustellen und dir ein Neues Passwort auswählen zu "
"können, tippe hier bitte die Wörter deiner Passphrase in der richtigen "
"Reihenfolge ein, welche du dir aufgeschrieben hast."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:303
#: build/http_pages/PassphrasePage.cpp:524
msgid "Fehler"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:304
#: build/http_pages/PassphrasePage.cpp:527
msgid ""
"Ungültige Seite, wenn du das siehst stimmt hier etwas nicht. Bitte wende "
"dich an den Server-Admin."
msgstr ""
#: model/Session.cpp:149 model/Session.cpp:180 model/Session.cpp:700
#: model/Session.cpp:706 model/Session.cpp:1005
#: src/cpp/model/Session.cpp:147 src/cpp/model/Session.cpp:177
#: src/cpp/model/Session.cpp:645 src/cpp/model/Session.cpp:651
#: src/cpp/model/Session.cpp:937 src/cpp/model/Session.cpp:953
msgid "Benutzer"
msgstr ""
#: model/Session.cpp:149
#: src/cpp/model/Session.cpp:147
msgid "Eingeloggter Benutzer ist kein Admin"
msgstr ""
#: model/Session.cpp:155 model/Session.cpp:201
#: src/cpp/model/Session.cpp:153 src/cpp/model/Session.cpp:212
msgid "Vorname"
msgstr ""
#: model/Session.cpp:155 model/Session.cpp:159 model/Session.cpp:201
#: model/Session.cpp:205
#: src/cpp/model/Session.cpp:153 src/cpp/model/Session.cpp:157
#: src/cpp/model/Session.cpp:212 src/cpp/model/Session.cpp:216
msgid ""
"Bitte gebe einen Namen an. Mindestens 3 Zeichen, keines folgender Zeichen "
"<>&;"
msgstr ""
#: model/Session.cpp:159 model/Session.cpp:205
#: src/cpp/model/Session.cpp:157 src/cpp/model/Session.cpp:216
msgid "Nachname"
msgstr ""
#: model/Session.cpp:163 model/Session.cpp:209
#: src/cpp/model/Session.cpp:161 src/cpp/model/Session.cpp:220
msgid "Bitte gebe eine g&uuml;ltige E-Mail Adresse an."
msgstr ""
#: model/Session.cpp:170 model/Session.cpp:234
#: src/cpp/model/Session.cpp:168
msgid "F&uuml;r diese E-Mail Adresse gibt es bereits einen Account"
msgstr ""
#: model/Session.cpp:180 model/Session.cpp:186
#: src/cpp/model/Session.cpp:177 src/cpp/model/Session.cpp:184
msgid "Fehler beim speichern!"
msgstr ""
#: model/Session.cpp:379 model/Session.cpp:438 model/Session.cpp:881
#: model/Session.cpp:889
#: src/cpp/model/Session.cpp:231
msgid "F&uuml;r diese E-Mail Adresse gibt es bereits ein Konto"
msgstr ""
#: src/cpp/model/Session.cpp:255
msgid "Server"
msgstr ""
#: src/cpp/model/Session.cpp:255
msgid "Fehler beim speichen des Kontos bitte versuche es später noch einmal"
msgstr ""
#: src/cpp/model/Session.cpp:350 src/cpp/model/Session.cpp:390
#: src/cpp/model/Session.cpp:832 src/cpp/model/Session.cpp:841
msgid "E-Mail Verification"
msgstr "E-Mail Überprüfung"
#: model/Session.cpp:379
#: src/cpp/model/Session.cpp:350
msgid "Du hast dein Konto bereits aktiviert!"
msgstr ""
#: model/Session.cpp:438
#: src/cpp/model/Session.cpp:390
msgid "Falscher Code f&uuml;r aktiven Login"
msgstr ""
#: model/Session.cpp:495
#: src/cpp/model/Session.cpp:465
msgid "Deine Passphrase ist ung&uuml;tig"
msgstr ""
#: model/Session.cpp:507
#: src/cpp/model/Session.cpp:477
msgid "Ein Fehler trat auf, bitte versuche es erneut"
msgstr ""
#: model/Session.cpp:515
#: src/cpp/model/Session.cpp:491
msgid "Das ist nicht die richtige Passphrase."
msgstr ""
#: model/Session.cpp:700
#: src/cpp/model/Session.cpp:645
msgid "Konnte Community Server nicht erreichen. E-Mail an den Admin ist raus."
msgstr ""
#: model/Session.cpp:706
#: src/cpp/model/Session.cpp:651
msgid ""
"Fehler beim L&ouml;schen des Accounts. Bitte logge dich erneut ein und "
"versuche es nochmal."
msgstr ""
#: model/Session.cpp:881
#: src/cpp/model/Session.cpp:832
msgid "Konnte kein passendes Konto finden."
msgstr ""
#: model/Session.cpp:889
#: src/cpp/model/Session.cpp:841
msgid "Fehler beim laden des Benutzers."
msgstr ""
#: model/Session.cpp:1005
#: src/cpp/model/Session.cpp:937
msgid "Kein g&uuml;ltiger Benutzer, bitte logge dich erneut ein."
msgstr ""
#~ msgid "Gradido: E-Mail Verification"
#~ msgstr "Gradido: E-Mail Überprüfung"
#: src/cpp/model/Session.cpp:953
msgid "Fehler beim generieren der Passphrase, der Admin bekommt eine E-Mail. "
msgstr ""
#: src/cpp/model/email/Email.cpp:174
msgid "Default Email Subject"
msgstr ""
#: src/cpp/model/email/Email.cpp:180
msgid "Error from Gradido Login Server"
msgstr "Fehler auf dem Gradido Login Server"
#: src/cpp/model/email/Email.cpp:200
msgid "Gradido: E-Mail Verification"
msgstr "Gradido: E-Mail Überprüfung"
#: src/cpp/model/email/Email.cpp:246
msgid "Gradido: Reset Password"
msgstr "Gradido: Passwort zurücksetzen"
#: src/cpp/SingletonManager/SessionManager.cpp:604
msgid ""
"Please enter a valid password with at least 8 characters, upper and lower "
"case letters, at least one number and one special character (@$!%*?&+-_)!"
msgstr ""
"Bitte gebe ein gültiges Password ein mit mindestens 8 Zeichen, Groß- und "
"Kleinbuchstaben, mindestens einer Zahl und einem Sonderzeichen (@$!%*?&+-_) "
"ein!"
#: src/cpp/SingletonManager/SessionManager.cpp:610
msgid "Your password is to short!"
msgstr "Dein Passwort ist zu kurz!"
#: src/cpp/SingletonManager/SessionManager.cpp:615
msgid "Your password does not contain lowercase letters!"
msgstr "Dein Passwort enthält keine Kleinbuchstaben!"
#: src/cpp/SingletonManager/SessionManager.cpp:620
msgid "Your password does not contain any capital letters!"
msgstr " Dein Passwort enthält keine Großbuchstaben!"
#: src/cpp/SingletonManager/SessionManager.cpp:625
msgid "Your password does not contain any number!"
msgstr "Dein Passwort enthält keine Zahlen!"
#: src/cpp/SingletonManager/SessionManager.cpp:630
msgid "Your password does not contain special characters (@$!%*?&+-)!"
msgstr "Dein Passwort enthält keine Sonderzeichen (@$!%*?&+-)!"
#~ msgid "Account"
#~ msgstr "Konto"
#~ msgid "E-Mail Address not checked, do you already get one?"
#~ msgstr ""
#~ "E-Mail Adresse wurde noch nicht überprüft. Hast du schon in deine E-Mails "
#~ "geschaut? Bitte schau auch in dein Spam-Verzeichnis nach."
#~ msgid ""
#~ "Schreibe dir deine Passphrase auf und packe sie gut weg. Du brauchst sie "
#~ "um deine Adresse wiederherzustellen. Wenn du sie verlierst, sind auch "
#~ "deine Gradidos verloren."
#~ msgstr ""
#~ "Schreibe dir deine Passphrase auf oder drucke sie aus und bewahre sie "
#~ "<b>in Papier-Form</b> an einem sicheren Ort auf (speichere sie nicht auf "
#~ "deinem Rechner oder Mobilgerät)! Du brauchst deine Passphrase um dein "
#~ "Konto wiederherzustellen, wenn du mal dein Passort vergessen haben "
#~ "solltest. "
#~ msgid ""
#~ "Der neue Gradido basiert technisch auf einer Kryptowährung (wie z.B. "
#~ "Bitcoin) um maximale Sicherheit zu erreichen."
#~ msgstr ""
#~ "Der neue Gradido basiert technisch auf einer Kryptowährung (wie z.B. "
#~ "Bitcoin) um für dich die maximale Sicherheit zu gewährleisten."
#~ msgid ""
#~ "Der Code stimmt nicht, bitte &uuml;berpr&uuml;fe ihn nochmal oder "

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-10 13:01+0100\n"
"POT-Creation-Date: 2021-06-21 13:37+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,415 +17,461 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:108
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:156
#: build/http_pages/LoginPage.cpp:196 build/http_pages/LoginPage.cpp:275
msgid "Login"
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:108
#: build/http_pages/LoginPage.cpp:196
msgid "E-Mail or password isn't right, please try again!"
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:116
#: build/http_pages/LoginPage.cpp:205
msgid "Passwort"
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:116
#: build/http_pages/LoginPage.cpp:205
msgid ""
"Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut."
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:119
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:122
#: build/http_pages/LoginPage.cpp:208 build/http_pages/LoginPage.cpp:211
msgid "User"
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:119
#: build/http_pages/LoginPage.cpp:208
msgid "Error in saved data, the server admin will look at it."
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:122
#: build/http_pages/LoginPage.cpp:211
msgid "Benutzer ist deaktiviert, kein Login möglich!"
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:156
#: build/http_pages/LoginPage.cpp:275
msgid "Username and password are needed!"
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:178
#: model/Session.cpp:210 model/Session.cpp:217 model/Session.cpp:259
#: model/Session.cpp:284 model/Session.cpp:383 model/Session.cpp:393
#: build/http_pages/LoginPage.cpp:376 src/cpp/model/Session.cpp:161
#: src/cpp/model/Session.cpp:168 src/cpp/model/Session.cpp:220
#: src/cpp/model/Session.cpp:231
msgid "E-Mail"
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:179
#: build/http_pages/LoginPage.cpp:381
#: src/cpp/SingletonManager/SessionManager.cpp:603
#: src/cpp/SingletonManager/SessionManager.cpp:609
#: src/cpp/SingletonManager/SessionManager.cpp:614
#: src/cpp/SingletonManager/SessionManager.cpp:619
#: src/cpp/SingletonManager/SessionManager.cpp:624
#: src/cpp/SingletonManager/SessionManager.cpp:629
msgid "Password"
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:180
#: build/http_pages/LoginPage.cpp:384
msgid " Login "
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:185
#: build/http_pages/LoginPage.cpp:391
msgid "You haven't any account yet? Please follow the link to create one."
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:187
#: build/http_pages/LoginPage.cpp:395
msgid "Create New Account"
msgstr ""
#: F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\login.cpsp:191
#: build/http_pages/LoginPage.cpp:403
msgid "Passwort vergessen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:72
#: build/http_pages/CheckEmailPage.cpp:155
msgid "E-Mail verifizieren"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:77
#: build/http_pages/CheckEmailPage.cpp:165
msgid ""
"Deine E-Mail wurde erfolgreich bestätigt. Du kannst nun Gradidos versenden."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:78
#: build/http_pages/CheckEmailPage.cpp:170
msgid "Zur Startseite"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:80
#: build/http_pages/CheckEmailPage.cpp:175
msgid "Bitte gib deinen E-Mail Verification Code ein:"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:81
#: model/Session.cpp:233
#: build/http_pages/CheckEmailPage.cpp:178 src/cpp/model/Session.cpp:184
msgid "Email Verification Code"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:82
#: build/http_pages/CheckEmailPage.cpp:185
msgid "&Uuml;berpr&uuml;fe Code"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:85
#: build/http_pages/CheckEmailPage.cpp:190
msgid "Du hast bisher keinen Code erhalten?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:86
#: build/http_pages/CheckEmailPage.cpp:193
msgid "E-Mail erneut zuschicken (in Arbeit)"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:89
#: build/http_pages/CheckEmailPage.cpp:198
msgid "Funktioniert dein E-Mail Verification Code nicht?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:90
#: build/http_pages/CheckEmailPage.cpp:201
msgid "Schicke uns eine E-Mail und wir k&uuml;mmern uns darum: "
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:91
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:151
#: build/http_pages/CheckEmailPage.cpp:208
#: build/http_pages/ResetPasswordPage.cpp:273
msgid "E-Mail an Support schicken"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:113
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:124
#: build/http_pages/ResetPasswordPage.cpp:174
#: build/http_pages/ResetPasswordPage.cpp:217
msgid "Gib bitte hier deine E-Mail Adresse an:"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:116
#: build/http_pages/ResetPasswordPage.cpp:183
msgid "Bestätigen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:126
#: build/http_pages/ResetPasswordPage.cpp:225
msgid "Hast du dir deine Passphrase notiert oder gemerkt?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:131
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:203
#: build/http_pages/ResetPasswordPage.cpp:234
#: build/http_pages/PassphrasePage.cpp:373
msgid "Ja"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:136
#: build/http_pages/ResetPasswordPage.cpp:241
msgid "Nein"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:140
#: build/http_pages/ResetPasswordPage.cpp:247
msgid "Absenden"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:145
#: build/http_pages/ResetPasswordPage.cpp:255
msgid "Dir wird eine E-Mail zugeschickt um dein Passwort zur&uuml;ckzusetzen."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:147
#: build/http_pages/ResetPasswordPage.cpp:260
msgid "Der Admin hat eine E-Mail bekommen und wird sich bei dir melden."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:149
#: build/http_pages/ResetPasswordPage.cpp:265
msgid ""
"Du hast bereits eine E-Mail bekommen. Bitte schau auch in dein Spam-"
"Verzeichnis nach. "
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:150
#: build/http_pages/ResetPasswordPage.cpp:268
msgid ""
"Du hast wirklich keine E-Mail erhalten und auch schon ein paar Minuten "
"gewartet?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:26
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:94
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:114
#: model/Session.cpp:638 model/Session.cpp:650 model/Session.cpp:658
#: build/http_pages/PassphrasePage.cpp:41
#: build/http_pages/PassphrasePage.cpp:111
#: build/http_pages/PassphrasePage.cpp:132 src/cpp/model/Session.cpp:465
#: src/cpp/model/Session.cpp:477 src/cpp/model/Session.cpp:491
msgid "Passphrase"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:27
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:263
#: build/http_pages/PassphrasePage.cpp:42
#: build/http_pages/PassphrasePage.cpp:451
msgid "Neues Konto anlegen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:28
#: build/http_pages/PassphrasePage.cpp:43
msgid "2/3"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:94
#: build/http_pages/PassphrasePage.cpp:111
msgid ""
"Diese Passphrase ist ung&uuml;ltig, bitte &uuml;berpr&uuml;fen oder neu "
"generieren (lassen)."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:114
#: build/http_pages/PassphrasePage.cpp:132
msgid "intern error please try again later"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:129
#: build/http_pages/PassphrasePage.cpp:147
msgid "3/3"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:132
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:135
#: build/http_pages/PassphrasePage.cpp:150
#: build/http_pages/PassphrasePage.cpp:153
msgid "1/3"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:134
#: build/http_pages/PassphrasePage.cpp:152
msgid "Neues Passwort anlegen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:145
#: build/http_pages/PassphrasePage.cpp:270
msgid "Passphrase abschreiben"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:156
#: build/http_pages/PassphrasePage.cpp:287
msgid "Was ist eine Passphrase?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:157
#: build/http_pages/PassphrasePage.cpp:290
msgid "Deine Passphrase besteht aus den im grünen Feld angezeigten Wörtern."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:158
#: build/http_pages/PassphrasePage.cpp:293
msgid "Sie dient deiner Sicherheit."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:159
#: build/http_pages/PassphrasePage.cpp:296
msgid ""
"Du brauchst deine Passphrase um dein Konto wiederherzustellen, wenn du mal "
"dein Passwort vergessen haben solltest."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:161
#: build/http_pages/PassphrasePage.cpp:300
msgid "Deine Passphrase (Groß/Kleinschreibung beachten)"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:166
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:194
#: build/http_pages/PassphrasePage.cpp:309
#: build/http_pages/PassphrasePage.cpp:352
msgid "Was zu tun ist:"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:167
#: build/http_pages/PassphrasePage.cpp:312
msgid ""
"Schreibe dir die obenstehende Passphrase <b>von Hand</b> auf ein Blatt "
"Papier!"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:168
#: build/http_pages/PassphrasePage.cpp:315
msgid "Speichere sie auf keinen Fall auf deinem Rechner oder Mobilgerät!!"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:169
#: build/http_pages/PassphrasePage.cpp:318
msgid "Bewahre sie an einem sicheren Ort auf!"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:171
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:282
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:287
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:300
#: build/http_pages/PassphrasePage.cpp:322
#: build/http_pages/PassphrasePage.cpp:478
#: build/http_pages/PassphrasePage.cpp:487
#: build/http_pages/PassphrasePage.cpp:511
msgid "Weiter"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:195
#: build/http_pages/PassphrasePage.cpp:355
msgid "Hast du dir deine Passphrase gemerkt?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:196
#: build/http_pages/PassphrasePage.cpp:358
msgid ""
"Dann zeig es mir. Zur Unterstützung gebe ich dir deine Wörter aber in "
"anderer Reihenfolge."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:197
#: build/http_pages/PassphrasePage.cpp:361
msgid "Klicke sie an um sie einzusetzen."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:198
#: build/http_pages/PassphrasePage.cpp:364
msgid "Überprüfe dabei, ob du alle Wörter richtig geschrieben hast!"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:202
#: build/http_pages/PassphrasePage.cpp:370
msgid ""
"Weil du kein Javascript verwendest geht es direkt weiter. Hast du dir deine "
"Passphrase gemerkt oder aufgeschrieben?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:249
#: build/http_pages/PassphrasePage.cpp:429
msgid "Deine E-Mail Adresse wurde erfolgreich bestätigt."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:253
#: build/http_pages/PassphrasePage.cpp:437
msgid "Neue Gradido Adresse anlegen / wiederherstellen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:254
#: build/http_pages/PassphrasePage.cpp:440
msgid ""
"Möchtest du ein neues Gradido-Konto anlegen oder ein bestehendes "
"wiederherstellen?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:270
#: build/http_pages/PassphrasePage.cpp:460
msgid "Bestehendes Konto wiederherstellen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:277
#: build/http_pages/PassphrasePage.cpp:469
msgid ""
"Falls du ein bestehendes Konto wiederherstellen willst, gib hier deine "
"Passphrase ein:"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:294
#: build/http_pages/PassphrasePage.cpp:497
msgid "Konto wiederherstellen / Neues Passwort anlegen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:296
#: build/http_pages/PassphrasePage.cpp:501
msgid ""
"Um dein Konto wiederherzustellen und dir ein Neues Passwort auswählen zu "
"können, tippe hier bitte die Wörter deiner Passphrase in der richtigen "
"Reihenfolge ein, welche du dir aufgeschrieben hast."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:310
#: build/http_pages/PassphrasePage.cpp:524
msgid "Fehler"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:311
#: build/http_pages/PassphrasePage.cpp:527
msgid ""
"Ungültige Seite, wenn du das siehst stimmt hier etwas nicht. Bitte wende "
"dich an den Server-Admin."
msgstr ""
#: model/Session.cpp:196 model/Session.cpp:227 model/Session.cpp:935
#: model/Session.cpp:941 model/Session.cpp:1226 model/Session.cpp:1242
#: src/cpp/model/Session.cpp:147 src/cpp/model/Session.cpp:177
#: src/cpp/model/Session.cpp:645 src/cpp/model/Session.cpp:651
#: src/cpp/model/Session.cpp:937 src/cpp/model/Session.cpp:953
msgid "Benutzer"
msgstr ""
#: model/Session.cpp:196
#: src/cpp/model/Session.cpp:147
msgid "Eingeloggter Benutzer ist kein Admin"
msgstr ""
#: model/Session.cpp:202 model/Session.cpp:251 model/Session.cpp:375
#: src/cpp/model/Session.cpp:153 src/cpp/model/Session.cpp:212
msgid "Vorname"
msgstr ""
#: model/Session.cpp:202 model/Session.cpp:206 model/Session.cpp:251
#: model/Session.cpp:255 model/Session.cpp:375 model/Session.cpp:379
#: src/cpp/model/Session.cpp:153 src/cpp/model/Session.cpp:157
#: src/cpp/model/Session.cpp:212 src/cpp/model/Session.cpp:216
msgid ""
"Bitte gebe einen Namen an. Mindestens 3 Zeichen, keines folgender Zeichen "
"<>&;"
msgstr ""
#: model/Session.cpp:206 model/Session.cpp:255 model/Session.cpp:379
#: src/cpp/model/Session.cpp:157 src/cpp/model/Session.cpp:216
msgid "Nachname"
msgstr ""
#: model/Session.cpp:210 model/Session.cpp:259 model/Session.cpp:383
#: src/cpp/model/Session.cpp:161 src/cpp/model/Session.cpp:220
msgid "Bitte gebe eine g&uuml;ltige E-Mail Adresse an."
msgstr ""
#: model/Session.cpp:217 model/Session.cpp:284
#: src/cpp/model/Session.cpp:168
msgid "F&uuml;r diese E-Mail Adresse gibt es bereits einen Account"
msgstr ""
#: model/Session.cpp:227 model/Session.cpp:233
#: src/cpp/model/Session.cpp:177 src/cpp/model/Session.cpp:184
msgid "Fehler beim speichern!"
msgstr ""
#: model/Session.cpp:393
#: src/cpp/model/Session.cpp:231
msgid "F&uuml;r diese E-Mail Adresse gibt es bereits ein Konto"
msgstr ""
#: model/Session.cpp:411
#: src/cpp/model/Session.cpp:255
msgid "Server"
msgstr ""
#: model/Session.cpp:411
#: src/cpp/model/Session.cpp:255
msgid "Fehler beim speichen des Kontos bitte versuche es später noch einmal"
msgstr ""
#: model/Session.cpp:505 model/Session.cpp:567 model/Session.cpp:1116
#: model/Session.cpp:1125
#: src/cpp/model/Session.cpp:350 src/cpp/model/Session.cpp:390
#: src/cpp/model/Session.cpp:832 src/cpp/model/Session.cpp:841
msgid "E-Mail Verification"
msgstr ""
#: model/Session.cpp:505
#: src/cpp/model/Session.cpp:350
msgid "Du hast dein Konto bereits aktiviert!"
msgstr ""
#: model/Session.cpp:567
#: src/cpp/model/Session.cpp:390
msgid "Falscher Code f&uuml;r aktiven Login"
msgstr ""
#: model/Session.cpp:638
#: src/cpp/model/Session.cpp:465
msgid "Deine Passphrase ist ung&uuml;tig"
msgstr ""
#: model/Session.cpp:650
#: src/cpp/model/Session.cpp:477
msgid "Ein Fehler trat auf, bitte versuche es erneut"
msgstr ""
#: model/Session.cpp:658
#: src/cpp/model/Session.cpp:491
msgid "Das ist nicht die richtige Passphrase."
msgstr ""
#: model/Session.cpp:935
#: src/cpp/model/Session.cpp:645
msgid "Konnte Community Server nicht erreichen. E-Mail an den Admin ist raus."
msgstr ""
#: model/Session.cpp:941
#: src/cpp/model/Session.cpp:651
msgid ""
"Fehler beim L&ouml;schen des Accounts. Bitte logge dich erneut ein und "
"versuche es nochmal."
msgstr ""
#: model/Session.cpp:1116
#: src/cpp/model/Session.cpp:832
msgid "Konnte kein passendes Konto finden."
msgstr ""
#: model/Session.cpp:1125
#: src/cpp/model/Session.cpp:841
msgid "Fehler beim laden des Benutzers."
msgstr ""
#: model/Session.cpp:1226
#: src/cpp/model/Session.cpp:937
msgid "Kein g&uuml;ltiger Benutzer, bitte logge dich erneut ein."
msgstr ""
#: model/Session.cpp:1242
#: src/cpp/model/Session.cpp:953
msgid "Fehler beim generieren der Passphrase, der Admin bekommt eine E-Mail. "
msgstr ""
#: src/cpp/model/email/Email.cpp:174
msgid "Default Email Subject"
msgstr ""
#: src/cpp/model/email/Email.cpp:180
msgid "Error from Gradido Login Server"
msgstr ""
#: src/cpp/model/email/Email.cpp:200
msgid "Gradido: E-Mail Verification"
msgstr ""
#: src/cpp/model/email/Email.cpp:246
msgid "Gradido: Reset Password"
msgstr ""
#: src/cpp/SingletonManager/SessionManager.cpp:604
msgid ""
"Please enter a valid password with at least 8 characters, upper and lower "
"case letters, at least one number and one special character (@$!%*?&+-_)!"
msgstr ""
#: src/cpp/SingletonManager/SessionManager.cpp:610
msgid "Your password is to short!"
msgstr ""
#: src/cpp/SingletonManager/SessionManager.cpp:615
msgid "Your password does not contain lowercase letters!"
msgstr ""
#: src/cpp/SingletonManager/SessionManager.cpp:620
msgid "Your password does not contain any capital letters!"
msgstr ""
#: src/cpp/SingletonManager/SessionManager.cpp:625
msgid "Your password does not contain any number!"
msgstr ""
#: src/cpp/SingletonManager/SessionManager.cpp:630
msgid "Your password does not contain special characters (@$!%*?&+-)!"
msgstr ""

View File

@ -26,7 +26,7 @@ services:
#########################################################
login-server:
build:
dockerfile: Dockerfiles/alpine/Dockerfile.debug
dockerfile: Dockerfiles/ubuntu/Dockerfile.debug
security_opt:
- seccomp:unconfined
cap_add:
@ -37,7 +37,7 @@ services:
- ./login_server/dependencies:/code/dependencies
- ./login_server/scripts:/code/scripts
- ./configs/login_server:/etc/grd_login
- login_build_3.1:/code/build
- login_build_ubuntu_3.1:/code/build
#########################################################
@ -99,4 +99,4 @@ services:
volumes:
frontend_node_modules:
login_build_3.1:
login_build_ubuntu_3.1:

View File

@ -93,7 +93,7 @@ const loginAPI = {
update: {
'User.first_name': data.firstName,
'User.last_name': data.lastName,
'User.description': data.description,
// 'User.description': data.description,
},
}
return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload)

View File

@ -0,0 +1,71 @@
import { mount } from '@vue/test-utils'
import InputEmail from './InputEmail'
const localVue = global.localVue
describe('InputEmail', () => {
let wrapper
const propsData = {
name: 'input-field-name',
label: 'input-field-label',
placeholder: 'input-field-placeholder',
value: '',
}
const Wrapper = () => {
return mount(InputEmail, { localVue, propsData })
}
describe('mount', () => {
beforeEach(() => {
wrapper = Wrapper()
})
it('has an input field', () => {
expect(wrapper.find('input').exists()).toBeTruthy()
})
describe('properties', () => {
it('has the name "input-field-name"', () => {
expect(wrapper.find('input').attributes('name')).toEqual('input-field-name')
})
it('has the id "input-field-name-input-field"', () => {
expect(wrapper.find('input').attributes('id')).toEqual('input-field-name-input-field')
})
it('has the placeholder "input-field-placeholder"', () => {
expect(wrapper.find('input').attributes('placeholder')).toEqual('input-field-placeholder')
})
it('has the value ""', () => {
expect(wrapper.vm.currentValue).toEqual('')
})
it('has the label "input-field-label"', () => {
expect(wrapper.find('label').text()).toEqual('input-field-label')
})
it('has the label for "input-field-name-input-field"', () => {
expect(wrapper.find('label').attributes('for')).toEqual('input-field-name-input-field')
})
})
describe('input value changes', () => {
it('emits input with new value', async () => {
await wrapper.find('input').setValue('12')
expect(wrapper.emitted('input')).toBeTruthy()
expect(wrapper.emitted('input')).toEqual([['12']])
})
})
describe('value property changes', () => {
it('updates data model', async () => {
await wrapper.setProps({ value: 'user@example.org' })
expect(wrapper.vm.currentValue).toEqual('user@example.org')
})
})
})
})

View File

@ -0,0 +1,73 @@
<template>
<validation-provider
tag="div"
:rules="rules"
:name="name"
v-slot="{ errors, valid, validated, ariaInput, ariaMsg }"
>
<b-form-group :label="label" :label-for="labelFor">
<b-input-group>
<b-form-input
v-model="currentValue"
v-bind="ariaInput"
:id="labelFor"
:name="name"
:placeholder="placeholder"
type="email"
:state="validated ? valid : false"
trim
class="email-form-input"
></b-form-input>
<b-form-invalid-feedback v-bind="ariaMsg">
{{ errors[0] }}
</b-form-invalid-feedback>
</b-input-group>
</b-form-group>
</validation-provider>
</template>
<script>
export default {
name: 'InputEmail',
props: {
rules: {
default: () => {
return {
required: true,
email: true,
}
},
},
name: { type: String, default: 'Email' },
label: { type: String, default: 'Email' },
placeholder: { type: String, default: 'Email' },
value: { required: true, type: String },
},
data() {
return {
currentValue: '',
}
},
computed: {
labelFor() {
return this.name + '-input-field'
},
},
watch: {
currentValue() {
this.$emit('input', this.currentValue)
},
value() {
if (this.value !== this.currentValue) this.currentValue = this.value
},
},
}
</script>
<style>
.email-form-input {
border-right-style: solid !important;
border-right-width: 1px !important;
padding-right: 12px !important;
border-top-right-radius: 6px !important;
border-bottom-right-radius: 6px !important;
}
</style>

View File

@ -0,0 +1,98 @@
import { mount } from '@vue/test-utils'
import InputPassword from './InputPassword'
const localVue = global.localVue
describe('InputPassword', () => {
let wrapper
const propsData = {
name: 'input-field-name',
label: 'input-field-label',
placeholder: 'input-field-placeholder',
value: '',
}
const Wrapper = () => {
return mount(InputPassword, { localVue, propsData })
}
describe('mount', () => {
beforeEach(() => {
wrapper = Wrapper()
})
it('has an input field', () => {
expect(wrapper.find('input').exists()).toBeTruthy()
})
describe('properties', () => {
it('has the name "input-field-name"', () => {
expect(wrapper.find('input').attributes('name')).toEqual('input-field-name')
})
it('has the id "input-field-name-input-field"', () => {
expect(wrapper.find('input').attributes('id')).toEqual('input-field-name-input-field')
})
it('has the placeholder "input-field-placeholder"', () => {
expect(wrapper.find('input').attributes('placeholder')).toEqual('input-field-placeholder')
})
it('has the value ""', () => {
expect(wrapper.vm.currentValue).toEqual('')
})
it('has the label "input-field-label"', () => {
expect(wrapper.find('label').text()).toEqual('input-field-label')
})
it('has the label for "input-field-name-input-field"', () => {
expect(wrapper.find('label').attributes('for')).toEqual('input-field-name-input-field')
})
})
describe('input value changes', () => {
it('emits input with new value', async () => {
await wrapper.find('input').setValue('12')
expect(wrapper.emitted('input')).toBeTruthy()
expect(wrapper.emitted('input')).toEqual([['12']])
})
})
describe('password visibilty', () => {
it('has type password by default', () => {
expect(wrapper.find('input').attributes('type')).toEqual('password')
})
it('changes to type text when icon is clicked', async () => {
await wrapper.find('button').trigger('click')
expect(wrapper.find('input').attributes('type')).toEqual('text')
})
it('changes back to type password when icon is clicked twice', async () => {
await wrapper.find('button').trigger('click')
await wrapper.find('button').trigger('click')
expect(wrapper.find('input').attributes('type')).toEqual('password')
})
})
describe('password visibilty icon', () => {
it('is by default bi-eye-slash', () => {
expect(wrapper.find('svg').classes('bi-eye-slash')).toBe(true)
})
it('changes to bi-eye when clicked', async () => {
await wrapper.find('button').trigger('click')
expect(wrapper.find('svg').classes('bi-eye')).toBe(true)
})
it('changes back to bi-eye-slash when clicked twice', async () => {
await wrapper.find('button').trigger('click')
await wrapper.find('button').trigger('click')
expect(wrapper.find('svg').classes('bi-eye-slash')).toBe(true)
})
})
})
})

View File

@ -0,0 +1,81 @@
<template>
<validation-provider
tag="div"
:rules="rules"
:name="name"
:bails="!showAllErrors"
:immediate="immediate"
v-slot="{ errors, valid, validated, ariaInput, ariaMsg }"
>
<b-form-group :label="label" :label-for="labelFor">
<b-input-group>
<b-form-input
v-model="currentValue"
v-bind="ariaInput"
:id="labelFor"
:name="name"
:placeholder="placeholder"
:type="showPassword ? 'text' : 'password'"
:state="validated ? valid : false"
></b-form-input>
<b-input-group-append>
<b-button variant="outline-primary" @click="toggleShowPassword">
<b-icon :icon="showPassword ? 'eye' : 'eye-slash'" />
</b-button>
</b-input-group-append>
<b-form-invalid-feedback v-bind="ariaMsg">
<div v-if="showAllErrors">
<span v-for="error in errors" :key="error">
{{ error }}
<br />
</span>
</div>
<div v-else>
{{ errors[0] }}
</div>
</b-form-invalid-feedback>
</b-input-group>
</b-form-group>
</validation-provider>
</template>
<script>
export default {
name: 'InputPassword',
props: {
rules: {
default: () => {
return {
required: true,
}
},
},
name: { type: String, default: 'password' },
label: { type: String, default: 'Password' },
placeholder: { type: String, default: 'Password' },
value: { required: true, type: String },
showAllErrors: { type: Boolean, default: false },
immediate: { type: Boolean, default: false },
},
data() {
return {
currentValue: '',
showPassword: false,
}
},
computed: {
labelFor() {
return this.name + '-input-field'
},
},
methods: {
toggleShowPassword() {
this.showPassword = !this.showPassword
},
},
watch: {
currentValue() {
this.$emit('input', this.currentValue)
},
},
}
</script>

View File

@ -0,0 +1,64 @@
import { mount } from '@vue/test-utils'
import InputPasswordConfirmation from './InputPasswordConfirmation'
const localVue = global.localVue
// validation is tested in src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js
describe('InputPasswordConfirmation', () => {
let wrapper
const propsData = {
value: {
password: '',
passwordRepeat: '',
},
}
const mocks = {
$t: jest.fn((t) => t),
}
const Wrapper = () => {
return mount(InputPasswordConfirmation, { localVue, propsData, mocks })
}
describe('mount', () => {
beforeEach(() => {
wrapper = Wrapper()
})
it('has two input fields', () => {
expect(wrapper.findAll('input')).toHaveLength(2)
})
describe('input values ', () => {
it('emits input with new value for first input field', async () => {
await wrapper.findAll('input').at(0).setValue('1234')
expect(wrapper.emitted('input')).toBeTruthy()
expect(wrapper.emitted('input')).toEqual([
[
{
password: '1234',
passwordRepeat: '',
},
],
])
})
it('emits input with new value for second input field', async () => {
await wrapper.findAll('input').at(1).setValue('1234')
expect(wrapper.emitted('input')).toBeTruthy()
expect(wrapper.emitted('input')).toEqual([
[
{
password: '',
passwordRepeat: '1234',
},
],
])
})
})
})
})

View File

@ -0,0 +1,68 @@
<template>
<div>
<b-row class="mb-2">
<b-col>
<input-password
:rules="{
required: true,
containsLowercaseCharacter: true,
containsUppercaseCharacter: true,
containsNumericCharacter: true,
atLeastEightCharactera: true,
}"
:label="$t('form.password_new')"
:showAllErrors="true"
:immediate="true"
:name="$t('form.password_new')"
:placeholder="$t('form.password_new')"
v-model="password"
></input-password>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<input-password
:rules="{ samePassword: value.password }"
:label="$t('form.password_new_repeat')"
:placeholder="$t('form.password_new_repeat')"
v-model="passwordRepeat"
></input-password>
</b-col>
</b-row>
</div>
</template>
<script>
import InputPassword from './InputPassword'
export default {
name: 'InputPasswordConfirm',
components: {
InputPassword,
},
props: {
value: {
type: Object,
required: true,
},
},
data() {
return {
password: '',
passwordRepeat: '',
}
},
computed: {
passwordObject() {
return { password: this.password, passwordRepeat: this.passwordRepeat }
},
},
watch: {
password() {
this.$emit('input', this.passwordObject)
},
passwordRepeat() {
this.$emit('input', this.passwordObject)
},
},
}
</script>

View File

@ -6,7 +6,7 @@
<b-icon icon="chevron-left" variant="primary"></b-icon>
</b-button>
</b-col>
<b-col cols="2">
<b-col cols="3">
<p class="text-center pt-2">{{ currentPage }} / {{ totalPages }}</p>
</b-col>
<b-col>

View File

@ -84,6 +84,7 @@
},
"error": {
"error":"Fehler",
"no-account": "Leider konnten wir keinen Account finden mit diesen Daten!",
"change-password": "Fehler beim Ändern des Passworts"
},
"transaction":{
@ -158,6 +159,7 @@
},
"reset-password": {
"title": "Passwort zurücksetzen",
"text": "Jetzt kannst du ein neues Passwort speichern, mit dem du dich zukünftig in der Gradido-App anmelden kannst."
"text": "Jetzt kannst du ein neues Passwort speichern, mit dem du dich zukünftig in der Gradido-App anmelden kannst.",
"not-authenticated": "Leider konnten wir dich nicht authentifizieren. Bitte wende dich an den Support."
}
}

View File

@ -84,6 +84,7 @@
},
"error": {
"error":"Error",
"no-account": "Unfortunately we could not find an account to the given data!",
"change-password": "Error while changing password"
},
"transaction":{
@ -159,6 +160,7 @@
},
"reset-password": {
"title": "Reset Password",
"text": "Now you can save a new password to login to the Gradido-App in the future."
"text": "Now you can save a new password to login to the Gradido-App in the future.",
"not-authenticated": "Unfortunately we could not authenticate you. Please contact the support."
}
}

View File

@ -2,22 +2,18 @@ import Vue from 'vue'
import DashboardPlugin from './plugins/dashboard-plugin'
import App from './App.vue'
import i18n from './i18n.js'
import { configure, extend } from 'vee-validate'
// eslint-disable-next-line camelcase
import { required, email, min, max, is_not } from 'vee-validate/dist/rules'
import { loadAllRules } from './validation-rules'
// store
import { store } from './store/store'
import loginAPI from './apis/loginAPI'
// router setup
import router from './routes/router'
// plugin setup
Vue.use(DashboardPlugin)
Vue.config.productionTip = false
loadAllRules(i18n)
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth && !store.state.sessionId) {
next({ path: '/login' })
@ -26,68 +22,6 @@ router.beforeEach((to, from, next) => {
}
})
configure({
defaultMessage: (field, values) => {
values._field_ = i18n.t(`fields.${field}`)
return i18n.t(`validations.messages.${values._rule_}`, values)
},
})
extend('email', {
...email,
message: (_, values) => i18n.t('validations.messages.email', values),
})
extend('required', {
...required,
message: (_, values) => i18n.t('validations.messages.required', values),
})
extend('min', {
...min,
message: (_, values) => i18n.t('validations.messages.min', values),
})
extend('max', {
...max,
message: (_, values) => i18n.t('validations.messages.max', values),
})
extend('gddSendAmount', {
validate(value, { min, max }) {
value = value.replace(',', '.')
return value.match(/^[0-9]+(\.[0-9]{0,2})?$/) && Number(value) >= min && Number(value) <= max
},
params: ['min', 'max'],
message: (_, values) => {
values.min = i18n.n(values.min, 'ungroupedDecimal')
values.max = i18n.n(values.max, 'ungroupedDecimal')
return i18n.t('form.validation.gddSendAmount', values)
},
})
extend('gddUsernameUnique', {
async validate(value) {
const result = await loginAPI.checkUsername(value)
return result.result.data.state === 'success'
},
message: (_, values) => i18n.t('form.validation.usernmae-unique', values),
})
extend('gddUsernameRgex', {
validate(value) {
return !!value.match(/^[a-zA-Z][-_a-zA-Z0-9]{2,}$/)
},
message: (_, values) => i18n.t('form.validation.usernmae-regex', values),
})
// eslint-disable-next-line camelcase
extend('is_not', {
// eslint-disable-next-line camelcase
...is_not,
message: (_, values) => i18n.t('form.validation.is-not', values),
})
/* eslint-disable no-new */
new Vue({
el: '#app',

View File

@ -1,5 +1,4 @@
import '@/polyfills'
import { configure, extend } from 'vee-validate'
import GlobalComponents from './globalComponents'
import GlobalDirectives from './globalDirectives'
import SideBar from '@/components/SidebarPlugin'
@ -14,8 +13,6 @@ import { BootstrapVue, IconsPlugin } from 'bootstrap-vue'
// asset imports
import '@/assets/scss/argon.scss'
import '@/assets/vendor/nucleo/css/nucleo.css'
import * as rules from 'vee-validate/dist/rules'
import { messages } from 'vee-validate/dist/locale/en.json'
import VueQrcodeReader from 'vue-qrcode-reader'
import VueQrcode from 'vue-qrcode'
@ -28,13 +25,6 @@ import VueMoment from 'vue-moment'
import Loading from 'vue-loading-overlay'
import 'vue-loading-overlay/dist/vue-loading.css'
Object.keys(rules).forEach((rule) => {
extend(rule, {
...rules[rule], // copies rule configuration
message: messages[rule], // assign message
})
})
export default {
install(Vue) {
Vue.use(GlobalComponents)
@ -49,12 +39,5 @@ export default {
Vue.use(VueQrcode)
Vue.use(FlatPickr)
Vue.use(Loading)
configure({
classes: {
valid: 'is-valid',
invalid: 'is-invalid',
dirty: ['is-dirty', 'is-dirty'], // multiple classes per flag!
},
})
},
}

View File

@ -1,6 +1,6 @@
import { mutations, actions } from './store'
const { language, email, sessionId } = mutations
const { language, email, sessionId, username, firstName, lastName, description } = mutations
const { login, logout } = actions
describe('Vuex store', () => {
@ -28,51 +28,102 @@ describe('Vuex store', () => {
expect(state.sessionId).toEqual('1234')
})
})
describe('username', () => {
it('sets the state of username', () => {
const state = { username: null }
username(state, 'user')
expect(state.username).toEqual('user')
})
})
describe('firstName', () => {
it('sets the state of firstName', () => {
const state = { firstName: null }
firstName(state, 'Peter')
expect(state.firstName).toEqual('Peter')
})
})
describe('lastName', () => {
it('sets the state of lastName', () => {
const state = { lastName: null }
lastName(state, 'Lustig')
expect(state.lastName).toEqual('Lustig')
})
})
describe('description', () => {
it('sets the state of description', () => {
const state = { description: null }
description(state, 'Nickelbrille')
expect(state.description).toEqual('Nickelbrille')
})
})
})
describe('actions', () => {
describe('login', () => {
const commit = jest.fn()
const state = {}
const commitedData = {
sessionId: 1234,
user: {
email: 'someone@there.is',
language: 'en',
username: 'user',
first_name: 'Peter',
last_name: 'Lustig',
description: 'Nickelbrille',
},
}
it('calls three commits', () => {
login(
{ commit, state },
{ sessionId: 1234, user: { email: 'someone@there.is', language: 'en' } },
)
it('calls seven commits', () => {
login({ commit, state }, commitedData)
expect(commit).toHaveBeenCalledTimes(7)
})
it('commits sessionId', () => {
login(
{ commit, state },
{ sessionId: 1234, user: { email: 'someone@there.is', language: 'en' } },
)
login({ commit, state }, commitedData)
expect(commit).toHaveBeenNthCalledWith(1, 'sessionId', 1234)
})
it('commits email', () => {
login(
{ commit, state },
{ sessionId: 1234, user: { email: 'someone@there.is', language: 'en' } },
)
login({ commit, state }, commitedData)
expect(commit).toHaveBeenNthCalledWith(2, 'email', 'someone@there.is')
})
it('commits language', () => {
login(
{ commit, state },
{ sessionId: 1234, user: { email: 'someone@there.is', language: 'en' } },
)
login({ commit, state }, commitedData)
expect(commit).toHaveBeenNthCalledWith(3, 'language', 'en')
})
it('commits username', () => {
login({ commit, state }, commitedData)
expect(commit).toHaveBeenNthCalledWith(4, 'username', 'user')
})
it('commits firstName', () => {
login({ commit, state }, commitedData)
expect(commit).toHaveBeenNthCalledWith(5, 'firstName', 'Peter')
})
it('commits lastName', () => {
login({ commit, state }, commitedData)
expect(commit).toHaveBeenNthCalledWith(6, 'lastName', 'Lustig')
})
it('commits description', () => {
login({ commit, state }, commitedData)
expect(commit).toHaveBeenNthCalledWith(7, 'description', 'Nickelbrille')
})
})
describe('logout', () => {
const commit = jest.fn()
const state = {}
it('calls two commits', () => {
it('calls six commits', () => {
logout({ commit, state })
expect(commit).toHaveBeenCalledTimes(6)
})
@ -87,11 +138,36 @@ describe('Vuex store', () => {
expect(commit).toHaveBeenNthCalledWith(2, 'email', null)
})
// how can I get this working?
it.skip('calls sessionStorage.clear()', () => {
it('commits username', () => {
logout({ commit, state })
const spy = jest.spyOn(sessionStorage, 'clear')
expect(spy).toHaveBeenCalledTimes(1)
expect(commit).toHaveBeenNthCalledWith(3, 'username', '')
})
it('commits firstName', () => {
logout({ commit, state })
expect(commit).toHaveBeenNthCalledWith(4, 'firstName', '')
})
it('commits lastName', () => {
logout({ commit, state })
expect(commit).toHaveBeenNthCalledWith(5, 'lastName', '')
})
it('commits description', () => {
logout({ commit, state })
expect(commit).toHaveBeenNthCalledWith(6, 'description', '')
})
// how to get this working?
it.skip('calls sessionStorage.clear()', () => {
const clearStorageMock = jest.fn()
global.sessionStorage = jest.fn(() => {
return {
clear: clearStorageMock,
}
})
logout({ commit, state })
expect(clearStorageMock).toBeCalled()
})
})
})

View File

@ -0,0 +1,110 @@
import { configure, extend } from 'vee-validate'
// eslint-disable-next-line camelcase
import { required, email, min, max, is_not } from 'vee-validate/dist/rules'
import loginAPI from './apis/loginAPI'
export const loadAllRules = (i18nCallback) => {
configure({
defaultMessage: (field, values) => {
values._field_ = i18nCallback.t(`fields.${field}`)
return i18nCallback.t(`validations.messages.${values._rule_}`, values)
},
classes: {
valid: 'is-valid',
invalid: 'is-invalid',
dirty: ['is-dirty', 'is-dirty'], // multiple classes per flag!
},
})
extend('email', {
...email,
message: (_, values) => i18nCallback.t('validations.messages.email', values),
})
extend('required', {
...required,
message: (_, values) => i18nCallback.t('validations.messages.required', values),
})
extend('min', {
...min,
message: (_, values) => i18nCallback.t('validations.messages.min', values),
})
extend('max', {
...max,
message: (_, values) => i18nCallback.t('validations.messages.max', values),
})
extend('gddSendAmount', {
validate(value, { min, max }) {
value = value.replace(',', '.')
return value.match(/^[0-9]+(\.[0-9]{0,2})?$/) && Number(value) >= min && Number(value) <= max
},
params: ['min', 'max'],
message: (_, values) => {
values.min = i18nCallback.n(values.min, 'ungroupedDecimal')
values.max = i18nCallback.n(values.max, 'ungroupedDecimal')
return i18nCallback.t('form.validation.gddSendAmount', values)
},
})
extend('gddUsernameUnique', {
async validate(value) {
const result = await loginAPI.checkUsername(value)
return result.result.data.state === 'success'
},
message: (_, values) => i18nCallback.t('form.validation.usernmae-unique', values),
})
extend('gddUsernameRgex', {
validate(value) {
return !!value.match(/^[a-zA-Z][-_a-zA-Z0-9]{2,}$/)
},
message: (_, values) => i18nCallback.t('form.validation.usernmae-regex', values),
})
// eslint-disable-next-line camelcase
extend('is_not', {
// eslint-disable-next-line camelcase
...is_not,
message: (_, values) => i18nCallback.t('form.validation.is-not', values),
})
// Password validation
extend('containsLowercaseCharacter', {
validate(value) {
return !!value.match(/[a-z]+/)
},
message: (_, values) => i18nCallback.t('site.signup.lowercase', values),
})
extend('containsUppercaseCharacter', {
validate(value) {
return !!value.match(/[A-Z]+/)
},
message: (_, values) => i18nCallback.t('site.signup.uppercase', values),
})
extend('containsNumericCharacter', {
validate(value) {
return !!value.match(/[0-9]+/)
},
message: (_, values) => i18nCallback.t('site.signup.one_number', values),
})
extend('atLeastEightCharactera', {
validate(value) {
return !!value.match(/.{8,}/)
},
message: (_, values) => i18nCallback.t('site.signup.minimum', values),
})
extend('samePassword', {
validate(value, [pwd]) {
return value === pwd
},
message: (_, values) => i18nCallback.t('site.signup.dont_match', values),
})
}

View File

@ -1,34 +1,127 @@
import { shallowMount } from '@vue/test-utils'
import { mount } from '@vue/test-utils'
import AccountOverview from './AccountOverview'
import communityAPI from '../../apis/communityAPI.js'
jest.mock('../../apis/communityAPI.js')
const sendMock = jest.fn()
sendMock.mockReturnValue({ success: true })
communityAPI.send = sendMock
const localVue = global.localVue
describe('AccountOverview', () => {
let wrapper
const propsData = {
balance: 123.45,
transactionCount: 1,
}
const mocks = {
$t: jest.fn((t) => t),
$store: {
state: {
sessionId: 1,
},
},
$n: jest.fn((n) => String(n)),
}
const Wrapper = () => {
return shallowMount(AccountOverview, { localVue, mocks })
return mount(AccountOverview, { localVue, mocks, propsData })
}
describe('shallow Mount', () => {
describe('mount', () => {
beforeEach(() => {
wrapper = Wrapper()
})
it('has a status line', () => {
expect(wrapper.find('gdd-status-stub').exists()).toBeTruthy()
expect(wrapper.find('div.gdd-status').exists()).toBeTruthy()
})
it('has a send field', () => {
expect(wrapper.find('gdd-send-stub').exists()).toBeTruthy()
expect(wrapper.find('div.gdd-send').exists()).toBeTruthy()
})
it('has a transactions table', () => {
expect(wrapper.find('gdd-transaction-list-stub').exists()).toBeTruthy()
expect(wrapper.find('div.gdd-transaction-list').exists()).toBeTruthy()
})
describe('transaction form', () => {
it('steps forward in the dialog', async () => {
await wrapper.findComponent({ name: 'TransactionForm' }).vm.$emit('set-transaction', {
email: 'user@example.org',
amount: 23.45,
memo: 'Make the best of it!',
})
expect(wrapper.findComponent({ name: 'TransactionConfirmation' }).exists()).toBeTruthy()
})
})
describe('confirm transaction', () => {
beforeEach(() => {
wrapper.setData({
currentTransactionStep: 1,
transactionData: {
email: 'user@example.org',
amount: 23.45,
memo: 'Make the best of it!',
},
})
})
it('resets the transaction process when on-reset is emitted', async () => {
await wrapper.findComponent({ name: 'TransactionConfirmation' }).vm.$emit('on-reset')
expect(wrapper.findComponent({ name: 'TransactionForm' }).exists()).toBeTruthy()
expect(wrapper.vm.transactionData).toEqual({
email: '',
amount: 0,
memo: '',
})
})
describe('transaction is confirmed and server response is success', () => {
beforeEach(async () => {
jest.clearAllMocks()
await wrapper
.findComponent({ name: 'TransactionConfirmation' })
.vm.$emit('send-transaction')
})
it('calls the API when send-transaction is emitted', async () => {
expect(sendMock).toBeCalledWith(1, {
email: 'user@example.org',
amount: 23.45,
memo: 'Make the best of it!',
})
})
it('emits update-balance', () => {
expect(wrapper.emitted('update-balance')).toBeTruthy()
expect(wrapper.emitted('update-balance')).toEqual([[23.45]])
})
it('shows the succes page', () => {
expect(wrapper.find('div.card-body').text()).toContain('form.send_transaction_success')
})
})
describe('transaction is confirmed and server response is error', () => {
beforeEach(async () => {
jest.clearAllMocks()
sendMock.mockReturnValue({ success: false })
await wrapper
.findComponent({ name: 'TransactionConfirmation' })
.vm.$emit('send-transaction')
})
it('shows the error page', () => {
expect(wrapper.find('div.card-body').text()).toContain('form.send_transaction_error')
})
})
})
})
})

View File

@ -69,7 +69,7 @@ export default {
data() {
return {
timestamp: Date.now(),
transactionData: EMPTY_TRANSACTION_DATA,
transactionData: { ...EMPTY_TRANSACTION_DATA },
error: false,
currentTransactionStep: 0,
loading: false,
@ -94,7 +94,7 @@ export default {
},
methods: {
setTransaction(data) {
this.transactionData = data
this.transactionData = { ...data }
this.currentTransactionStep = 1
},
async sendTransaction() {
@ -110,7 +110,7 @@ export default {
this.loading = false
},
onReset() {
this.transactionData = EMPTY_TRANSACTION_DATA
this.transactionData = { ...EMPTY_TRANSACTION_DATA }
this.currentTransactionStep = 0
},
updateTransactions(pagination) {

View File

@ -1,5 +1,6 @@
import { mount } from '@vue/test-utils'
import TransactionForm from './TransactionForm'
import flushPromises from 'flush-promises'
const localVue = global.localVue
@ -19,8 +20,12 @@ describe('GddSend', () => {
},
}
const propsData = {
balance: 100.0,
}
const Wrapper = () => {
return mount(TransactionForm, { localVue, mocks })
return mount(TransactionForm, { localVue, mocks, propsData })
}
describe('mount', () => {
@ -53,6 +58,18 @@ describe('GddSend', () => {
'E-Mail',
)
})
it('flushes an error message when no valid email is given', async () => {
await wrapper.find('#input-group-1').find('input').setValue('a')
await flushPromises()
expect(wrapper.find('span.errors').text()).toBe('validations.messages.email')
})
it('trims the email after blur', async () => {
await wrapper.find('#input-group-1').find('input').setValue(' valid@email.com ')
await flushPromises()
expect(wrapper.vm.form.email).toBe('valid@email.com')
})
})
describe('ammount field', () => {
@ -73,6 +90,24 @@ describe('GddSend', () => {
'0.01',
)
})
it('flushes an error message when no valid amount is given', async () => {
await wrapper.find('#input-group-2').find('input').setValue('a')
await flushPromises()
expect(wrapper.find('span.errors').text()).toBe('form.validation.gddSendAmount')
})
it('flushes an error message when amount is too high', async () => {
await wrapper.find('#input-group-2').find('input').setValue('123.34')
await flushPromises()
expect(wrapper.find('span.errors').text()).toBe('form.validation.gddSendAmount')
})
it('flushes no errors when amount is valid', async () => {
await wrapper.find('#input-group-2').find('input').setValue('87.34')
await flushPromises()
expect(wrapper.find('span.errors').exists()).toBeFalsy()
})
})
describe('message text box', () => {
@ -89,6 +124,18 @@ describe('GddSend', () => {
it('has a label form.memo', () => {
expect(wrapper.find('label.input-3').text()).toBe('form.memo')
})
it('flushes an error message when memo is less than 5 characters', async () => {
await wrapper.find('#input-group-3').find('textarea').setValue('a')
await flushPromises()
expect(wrapper.find('span.errors').text()).toBe('validations.messages.min')
})
it('flushes no error message when memo is valid', async () => {
await wrapper.find('#input-group-3').find('textarea').setValue('Long enough')
await flushPromises()
expect(wrapper.find('span.errors').exists()).toBeFalsy()
})
})
describe('cancel button', () => {
@ -100,11 +147,42 @@ describe('GddSend', () => {
expect(wrapper.find('button[type="reset"]').text()).toBe('form.reset')
})
it.skip('clears the email field on click', async () => {
wrapper.find('#input-group-1').find('input').setValue('someone@watches.tv')
wrapper.find('button[type="reset"]').trigger('click')
await wrapper.vm.$nextTick()
expect(wrapper.vm.form.email).toBeNull()
it('clears all fields on click', async () => {
await wrapper.find('#input-group-1').find('input').setValue('someone@watches.tv')
await wrapper.find('#input-group-2').find('input').setValue('87.23')
await wrapper.find('#input-group-3').find('textarea').setValue('Long enugh')
await flushPromises()
expect(wrapper.vm.form.email).toBe('someone@watches.tv')
expect(wrapper.vm.form.amount).toBe('87.23')
expect(wrapper.vm.form.memo).toBe('Long enugh')
await wrapper.find('button[type="reset"]').trigger('click')
await flushPromises()
expect(wrapper.vm.form.email).toBe('')
expect(wrapper.vm.form.amount).toBe('')
expect(wrapper.vm.form.memo).toBe('')
})
})
describe('submit', () => {
beforeEach(async () => {
await wrapper.find('#input-group-1').find('input').setValue('someone@watches.tv')
await wrapper.find('#input-group-2').find('input').setValue('87.23')
await wrapper.find('#input-group-3').find('textarea').setValue('Long enugh')
await wrapper.find('form').trigger('submit')
await flushPromises()
})
it('emits set-transaction', async () => {
expect(wrapper.emitted('set-transaction')).toBeTruthy()
expect(wrapper.emitted('set-transaction')).toEqual([
[
{
email: 'someone@watches.tv',
amount: 87.23,
memo: 'Long enugh',
},
],
])
})
})
})

View File

@ -168,7 +168,7 @@ export default {
},
methods: {
onSubmit() {
this.normalizeAmount()
this.normalizeAmount(true)
this.$emit('set-transaction', {
email: this.form.email,
amount: this.form.amountValue,
@ -181,10 +181,11 @@ export default {
this.form.amount = ''
this.form.memo = ''
},
setTransaction(data) {
this.form.email = data.email
this.form.amount = data.amount
},
/*
setTransaction(data) {
this.form.email = data.email
this.form.amount = data.amount
}, */
normalizeAmount(isValid) {
this.amountFocused = false
if (!isValid) return

View File

@ -1,5 +1,5 @@
<template>
<div>
<div class="gdd-status">
<b-row>
<b-col class="p-0">
<b-card class="p-0" style="background-color: #ebebeba3 !important">

View File

@ -168,10 +168,12 @@ export default {
showNext() {
this.currentPage++
this.updateTransactions()
window.scrollTo(0, 0)
},
showPrevious() {
this.currentPage--
this.updateTransactions()
window.scrollTo(0, 0)
},
},
}

View File

@ -83,9 +83,7 @@ describe('ForgotPassword', () => {
})
it('displays an error', () => {
expect(form.find('#reset-pwd--live-feedback').text()).toEqual(
'The Email field must be a valid email',
)
expect(form.find('div.invalid-feedback').text()).toEqual('validations.messages.email')
})
it('does not call the API', () => {
@ -96,8 +94,7 @@ describe('ForgotPassword', () => {
describe('valid Email', () => {
beforeEach(async () => {
await form.find('input').setValue('user@example.org')
form.trigger('submit')
await wrapper.vm.$nextTick()
await form.trigger('submit')
await flushPromises()
})

View File

@ -19,27 +19,7 @@
<b-card-body class="p-4">
<validation-observer ref="observer" v-slot="{ handleSubmit }">
<b-form role="form" @submit.prevent="handleSubmit(onSubmit)">
<validation-provider
name="Email"
:rules="{ required: true, email: true }"
v-slot="validationContext"
>
<b-form-group class="mb-3" label="Email" label-for="input-reset-pwd">
<b-form-input
id="input-reset-pwd"
name="input-reset-pwd"
v-model="form.email"
placeholder="Email"
:state="getValidationState(validationContext)"
aria-describedby="reset-pwd--live-feedback"
></b-form-input>
<b-form-invalid-feedback id="reset-pwd--live-feedback">
{{ validationContext.errors[0] }}
</b-form-invalid-feedback>
</b-form-group>
</validation-provider>
<input-email v-model="form.email"></input-email>
<div class="text-center">
<b-button type="submit" variant="primary">
{{ $t('site.password.reset_now') }}
@ -59,9 +39,13 @@
</template>
<script>
import loginAPI from '../../apis/loginAPI.js'
import InputEmail from '../../components/Inputs/InputEmail'
export default {
name: 'password',
components: {
InputEmail,
},
data() {
return {
disable: 'disabled',
@ -71,9 +55,6 @@ export default {
}
},
methods: {
getValidationState({ dirty, validated, valid = null }) {
return dirty || validated ? valid : null
},
async onSubmit() {
await loginAPI.sendEmail(this.form.email)
// always give success to avoid email spying

View File

@ -1,10 +1,37 @@
import { mount, RouterLinkStub } from '@vue/test-utils'
import flushPromises from 'flush-promises'
import loginAPI from '../../apis/loginAPI'
import Login from './Login'
jest.mock('../../apis/loginAPI')
const localVue = global.localVue
const mockLoginCall = jest.fn()
mockLoginCall.mockReturnValue({
success: true,
result: {
data: {
session_id: 1,
user: {
name: 'Peter Lustig',
},
},
},
})
loginAPI.login = mockLoginCall
const toastErrorMock = jest.fn()
const mockStoreDispach = jest.fn()
const mockRouterPush = jest.fn()
const spinnerHideMock = jest.fn()
const spinnerMock = jest.fn(() => {
return {
hide: spinnerHideMock,
}
})
describe('Login', () => {
let wrapper
@ -13,6 +40,18 @@ describe('Login', () => {
locale: 'en',
},
$t: jest.fn((t) => t),
$store: {
dispatch: mockStoreDispach,
},
$loading: {
show: spinnerMock,
},
$router: {
push: mockRouterPush,
},
$toast: {
error: toastErrorMock,
},
}
const stubs = {
@ -76,16 +115,76 @@ describe('Login', () => {
it('has a Submit button', () => {
expect(wrapper.find('button[type="submit"]').exists()).toBeTruthy()
})
it('shows a warning when no valid Email is entered', async () => {
wrapper.find('input[placeholder="Email"]').setValue('no_valid@Email')
await flushPromises()
await expect(wrapper.find('.invalid-feedback').text()).toEqual(
'The Email field must be a valid email',
)
})
})
// to do: test submit button
describe('submit', () => {
describe('no data', () => {
it('displays a message that Email is required', async () => {
await wrapper.find('form').trigger('submit')
await flushPromises()
expect(wrapper.findAll('div.invalid-feedback').at(0).text()).toBe(
'validations.messages.required',
)
})
it('displays a message that password is required', async () => {
await wrapper.find('form').trigger('submit')
await flushPromises()
expect(wrapper.findAll('div.invalid-feedback').at(1).text()).toBe(
'validations.messages.required',
)
})
})
describe('valid data', () => {
beforeEach(async () => {
jest.clearAllMocks()
await wrapper.find('input[placeholder="Email"]').setValue('user@example.org')
await wrapper.find('input[placeholder="form.password"]').setValue('1234')
await flushPromises()
await wrapper.find('form').trigger('submit')
await flushPromises()
})
it('calls the API with the given data', () => {
expect(mockLoginCall).toBeCalledWith('user@example.org', '1234')
})
it('creates a spinner', () => {
expect(spinnerMock).toBeCalled()
})
describe('login success', () => {
it('dispatches server response to store', () => {
expect(mockStoreDispach).toBeCalledWith('login', {
sessionId: 1,
user: { name: 'Peter Lustig' },
})
})
it('redirects to overview page', () => {
expect(mockRouterPush).toBeCalledWith('/overview')
})
it('hides the spinner', () => {
expect(spinnerHideMock).toBeCalled()
})
})
describe('login fails', () => {
beforeEach(() => {
mockLoginCall.mockReturnValue({ success: false })
})
it('hides the spinner', () => {
expect(spinnerHideMock).toBeCalled()
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('error.no-account')
})
})
})
})
})
})

View File

@ -13,7 +13,6 @@
</div>
</b-container>
</div>
<!-- Page content -->
<b-container class="mt--8">
<b-row class="justify-content-center">
<b-col lg="5" md="7">
@ -22,76 +21,16 @@
<div class="text-center text-muted mb-4">
<small>{{ $t('login') }}</small>
</div>
<validation-observer ref="observer" v-slot="{ handleSubmit }">
<b-form @submit.stop.prevent="handleSubmit(onSubmit)">
<validation-provider
name="Email"
:rules="{ required: true, email: true }"
v-slot="validationContext"
>
<b-form-group class="mb-3" label="Email" label-for="login-email">
<b-form-input
id="login-email"
name="example-input-1"
v-model="form.email"
placeholder="Email"
:state="getValidationState(validationContext)"
aria-describedby="login-email-live-feedback"
></b-form-input>
<b-form-invalid-feedback id="login-email-live-feedback">
{{ validationContext.errors[0] }}
</b-form-invalid-feedback>
</b-form-group>
</validation-provider>
<validation-provider
<input-email v-model="form.email"></input-email>
<input-password
:label="$t('form.password')"
:placeholder="$t('form.password')"
:name="$t('form.password')"
:rules="{ required: true }"
v-slot="validationContext"
>
<b-form-group
class="mb-5"
id="example-input-group-1"
:label="$t('form.password')"
label-for="example-input-1"
>
<b-input-group>
<b-form-input
id="input-pwd"
name="input-pwd"
v-model="form.password"
:placeholder="$t('form.password')"
:type="passwordVisible ? 'text' : 'password'"
:state="getValidationState(validationContext)"
aria-describedby="input-2-live-feedback"
></b-form-input>
<b-input-group-append>
<b-button variant="outline-primary" @click="togglePasswordVisibility">
<b-icon :icon="passwordVisible ? 'eye' : 'eye-slash'" />
</b-button>
</b-input-group-append>
</b-input-group>
<b-form-invalid-feedback id="input-2-live-feedback">
{{ validationContext.errors[0] }}
</b-form-invalid-feedback>
</b-form-group>
</validation-provider>
<b-alert v-show="loginfail" show dismissible variant="warning">
<span class="alert-text bv-example-row">
<b-row>
<b-col class="col-9 text-left text-dark">
<strong>
Leider konnten wir keinen Account finden mit diesen Daten!
</strong>
</b-col>
</b-row>
</span>
</b-alert>
<div class="text-center">
v-model="form.password"
></input-password>
<div class="text-center mt-4">
<b-button type="submit" variant="primary">{{ $t('login') }}</b-button>
</div>
</b-form>
@ -118,32 +57,27 @@
<script>
import loginAPI from '../../apis/loginAPI'
import CONFIG from '../../config'
import InputPassword from '../../components/Inputs/InputPassword'
import InputEmail from '../../components/Inputs/InputEmail'
export default {
name: 'login',
components: {
InputPassword,
InputEmail,
},
data() {
return {
form: {
email: '',
password: '',
// rememberMe: false
},
loginfail: false,
allowRegister: CONFIG.ALLOW_REGISTER,
passwordVisible: false,
}
},
methods: {
getValidationState({ dirty, validated, valid = null }) {
return dirty || validated ? valid : null
},
togglePasswordVisibility() {
this.passwordVisible = !this.passwordVisible
},
async onSubmit() {
// error info ausschalten
this.loginfail = false
const loader = this.$loading.show({
container: this.$refs.submitButton,
})
@ -157,7 +91,7 @@ export default {
loader.hide()
} else {
loader.hide()
this.loginfail = true
this.$toast.error(this.$t('error.no-account'))
}
},
},

View File

@ -84,7 +84,7 @@ describe('Register', () => {
wrapper.find('#registerEmail').setValue('no_valid@Email')
await flushPromises()
await expect(wrapper.find('#registerEmailLiveFeedback').text()).toEqual(
'The Email field must be a valid email',
'validations.messages.email',
)
})

View File

@ -3,6 +3,8 @@ import loginAPI from '../../apis/loginAPI'
import ResetPassword from './ResetPassword'
import flushPromises from 'flush-promises'
// validation is tested in src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js
jest.mock('../../apis/loginAPI')
const localVue = global.localVue
@ -28,6 +30,7 @@ emailVerificationMock
.mockReturnValueOnce({ success: false, result: { message: 'error' } })
.mockReturnValueOnce({ success: false, result: { message: 'error' } })
.mockReturnValueOnce({ success: false, result: { message: 'error' } })
.mockReturnValueOnce({ success: false, result: { message: 'error' } })
.mockReturnValue(successResponseObject)
changePasswordMock
@ -81,36 +84,39 @@ describe('ResetPassword', () => {
})
it('does not render the Reset Password form when not authenticated', () => {
expect(wrapper.find('div.resetpwd-form').exists()).toBeFalsy()
expect(wrapper.find('form').exists()).toBeFalsy()
})
it('toasts an error when no valid optin is given', () => {
expect(toasterMock).toHaveBeenCalledWith('error')
})
it('has a message suggesting to contact the support', () => {
expect(wrapper.find('div.header').text()).toContain('reset-password.title')
expect(wrapper.find('div.header').text()).toContain('reset-password.not-authenticated')
})
it('renders the Reset Password form when authenticated', async () => {
wrapper.setData({ authenticated: true })
await wrapper.vm.$nextTick()
await wrapper.setData({ authenticated: true })
expect(wrapper.find('div.resetpwd-form').exists()).toBeTruthy()
})
describe('Register header', () => {
it('has a welcome message', () => {
expect(wrapper.find('div.header').text()).toBe('reset-password.title reset-password.text')
expect(wrapper.find('div.header').text()).toContain('reset-password.title')
expect(wrapper.find('div.header').text()).toContain('reset-password.text')
})
})
/* there is no back button, why?
describe('links', () => {
it('has a link "Back"', () => {
expect(wrapper.findAllComponents(RouterLinkStub).at(0).text()).toEqual('back')
})
it('links to /login when clicking "Back"', () => {
expect(wrapper.findAllComponents(RouterLinkStub).at(0).props().to).toBe('/login')
expect(wrapper.findAllComponents(RouterLinkStub).at(0).props().to).toBe('/Login')
})
})
*/
describe('reset password form', () => {
it('has a register form', () => {
@ -121,10 +127,6 @@ describe('ResetPassword', () => {
expect(wrapper.findAll('input[type="password"]').length).toBe(2)
})
it('has no submit button when not completely filled', () => {
expect(wrapper.find('button[type="submit"]').exists()).toBe(false)
})
it('toggles the first input field to text when eye icon is clicked', async () => {
wrapper.findAll('button').at(0).trigger('click')
await wrapper.vm.$nextTick()
@ -140,23 +142,20 @@ describe('ResetPassword', () => {
describe('submit form', () => {
beforeEach(async () => {
wrapper.findAll('input').at(0).setValue('Aa123456')
wrapper.findAll('input').at(1).setValue('Aa123456')
await wrapper.vm.$nextTick()
await wrapper.findAll('input').at(0).setValue('Aa123456')
await wrapper.findAll('input').at(1).setValue('Aa123456')
await flushPromises()
wrapper.find('form').trigger('submit')
await wrapper.find('form').trigger('submit')
})
describe('server response with error', () => {
it('toasts an error message', async () => {
it('toasts an error message', () => {
expect(toasterMock).toHaveBeenCalledWith('error')
})
})
describe('server response with success', () => {
it('calls the API', async () => {
await wrapper.vm.$nextTick()
await flushPromises()
it('calls the API', () => {
expect(changePasswordMock).toHaveBeenCalledWith(1, 'user@example.org', 'Aa123456')
})

View File

@ -1,102 +1,34 @@
<template>
<div class="resetpwd-form" v-if="authenticated">
<!-- Header -->
<div class="header p-4">
<b-container class="container">
<div class="resetpwd-form">
<b-container>
<div class="header p-4" ref="header">
<div class="header-body text-center mb-7">
<b-row class="justify-content-center">
<b-col xl="5" lg="6" md="8" class="px-2">
<h1>{{ $t('reset-password.title') }}</h1>
<div class="pb-4">{{ $t('reset-password.text') }}</div>
<div class="pb-4" v-if="!pending">
<span v-if="authenticated">
{{ $t('reset-password.text') }}
</span>
<span v-else>
{{ $t('reset-password.not-authenticated') }}
</span>
</div>
</b-col>
</b-row>
</div>
</b-container>
</div>
<!-- Page content -->
</div>
</b-container>
<b-container class="mt--8 p-1">
<!-- Table -->
<b-row class="justify-content-center">
<b-row class="justify-content-center" v-if="authenticated">
<b-col lg="6" md="8">
<b-card no-body class="border-0" style="background-color: #ebebeba3 !important">
<b-card-body class="p-4">
<validation-observer ref="observer" v-slot="{ handleSubmit }">
<b-form role="form" @submit.prevent="handleSubmit(onSubmit)">
<validation-provider
:name="$t('form.password')"
:rules="{ required: true }"
v-slot="validationContext"
>
<b-form-group
class="mb-5"
:label="$t('form.password')"
label-for="resetPassword"
>
<b-input-group>
<b-form-input
id="resetPassword"
:name="$t('form.password')"
v-model="form.password"
:placeholder="$t('form.password')"
:type="passwordVisible ? 'text' : 'password'"
:state="getValidationState(validationContext)"
aria-describedby="resetPasswordLiveFeedback"
></b-form-input>
<b-input-group-append>
<b-button variant="outline-primary" @click="togglePasswordVisibility">
<b-icon :icon="passwordVisible ? 'eye' : 'eye-slash'" />
</b-button>
</b-input-group-append>
</b-input-group>
<b-form-invalid-feedback id="resetPasswordLiveFeedback">
{{ validationContext.errors[0] }}
</b-form-invalid-feedback>
</b-form-group>
</validation-provider>
<b-form-group
class="mb-5"
:label="$t('form.passwordRepeat')"
label-for="resetPasswordRepeat"
>
<b-input-group>
<b-form-input
id="resetPasswordRepeat"
:name="$t('form.passwordRepeat')"
v-model.lazy="form.passwordRepeat"
:placeholder="$t('form.passwordRepeat')"
:type="passwordVisibleRepeat ? 'text' : 'password'"
></b-form-input>
<b-input-group-append>
<b-button variant="outline-primary" @click="togglePasswordRepeatVisibility">
<b-icon :icon="passwordVisibleRepeat ? 'eye' : 'eye-slash'" />
</b-button>
</b-input-group-append>
</b-input-group>
</b-form-group>
<transition name="hint" appear>
<div v-if="passwordValidation.errors.length > 0 && !submitted" class="hints">
<ul>
<li v-for="error in passwordValidation.errors" :key="error">
<small>{{ error }}</small>
</li>
</ul>
</div>
<div class="matches" v-else-if="!samePasswords">
<p>
{{ $t('site.signup.dont_match') }}
<i class="ni ni-active-40" color="danger"></i>
</p>
</div>
</transition>
<div
class="text-center"
v-if="passwordsFilled && samePasswords && passwordValidation.valid"
>
<b-button type="submit" variant="secondary" class="mt-4">
<input-password-confirmation v-model="form" />
<div class="text-center">
<b-button type="submit" variant="primary" class="mt-4">
{{ $t('reset') }}
</b-button>
</div>
@ -106,38 +38,36 @@
</b-card>
</b-col>
</b-row>
<b-row>
<b-col class="text-center py-lg-4">
<router-link to="/Login" class="mt-3">{{ $t('back') }}</router-link>
</b-col>
</b-row>
</b-container>
</div>
</template>
<script>
import loginAPI from '../../apis/loginAPI'
import InputPasswordConfirmation from '../../components/Inputs/InputPasswordConfirmation'
export default {
name: 'reset',
name: 'ResetPassword',
components: {
InputPasswordConfirmation,
},
data() {
return {
form: {
password: '',
passwordRepeat: '',
},
password: '',
passwordVisible: false,
passwordVisibleRepeat: false,
submitted: false,
authenticated: false,
sessionId: null,
email: null,
pending: true,
}
},
methods: {
getValidationState({ dirty, validated, valid = null }) {
return dirty || validated ? valid : null
},
togglePasswordVisibility() {
this.passwordVisible = !this.passwordVisible
},
togglePasswordRepeatVisibility() {
this.passwordVisibleRepeat = !this.passwordVisibleRepeat
},
async onSubmit() {
const result = await loginAPI.changePassword(this.sessionId, this.email, this.form.password)
if (result.success) {
@ -155,7 +85,7 @@ export default {
},
async authenticate() {
const loader = this.$loading.show({
container: this.$refs.submitButton,
container: this.$refs.header,
})
const optin = this.$route.params.optin
const result = await loginAPI.loginViaEmailVerificationCode(optin)
@ -167,37 +97,10 @@ export default {
this.$toast.error(result.result.message)
}
loader.hide()
this.pending = false
},
},
computed: {
samePasswords() {
return this.form.password === this.form.passwordRepeat
},
passwordsFilled() {
return this.form.password !== '' && this.form.passwordRepeat !== ''
},
rules() {
return [
{ message: this.$t('site.signup.lowercase'), regex: /[a-z]+/ },
{ message: this.$t('site.signup.uppercase'), regex: /[A-Z]+/ },
{ message: this.$t('site.signup.minimum'), regex: /.{8,}/ },
{ message: this.$t('site.signup.one_number'), regex: /[0-9]+/ },
]
},
passwordValidation() {
const errors = []
for (const condition of this.rules) {
if (!condition.regex.test(this.form.password)) {
errors.push(condition.message)
}
}
if (errors.length === 0) {
return { valid: true, errors }
}
return { valid: false, errors }
},
},
async created() {
mounted() {
this.authenticate()
},
}

View File

@ -0,0 +1,169 @@
import { mount } from '@vue/test-utils'
import UserCardFormUserData from './UserCard_FormUserData'
import loginAPI from '../../../apis/loginAPI'
import flushPromises from 'flush-promises'
jest.mock('../../../apis/loginAPI')
const localVue = global.localVue
const mockAPIcall = jest.fn((args) => {
return { success: true }
})
const toastErrorMock = jest.fn()
const toastSuccessMock = jest.fn()
const storeCommitMock = jest.fn()
loginAPI.updateUserInfos = mockAPIcall
describe('UserCard_FormUsername', () => {
let wrapper
const mocks = {
$t: jest.fn((t) => t),
$store: {
state: {
sessionId: 1,
email: 'user@example.org',
firstName: 'Peter',
lastName: 'Lustig',
description: '',
},
commit: storeCommitMock,
},
$toast: {
success: toastSuccessMock,
error: toastErrorMock,
},
}
const Wrapper = () => {
return mount(UserCardFormUserData, { localVue, mocks })
}
describe('mount', () => {
beforeEach(() => {
wrapper = Wrapper()
})
it('renders the component', () => {
expect(wrapper.find('div#userdata_form').exists()).toBeTruthy()
})
it('has an edit icon', () => {
expect(wrapper.find('svg.bi-pencil').exists()).toBeTruthy()
})
it('renders the first name', () => {
expect(wrapper.findAll('div.col').at(2).text()).toBe('Peter')
})
it('renders the last name', () => {
expect(wrapper.findAll('div.col').at(4).text()).toBe('Lustig')
})
it('renders the description', () => {
expect(wrapper.findAll('div.col').at(6).text()).toBe('')
})
describe('edit user data', () => {
beforeEach(async () => {
await wrapper.find('svg.bi-pencil').trigger('click')
})
it('shows an cancel icon', () => {
expect(wrapper.find('svg.bi-x-circle').exists()).toBeTruthy()
})
it('closes the input when cancel icon is clicked', async () => {
await wrapper.find('svg.bi-x-circle').trigger('click')
expect(wrapper.find('input').exists()).toBeFalsy()
})
it('does not change the userdate when cancel is clicked', async () => {
await wrapper.findAll('input').at(0).setValue('Petra')
await wrapper.findAll('input').at(1).setValue('Lustiger')
await wrapper.find('textarea').setValue('Keine Nickelbrille')
await wrapper.find('svg.bi-x-circle').trigger('click')
expect(wrapper.findAll('div.col').at(2).text()).toBe('Peter')
expect(wrapper.findAll('div.col').at(4).text()).toBe('Lustig')
expect(wrapper.findAll('div.col').at(6).text()).toBe('')
})
it('has a submit button', () => {
expect(wrapper.find('button[type="submit"]').exists()).toBeTruthy()
})
it('does not enable submit button when data is not changed', async () => {
await wrapper.find('form').trigger('keyup')
expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe('disabled')
})
describe('successfull submit', () => {
beforeEach(async () => {
jest.clearAllMocks()
await wrapper.findAll('input').at(0).setValue('Petra')
await wrapper.findAll('input').at(1).setValue('Lustiger')
await wrapper.find('textarea').setValue('Keine Nickelbrille')
await wrapper.find('form').trigger('keyup')
await wrapper.find('button[type="submit"]').trigger('click')
await flushPromises()
})
it('calls the loginAPI', () => {
expect(mockAPIcall).toBeCalledWith(1, 'user@example.org', {
firstName: 'Petra',
lastName: 'Lustiger',
description: 'Keine Nickelbrille',
})
})
it('commits firstname to store', () => {
expect(storeCommitMock).toBeCalledWith('firstName', 'Petra')
})
it('commits lastname to store', () => {
expect(storeCommitMock).toBeCalledWith('lastName', 'Lustiger')
})
it('commits description to store', () => {
expect(storeCommitMock).toBeCalledWith('description', 'Keine Nickelbrille')
})
it('toasts a success message', () => {
expect(toastSuccessMock).toBeCalledWith('site.profil.user-data.change-success')
})
it('has an edit button again', () => {
expect(wrapper.find('svg.bi-pencil').exists()).toBeTruthy()
})
})
describe('submit results in server error', () => {
beforeEach(async () => {
jest.clearAllMocks()
mockAPIcall.mockReturnValue({ success: false, result: { message: 'Error' } })
await wrapper.findAll('input').at(0).setValue('Petra')
await wrapper.findAll('input').at(1).setValue('Lustiger')
await wrapper.find('textarea').setValue('Keine Nickelbrille')
await wrapper.find('form').trigger('keyup')
await wrapper.find('button[type="submit"]').trigger('click')
await flushPromises()
})
it('calls the loginAPI', () => {
expect(mockAPIcall).toBeCalledWith(1, 'user@example.org', {
firstName: 'Petra',
lastName: 'Lustiger',
description: 'Keine Nickelbrille',
})
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('Error')
})
})
})
})
})

View File

@ -1,13 +1,15 @@
import { mount } from '@vue/test-utils'
import UserCardFormPasswort from './UserCard_FormUserPasswort'
import loginAPI from '../../../apis/loginAPI'
// import flushPromises from 'flush-promises'
import flushPromises from 'flush-promises'
jest.mock('../../../apis/loginAPI')
const localVue = global.localVue
const changePasswordProfileMock = jest.fn()
changePasswordProfileMock.mockReturnValue({ success: true })
loginAPI.changePasswordProfile = changePasswordProfileMock
const toastSuccessMock = jest.fn()
@ -59,8 +61,8 @@ describe('UserCardFormUserPasswort', () => {
let form
beforeEach(async () => {
wrapper.find('a').trigger('click')
await wrapper.vm.$nextTick()
await wrapper.find('a').trigger('click')
await flushPromises()
form = wrapper.find('form')
})
@ -69,12 +71,11 @@ describe('UserCardFormUserPasswort', () => {
})
it('has a cancel button', () => {
expect(form.find('svg.bi-x-circle').exists()).toBeTruthy()
expect(wrapper.find('svg.bi-x-circle').exists()).toBeTruthy()
})
it('closes the form when cancel button is clicked', async () => {
form.find('svg.bi-x-circle').trigger('click')
await wrapper.vm.$nextTick()
await wrapper.find('svg.bi-x-circle').trigger('click')
expect(wrapper.find('input').exists()).toBeFalsy()
})
@ -104,24 +105,103 @@ describe('UserCardFormUserPasswort', () => {
expect(form.find('button[type="submit"]').exists()).toBeTruthy()
})
/*
describe('submit', () => {
beforeEach(async () => {
await form.findAll('input').at(0).setValue('1234')
await form.findAll('input').at(1).setValue('Aa123456')
await form.findAll('input').at(2).setValue('Aa123456')
form.trigger('submit')
await wrapper.vm.$nextTick()
await flushPromises()
describe('validation', () => {
it('displays all password requirements', () => {
const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span')
expect(feedbackArray).toHaveLength(5)
expect(feedbackArray.at(0).text()).toBe('validations.messages.required')
expect(feedbackArray.at(1).text()).toBe('site.signup.lowercase')
expect(feedbackArray.at(2).text()).toBe('site.signup.uppercase')
expect(feedbackArray.at(3).text()).toBe('site.signup.one_number')
expect(feedbackArray.at(4).text()).toBe('site.signup.minimum')
})
it('calls the API', async () => {
await wrapper.vm.$nextTick()
it('removes first message when a character is given', async () => {
await wrapper.findAll('input').at(1).setValue('@')
await flushPromises()
expect(changePasswordProfileMock).toHaveBeenCalledWith(1, 'user@example.org', '1234', 'Aa123456')
const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span')
expect(feedbackArray).toHaveLength(4)
expect(feedbackArray.at(0).text()).toBe('site.signup.lowercase')
})
it('removes first and second message when a lowercase character is given', async () => {
await wrapper.findAll('input').at(1).setValue('a')
await flushPromises()
const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span')
expect(feedbackArray).toHaveLength(3)
expect(feedbackArray.at(0).text()).toBe('site.signup.uppercase')
})
it('removes the first three messages when a lowercase and uppercase characters are given', async () => {
await wrapper.findAll('input').at(1).setValue('Aa')
await flushPromises()
const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span')
expect(feedbackArray).toHaveLength(2)
expect(feedbackArray.at(0).text()).toBe('site.signup.one_number')
})
it('removes the first four messages when a lowercase, uppercase and numeric characters are given', async () => {
await wrapper.findAll('input').at(1).setValue('Aa1')
await flushPromises()
const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span')
expect(feedbackArray).toHaveLength(1)
expect(feedbackArray.at(0).text()).toBe('site.signup.minimum')
})
it('removes all messages when all rules are fulfilled', async () => {
await wrapper.findAll('input').at(1).setValue('Aa123456')
await flushPromises()
const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span')
expect(feedbackArray).toHaveLength(0)
})
})
describe('submit', () => {
describe('valid data', () => {
beforeEach(async () => {
await form.findAll('input').at(0).setValue('1234')
await form.findAll('input').at(1).setValue('Aa123456')
await form.findAll('input').at(2).setValue('Aa123456')
await form.trigger('submit')
await flushPromises()
})
it('calls the API', () => {
expect(changePasswordProfileMock).toHaveBeenCalledWith(
1,
'user@example.org',
'1234',
'Aa123456',
)
})
it('toasts a success message', () => {
expect(toastSuccessMock).toBeCalledWith('site.thx.reset')
})
it('cancels the edit process', () => {
expect(wrapper.find('input').exists()).toBeFalsy()
})
})
describe('server response is error', () => {
beforeEach(async () => {
changePasswordProfileMock.mockReturnValue({
success: false,
result: { message: 'error' },
})
await form.findAll('input').at(0).setValue('1234')
await form.findAll('input').at(1).setValue('Aa123456')
await form.findAll('input').at(2).setValue('Aa123456')
await form.trigger('submit')
await flushPromises()
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('error')
})
})
})
*/
})
})
})

View File

@ -1,183 +1,86 @@
<template>
<b-card id="change_pwd" class="bg-transparent" style="background-color: #ebebeba3 !important">
<b-container>
<b-form @keyup.prevent="loadSubmitButton">
<div v-if="!editPassword">
<b-row class="mb-4 text-right">
<b-col class="text-right">
<a href="#change_pwd" v-if="!editPassword" @click="editPassword = !editPassword">
<a href="#change_pwd" @click="editPassword = !editPassword">
<span>{{ $t('form.change-password') }}</span>
<b-icon class="pointer ml-3" icon="pencil" />
</a>
<b-icon
v-else
@click="cancelEdit()"
class="pointer"
icon="x-circle"
variant="danger"
></b-icon>
</b-col>
</b-row>
<div v-if="editPassword">
<b-row class="mb-5">
<b-col class="col-12 col-lg-3 col-md-10 col-sm-10 text-md-left text-lg-right">
<small>{{ $t('form.password_old') }}</small>
</b-col>
<b-col class="col-md-9 col-sm-10">
<b-input-group>
<b-form-input
class="mb-0"
v-model="password"
name="Password"
:type="passwordVisibleOldPwd ? 'text' : 'password'"
prepend-icon="ni ni-lock-circle-open"
</div>
<div v-if="editPassword">
<b-row class="mb-4 text-right">
<b-col class="text-right">
<b-icon @click="cancelEdit()" class="pointer" icon="x-circle" variant="danger"></b-icon>
</b-col>
</b-row>
<validation-observer ref="observer" v-slot="{ handleSubmit }">
<b-form @submit.stop.prevent="handleSubmit(onSubmit)">
<b-row class="mb-2">
<b-col>
<input-password
:label="$t('form.password_old')"
:placeholder="$t('form.password_old')"
></b-form-input>
<b-input-group-append>
<b-button variant="outline-primary" @click="togglePasswordVisibilityOldPwd">
<b-icon :icon="passwordVisibleOldPwd ? 'eye' : 'eye-slash'" />
v-model="form.password"
></input-password>
</b-col>
</b-row>
<input-password-confirmation v-model="form.newPassword" />
<b-row class="text-right">
<b-col>
<div class="text-right">
<b-button type="submit" variant="primary" class="mt-4">
{{ $t('form.save') }}
</b-button>
</b-input-group-append>
</b-input-group>
</b-col>
</b-row>
<b-row class="mb-3">
<b-col class="col-12 col-lg-3 col-md-10 col-sm-10 text-md-left text-lg-right">
<small>{{ $t('form.password_new') }}</small>
</b-col>
<b-col class="col-md-9 col-sm-10">
<b-input-group>
<b-form-input
class="mb-0"
v-model="passwordNew"
name="Password"
:type="passwordVisibleNewPwd ? 'text' : 'password'"
prepend-icon="ni ni-lock-circle-open"
:placeholder="$t('form.password_new')"
></b-form-input>
<b-input-group-append>
<b-button variant="outline-primary" @click="togglePasswordVisibilityNewPwd">
<b-icon :icon="passwordVisibleNewPwd ? 'eye' : 'eye-slash'" />
</b-button>
</b-input-group-append>
</b-input-group>
</b-col>
</b-row>
<b-row class="mb-3">
<b-col class="col-12 col-lg-3 col-md-10 col-sm-10 text-md-left text-lg-right">
<small>{{ $t('form.password_new_repeat') }}</small>
</b-col>
<b-col class="col-md-9 col-sm-10">
<b-input-group>
<b-form-input
class="mb-0"
v-model="passwordNewRepeat"
name="Password"
:type="passwordVisibleNewPwdRepeat ? 'text' : 'password'"
prepend-icon="ni ni-lock-circle-open"
:placeholder="$t('form.password_new_repeat')"
></b-form-input>
<b-input-group-append>
<b-button variant="outline-primary" @click="togglePasswordVisibilityNewPwdRepeat">
<b-icon :icon="passwordVisibleNewPwdRepeat ? 'eye' : 'eye-slash'" />
</b-button>
</b-input-group-append>
</b-input-group>
</b-col>
</b-row>
<b-row>
<b-col></b-col>
<b-col class="col-12">
<transition name="hint" appear>
<div v-if="passwordValidation.errors.length > 0" class="hints">
<ul>
<li v-for="error in passwordValidation.errors" :key="error">
<small>{{ error }}</small>
</li>
</ul>
</div>
</transition>
</b-col>
</b-row>
<b-row class="text-right" v-if="editPassword">
<b-col>
<div class="text-right" ref="submitButton">
<b-button
:variant="loading ? 'default' : 'success'"
@click="onSubmit"
type="submit"
class="mt-4"
:disabled="loading"
>
{{ $t('form.save') }}
</b-button>
</div>
</b-col>
</b-row>
</div>
</b-form>
</b-col>
</b-row>
</b-form>
</validation-observer>
</div>
</b-container>
</b-card>
</template>
<script>
import loginAPI from '../../../apis/loginAPI'
import InputPassword from '../../../components/Inputs/InputPassword'
import InputPasswordConfirmation from '../../../components/Inputs/InputPasswordConfirmation'
export default {
name: 'FormUserPasswort',
components: {
InputPassword,
InputPasswordConfirmation,
},
data() {
return {
editPassword: false,
email: null,
password: '',
passwordNew: '',
passwordNewRepeat: '',
passwordVisibleOldPwd: false,
passwordVisibleNewPwd: false,
passwordVisibleNewPwdRepeat: false,
loading: true,
form: {
password: '',
newPassword: {
password: '',
passwordRepeat: '',
},
},
}
},
methods: {
cancelEdit() {
this.editPassword = false
this.password = ''
this.passwordNew = ''
this.passwordNewRepeat = ''
this.form.password = ''
this.form.passwordNew = ''
this.form.passwordNewRepeat = ''
},
togglePasswordVisibilityNewPwd() {
this.passwordVisibleNewPwd = !this.passwordVisibleNewPwd
},
togglePasswordVisibilityNewPwdRepeat() {
this.passwordVisibleNewPwdRepeat = !this.passwordVisibleNewPwdRepeat
},
togglePasswordVisibilityOldPwd() {
this.passwordVisibleOldPwd = !this.passwordVisibleOldPwd
},
loadSubmitButton() {
if (
this.password !== '' &&
this.passwordNew !== '' &&
this.passwordNewRepeat !== '' &&
this.passwordNew === this.passwordNewRepeat
) {
this.loading = false
} else {
this.loading = true
}
},
async onSubmit(event) {
event.preventDefault()
async onSubmit() {
const result = await loginAPI.changePasswordProfile(
this.$store.state.sessionId,
this.$store.state.email,
this.password,
this.passwordNew,
this.form.password,
this.form.newPassword.password,
)
if (result.success) {
this.$toast.success(this.$t('site.thx.reset'))
@ -187,31 +90,5 @@ export default {
}
},
},
computed: {
samePasswords() {
return this.password === this.passwordNew
},
rules() {
return [
{ message: this.$t('site.signup.lowercase'), regex: /[a-z]+/ },
{ message: this.$t('site.signup.uppercase'), regex: /[A-Z]+/ },
{ message: this.$t('site.signup.minimum'), regex: /.{8,}/ },
{ message: this.$t('site.signup.one_number'), regex: /[0-9]+/ },
]
},
passwordValidation() {
const errors = []
for (const condition of this.rules) {
if (!condition.regex.test(this.passwordNew)) {
errors.push(condition.message)
}
}
if (errors.length === 0) {
return { valid: true, errors }
}
return { valid: false, errors }
},
},
}
</script>
<style></style>

View File

@ -1,29 +1,28 @@
import { mount } from '@vue/test-utils'
import { extend } from 'vee-validate'
import UserCardFormUsername from './UserCard_FormUsername'
import loginAPI from '../../../apis/loginAPI'
import flushPromises from 'flush-promises'
import { extend } from 'vee-validate'
jest.mock('../../../apis/loginAPI')
extend('gddUsernameRgex', {
validate(value) {
return true
},
})
extend('gddUsernameUnique', {
validate(value) {
return true
},
})
const localVue = global.localVue
const mockAPIcall = jest.fn((args) => {
return { success: true }
})
// override this rule to avoid API call
extend('gddUsernameUnique', {
validate(value) {
return true
},
})
const toastErrorMock = jest.fn()
const toastSuccessMock = jest.fn()
const storeCommitMock = jest.fn()
loginAPI.changeUsernameProfile = mockAPIcall
describe('UserCard_FormUsername', () => {
@ -37,10 +36,11 @@ describe('UserCard_FormUsername', () => {
email: 'user@example.org',
username: '',
},
commit: jest.fn(),
commit: storeCommitMock,
},
$toast: {
success: jest.fn(),
success: toastSuccessMock,
error: toastErrorMock,
},
}
@ -111,10 +111,43 @@ describe('UserCard_FormUsername', () => {
expect(wrapper.find('div.display-username').text()).toEqual('@username')
})
it('commits the username to the store', () => {
expect(storeCommitMock).toBeCalledWith('username', 'username')
})
it('toasts an success message', () => {
expect(toastSuccessMock).toBeCalledWith('site.profil.user-data.change-success')
})
it('has no edit button anymore', () => {
expect(wrapper.find('svg.bi-pencil').exists()).toBeFalsy()
})
})
describe('submit retruns error', () => {
beforeEach(async () => {
jest.clearAllMocks()
mockAPIcall.mockReturnValue({
success: false,
result: { message: 'Error' },
})
await wrapper.find('input[placeholder="Username"]').setValue('username')
await wrapper.find('form').trigger('submit')
await flushPromises()
})
it('calls the loginAPI', () => {
expect(mockAPIcall).toHaveBeenCalledWith(1, 'user@example.org', 'username')
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('Error')
})
it('renders an empty username', () => {
expect(wrapper.find('div.display-username').text()).toEqual('@')
})
})
})
})
})

View File

@ -1,10 +1,11 @@
import { createLocalVue } from '@vue/test-utils'
import { BootstrapVue, IconsPlugin } from 'bootstrap-vue'
import Vuex from 'vuex'
import { ValidationProvider, ValidationObserver, extend } from 'vee-validate'
import * as rules from 'vee-validate/dist/rules'
import { messages } from 'vee-validate/dist/locale/en.json'
import RegeneratorRuntime from 'regenerator-runtime'
import SideBar from '@/components/SidebarPlugin'
import VueQrcode from 'vue-qrcode'
@ -14,7 +15,7 @@ import VueMoment from 'vue-moment'
import clickOutside from '@/directives/click-ouside.js'
import { focus } from 'vue-focus'
global.localVue = createLocalVue()
import { loadAllRules } from '../src/validation-rules'
Object.keys(rules).forEach((rule) => {
extend(rule, {
@ -23,6 +24,15 @@ Object.keys(rules).forEach((rule) => {
})
})
const i18nMock = {
t: (identifier, values) => identifier,
n: (value, format) => value,
}
loadAllRules(i18nMock)
global.localVue = createLocalVue()
global.localVue.use(BootstrapVue)
global.localVue.use(Vuex)
global.localVue.use(IconsPlugin)

View File

@ -12,7 +12,6 @@ RUN echo '/usr/local/lib' >> /etc/ld.so.conf && ldconfig
COPY ./CMakeLists.txt.lib ./CMakeLists.txt
RUN ln -s /usr/local/googletest ./googletest
COPY ./src ./src
COPY ./cmake/CodeCoverage.cmake ./cmake/CodeCoverage.cmake
COPY ./dependencies/cmake-modules ./dependencies/cmake-modules
COPY ./dependencies/spirit-po ./dependencies/spirit-po
COPY ./dependencies/tinf ./dependencies/tinf
@ -35,5 +34,5 @@ RUN cd scripts && \
chmod +x compile_pot.sh && \
./compile_pot.sh
CMD cd build && cmake .. && make -j$(nproc) Gradido_LoginServer && ./bin/Gradido_LoginServer
CMD cd build && cmake .. -DCMAKE_BUILD_TYPE=Debug && make -j$(nproc) Gradido_LoginServer && ./bin/Gradido_LoginServer

Binary file not shown.

View File

@ -7,438 +7,452 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-05-18 12:17+0200\n"
"PO-Revision-Date: 2021-05-18 12:21+0200\n"
"POT-Creation-Date: 2021-06-21 13:37+0200\n"
"PO-Revision-Date: 2021-06-21 13:38+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.3\n"
"X-Generator: Poedit 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:181
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:260
#: build/http_pages/LoginPage.cpp:196 build/http_pages/LoginPage.cpp:275
msgid "Login"
msgstr "Anmeldung"
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:181
#: build/http_pages/LoginPage.cpp:196
msgid "E-Mail or password isn't right, please try again!"
msgstr ""
"E-Mail und Passwort Kombination stimmen nicht, bitte versuche es erneut. "
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:190
#: build/http_pages/LoginPage.cpp:205
msgid "Passwort"
msgstr "Passwort"
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:190
#: build/http_pages/LoginPage.cpp:205
msgid ""
"Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut."
msgstr ""
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:193
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:196
#: build/http_pages/LoginPage.cpp:208 build/http_pages/LoginPage.cpp:211
msgid "User"
msgstr ""
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:193
#: build/http_pages/LoginPage.cpp:208
msgid "Error in saved data, the server admin will look at it."
msgstr ""
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:196
#: build/http_pages/LoginPage.cpp:211
msgid "Benutzer ist deaktiviert, kein Login möglich!"
msgstr ""
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:260
#: build/http_pages/LoginPage.cpp:275
msgid "Username and password are needed!"
msgstr "E-Mail und Passwort werden benötigt!"
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:290
#: model/Session.cpp:164 model/Session.cpp:171 model/Session.cpp:223
#: model/Session.cpp:234
#: build/http_pages/LoginPage.cpp:376 src/cpp/model/Session.cpp:161
#: src/cpp/model/Session.cpp:168 src/cpp/model/Session.cpp:220
#: src/cpp/model/Session.cpp:231
msgid "E-Mail"
msgstr ""
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:291
#: SingletonManager/SessionManager.cpp:608
#: SingletonManager/SessionManager.cpp:614
#: SingletonManager/SessionManager.cpp:620
#: SingletonManager/SessionManager.cpp:626
#: SingletonManager/SessionManager.cpp:632
#: SingletonManager/SessionManager.cpp:638
#: build/http_pages/LoginPage.cpp:381
#: src/cpp/SingletonManager/SessionManager.cpp:603
#: src/cpp/SingletonManager/SessionManager.cpp:609
#: src/cpp/SingletonManager/SessionManager.cpp:614
#: src/cpp/SingletonManager/SessionManager.cpp:619
#: src/cpp/SingletonManager/SessionManager.cpp:624
#: src/cpp/SingletonManager/SessionManager.cpp:629
msgid "Password"
msgstr "Passwort"
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:292
#: build/http_pages/LoginPage.cpp:384
msgid " Login "
msgstr "Anmeldung"
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:297
#: build/http_pages/LoginPage.cpp:391
msgid "You haven't any account yet? Please follow the link to create one."
msgstr "Du hast noch kein Gradido-Konto?"
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:299
#: build/http_pages/LoginPage.cpp:395
msgid "Create New Account"
msgstr "Neues Konto erstellen"
#: F:\\Gradido\\gradido_stage2_local\\login_server\\src\\cpsp\\login.cpsp:303
#: build/http_pages/LoginPage.cpp:403
msgid "Passwort vergessen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:73
#: build/http_pages/CheckEmailPage.cpp:155
msgid "E-Mail verifizieren"
msgstr "E-Mail überprüfen"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:78
#: build/http_pages/CheckEmailPage.cpp:165
msgid ""
"Deine E-Mail wurde erfolgreich bestätigt. Du kannst nun Gradidos versenden."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:79
#: build/http_pages/CheckEmailPage.cpp:170
msgid "Zur Startseite"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:81
#: build/http_pages/CheckEmailPage.cpp:175
msgid "Bitte gib deinen E-Mail Verification Code ein:"
msgstr "Bitte gib deinen E-Mail Verification Code ein:"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:82
#: model/Session.cpp:187
#: build/http_pages/CheckEmailPage.cpp:178 src/cpp/model/Session.cpp:184
msgid "Email Verification Code"
msgstr "Email Verification Code"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:83
#: build/http_pages/CheckEmailPage.cpp:185
msgid "&Uuml;berpr&uuml;fe Code"
msgstr "&Uuml;berpr&uuml;fe Code"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:86
#: build/http_pages/CheckEmailPage.cpp:190
msgid "Du hast bisher keinen Code erhalten?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:87
#: build/http_pages/CheckEmailPage.cpp:193
msgid "E-Mail erneut zuschicken (in Arbeit)"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:90
#: build/http_pages/CheckEmailPage.cpp:198
msgid "Funktioniert dein E-Mail Verification Code nicht?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:91
#: build/http_pages/CheckEmailPage.cpp:201
msgid "Schicke uns eine E-Mail und wir k&uuml;mmern uns darum: "
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:92
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:151
#: build/http_pages/CheckEmailPage.cpp:208
#: build/http_pages/ResetPasswordPage.cpp:273
msgid "E-Mail an Support schicken"
msgstr ""
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:113
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:124
#: build/http_pages/ResetPasswordPage.cpp:174
#: build/http_pages/ResetPasswordPage.cpp:217
msgid "Gib bitte hier deine E-Mail Adresse an:"
msgstr ""
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:116
#: build/http_pages/ResetPasswordPage.cpp:183
msgid "Bestätigen"
msgstr ""
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:126
#: build/http_pages/ResetPasswordPage.cpp:225
msgid "Hast du dir deine Passphrase notiert oder gemerkt?"
msgstr ""
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:131
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:206
#: build/http_pages/ResetPasswordPage.cpp:234
#: build/http_pages/PassphrasePage.cpp:373
msgid "Ja"
msgstr ""
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:136
#: build/http_pages/ResetPasswordPage.cpp:241
msgid "Nein"
msgstr ""
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:140
#: build/http_pages/ResetPasswordPage.cpp:247
msgid "Absenden"
msgstr ""
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:145
#: build/http_pages/ResetPasswordPage.cpp:255
msgid "Dir wird eine E-Mail zugeschickt um dein Passwort zur&uuml;ckzusetzen."
msgstr ""
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:147
#: build/http_pages/ResetPasswordPage.cpp:260
msgid "Der Admin hat eine E-Mail bekommen und wird sich bei dir melden."
msgstr ""
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:149
#: build/http_pages/ResetPasswordPage.cpp:265
msgid ""
"Du hast bereits eine E-Mail bekommen. Bitte schau auch in dein Spam-"
"Verzeichnis nach. "
msgstr ""
#: F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\resetPassword.cpsp:150
#: build/http_pages/ResetPasswordPage.cpp:268
msgid ""
"Du hast wirklich keine E-Mail erhalten und auch schon ein paar Minuten "
"gewartet?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:26
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:96
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:117
#: model/Session.cpp:468 model/Session.cpp:480 model/Session.cpp:494
#: build/http_pages/PassphrasePage.cpp:41
#: build/http_pages/PassphrasePage.cpp:111
#: build/http_pages/PassphrasePage.cpp:132 src/cpp/model/Session.cpp:465
#: src/cpp/model/Session.cpp:477 src/cpp/model/Session.cpp:491
msgid "Passphrase"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:27
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:266
#: build/http_pages/PassphrasePage.cpp:42
#: build/http_pages/PassphrasePage.cpp:451
msgid "Neues Konto anlegen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:28
#: build/http_pages/PassphrasePage.cpp:43
msgid "2/3"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:96
#: build/http_pages/PassphrasePage.cpp:111
msgid ""
"Diese Passphrase ist ung&uuml;ltig, bitte &uuml;berpr&uuml;fen oder neu "
"generieren (lassen)."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:117
#: build/http_pages/PassphrasePage.cpp:132
msgid "intern error please try again later"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:132
#: build/http_pages/PassphrasePage.cpp:147
msgid "3/3"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:135
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:138
#: build/http_pages/PassphrasePage.cpp:150
#: build/http_pages/PassphrasePage.cpp:153
msgid "1/3"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:137
#: build/http_pages/PassphrasePage.cpp:152
msgid "Neues Passwort anlegen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:148
#: build/http_pages/PassphrasePage.cpp:270
msgid "Passphrase abschreiben"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:159
#: build/http_pages/PassphrasePage.cpp:287
msgid "Was ist eine Passphrase?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:160
#: build/http_pages/PassphrasePage.cpp:290
msgid "Deine Passphrase besteht aus den im grünen Feld angezeigten Wörtern."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:161
#: build/http_pages/PassphrasePage.cpp:293
msgid "Sie dient deiner Sicherheit."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:162
#: build/http_pages/PassphrasePage.cpp:296
msgid ""
"Du brauchst deine Passphrase um dein Konto wiederherzustellen, wenn du mal "
"dein Passwort vergessen haben solltest."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:164
#: build/http_pages/PassphrasePage.cpp:300
msgid "Deine Passphrase (Groß/Kleinschreibung beachten)"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:169
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:197
#: build/http_pages/PassphrasePage.cpp:309
#: build/http_pages/PassphrasePage.cpp:352
msgid "Was zu tun ist:"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:170
#: build/http_pages/PassphrasePage.cpp:312
msgid ""
"Schreibe dir die obenstehende Passphrase <b>von Hand</b> auf ein Blatt "
"Papier!"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:171
#: build/http_pages/PassphrasePage.cpp:315
msgid "Speichere sie auf keinen Fall auf deinem Rechner oder Mobilgerät!!"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:172
#: build/http_pages/PassphrasePage.cpp:318
msgid "Bewahre sie an einem sicheren Ort auf!"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:174
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:285
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:290
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:303
#: build/http_pages/PassphrasePage.cpp:322
#: build/http_pages/PassphrasePage.cpp:478
#: build/http_pages/PassphrasePage.cpp:487
#: build/http_pages/PassphrasePage.cpp:511
msgid "Weiter"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:198
#: build/http_pages/PassphrasePage.cpp:355
msgid "Hast du dir deine Passphrase gemerkt?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:199
#: build/http_pages/PassphrasePage.cpp:358
msgid ""
"Dann zeig es mir. Zur Unterstützung gebe ich dir deine Wörter aber in "
"anderer Reihenfolge."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:200
#: build/http_pages/PassphrasePage.cpp:361
msgid "Klicke sie an um sie einzusetzen."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:201
#: build/http_pages/PassphrasePage.cpp:364
msgid "Überprüfe dabei, ob du alle Wörter richtig geschrieben hast!"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:205
#: build/http_pages/PassphrasePage.cpp:370
msgid ""
"Weil du kein Javascript verwendest geht es direkt weiter. Hast du dir deine "
"Passphrase gemerkt oder aufgeschrieben?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:252
#: build/http_pages/PassphrasePage.cpp:429
msgid "Deine E-Mail Adresse wurde erfolgreich bestätigt."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:256
#: build/http_pages/PassphrasePage.cpp:437
msgid "Neue Gradido Adresse anlegen / wiederherstellen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:257
#: build/http_pages/PassphrasePage.cpp:440
msgid ""
"Möchtest du ein neues Gradido-Konto anlegen oder ein bestehendes "
"wiederherstellen?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:273
#: build/http_pages/PassphrasePage.cpp:460
msgid "Bestehendes Konto wiederherstellen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:280
#: build/http_pages/PassphrasePage.cpp:469
msgid ""
"Falls du ein bestehendes Konto wiederherstellen willst, gib hier deine "
"Passphrase ein:"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:297
#: build/http_pages/PassphrasePage.cpp:497
msgid "Konto wiederherstellen / Neues Passwort anlegen"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:299
#: build/http_pages/PassphrasePage.cpp:501
msgid ""
"Um dein Konto wiederherzustellen und dir ein Neues Passwort auswählen zu "
"können, tippe hier bitte die Wörter deiner Passphrase in der richtigen "
"Reihenfolge ein, welche du dir aufgeschrieben hast."
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:313
#: build/http_pages/PassphrasePage.cpp:524
msgid "Fehler"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:314
#: build/http_pages/PassphrasePage.cpp:527
msgid ""
"Ungültige Seite, wenn du das siehst stimmt hier etwas nicht. Bitte wende "
"dich an den Server-Admin."
msgstr ""
#: model/Session.cpp:150 model/Session.cpp:180 model/Session.cpp:779
#: model/Session.cpp:785 model/Session.cpp:1061 model/Session.cpp:1077
#: src/cpp/model/Session.cpp:147 src/cpp/model/Session.cpp:177
#: src/cpp/model/Session.cpp:645 src/cpp/model/Session.cpp:651
#: src/cpp/model/Session.cpp:937 src/cpp/model/Session.cpp:953
msgid "Benutzer"
msgstr ""
#: model/Session.cpp:150
#: src/cpp/model/Session.cpp:147
msgid "Eingeloggter Benutzer ist kein Admin"
msgstr ""
#: model/Session.cpp:156 model/Session.cpp:215
#: src/cpp/model/Session.cpp:153 src/cpp/model/Session.cpp:212
msgid "Vorname"
msgstr ""
#: model/Session.cpp:156 model/Session.cpp:160 model/Session.cpp:215
#: model/Session.cpp:219
#: src/cpp/model/Session.cpp:153 src/cpp/model/Session.cpp:157
#: src/cpp/model/Session.cpp:212 src/cpp/model/Session.cpp:216
msgid ""
"Bitte gebe einen Namen an. Mindestens 3 Zeichen, keines folgender Zeichen "
"<>&;"
msgstr ""
#: model/Session.cpp:160 model/Session.cpp:219
#: src/cpp/model/Session.cpp:157 src/cpp/model/Session.cpp:216
msgid "Nachname"
msgstr ""
#: model/Session.cpp:164 model/Session.cpp:223
#: src/cpp/model/Session.cpp:161 src/cpp/model/Session.cpp:220
msgid "Bitte gebe eine g&uuml;ltige E-Mail Adresse an."
msgstr ""
#: model/Session.cpp:171
#: src/cpp/model/Session.cpp:168
msgid "F&uuml;r diese E-Mail Adresse gibt es bereits einen Account"
msgstr ""
#: model/Session.cpp:180 model/Session.cpp:187
#: src/cpp/model/Session.cpp:177 src/cpp/model/Session.cpp:184
msgid "Fehler beim speichern!"
msgstr ""
#: model/Session.cpp:234
#: src/cpp/model/Session.cpp:231
msgid "F&uuml;r diese E-Mail Adresse gibt es bereits ein Konto"
msgstr ""
#: model/Session.cpp:258
#: src/cpp/model/Session.cpp:255
msgid "Server"
msgstr ""
#: model/Session.cpp:258
#: src/cpp/model/Session.cpp:255
msgid "Fehler beim speichen des Kontos bitte versuche es später noch einmal"
msgstr ""
#: model/Session.cpp:353 model/Session.cpp:393 model/Session.cpp:966
#: model/Session.cpp:975
#: src/cpp/model/Session.cpp:350 src/cpp/model/Session.cpp:390
#: src/cpp/model/Session.cpp:832 src/cpp/model/Session.cpp:841
msgid "E-Mail Verification"
msgstr "E-Mail Überprüfung"
#: model/Session.cpp:353
#: src/cpp/model/Session.cpp:350
msgid "Du hast dein Konto bereits aktiviert!"
msgstr ""
#: model/Session.cpp:393
#: src/cpp/model/Session.cpp:390
msgid "Falscher Code f&uuml;r aktiven Login"
msgstr ""
#: model/Session.cpp:468
#: src/cpp/model/Session.cpp:465
msgid "Deine Passphrase ist ung&uuml;tig"
msgstr ""
#: model/Session.cpp:480
#: src/cpp/model/Session.cpp:477
msgid "Ein Fehler trat auf, bitte versuche es erneut"
msgstr ""
#: model/Session.cpp:494
#: src/cpp/model/Session.cpp:491
msgid "Das ist nicht die richtige Passphrase."
msgstr ""
#: model/Session.cpp:779
#: src/cpp/model/Session.cpp:645
msgid "Konnte Community Server nicht erreichen. E-Mail an den Admin ist raus."
msgstr ""
#: model/Session.cpp:785
#: src/cpp/model/Session.cpp:651
msgid ""
"Fehler beim L&ouml;schen des Accounts. Bitte logge dich erneut ein und "
"versuche es nochmal."
msgstr ""
#: model/Session.cpp:966
#: src/cpp/model/Session.cpp:832
msgid "Konnte kein passendes Konto finden."
msgstr ""
#: model/Session.cpp:975
#: src/cpp/model/Session.cpp:841
msgid "Fehler beim laden des Benutzers."
msgstr ""
#: model/Session.cpp:1061
#: src/cpp/model/Session.cpp:937
msgid "Kein g&uuml;ltiger Benutzer, bitte logge dich erneut ein."
msgstr ""
#: model/Session.cpp:1077
#: src/cpp/model/Session.cpp:953
msgid "Fehler beim generieren der Passphrase, der Admin bekommt eine E-Mail. "
msgstr ""
#: SingletonManager/SessionManager.cpp:609
#: src/cpp/model/email/Email.cpp:174
msgid "Default Email Subject"
msgstr ""
#: src/cpp/model/email/Email.cpp:180
msgid "Error from Gradido Login Server"
msgstr "Fehler auf dem Gradido Login Server"
#: src/cpp/model/email/Email.cpp:200
msgid "Gradido: E-Mail Verification"
msgstr "Gradido: E-Mail Überprüfung"
#: src/cpp/model/email/Email.cpp:246
msgid "Gradido: Reset Password"
msgstr "Gradido: Passwort zurücksetzen"
#: src/cpp/SingletonManager/SessionManager.cpp:604
msgid ""
"Please enter a valid password with at least 8 characters, upper and lower "
"case letters, at least one number and one special character (@$!%*?&+-_)!"
@ -447,23 +461,23 @@ msgstr ""
"Kleinbuchstaben, mindestens einer Zahl und einem Sonderzeichen (@$!%*?&+-_) "
"ein!"
#: SingletonManager/SessionManager.cpp:615
#: src/cpp/SingletonManager/SessionManager.cpp:610
msgid "Your password is to short!"
msgstr "Dein Passwort ist zu kurz!"
#: SingletonManager/SessionManager.cpp:621
#: src/cpp/SingletonManager/SessionManager.cpp:615
msgid "Your password does not contain lowercase letters!"
msgstr "Dein Passwort enthält keine Kleinbuchstaben!"
#: SingletonManager/SessionManager.cpp:627
#: src/cpp/SingletonManager/SessionManager.cpp:620
msgid "Your password does not contain any capital letters!"
msgstr " Dein Passwort enthält keine Großbuchstaben!"
#: SingletonManager/SessionManager.cpp:633
#: src/cpp/SingletonManager/SessionManager.cpp:625
msgid "Your password does not contain any number!"
msgstr "Dein Passwort enthält keine Zahlen!"
#: SingletonManager/SessionManager.cpp:639
#: src/cpp/SingletonManager/SessionManager.cpp:630
msgid "Your password does not contain special characters (@$!%*?&+-)!"
msgstr "Dein Passwort enthält keine Sonderzeichen (@$!%*?&+-)!"
@ -493,9 +507,6 @@ msgstr "Dein Passwort enthält keine Sonderzeichen (@$!%*?&+-)!"
#~ "Der neue Gradido basiert technisch auf einer Kryptowährung (wie z.B. "
#~ "Bitcoin) um für dich die maximale Sicherheit zu gewährleisten."
#~ msgid "Gradido: E-Mail Verification"
#~ msgstr "Gradido: E-Mail Überprüfung"
#~ msgid ""
#~ "Der Code stimmt nicht, bitte &uuml;berpr&uuml;fe ihn nochmal oder "
#~ "registriere dich erneut oder wende dich an den Server-Admin"

View File

@ -123,13 +123,18 @@ Poco::JSON::Object* JsonUpdateUserInfos::handle(Poco::Dynamic::Var params)
}
}
else if ("User.description" == name) {
std::string str_val = validateString(value, "User.description", jsonErrorsArray);
std::string errorMessage = "User.description";
if (str_val.size() > 0 && str_val != user_model->getDescription()) {
if (!value.isString()) {
errorMessage += " isn't a string";
jsonErrorsArray.add(errorMessage);
}
std::string str_val = value.toString();
if (str_val != user_model->getDescription()) {
user_model->setDescription(str_val);
extractet_values++;
}
}
else if ("User.disabled" == name) {
bool disabled;

View File

@ -171,13 +171,13 @@ Gradido Login-Server\n\
switch (mType) {
case EMAIL_DEFAULT:
mailMessage->addRecipient(adminRecipient);
mailMessage->setSubject(langCatalog->gettext_str("Default Email Subject"));
mailMessage->setSubject(langCatalog->gettext("Default Email Subject"));
mailMessage->addContent(new Poco::Net::StringPartSource(langCatalog->gettext_str("Empty Email Content"), mt.toString()));
break;
case EMAIL_ERROR:
mailMessage->addRecipient(adminRecipient);
mailMessage->setSubject(langCatalog->gettext_str("Error from Gradido Login Server"));
mailMessage->setSubject(langCatalog->gettext("Error from Gradido Login Server"));
mailMessage->addContent(new Poco::Net::StringPartSource(mErrorHtml, mt.toString()));
break;
@ -197,7 +197,7 @@ Gradido Login-Server\n\
return false;
}
mailMessage->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, mUser->getModel()->getEmail()));
mailMessage->setSubject(langCatalog->gettext_str("Gradido: E-Mail Verification"));
mailMessage->setSubject(langCatalog->gettext("Gradido: E-Mail Verification"));
messageTemplate = EmailText_emailVerification;
if (EMAIL_USER_VERIFICATION_CODE_RESEND == mType) {
@ -243,7 +243,7 @@ Gradido Login-Server\n\
return false;
}
mailMessage->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, mUser->getModel()->getEmail()));
mailMessage->setSubject(langCatalog->gettext_str(u8"Gradido: Passwort zurücksetzen"));
mailMessage->setSubject(langCatalog->gettext("Gradido: Reset Password"));
mailMessage->addContent(
new Poco::Net::StringPartSource(replaceUserNamesAndLink(