diff --git a/public/js/headfoot.js b/public/js/headfoot.js new file mode 100644 index 0000000000000000000000000000000000000000..d1013948f2f6cc7f9c867ea442ec2e6a1068f733 --- /dev/null +++ b/public/js/headfoot.js @@ -0,0 +1,227 @@ +var menu = [{'name':'Informationen', 'combos':[{'name':'Projekte', 'link':'/project'}, {'name':'Über das M4_LAB', 'link':'/projectoverview?projectID=1'},{'name':'Kontakt', 'link':'/account/contact'}], 'type':'dropdown', 'link':'#'},{'name':'Zusammenarbeit', 'combos':[{'name':'Mailinglisten', 'link':'/mailinglists'},{'name':'Videokonferenzen', 'link':'/videoconference.html'},/* {'name':'...', 'link':'#'}*/], 'type':'dropdown', 'link':'#'},{'name':'Events', 'combos':[{'name':'Veranstaltungen der HfT', 'link':'http://www.hft-stuttgart.de/Aktuell/Veranstaltungen/'},{'name':'Veranstaltungen der HfT Forschung', 'link':'https://www.hft-stuttgart.de/forschung/veranstaltungen'}], 'type':'dropdown', 'link':'#'},{'name':'Benutzerkonto', 'combos': [], 'type':'', 'link':'/account/'}]; + + +var hft_links = [{'url':'/account/contact', 'name':'Kontakt'},{'url':'https://www.hft-stuttgart.de/impressum', 'name':'Impressum'},{'url':'https://www.hft-stuttgart.de/datenschutz', 'name':'Datenschutz'}] + +var socialmedias = [{'url':'https://twitter.com/InnolabM4', 'name': 'fa-twitter'}, {'url':'https://www.facebook.com/HfTStuttgart/', 'name': 'fa-facebook-square'}, {'url':'https://www.instagram.com/m4_lab/', 'name': 'fa-instagram'}, {'url':'https://de.linkedin.com/school/hochschule-f%C3%BCr-technik-stuttgart-%E2%80%93-university-of-applied-sciences/', 'name': 'fa-linkedin'}, {'url':'https://www.youtube.com/channel/UCi0_JfF2qMZbOhOnNH5PyHA', 'name': 'fa-youtube'}]; + +var footer_images = [/*{'src':'/images/demo/bbf_logo.png', 'alt':'BMBF'},*/ {'src':'/images/demo/Innovative_Hochschule_Initiative_BMBF_GWK_RGB.jpg', 'alt':'Innovative Hochschule'}] + +function prependChild(parent,child){ + parent.insertBefore(child, parent.childNodes[0]); +} + + +function readCookie(cname) { + var name = cname + "="; + var decodedCookie = decodeURIComponent(document.cookie); + var ca = decodedCookie.split(';'); + for(var i = 0; i <ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) == ' ') { + c = c.substring(1); + } + if (c.indexOf(name) == 0) { + return c.substring(name.length, c.length); + } + } + return ""; +} + +function sendRequest(URL){ + console.log(document.cookie); + let xhr = new XMLHttpRequest(); + xhr.open("POST", URL, true); + let token = readCookie("XSRF-TOKEN"); + //Send the proper header information along with the request + xhr.setRequestHeader('X-CSRF-TOKEN', token); + xhr.send(); +} + + +/* function head() + * creates header and prepends it to the documents body + */ + +function head() { + let navheader = document.createElement("header"); + navheader.id = "header"; + navheader.classList.add("clear"); + + // disclaimer + let alertdiv = document.createElement("div"); + alertdiv.classList.add("alert", "alert-danger", "alert-dismissible", "fade", "show"); + alertdiv.style = "text-align:center;"; + alertdiv.innerHTML="<strong>Disclaimer</strong> This website is under construction and in prototype-phase. It is not for public use." + let alertbutton = document.createElement("button"); + alertbutton.type = "button"; + alertbutton.classList.add("close"); + alertbutton.setAttribute("data-dismiss", "alert"); + alertbutton.innerHTML = "×"; + prependChild(alertdiv, alertbutton); + + // navigation header + let navbar = document.createElement("nav"); + navbar.classList.add("navbar", "navbar-expand-md", "navbar-light"); + navbar.style = "background-color: #ffffff;"; + + let navbarcontainer = document.createElement("div"); + navbarcontainer.classList.add("container"); + + let navbarheader = document.createElement("div"); + navbarheader.classList.add("navbar-header"); + // navigation header - logo + let link_m4lab = document.createElement('a'); + link_m4lab.href = "/"; + link_m4lab.classList.add("navbar-brand"); + link_m4lab.innerHTML = "<img src='/img/header/Logozeile_Header.png' alt='Logo Innovationslabor M4_LAB'>"; + navbarheader.appendChild(link_m4lab); + // navigation header - toggle button menu for mobile devices + let togglebutton = document.createElement('button'); + togglebutton.classList.add("navbar-toggler") + togglebutton.type = "button"; + togglebutton.setAttribute("data-toggle", "collapse"); + togglebutton.setAttribute("data-target", "#navbarCollapse"); + togglebutton.setAttribute("aria-controls", "navbarCollapse"); + togglebutton.setAttribute("aria-expanded", "false"); + togglebutton.setAttribute("aria-label", "Toggle navigation"); + togglebutton.innerHTML = "<span class='navbar-toggler-icon'></span>"; + // nav menu + let navelements = document.createElement('ul'); + navelements.id="navbarCollapse"; + navelements.classList.add("collapse", "nav", "navbar-collapse", "navbar-nav", "justify-content-end"); + for(let j = 0; j<menu.length; j++){ + let headitem = document.createElement('li'); + let itemtype = menu[j].type; + headitem.classList.add("nav-item") + let headlink = document.createElement('a'); + headlink.href=menu[j].link; + headlink.id="navbarDropdown" + j; + headlink.classList.add('nav-link'); + headlink.setAttribute("role", "button"); + if(itemtype=='dropdown'){ + headitem.classList.add("dropdown"); + headlink.classList.add('dropdown-toggle'); + headlink.setAttribute("data-toggle", "dropdown"); + headlink.setAttribute("aria-haspopup", "true"); + headlink.setAttribute("aria-expanded", "false"); + } + headlink.innerHTML=menu[j].name; + if(itemtype=='dropdown'){ + let combodiv = document.createElement('div'); + combodiv.id=headlink.id+"_par"; + combodiv.setAttribute("aria-labelledby",headlink.id); + combodiv.classList.add("dropdown-menu"); + for(let k = 0; k< menu[j].combos.length; k++){ + let combolink = document.createElement('a'); + combolink.classList.add("dropdown-item"); + combolink.href = menu[j].combos[k].link; + combolink.innerHTML = menu[j].combos[k].name; + combodiv.appendChild(combolink); + } + headitem.appendChild(combodiv); + } + prependChild(headitem, headlink) + navelements.appendChild(headitem); + } + + navbarcontainer.appendChild(navbarheader); + navbarcontainer.appendChild(togglebutton); + navbarcontainer.appendChild(navelements); + navbar.appendChild(navbarcontainer) + + navheader.appendChild(alertdiv); + navheader.appendChild(navbar); + prependChild(document.body, navheader); +} + +/* function foot() + * creates footer and appends it to the documents body + */ + +function foot() { + // add styles to <head> to manage sticky footer + var styles = ` + @media only screen and (min-width: 768px) { + html { + position: relative; + min-height: 100%; + } + body { + margin-bottom: 120px; /* Margin bottom by footer height */ + } + #homepage { + position: absolute; + bottom: 0; + width: 100%; + text-align: center; + } + } + ` + var styleSheet = document.createElement("style") + styleSheet.type = "text/css" + styleSheet.innerText = styles + document.head.appendChild(styleSheet) + + let footerdiv = document.createElement('div'); + footerdiv.id="homepage"; + //footerdiv.classList.add("last", "clear"); + footerdiv.innerHTML = "<hr>"; + let containerdiv = document.createElement('div'); + containerdiv.classList.add('container'); + let containerdivrow = document.createElement('div'); + containerdivrow.classList.add('row'); + + //bmbf + let bmbf = document.createElement('div'); + bmbf.classList.add("col-md-auto"); + bmbf.innerHTML = "<img src='/img/footer/Innovative_Hochschule_Initiative_BMBF_GWK_RGB.png' alt='Innovative Hochschule' style='height:90px'/>" + //m4labgrau + let m4labgrau = document.createElement('div'); + m4labgrau.classList.add("col-md-auto"); + m4labgrau.innerHTML = "<img src='/img/footer/M4_LAB_LOGO_Graustufen.png' alt='M4_LAB' style='height:80px'/>" + // socmed + let socialdiv = document.createElement('div'); + socialdiv.classList.add("col-md-auto"); + let socialrow = document.createElement('div'); + socialrow.id="socialmediabuttons"; + for(let j = 0; j< socialmedias.length; j++){ + let sociallink = document.createElement('a'); + sociallink.href = socialmedias[j].url; + let socialcontent = document.createElement('i'); + socialcontent.classList.add("fab", socialmedias[j].name); + sociallink.appendChild(socialcontent); + socialrow.appendChild(sociallink); + socialrow.innerHTML+=" "; + } + socialdiv.appendChild(socialrow); + // contact + let contactdiv = document.createElement('div'); + contactdiv.classList.add("col-md-auto", "footer-unten") + contactdiv.innerHTML="Hochschule für Technik Stuttgart"; + let rowdiv = document.createElement('div'); + rowdiv.classList.add("row"); + for(let i = 0; i<hft_links.length; i++){ + let coldiv = document.createElement('div'); + coldiv.classList.add("contactrow", "footer-unten"); + let collink = document.createElement('a'); + collink.innerHTML = hft_links[i].name; + collink.classList.add("contact-lower") + collink.href = hft_links[i].url; + coldiv.appendChild(collink) + rowdiv.appendChild(coldiv); + } + contactdiv.appendChild(rowdiv); + + containerdivrow.appendChild(bmbf); + containerdivrow.appendChild(m4labgrau); + containerdivrow.appendChild(socialdiv); + containerdivrow.appendChild(contactdiv); + + containerdiv.appendChild(containerdivrow); + footerdiv.appendChild(containerdiv); + document.body.appendChild(footerdiv); +} + +head(); +foot(); diff --git a/routes/methods.js b/routes/methods.js index ce0b1dccf2c35890a115084497a84ddaae20a292..9aee72adf7b7ce1282e819d34119117ef9304c22 100644 --- a/routes/methods.js +++ b/routes/methods.js @@ -42,14 +42,26 @@ var methods = { throw err }); } - // COMMIT - dbconn.user.commit(function(err) { + // MLAB-129: INSERT verification token + let verificationData = { + user_id: newUserId, + token: data.verificationToken + } + dbconn.user.query('INSERT INTO verification SET ?', verificationData, function (err, results, fields) { if (err) { return dbconn.user.rollback(function() { throw err }); } - }); + // COMMIT + dbconn.user.commit(function(err) { + if (err) { + return dbconn.user.rollback(function() { + throw err + }) + } + }) + }) }) }); }); @@ -70,7 +82,7 @@ var methods = { }); }, checkUserEmail: function(email, callback) { - var user; + let user; dbconn.user.query('SELECT id, email FROM user WHERE email = "' +email+'"', function (err, rows, fields) { if (err) { throw err; @@ -100,20 +112,20 @@ var methods = { } ); }, - updateUser: function(userData, callback) { - dbconn.user.query('UPDATE user SET ? WHERE email = "' +userData.email+'"', userData, function (err, rows, fields) { - if (err) throw err; - callback(err); + updateUserById: function(userData, callback) { + dbconn.user.query('UPDATE user SET ? WHERE id = ' +userData.id, userData, function (err, rows, fields) { + if (err) throw err + callback(err) }) }, updateCredential: function(data, callback) { dbconn.user.query('UPDATE credential SET ? WHERE user_id = ' +data.user_id, data, function (err, rows, fields) { - if (err) throw err; - callback(err); + if (err) throw err + callback(err) }) }, getUserIdByEmail: function(email, callback) { - var userId + let userId dbconn.user.query('SELECT id FROM user WHERE email = "' +email+'"', function (err, rows, fields) { if (err) { throw err; @@ -138,6 +150,57 @@ var methods = { callback(err); }) }, + // MLAB-129 + getVerificationTokenByUserId: function(userId, callback) { + let token + dbconn.user.query('SELECT token FROM verification WHERE user_id = "' +userId+'"', function (err, rows, fields) { + if (err) { + throw err + } + else { + if (rows.length > 0) { + token = rows[0].token + } + } + callback(token, err) + }) + }, + getUserIdByVerificationToken: function(token, callback) { + let userId + dbconn.user.query('SELECT user_id FROM verification WHERE token = "' +token+'"', function (err, rows, fields) { + if (err) { + throw err + } + else if(rows[0]) { + userId = rows[0].user_id + } + callback(userId, err) + }) + }, + verifyUserAccount: function(userData, callback) { + dbconn.user.beginTransaction(function(err) { // START TRANSACTION + if (err) { throw err } + // update user status + dbconn.user.query('UPDATE user SET ? WHERE id =' +userData.id, userData, function (err, rows, fields) { + if (err) { + return dbconn.user.rollback(function() { throw err }) + } + // delete verification token + dbconn.user.query('DELETE FROM verification WHERE user_id = '+userData.id, function (err, rows, fields) { + if (err) { + return dbconn.user.rollback(function() { throw err }) + } + // COMMIT + dbconn.user.commit(function(err) { + if (err) { + return dbconn.user.rollback(function() { throw err }) + } + }) + }) + }) + callback(err) + }) + }, // ======================= project db ======================= getAllProjects: function(callback) { dbconn.project.query('CALL getAllprojects', function (err, rows, fields){ diff --git a/routes/routes-account.js b/routes/routes-account.js index 43394cac613791892e2b9bb950a3b827ec394e3a..b2118190c8e0cc1dc101f2ea05ef31d907b1120c 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -142,10 +142,18 @@ module.exports = function (app, config, passport, i18n) { if (req.isAuthenticated()) { methods.getUserByEmail(req.user.email, function(data, err){ if (!err) { - res.render(lang+'/account/profile', { - user: data, - email: req.user.email - }); + if (data.verificationStatus == 1) { + console.log(data) + res.render(lang+'/account/profile', { + user: data, + email: req.user.email + }) + } + else { + res.render(lang+'/account/home', { + user: data + }); + } } }) } else { @@ -155,63 +163,74 @@ module.exports = function (app, config, passport, i18n) { app.get('/services', function (req, res) { if (req.isAuthenticated()) { - async.waterfall([ - // get userId by email from userdb - function(done) { - methods.getUserIdByEmail(req.user.email, function(userId, err) { - if (!err) { - done(err, userId) - } - }) - }, - // get user-project-role from userdb - function(userId, done) { - methods.getUserProjectRole(userId, function(userProjects, err) { - if (!err) { - done(err, userProjects) - } - }) - }, - // get all projects from projectdb - function(userProjects, done) { - methods.getAllProjects(function(projectsOverview, err) { - if (!err) { - done(err, userProjects, projectsOverview) - } - }) - }, - // create JSON object of projects and user status for front-end - function(userProjects, projectsOverview, done) { - var allProjects = [] // JSON object - - var userProjectId = [] // array of user's project_id - for (var i = 0; i < userProjects.length; i++) { - userProjectId.push(userProjects[i].project_id) + methods.getUserByEmail(req.user.email, function(data, err){ + if (!err) { + if (data.verificationStatus == 1) { + async.waterfall([ + // get userId by email from userdb + function(done) { + methods.getUserIdByEmail(req.user.email, function(userId, err) { + if (!err) { + done(err, userId) + } + }) + }, + // get user-project-role from userdb + function(userId, done) { + methods.getUserProjectRole(userId, function(userProjects, err) { + if (!err) { + done(err, userProjects) + } + }) + }, + // get all projects from projectdb + function(userProjects, done) { + methods.getAllProjects(function(projectsOverview, err) { + if (!err) { + done(err, userProjects, projectsOverview) + } + }) + }, + // create JSON object of projects and user status for front-end + function(userProjects, projectsOverview, done) { + var allProjects = [] // JSON object + + var userProjectId = [] // array of user's project_id + for (var i = 0; i < userProjects.length; i++) { + userProjectId.push(userProjects[i].project_id) + } + + for (var i = 0; i < projectsOverview.length; i++) { + // check if projectId is exist in userProjectId[] + var status = false + if (userProjectId.indexOf(projectsOverview[i].id) > -1) { + status = true + } + // add data to JSON object + allProjects.push({ + id: projectsOverview[i].id, + title: projectsOverview[i].title, + summary: projectsOverview[i].onelinesummary, + cp: projectsOverview[i].contact_email, + userStatus: status + }); + } + + // render the page + res.render(lang+'/account/services', { + user: data, + project: allProjects + }); + } + ]) } - - for (var i = 0; i < projectsOverview.length; i++) { - // check if projectId is exist in userProjectId[] - var status = false - if (userProjectId.indexOf(projectsOverview[i].id) > -1) { - status = true - } - // add data to JSON object - allProjects.push({ - id: projectsOverview[i].id, - title: projectsOverview[i].title, - summary: projectsOverview[i].onelinesummary, - cp: projectsOverview[i].contact_email, - userStatus: status + else { + res.render(lang+'/account/home', { + user: data }); } - - // render the page - res.render(lang+'/account/services', { - user: req.user, - project: allProjects - }); } - ]) + }) } else { res.redirect('/login'); } @@ -219,9 +238,21 @@ module.exports = function (app, config, passport, i18n) { app.get('/security', function (req, res) { if (req.isAuthenticated()) { - res.render(lang+'/account/security', { - user: req.user // useful for view engine, useless for HTML - }); + methods.getUserByEmail(req.user.email, function(data, err){ + if (!err) { + if (data.verificationStatus == 1) { + console.log(data) + res.render(lang+'/account/security', { + user: data + }) + } + else { + res.render(lang+'/account/home', { + user: data + }); + } + } + }) } else { res.redirect('/login'); } @@ -345,6 +376,76 @@ module.exports = function (app, config, passport, i18n) { }); }); + // =========== MLAB-129 ======== + app.get("/verifyAccount", function(req, res){ + methods.getUserIdByVerificationToken(req.query.token, function(userId, err){ + console.log(err) + console.log(userId) + if (userId) { + let userData = { + id: userId, + verificationStatus: 1 + } + methods.verifyUserAccount(userData, function(err){ + if (err) { + res.send("Failed to verify your account. Please try again. https://transfer.hft-stuttgart.de") + // todo: create a page for this. copy the template from error page. + } + else { + res.send("email verified.\n\nhttps://transfer.hft-stuttgart.de") + // todo: create a page for this. copy the template from error page. + } + }) + } + else { + res.send("Your account is not found.\n\nhttps://transfer.hft-stuttgart.de") + // todo: create a page for this. copy the template from error page. + } + }) + }) + + app.get("/resendVerificationEmail", function(req, res){ + if (req.isAuthenticated()) { + var emailAddress = req.user.email + + methods.getUserIdByEmail(req.user.email, function(userId, err) { + if (!err) { + // get token + methods.getVerificationTokenByUserId(userId, function(token, err){ + if (!err) { + if (token) { + // send email + var emailSubject = "Verify Your M4_LAB Account"; // todo: translate to DE + var emailContent = "Lieber Nutzer,\n\n"+ + "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart. "+ + "\nUm Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+ + "\n\nOhne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+mailSignature + + mailer.options.to = emailAddress; + mailer.options.subject = emailSubject; + mailer.options.text = emailContent; + mailer.transport.sendMail(mailer.options, function(err) { + if (err) { + console.log('cannot send email') + throw err + } + }) + res.send(true) + } + else { + res.send(false) + } + } + else { + console.log(err) + } + }) + } + }) + } + }) + // =================== + app.post('/forgotPwd', function(req, res, next) { //methods.currentDate(); @@ -474,16 +575,11 @@ module.exports = function (app, config, passport, i18n) { }); - // todo: user registration with captcha app.get('/registration', function(req, res) { res.render(lang+'/account/registration') }) app.post('/registration', function(req, res) { - // TODO: - // create gitlab account? - // send email to activate profile? - // user data var curDate = new Date() var userData = { @@ -497,14 +593,30 @@ module.exports = function (app, config, passport, i18n) { speciality: req.body.inputSpeciality, createdDate: curDate.toISOString().slice(0,10) } - // encrypt password - bcrypt.genSalt(saltRounds, function(err, salt) { - bcrypt.hash(req.body.inputPassword, salt, function(err, hash) { - // create account - var newAccount = { - profile: userData, - password: hash - } + + async.waterfall([ + // token + function(done) { + crypto.randomBytes(20, function(err, buf) { + var token = buf.toString('hex'); + done(err, token); + }); + }, + // encrypt password + function(token, done) { + bcrypt.genSalt(saltRounds, function(err, salt) { + bcrypt.hash(req.body.inputPassword, salt, function(err, hash) { + var newAccount = { + profile: userData, + password: hash, + verificationToken: token + } + done(err, newAccount) + }); + }); + }, + // save data + function(newAccount, err) { methods.registerNewUser(newAccount, function(err){ if (err) { //req.flash('error', "Failed") @@ -516,8 +628,8 @@ module.exports = function (app, config, passport, i18n) { } res.redirect('/account/registration'); }) - }); - }); + } + ]) }) app.get('/email/:email', function(req, res) { diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index 7f7ace746184593c8f24397859a70ac599c8a5f9..cf284f1a8fbcdf44738a476eed250a09357ff7c0 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -8,34 +8,43 @@ html(lang="de") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") - div(class="row min-vh-100 flex-column flex-md-row") - aside(class="col-12 col-md-3 p-0 flex-shrink-1") - nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") - div(class="collapse navbar-collapse") - ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") - li(class="nav-item") - a(class="nav-link pl-0 text-nowrap" href="#") - span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} - li(class="nav-item") - a(class="nav-link pl-0" href="/profile") - i(class="fa fa-user fa-fw") - span(class="d-none d-md-inline") Benutzerprofil - li(class="nav-item") - a(class="nav-link pl-0" href="/security") - i(class="fa fa-lock fa-fw") - span(class="d-none d-md-inline") Sicherheitseinstellungen - li(class="nav-item") - a(class="nav-link pl-0" href="/services") - i(class="fa fa-tasks fa-fw") - span(class="d-none d-md-inline") Projekte und Dienste - li(class="nav-item") - a(class="nav-link pl-0" href="/logout" style="color:red;") - i(class="fa fa-sign-out-alt fa-fw") - span(class="d-none d-md-inline") Logout - main(class="col bg-faded py-3 flex-grow-1") - p Willkommen im Benutzerkonto-Bereich des HFT Transferportals - p In diesem Bereich können Sie Ihr Benutzerkonto pflegen.<br/> Dazu finden Sie auf der linken Seite verschiedene Menüs. - p Bei Rückfragen kontaktieren Sie uns bitte unter: <a href="mailto:support-transfer@hft-stuttgart.de">support-transfer@hft-stuttgart.de</a> + if user.verificationStatus == 0 + div.alert.alert-warning.alert-dismissible + | Willkommen im Benutzerkonto-Bereich des HFT Transferportals + | <br/><br/> + | Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts. + | Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner. + | <br >Falls Sie keine E-Mail von uns erhalten haben, können Sie <a href="javascript:void(0);" onclick="verify();">diese hier</a> erneut anfordern. + div(class="spinner-border text-secondary", role="status", style="display: none") + else + div(class="row min-vh-100 flex-column flex-md-row") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") + nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") + div(class="collapse navbar-collapse") + ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") + li(class="nav-item") + a(class="nav-link pl-0 text-nowrap" href="#") + span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + li(class="nav-item") + a(class="nav-link pl-0" href="/profile") + i(class="fa fa-user fa-fw") + span(class="d-none d-md-inline") Benutzerprofil + li(class="nav-item") + a(class="nav-link pl-0" href="/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen + li(class="nav-item") + a(class="nav-link pl-0" href="/services") + i(class="fa fa-tasks fa-fw") + span(class="d-none d-md-inline") Projekte und Dienste + li(class="nav-item") + a(class="nav-link pl-0" href="/logout" style="color:red;") + i(class="fa fa-sign-out-alt fa-fw") + span(class="d-none d-md-inline") Logout + main(class="col bg-faded py-3 flex-grow-1") + p Willkommen im Benutzerkonto-Bereich des HFT Transferportals + p In diesem Bereich können Sie Ihr Benutzerkonto pflegen.<br/> Dazu finden Sie auf der linken Seite verschiedene Menüs. + p Bei Rückfragen kontaktieren Sie uns bitte unter: <a href="mailto:support-transfer@hft-stuttgart.de">support-transfer@hft-stuttgart.de</a> // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") @@ -43,4 +52,25 @@ html(lang="de") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB - script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") \ No newline at end of file + script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") + script. + // call verifyAccount + function verify() { + $(".spinner-border").show() + $.get( "/resendVerificationEmail", function( data ) { + console.log(data) + if (data) { + alert( "Email sent!" ) + } + else { + alert("Please contact support-transfer@hft-stuttgart.de to verify your account.") + } + }) + .fail(function() { + alert( "Something went wrong. Please try again." ) // todo: to DE + }) + .always(function() { + $(".spinner-border").hide() + }) + + } \ No newline at end of file diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index f6e800f66e011a600ac38cecd39257a876053bf2..c69b3479e2fc89e6acfd72eb1e73944d47c4dd83 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -33,11 +33,6 @@ html(lang="de") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") - if user.verificationStatus == 0 - div.alert.alert-warning.alert-dismissible - | Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts. - | Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner. - | <br >Falls Sie keine E-Mail von uns erhalten haben, können Sie <a href="#">diese hier</a> erneut anfordern. if successes for success in successes div.alert.alert-success.alert-dismissible #{ success } @@ -50,7 +45,7 @@ html(lang="de") 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) + select#inputSalutation(name="inputSalutation", class="form-control", value=user.salutation) option(value="") - Anrede - option(value="Herr") Herr option(value="Frau") Frau diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug index bc20963b8fca3b3ef68d23d2a45bb2df311399c6..16b9458acc3873ac1e818716938ede792897d59c 100644 --- a/views/DE/account/security.pug +++ b/views/DE/account/security.pug @@ -19,7 +19,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/") - span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} + span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} li(class="nav-item") a(class="nav-link pl-0" href="/profile") i(class="fa fa-user fa-fw") @@ -64,7 +64,7 @@ html(lang="de") span#message div(class="invalid-feedback") Bitte füllen Sie dieses Feld aus. input#updateBtn(type="submit", class="btn btn-primary", value="Passwort ändern" disabled) - + // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index f3aad9ce009775f6d9896063584725d1c59ad633..e1b658876c3ab3c7a7a70bbb4694dbb3ecfbe576 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -15,7 +15,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/") - span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} + span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} li(class="nav-item") a(class="nav-link pl-0" href="/profile") i(class="fa fa-user fa-fw") diff --git a/views/DE/account/verification.pug b/views/DE/account/verification.pug new file mode 100644 index 0000000000000000000000000000000000000000..457823d2e6e153893f47bf860e1b26c20f633bc6 --- /dev/null +++ b/views/DE/account/verification.pug @@ -0,0 +1,32 @@ +doctype html +html(lang="de") + head + title= "404 - Page not found" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + style. + .container { + height: 400px; + position: relative; + } + .center { + margin: 0; + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + } + body + div(class="container") + div(class="center", align="center") + a(href="https://m4lab.hft-stuttgart.de") + img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192") + br + br + p(class="h5") 404. The requested URL was not found. + // success: email verified + // failed: Failed to verify your account. Please try again. + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") \ No newline at end of file