Commit ca5d01c5 authored by Rosanny Sihombing's avatar Rosanny Sihombing
Browse files

DE

parent 198aca69
...@@ -96,11 +96,15 @@ module.exports = function (app, config, passport, i18n) { ...@@ -96,11 +96,15 @@ module.exports = function (app, config, passport, i18n) {
text: "" text: ""
}; };
var updatePasswordMailContent = "Hello,\n\n"+ var updatePasswordMailSubject = "Ihr Passwort für das Transferportal wurde gespeichert."
"We would like to notify that your password has been successfully updated.\n\n"+ var mailSignature = "Mit den besten Grüßen,\ndas Transferportal-Team der HFT Stuttgart\n\n"+
"Thanks,\nM4_LAB Team" "Transferportal der Hochschule für Technik Stuttgart\n"+
var updatePasswordMailSubject = "Your M4_LAB Password has been updated" "Schellingstr. 24\n"+
"70174 Stuttgart\n"+
"m4lab@hft-stuttgart.de\n"+
"https://transfer.hft-stuttgart.de"
var updatePasswordMailContent = "Lieber Nutzer,\n\n"+"Ihr Passwort wurde erfolgreich geändert.\n\n"+mailSignature
// ================ test i18n ================== // ================ test i18n ==================
i18n.setLocale('de'); i18n.setLocale('de');
app.get('/de', function(req, res) { app.get('/de', function(req, res) {
...@@ -108,30 +112,32 @@ module.exports = function (app, config, passport, i18n) { ...@@ -108,30 +112,32 @@ module.exports = function (app, config, passport, i18n) {
res.send(greeting) res.send(greeting)
}); });
var lang = 'DE'
// ======== APP ROUTES ==================== // ======== APP ROUTES ====================
app.get('/account', function (req, res) { app.get('/', function (req, res) {
if (req.isAuthenticated()) { if (req.isAuthenticated()) {
methods.getUserByEmail(req.user.email, function(data, err){ methods.getUserByEmail(req.user.email, function(data, err){
if (!err) { if (!err) {
res.render('home', { res.render(lang+'/home', {
greeting: i18n.__('Hello'), user: data
}); });
} }
}) })
} else { } else {
res.redirect('/account/login'); res.redirect('/login'); // localhost
} }
}); });
app.get('/error', function (req, res) { app.get('/error', function (req, res) {
res.render('error') res.render(lang+'/error')
}); });
app.get('/account/login', app.get('/login',
passport.authenticate(config.passport.strategy, passport.authenticate(config.passport.strategy,
{ {
successRedirect: '/account/', successRedirect: '/',
failureRedirect: '/account/login' failureRedirect: '/login'
}) })
); );
...@@ -157,22 +163,22 @@ module.exports = function (app, config, passport, i18n) { ...@@ -157,22 +163,22 @@ module.exports = function (app, config, passport, i18n) {
}); });
}); });
app.get('/account/profile', function (req, res) { app.get('/profile', function (req, res) {
if (req.isAuthenticated()) { if (req.isAuthenticated()) {
methods.getUserByEmail(req.user.email, function(data, err){ methods.getUserByEmail(req.user.email, function(data, err){
if (!err) { if (!err) {
res.render('profile', { res.render(lang+'/profile', {
user: data, user: data,
email: req.user.email email: req.user.email
}); });
} }
}) })
} else { } else {
res.redirect('/account/login'); res.redirect('/login');
} }
}); });
app.get('/account/services', function (req, res) { app.get('/services', function (req, res) {
if (req.isAuthenticated()) { if (req.isAuthenticated()) {
async.waterfall([ async.waterfall([
// get userId by email from userdb // get userId by email from userdb
...@@ -225,29 +231,30 @@ module.exports = function (app, config, passport, i18n) { ...@@ -225,29 +231,30 @@ module.exports = function (app, config, passport, i18n) {
} }
// render the page // render the page
res.render('services', { res.render(lang+'/services', {
user: req.user, user: req.user,
project: allProjects project: allProjects
}); });
} }
]) ])
} else { } else {
res.redirect('/account/login'); res.redirect('/login');
} }
}); });
app.get('/account/security', function (req, res) { app.get('/security', function (req, res) {
if (req.isAuthenticated()) { if (req.isAuthenticated()) {
res.render('security', { res.render(lang+'/security', {
user: req.user // useful for view engine, useless for HTML user: req.user // useful for view engine, useless for HTML
}); });
} else { } else {
res.redirect('/account/login'); res.redirect('/login');
} }
}); });
app.post('/updateProfile', function (req, res) { app.post('/updateProfile', function (req, res) {
var userData = { var userData = {
salutation: req.body.inputSalutation,
title: req.body.inputTitle, title: req.body.inputTitle,
firstname: req.body.inputFirstname, firstname: req.body.inputFirstname,
lastname: req.body.inputLastname, lastname: req.body.inputLastname,
...@@ -267,11 +274,11 @@ module.exports = function (app, config, passport, i18n) { ...@@ -267,11 +274,11 @@ module.exports = function (app, config, passport, i18n) {
else { else {
req.flash('success', 'Profile updated!'); req.flash('success', 'Profile updated!');
} }
res.redirect('/account/profile'); res.redirect('/profile');
}) })
} }
} else { } else {
res.redirect('/account/login'); res.redirect('/login');
} }
}); });
...@@ -286,7 +293,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -286,7 +293,7 @@ module.exports = function (app, config, passport, i18n) {
// Load hashed passwd from DB // Load hashed passwd from DB
dbconn.user.query('SELECT password FROM credential WHERE user_id='+userId, function (err, rows, fields) { dbconn.user.query('SELECT password FROM credential WHERE user_id='+userId, function (err, rows, fields) {
if (err) { if (err) {
res.redirect('/account/500') res.redirect('/500')
throw err throw err
} }
var userPwd = rows[0].password var userPwd = rows[0].password
...@@ -294,17 +301,21 @@ module.exports = function (app, config, passport, i18n) { ...@@ -294,17 +301,21 @@ module.exports = function (app, config, passport, i18n) {
// check if the password is correct // check if the password is correct
bcrypt.compare(currPwd, userPwd, function(err, isMatch) { bcrypt.compare(currPwd, userPwd, function(err, isMatch) {
if (err) { if (err) {
res.redirect('/account/500') res.redirect('/500')
throw err throw err
} }
else if (!isMatch) { else if (!isMatch) {
req.flash('error', "Sorry, your password was incorrect. Please double-check your password.") //req.flash('error', "Sorry, your password was incorrect. Please double-check your password.")
res.redirect('/account/security') req.flash('error', "Das Passwort ist leider falsch. Bitte überprüfen Sie Ihre Eingabe.")
//res.redirect('/account/security')
res.redirect('/security')
} }
else { else {
if ( newPwd != retypePwd ) { if ( newPwd != retypePwd ) {
//req.flash('error', "Passwords do no match. Please make sure you re-type your new password correctly.")
req.flash('error', "Passwords do no match. Please make sure you re-type your new password correctly.") req.flash('error', "Passwords do no match. Please make sure you re-type your new password correctly.")
res.redirect('/account/security') //res.redirect('/account/security')
res.redirect('/security')
} }
else { else {
// update password // update password
...@@ -316,13 +327,16 @@ module.exports = function (app, config, passport, i18n) { ...@@ -316,13 +327,16 @@ module.exports = function (app, config, passport, i18n) {
} }
methods.updateCredential(credentialData, function(err){ methods.updateCredential(credentialData, function(err){
if (err) { if (err) {
req.flash('error', "Database error: Password cannot be modified.") //req.flash('error', "Database error: Password cannot be modified.")
req.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.")
throw err throw err
} }
else { else {
req.flash('success', "Pasword updated!") //req.flash('success', "Pasword updated!")
req.flash('success', "Passwort aktualisiert!")
mailOptions.to = req.user.email mailOptions.to = req.user.email
mailOptions.subject = "Your M4_LAB Password has been updated" //mailOptions.subject = "Your M4_LAB Password has been updated."
mailOptions.subject = updatePasswordMailSubject
mailOptions.text = updatePasswordMailContent mailOptions.text = updatePasswordMailContent
smtpTransport.sendMail(mailOptions, function(err) { smtpTransport.sendMail(mailOptions, function(err) {
if (err) { if (err) {
...@@ -330,7 +344,8 @@ module.exports = function (app, config, passport, i18n) { ...@@ -330,7 +344,8 @@ module.exports = function (app, config, passport, i18n) {
} }
}); });
} }
res.redirect('/account/security') //res.redirect('/account/security')
res.redirect('/security')
}) })
}); });
}); });
...@@ -342,12 +357,12 @@ module.exports = function (app, config, passport, i18n) { ...@@ -342,12 +357,12 @@ module.exports = function (app, config, passport, i18n) {
}) })
} }
else { else {
res.redirect('/account/login'); res.redirect('/login');
} }
}); });
app.get('/forgotPwd', function (req, res) { app.get('/forgotPwd', function (req, res) {
res.render('forgotPwd', { res.render(lang+'/forgotPwd', {
user: req.user user: req.user
}); });
}); });
...@@ -372,13 +387,19 @@ module.exports = function (app, config, passport, i18n) { ...@@ -372,13 +387,19 @@ module.exports = function (app, config, passport, i18n) {
methods.checkUserEmail(emailAddress, function(err, user){ methods.checkUserEmail(emailAddress, function(err, user){
if (user) { if (user) {
console.log("email: user found"); console.log("email: user found");
var emailSubject = "M4_LAB Password Reset"; //var emailSubject = "M4_LAB Password Reset";
var emailContent = "Hi User,\n\n"+ var emailSubject = "Ihre Passwort-Anfrage an das Transferportal der HFT Stuttgart";
/* var emailContent = "Hi User,\n\n"+
"we've received a request to reset your password. If you didn't make the request, just ignore this email.\n\n"+ "we've received a request to reset your password. If you didn't make the request, just ignore this email.\n\n"+
"Otherwise, you can reset your password using this link: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" + "Otherwise, you can reset your password using this link: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" +
"This password reset is only valid for 1 hour.\n\n"+ "This password reset is only valid for 1 hour.\n\n"+
"Thanks,\nM4_LAB Team" "Thanks,\nM4_LAB Team" */
var emailContent = "Lieber Nutzer,\n\n"+
"wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.\n\n"+
//"Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" + // test server
"Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://localhost:9989/reset/" + token + "\n" + // localhost
"Dieser Link ist aus Sicherheitsgründen nur für 1 Stunde gültig.\n\n"+mailSignature
var credentialData = { var credentialData = {
user_id: user.id, user_id: user.id,
resetPasswordToken: token, resetPasswordToken: token,
...@@ -402,34 +423,30 @@ module.exports = function (app, config, passport, i18n) { ...@@ -402,34 +423,30 @@ module.exports = function (app, config, passport, i18n) {
} }
}); });
} }
/*,
function(token, user, done) {
mailOptions.to = emailAddress;
mailOptions.subject = emailSubject;
mailOptions.text = emailContent;
smtpTransport.sendMail(mailOptions, function(err) {
done(err, 'done');
});
} */
], function(err) { ], function(err) {
if (err) { if (err) {
req.flash('error', 'An error occured. Please try again.'); //req.flash('error', 'An error occured. Please try again.');
req.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.');
} }
else { else {
req.flash('success', 'If your email is registered, an e-mail has been sent to ' + emailAddress + ' with further instructions.'); //req.flash('success', 'If your email is registered, an e-mail has been sent to ' + emailAddress + ' with further instructions.');
req.flash('success', 'Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an ' + emailAddress + ' versendet.');
} }
res.redirect('/account/forgotPwd'); //res.redirect('/account/forgotPwd'); // deployment
res.redirect('/forgotPwd'); // localhost
}); });
}); });
app.get('/reset/:token', function(req, res) { app.get('/reset/:token', function(req, res) {
methods.getUserByToken(req.params.token, function(err, user){ methods.getUserByToken(req.params.token, function(err, user){
if (!user) { if (!user) {
req.flash('error', 'Password reset token is invalid or has expired.'); //req.flash('error', 'Password reset token is invalid or has expired.');
res.redirect('/account/forgotPwd'); req.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.');
//res.redirect('/account/forgotPwd'); // deployment
res.redirect('/forgotPwd'); // localhost
} }
else { else {
res.render('reset'); res.render(lang+'/reset');
} }
}); });
}); });
...@@ -448,11 +465,13 @@ module.exports = function (app, config, passport, i18n) { ...@@ -448,11 +465,13 @@ module.exports = function (app, config, passport, i18n) {
// update password // update password
methods.updateCredential(credentialData, function(err){ methods.updateCredential(credentialData, function(err){
if (err) { if (err) {
req.flash('error', "Database error: Password cannot be modified.") //req.flash('error', "Database error: Password cannot be modified.")
req.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.")
throw err throw err
} }
else { else {
req.flash('success', "Your pasword has been updated.") //req.flash('success', "Your pasword has been updated.")
req.flash('success', "Passwort aktualisiert!")
// send notifiaction email // send notifiaction email
mailOptions.to = user.email mailOptions.to = user.email
mailOptions.subject = updatePasswordMailSubject mailOptions.subject = updatePasswordMailSubject
...@@ -463,7 +482,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -463,7 +482,7 @@ module.exports = function (app, config, passport, i18n) {
} }
}); });
// redirect to login page // redirect to login page
res.redirect('/account/login') res.redirect('/login')
} }
}) })
}); });
...@@ -471,7 +490,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -471,7 +490,7 @@ module.exports = function (app, config, passport, i18n) {
} }
else { else {
req.flash('error', "User not found.") req.flash('error', "User not found.")
res.redirect('/account/login') res.redirect('/login')
} }
}); });
...@@ -479,7 +498,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -479,7 +498,7 @@ module.exports = function (app, config, passport, i18n) {
// todo: user registration with captcha // todo: user registration with captcha
app.get('/registration', function(req, res) { app.get('/registration', function(req, res) {
res.render('registration') res.render(lang+'/registration')
}) })
app.post('/registration', function(req, res) { app.post('/registration', function(req, res) {
...@@ -490,6 +509,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -490,6 +509,7 @@ module.exports = function (app, config, passport, i18n) {
// user data // user data
var curDate = new Date() var curDate = new Date()
var userData = { var userData = {
salutation: req.body.inputSalutation,
title: req.body.inputTitle, title: req.body.inputTitle,
firstname: req.body.inputFirstname, firstname: req.body.inputFirstname,
lastname: req.body.inputLastname, lastname: req.body.inputLastname,
...@@ -509,12 +529,15 @@ module.exports = function (app, config, passport, i18n) { ...@@ -509,12 +529,15 @@ module.exports = function (app, config, passport, i18n) {
} }
methods.registerNewUser(newAccount, function(err){ methods.registerNewUser(newAccount, function(err){
if (err) { if (err) {
req.flash('error', "Failed"); //req.flash('error', "Failed")
req.flash('error', "Fehlgeschlagen")
} }
else { else {
req.flash('success', 'Your account has been created. Please log in.'); //req.flash('success', 'Your account has been created. Please log in.')
req.flash('success', 'Ihr Benutzerkonto wurde angelegt. Bitte melden Sie sich an.')
} }
res.redirect('/account/registration'); //res.redirect('/account/registration'); // deployment
res.redirect('/registration'); // localhost
}) })
}); });
}); });
......
...@@ -34,9 +34,9 @@ html(lang="de") ...@@ -34,9 +34,9 @@ html(lang="de")
h5 h5
span #{user.firstname} #{user.lastname} span #{user.firstname} #{user.lastname}
div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
a(class="nav-link" href="#" aria-selected="true") Benutzerprofil a(class="nav-link" href="/profile" aria-selected="true") Benutzerprofil
a(class="nav-link" href="/account/security" aria-selected="false") Sicherheitseinstellungen a(class="nav-link" href="/security" aria-selected="false") Sicherheitseinstellungen
a(class="nav-link" href="/account/services" aria-selected="false") Projekte und Dienste a(class="nav-link" href="/services" aria-selected="false") Projekte und Dienste
div(class="col-sm-9") div(class="col-sm-9")
p content goes here p content goes here
......
...@@ -35,8 +35,8 @@ html(lang="de") ...@@ -35,8 +35,8 @@ html(lang="de")
span #{user.firstname} #{user.lastname} span #{user.firstname} #{user.lastname}
div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
a(class="nav-link" href="#" aria-selected="true") Benutzerprofil a(class="nav-link" href="#" aria-selected="true") Benutzerprofil
a(class="nav-link" href="/account/security" aria-selected="false") Sicherheitseinstellungen a(class="nav-link" href="/security" aria-selected="false") Sicherheitseinstellungen
a(class="nav-link" href="/account/services" aria-selected="false") Projekte und Dienste a(class="nav-link" href="/services" aria-selected="false") Projekte und Dienste
div(class="col-sm-9") div(class="col-sm-9")
if successes if successes
for success in successes for success in successes
...@@ -48,9 +48,23 @@ html(lang="de") ...@@ -48,9 +48,23 @@ html(lang="de")
a(class="close", href="#", data-dismiss="alert", aria-label="close") × a(class="close", href="#", data-dismiss="alert", aria-label="close") ×
form#profileForm(method="POST", action="/updateProfile") form#profileForm(method="POST", action="/updateProfile")
div(class="form-row") div(class="form-row")
div(class='form-group col-md-2')
label(for="title") Anrede
select#inputSalutation(name="inputSalutation", class="form-control", , value=user.salutation)
option(value="") - Anrede -
option(value="Herr") Herr
option(value="Frau") Frau
option(value="Divers") Divers
script.
var salutationOptions = document.getElementById('inputSalutation').options;
for (i=0; i < salutationOptions.length; i++) {
if (salutationOptions[i].value == '#{user.salutation}')
salutationOptions[i].selected = true;
}
div(class='form-group col-md-2') div(class='form-group col-md-2')
label(for="title") Titel label(for="title") Titel
select#inputTitle(name="inputTitle", class="form-control", value=user.title) select#inputTitle(name="inputTitle", class="form-control", value=user.title)
option(value="") - Titel -
option(value="Prof.") Prof. option(value="Prof.") Prof.
option(value="Dr.") Dr. option(value="Dr.") Dr.
option(value="Dipl.-Ing.") Dipl.-Ing. option(value="Dipl.-Ing.") Dipl.-Ing.
...@@ -61,15 +75,15 @@ html(lang="de") ...@@ -61,15 +75,15 @@ html(lang="de")
if (titleOptions[i].value == '#{user.title}') if (titleOptions[i].value == '#{user.title}')
titleOptions[i].selected = true; titleOptions[i].selected = true;
} }
div(class='form-group col-md-3') div(class='form-group col-md-2')
label(for="firstname") Vorname label(for="firstname") Vorname
input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname", value=user.firstname required) input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname", value=user.firstname required)
div(class='form-group col-md-3') div(class='form-group col-md-2')
label(for="lastname") Nachname label(for="lastname") Nachname
input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname", value=user.lastname required) input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname", value=user.lastname required)
div(class="form-row") div(class="form-row")
div(class='form-group col-md-8') div(class='form-group col-md-8')
label(for="email") Email label(for="email") E-mail Adresse
input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email", value=email required) input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email", value=email required)
div(class="form-row") div(class="form-row")
div(class='form-group col-md-8') div(class='form-group col-md-8')
...@@ -83,7 +97,7 @@ html(lang="de") ...@@ -83,7 +97,7 @@ html(lang="de")
div(class='form-group col-md-8') div(class='form-group col-md-8')
label(for="speciality") Fachgebiete label(for="speciality") Fachgebiete
input#inputSpeciality(name="inputSpeciality", type="text", class="form-control", placeholder="Fachgebiete", value=user.speciality) input#inputSpeciality(name="inputSpeciality", type="text", class="form-control", placeholder="Fachgebiete", value=user.speciality)
input(type="submit", class="btn btn-primary", value="Update") input(type="submit", class="btn btn-primary", value="Speichern")
// jQuery // jQuery
script(src="https://code.jquery.com/jquery-3.3.1.min.js") script(src="https://code.jquery.com/jquery-3.3.1.min.js")
......
...@@ -82,7 +82,7 @@ html(lang="de") ...@@ -82,7 +82,7 @@ html(lang="de")
p <em><small>* Pflichtfeld</small></em> p <em><small>* Pflichtfeld</small></em>
input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Senden" disabled) input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Senden" disabled)
br br
p(class="text-center") Sie haben bereits ein Benutzerkonto? <a href="/account">Melden Sie sich hier an</a>. p(class="text-center") Sie haben bereits ein Benutzerkonto? <a href="/login">Melden Sie sich hier an</a>.
// jQuery // jQuery
......
...@@ -37,9 +37,9 @@ html(lang="de") ...@@ -37,9 +37,9 @@ html(lang="de")
h5 h5
span #{user.firstName} #{user.lastName} span #{user.firstName} #{user.lastName}
div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
a(class="nav-link" href="/account/profile" aria-selected="true") Benutzerprofil a(class="nav-link" href="/profile" aria-selected="true") Benutzerprofil
a(class="nav-link" href="#" aria-selected="false") Sicherheitseinstellungen a(class="nav-link" href="#" aria-selected="false") Sicherheitseinstellungen
a(class="nav-link" href="/account/services" aria-selected="false") Projekte und Dienste a(class="nav-link" href="/services" aria-selected="false") Projekte und Dienste
div(class="col-sm-9") div(class="col-sm-9")
if successes if successes
for success in successes for success in successes
...@@ -53,18 +53,18 @@ html(lang="de") ...@@ -53,18 +53,18 @@ html(lang="de")
div(class="form-group row") div(class="form-group row")
label(for="currPwd") Aktuelles Passwort label(for="currPwd") Aktuelles Passwort
input(id="inputCurrPwd", name="inputCurrPwd", type="password", class="form-control" required) input(id="inputCurrPwd", name="inputCurrPwd", type="password", class="form-control" required)
div(class="invalid-feedback") Please fill in this field. div(class="invalid-feedback") Bitte füllen Sie dieses Feld aus.
div(class="form-group row") div(class="form-group row")
label(for="newPwd") Neues Passwort label(for="newPwd") Neues Passwort
input#inputNewPwd(name="inputNewPwd", type="password", class="form-control" required) input#inputNewPwd(name="inputNewPwd", type="password", class="form-control" required)
span#recommendation span#recommendation
div(class="invalid-feedback") Please fill in this field. div(class="invalid-feedback") Bitte füllen Sie dieses Feld aus.
div(class="form-group row") div(class="form-group row")
label(for="confirm") Bestätigen Sie das neue Passwort label(for="confirm") Bestätigen Sie das neue Passwort
input#inputConfirm(name="inputConfirm", type="password", class="form-control" required) input#inputConfirm(name="inputConfirm", type="password", class="form-control" required)
span#message span#message
div(class="invalid-feedback") Please fill in this field. div(class="invalid-feedback") Bitte füllen Sie dieses Feld aus.
input#updateBtn(type="submit", class="btn btn-primary", value="Update Password" disabled) input#updateBtn(type="submit", class="btn btn-primary", value="Passwort ändern" disabled)
// jQuery // jQuery
script(src="https://code.jquery.com/jquery-3.3.1.min.js") script(src="https://code.jquery.com/jquery-3.3.1.min.js")
......
...@@ -34,8 +34,8 @@ html(lang="de") ...@@ -34,8 +34,8 @@ html(lang="de")
h5 h5
span #{user.firstName} #{user.lastName} span #{user.firstName} #{user.lastName}
div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
a(class="nav-link" href="/account/profile" aria-selected="true") Benutzerprofil a(class="nav-link" href="/profile" aria-selected="true") Benutzerprofil
a(class="nav-link" href="/account/security" aria-selected="false") Sicherheitseinstellungen a(class="nav-link" href="/security" aria-selected="false") Sicherheitseinstellungen
a(class="nav-link" href="#" aria-selected="false") Projekte und Dienste a(class="nav-link" href="#" aria-selected="false") Projekte und Dienste
div(class="col-sm-9") div(class="col-sm-9")
if successes if successes
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment