diff --git a/app.js b/app.js index bcbbfbfea641c144798b6d65c147f34e033622e8..debd5c3632871c1bc29c6cf4dce6fec8abff6a60 100644 --- a/app.js +++ b/app.js @@ -9,6 +9,10 @@ const session = require('express-session'); const errorhandler = require('errorhandler'); const flash = require('express-flash'); const i18n = require('i18n'); // internationalization +i18n.configure({ + locales:['de', 'en'], + directory: './locales' +}); var env = process.env.NODE_ENV || 'development'; const config = require('./config/config')[env]; @@ -24,6 +28,12 @@ app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: false})); app.use(express.static(path.join(__dirname, 'public'))); +app.use(i18n.init); +app.use((req, res, next) => { + res.setLocale('de'); + next(); +}); + app.use(session( { resave: true, @@ -48,14 +58,9 @@ app.use(function(req, res, next) { next(); }); -// internationalization (i18n) -i18n.configure({ - locales:['de', 'en'], - directory: './locales' -}); -app.use(i18n.init); - -require('./routes/routes')(app, config, passport, i18n); +//require('./routes/routes')(app, config, passport, i18n); +require('./routes/routes-account')(app, config, passport, i18n); +require('./routes/routes-project')(app, config, passport); //require('./routes/dbconn')(app, config); require('./routes/api')(app, config, passport); diff --git a/public/js/jquery-ui/i18n/datepicker-de.js b/public/js/jquery-ui/i18n/datepicker-de.js new file mode 100644 index 0000000000000000000000000000000000000000..e2e61d27b6b4bf33c0fd59e9ebf2d307d0337af3 --- /dev/null +++ b/public/js/jquery-ui/i18n/datepicker-de.js @@ -0,0 +1,37 @@ +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +( function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}( function( datepicker ) { + +datepicker.regional.de = { + closeText: "Schließen", + prevText: "<Zurück", + nextText: "Vor>", + currentText: "Heute", + monthNames: [ "Januar","Februar","März","April","Mai","Juni", + "Juli","August","September","Oktober","November","Dezember" ], + monthNamesShort: [ "Jan","Feb","Mär","Apr","Mai","Jun", + "Jul","Aug","Sep","Okt","Nov","Dez" ], + dayNames: [ "Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag" ], + dayNamesShort: [ "So","Mo","Di","Mi","Do","Fr","Sa" ], + dayNamesMin: [ "So","Mo","Di","Mi","Do","Fr","Sa" ], + weekHeader: "KW", + dateFormat: "dd.mm.yy", + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: "" }; +datepicker.setDefaults( datepicker.regional.de ); + +return datepicker.regional.de; + +} ) ); \ No newline at end of file diff --git a/routes/mailer.js b/routes/mailer.js new file mode 100644 index 0000000000000000000000000000000000000000..510b5bb1d11e075f446cdf19b8a954411025ee38 --- /dev/null +++ b/routes/mailer.js @@ -0,0 +1,31 @@ +const nodemailer = require('nodemailer') + +var env = process.env.NODE_ENV || 'development'; +const config = require('../config/config')[env] + +var smtpTransport = nodemailer.createTransport({ + host: config.mailer.host, + secureConnection: config.mailer.secureConnection, + port: config.mailer.port, + auth: { + user: config.mailer.authUser, + pass: config.mailer.authPass + }, + tls: { + ciphers: config.mailer.tlsCiphers + } +}); + +var mailOptions = { + to: "", + from: config.mailer.from, + subject: "", + text: "" +}; + +var mailer = { + transport: smtpTransport, + options: mailOptions +} + +module.exports = mailer \ No newline at end of file diff --git a/routes/routes.js b/routes/routes-account.js similarity index 74% rename from routes/routes.js rename to routes/routes-account.js index febd0ccc73be9203e6d64f33841f5d3529a3dcd8..edba628a284d1302dc4af590ae0f4c14bfde4e9e 100644 --- a/routes/routes.js +++ b/routes/routes-account.js @@ -9,7 +9,7 @@ const salt = 64; // salt length // forgot pwd const async = require('async') const crypto = require('crypto') -const nodemailer = require('nodemailer') +const mailer = require('./mailer') module.exports = function (app, config, passport, i18n) { @@ -74,28 +74,17 @@ module.exports = function (app, config, passport, i18n) { res.status(200).send(spMetadata); } ); - - // ======== NODEMAILER ==================== - var smtpTransport = nodemailer.createTransport({ - host: config.mailer.host, - secureConnection: config.mailer.secureConnection, - port: config.mailer.port, - auth: { - user: config.mailer.authUser, - pass: config.mailer.authPass - }, - tls: { - ciphers: config.mailer.tlsCiphers - } + + // ================ test i18n ================== + i18n.setLocale('de'); + app.get('/de', function(req, res) { + var greeting = i18n.__('Hello World') + res.send(greeting) }); - var mailOptions = { - to: "", - from: config.mailer.from, - subject: "", - text: "" - }; + var lang = 'DE' + // ======== APP ROUTES - ACCOUNT ==================== var updatePasswordMailSubject = "Ihr Passwort für das Transferportal wurde gespeichert." var mailSignature = "Mit den besten Grüßen,\ndas Transferportal-Team der HFT Stuttgart\n\n"+ "Transferportal der Hochschule für Technik Stuttgart\n"+ @@ -104,17 +93,7 @@ module.exports = function (app, config, passport, i18n) { "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 ================== - i18n.setLocale('de'); - app.get('/de', function(req, res) { - var greeting = i18n.__('Hello World') - res.send(greeting) - }); - - var lang = 'DE' - // ======== APP ROUTES - ACCOUNT ==================== app.get('/', function (req, res) { if (req.isAuthenticated()) { methods.getUserByEmail(req.user.email, function(data, err){ @@ -332,11 +311,11 @@ module.exports = function (app, config, passport, i18n) { else { //req.flash('success', "Pasword updated!") req.flash('success', "Passwort aktualisiert!") - mailOptions.to = req.user.email + mailer.options.to = req.user.email //mailOptions.subject = "Your M4_LAB Password has been updated." - mailOptions.subject = updatePasswordMailSubject - mailOptions.text = updatePasswordMailContent - smtpTransport.sendMail(mailOptions, function(err) { + mailer.options.subject = updatePasswordMailSubject + mailer.options.text = updatePasswordMailContent + mailer.transport.sendMail(mailer.options, function(err) { if (err) { console.log(err) } @@ -407,10 +386,10 @@ module.exports = function (app, config, passport, i18n) { }); // send email - mailOptions.to = emailAddress; - mailOptions.subject = emailSubject; - mailOptions.text = emailContent; - smtpTransport.sendMail(mailOptions, function(err) { + mailer.options.to = emailAddress; + mailer.options.subject = emailSubject; + mailer.options.text = emailContent; + mailer.transport.sendMail(mailer.options, function(err) { done(err, 'done'); }); } @@ -470,10 +449,10 @@ module.exports = function (app, config, passport, i18n) { //req.flash('success', "Your pasword has been updated.") req.flash('success', "Passwort aktualisiert!") // send notifiaction email - mailOptions.to = user.email - mailOptions.subject = updatePasswordMailSubject - mailOptions.text = updatePasswordMailContent - smtpTransport.sendMail(mailOptions, function(err) { + mailer.options.to = user.email + mailer.options.subject = updatePasswordMailSubject + mailer.options.text = updatePasswordMailContent + mailer.transport.sendMail(mailer.options, function(err) { if (err) { console.log(err) } @@ -551,146 +530,5 @@ module.exports = function (app, config, passport, i18n) { } }) }) - app.get('/mailinglists', function (req, res) { - async.waterfall([ - function(done) { - methods.getAllMailinglists(function(mailinglistOverview, err) { - if (!err) { - done(err, mailinglistOverview) - } - }) - }, - // create JSON object of mailinglists for front-end - function(mailinglistOverview, done) { - var allMailingLists = [] // JSON object - for (let i = 0; i < mailinglistOverview.length; i++) { - // add data to JSON object - allMailingLists.push({ - id: mailinglistOverview[i].id, - name: mailinglistOverview[i].name, - src: mailinglistOverview[i].src, - projectstatus: mailinglistOverview[i].projectstatus, - project_title: mailinglistOverview[i].project_title - }); - } - - res.render(lang+'/mailinglists', { - isUserAuthenticated: req.isAuthenticated(), - user: req.user, - mailinglists: allMailingLists - }); - } - ]) - }); - - // ======== APP ROUTES - PROJECT ==================== - app.get('/project', function (req, res) { - async.waterfall([ - // get all projects from projectdb - function(done) { - methods.getAllProjects(function(projectsOverview, err) { - if (!err) { - done(err, projectsOverview) - } - }) - }, - // create JSON object for front-end - function(projectsOverview, done) { - var activeProjects = [] - var nonActiveProjects = [] - - for (var i = 0; i < projectsOverview.length; i++) { - var project = { - id: projectsOverview[i].id, - logo: projectsOverview[i].logo, - akronym: projectsOverview[i].pname, - title: projectsOverview[i].title, - summary: projectsOverview[i].onelinesummary, - category: projectsOverview[i].category, - cp: projectsOverview[i].contact_email, - gitlab: projectsOverview[i].gitlab - } - if (projectsOverview[i].projectstatus == 0) { - nonActiveProjects.push(project) - } - else if (projectsOverview[i].projectstatus == 1) { - activeProjects.push(project) - } - } - - // render the page - if (req.isAuthenticated()) { - res.render(lang+'/project/projects', { - isUserAuthenticated: true, - nonActive: nonActiveProjects, - active: activeProjects - }); - } - else { - res.render(lang+'/project/projects', { - isUserAuthenticated: false, - nonActive: nonActiveProjects, - active: activeProjects - }); - } - } - ]) - }) - - app.get('/addprojectoverview', function (req, res) { - if (req.isAuthenticated()) { - res.render(lang+'/project/addProjectOverview') - } - else { - res.redirect('/account/login') - } - }) - - app.post('/addprojectoverview', function (req, res) { - if (req.isAuthenticated()) { - var wiki = 0 - if (req.body.wiki) - wiki = 1 - - var projectOverviewData = { - pname: req.body.pname, - title: req.body.title, - onelinesummary: req.body.summary, - category: req.body.category, - logo: req.body.logo, - gitlab: req.body.gitlabURL, - wiki: wiki, - overview: req.body.overview, - question: req.body.question, - approach: req.body.approach, - result: req.body.result, - keywords: req.body.keywords, - announcement: req.body.announcement, - term: req.body.term, - further_details: req.body.furtherDetails, - website: req.body.website, - src: req.body.src, - caption: req.body.caption, - contact_firstname: req.body.contactFirstname, - contact_lastname: req.body.contactLastname, - contact_email: req.body.contactEmail, - leader_firstname: req.body.leaderFirstname, - leader_lastname: req.body.leaderLastname, - leader_email: req.body.leaderEmail - } - - methods.addProjectOverview(projectOverviewData, function(err){ - if (err) { - //req.flash('error', "Failed") - req.flash('error', "Fehlgeschlagen") - res.redirect('/account/addProjectOverview'); - } - else { - req.flash('success', 'Your project has been created.') - res.redirect('/account/project'); - } - }) - } - }) }; \ No newline at end of file diff --git a/routes/routes-project.js b/routes/routes-project.js new file mode 100644 index 0000000000000000000000000000000000000000..6b8ac371b0eb983b000f9f9e0e806adcfc96c5aa --- /dev/null +++ b/routes/routes-project.js @@ -0,0 +1,157 @@ +const methods = require('./methods') +const async = require('async') + +module.exports = function (app) { + + // ======== APP ROUTES - PROJECT ==================== + var lang = 'DE' + + app.get('/mailinglists', function (req, res) { + async.waterfall([ + function(done) { + methods.getAllMailinglists(function(mailinglistOverview, err) { + if (!err) { + done(err, mailinglistOverview) + } + }) + }, + // create JSON object of mailinglists for front-end + function(mailinglistOverview, done) { + var allMailingLists = [] // JSON object + for (let i = 0; i < mailinglistOverview.length; i++) { + // add data to JSON object + allMailingLists.push({ + id: mailinglistOverview[i].id, + name: mailinglistOverview[i].name, + src: mailinglistOverview[i].src, + projectstatus: mailinglistOverview[i].projectstatus, + project_title: mailinglistOverview[i].project_title + }); + } + + res.render(lang+'/project/mailinglists', { + isUserAuthenticated: req.isAuthenticated(), + user: req.user, + mailinglists: allMailingLists + }); + } + ]) + }); + + app.get('/project', function (req, res) { + async.waterfall([ + // get all projects from projectdb + function(done) { + methods.getAllProjects(function(projectsOverview, err) { + if (!err) { + done(err, projectsOverview) + } + }) + }, + // create JSON object for front-end + function(projectsOverview, done) { + var activeProjects = [] + var nonActiveProjects = [] + + for (var i = 0; i < projectsOverview.length; i++) { + var project = { + id: projectsOverview[i].id, + logo: projectsOverview[i].logo, + akronym: projectsOverview[i].pname, + title: projectsOverview[i].title, + summary: projectsOverview[i].onelinesummary, + category: projectsOverview[i].category, + cp: projectsOverview[i].contact_email, + gitlab: projectsOverview[i].gitlab + } + if (projectsOverview[i].projectstatus == 0) { + nonActiveProjects.push(project) + } + else if (projectsOverview[i].projectstatus == 1) { + activeProjects.push(project) + } + } + + // render the page + if (req.isAuthenticated()) { + res.render(lang+'/project/projects', { + isUserAuthenticated: true, + nonActive: nonActiveProjects, + active: activeProjects + }); + } + else { + res.render(lang+'/project/projects', { + isUserAuthenticated: false, + nonActive: nonActiveProjects, + active: activeProjects + }); + } + } + ]) + }) + + app.get('/addprojectoverview', function (req, res) { + if (req.isAuthenticated()) { + res.render(lang+'/project/addProjectOverview') + } + else { + res.redirect('/login') + } + }) + + app.post('/addprojectoverview', function (req, res) { + if (req.isAuthenticated()) { + var wiki = 0 + if (req.body.wiki) + wiki = 1 + + var projectTerm = req.body.termForm + " - " + req.body.termTo + var projectOverviewData = { + pname: req.body.pname, + title: req.body.title, + onelinesummary: req.body.summary, + category: req.body.category, + logo: req.body.logo, + gitlab: req.body.gitlabURL, + wiki: wiki, + overview: req.body.overview, + question: req.body.question, + approach: req.body.approach, + result: req.body.result, + keywords: req.body.keywords, + announcement: req.body.announcement, + term: projectTerm, + further_details: req.body.furtherDetails, + website: req.body.website, + src: req.body.src, + caption: req.body.caption, + contact_lastname: req.body.contactName, + contact_email: req.body.contactEmail, + leader_lastname: req.body.leaderName, + leader_email: req.body.leaderEmail + } + + methods.addProjectOverview(projectOverviewData, function(err){ + if (err) { + //req.flash('error', "Failed") + req.flash('error', "Fehlgeschlagen") + res.redirect('/addProjectOverview'); + } + else { + req.flash('success', 'Your project has been created.') + res.redirect('/project'); + } + }) + } + }) + + app.get('/updateprojectoverview', function (req, res) { + // only their own project + }) + + app.post('/updateprojectoverview', function (req, res) { + // only their own project + }) + +}; \ No newline at end of file diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index f08d9ee7937aee1b391b8cfd40bbb004173df5d6..58b2427c3063a835f93a8be4ad87515929121978 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -34,9 +34,9 @@ html(lang="de") h5 span #{user.firstname} #{user.lastname} 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="/account/security" aria-selected="false") Sicherheitseinstellungen - a(class="nav-link" href="/account/services" aria-selected="false") Projekte und Dienste + a(class="nav-link" href="/profile" aria-selected="true") Benutzerprofil + a(class="nav-link" href="/security" aria-selected="false") Sicherheitseinstellungen + a(class="nav-link" href="/services" aria-selected="false") Projekte und Dienste div(class="col-sm-9") p content goes here diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index e4d7e2609827baefef68378e4b42cdd06b84d8f9..32a2aff116c487f82b6c6b2bd6d50637c5cedd2f 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -35,8 +35,8 @@ html(lang="de") span #{user.firstname} #{user.lastname} 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="/account/security" aria-selected="false") Sicherheitseinstellungen - a(class="nav-link" href="/account/services" aria-selected="false") Projekte und Dienste + a(class="nav-link" href="/security" aria-selected="false") Sicherheitseinstellungen + a(class="nav-link" href="/services" aria-selected="false") Projekte und Dienste div(class="col-sm-9") if successes for success in successes diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug index 6db09112136b41451ea1fd381e768d36282626f3..560d32bc554c360f2cc32783f4aeda33b546d0fe 100644 --- a/views/DE/account/security.pug +++ b/views/DE/account/security.pug @@ -37,9 +37,9 @@ html(lang="de") h5 span #{user.firstName} #{user.lastName} 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="/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") if successes for success in successes diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index 6ab101f30c8da9f6c5b53d526af7c4dd8178936b..55f5a1b66458fb86a0bd9a6e2069da57a4d370ea 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -34,8 +34,8 @@ html(lang="de") h5 span #{user.firstName} #{user.lastName} 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="/account/security" aria-selected="false") Sicherheitseinstellungen + a(class="nav-link" href="/profile" aria-selected="true") Benutzerprofil + a(class="nav-link" href="/security" aria-selected="false") Sicherheitseinstellungen a(class="nav-link" href="#" aria-selected="false") Projekte und Dienste div(class="col-sm-9") if successes diff --git a/views/DE/project/addProjectOverview.pug b/views/DE/project/addProjectOverview.pug index 7b40b54fc63b3d774caf8d0b8af272f4e3a554ce..87e5d469f911e3f692354433708cbbbf9c3c4787 100644 --- a/views/DE/project/addProjectOverview.pug +++ b/views/DE/project/addProjectOverview.pug @@ -6,6 +6,8 @@ html(lang="de") 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") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + // jQuery UI - Datepicker + link(rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css") style. .collapse { display: none; @@ -49,8 +51,13 @@ html(lang="de") input#inputTitle(name="title" class="form-control" type="text" placeholder="official title of the project*" required) div(class="form-group col-md-12") input#inputSummary(name="summary" class="form-control" type="text" placeholder="one line summary of the project") - div(class="form-group col-md-12") - input#inputCategory(name="category" class="form-control" type="text" placeholder="category of the project") + div(class='form-group col-md-12') + select#inputCategory(name="category", class="form-control") + option(value="") - select a category - + option(value="Experten-Gruppe") Experten-Gruppe + option(value="Student-Projekt") Student-Projekt + option(value="Lehr Projekt") Lehr Projekt + option(value="Transfer-projekt") Transfer-projekt div(class="form-group col-md-12") input#inputLogo(name="logo" class="form-control" type="text" placeholder="official logo of the project") div(class="form-group col-md-12") @@ -64,13 +71,13 @@ html(lang="de") h5(class="mb-3 font-weight-bold") Content div(class='form-row') div(class='form-group col-md-12') - textarea#inputOverview(name="overview" class="form-control" type="text" rows="5" placeholder="overview") + textarea#inputOverview(name="overview" class="form-control" type="text" rows="5" placeholder="Projektüberblick") div(class="form-group col-md-12") - textarea#inputQuestion(name="question" class="form-control" type="text" rows="5" placeholder="question") + textarea#inputQuestion(name="question" class="form-control" type="text" rows="5" placeholder="Fragestellung") div(class='form-group col-md-12') - textarea#inputApproach(name="approach" class="form-control" type="text" rows="5" placeholder="approach") + textarea#inputApproach(name="approach" class="form-control" type="text" rows="5" placeholder="Vorgehensweise") div(class="form-group col-md-12") - textarea#inputResult(name="result" class="form-control" type="text" rows="5" placeholder="result") + textarea#inputResult(name="result" class="form-control" type="text" rows="5" placeholder="Ergebnis und Nutzung") div(class="form-group col-md-12") input#inputKeywords(name="keywords" class="form-control" type="text" placeholder="keywords") h5(class="mb-3 font-weight-bold") Info @@ -78,7 +85,13 @@ html(lang="de") div(class='form-group col-md-12') textarea#inputAnnouncement(name="announcement" class="form-control" type="text" rows="5" placeholder="Ausschreibung") div(class="form-group col-md-12") - input#inputTerm(name="term" class="form-control" type="text" placeholder="Laufzeit") + div(class='form-row') + div(class="form-group col-md-2") + <p class="font-weight-normal">Laufzeit</p> + div(class="form-group col-md-5") + input#inputTermFrom(name="termForm" class="form-control" type="text" placeholder="von (dd.mm.yyyy)") + div(class="form-group col-md-5") + input#inputTermTo(name="termTo" class="form-control" type="text" placeholder="bis (dd.mm.yyyy)") div(class='form-group col-md-12') textarea#inputFurtherDetails(name="furtherDetails" class="form-control" type="text" rows="5" placeholder="Mehr informationen") div(class="form-group col-md-12") @@ -89,27 +102,37 @@ html(lang="de") input#inputSrc(name="src" class="form-control" type="text" placeholder="link to the image source") div(class="form-group col-md-12") input#inputCaption(name="caption" class="form-control" type="text" placeholder="caption of the image") - h5(class="mb-3 font-weight-bold") Contact + h5(class="mb-3 font-weight-bold") Kontakt div(class='form-row') - div(class="form-group col-md-4") - input#inputContactFirstname(name="contactFirstname" class="form-control" type="text" placeholder="contact firstname") - div(class="form-group col-md-4") - input#inputContactLastname(name="contactLastname" class="form-control" type="text" placeholder="contact lastname") - div(class="form-group col-md-4") - input#inputContactEmail(name="contactEmail" class="form-control" type="email" placeholder="contact email") - div(class="form-group col-md-4") - input#inputLeaderFirstname(name="leaderFirstname" class="form-control" type="text" placeholder="leader firstname") - div(class="form-group col-md-4") - input#inputLeaderLastname(name="leaderLastname" class="form-control" type="text" placeholder="leader lastname") - div(class="form-group col-md-4") - input#inputLeaderEmail(name="leaderEmail" class="form-control" type="email" placeholder="leader email") + div(class="form-group col-md-2") + <p class="font-weight-normal">Ansprechpartner</p> + div(class="form-group col-md-5") + input#inputContactName(name="contactName" class="form-control" type="text" placeholder="Titel/Anrede Vorname Nachname") + div(class="form-group col-md-5") + input#inputContactEmail(name="contactEmail" class="form-control" type="email" placeholder="E-mail Adresse") + div(class="form-group col-md-2") + <p class="font-weight-normal">Projektleitung</p> + div(class="form-group col-md-5") + input#inputLeaderName(name="leaderName" class="form-control" type="text" placeholder="Titel/Anrede Vorname Nachname") + div(class="form-group col-md-5") + input#inputLeaderEmail(name="leaderEmail" class="form-control" type="email" placeholder="E-mail Adresse") p <em><small>* Pflichtfeld</small></em> input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Projekt Anlegen") // 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") + // jQuery UI - Datepicker + script(src="https://code.jquery.com/ui/1.12.1/jquery-ui.js") + script(src="/js/jquery-ui/i18n/datepicker-de.js") + //script(src="i18n/datepicker-de.js") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // Header - script(src="/js/headfootLogout.js") \ No newline at end of file + script(src="/js/headfootLogout.js") + script. + $( function() { + $.datepicker.setDefaults( $.datepicker.regional["de"] ); + $("#inputTermFrom").datepicker(); + $("#inputTermTo").datepicker(); + }); \ No newline at end of file diff --git a/views/DE/mailinglists.pug b/views/DE/project/mailinglists.pug similarity index 100% rename from views/DE/mailinglists.pug rename to views/DE/project/mailinglists.pug diff --git a/views/EN/forgotPwd.pug b/views/EN/account/forgotPwd.pug similarity index 100% rename from views/EN/forgotPwd.pug rename to views/EN/account/forgotPwd.pug diff --git a/views/EN/home.pug b/views/EN/account/home.pug similarity index 84% rename from views/EN/home.pug rename to views/EN/account/home.pug index 050c1bf95537299dbeffb3fe7aa11d337547c4ae..d2f3875a5a831fde499fae7baddb5acfbd47e34d 100644 --- a/views/EN/home.pug +++ b/views/EN/account/home.pug @@ -32,11 +32,11 @@ html(lang="en") div(class="row") div(class="col-3") h5 - span #{greeting} + span #{user.firstname} #{user.lastname} div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") - a(class="nav-link" href="#" aria-selected="true") #{i18n.__(Profile)} - a(class="nav-link" href="/account/security" aria-selected="false") Security - a(class="nav-link" href="/account/services" aria-selected="false") Services + a(class="nav-link" href="/profile" aria-selected="true") Profile + a(class="nav-link" href="/security" aria-selected="false") Security + a(class="nav-link" href="/services" aria-selected="false") Services div(class="col-sm-9") p content goes here diff --git a/views/EN/profile.pug b/views/EN/account/profile.pug similarity index 96% rename from views/EN/profile.pug rename to views/EN/account/profile.pug index d6edd221188c8fe39667cddba1c21006c5f5f292..47c1f7e8683e370e2fb368337c4fca5d419230fe 100644 --- a/views/EN/profile.pug +++ b/views/EN/account/profile.pug @@ -35,8 +35,8 @@ html(lang="en") span #{user.firstname} #{user.lastname} div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") a(class="nav-link" href="#" aria-selected="true") Profile - a(class="nav-link" href="/account/security" aria-selected="false") Security - a(class="nav-link" href="/account/services" aria-selected="false") Services + a(class="nav-link" href="/security" aria-selected="false") Security + a(class="nav-link" href="/services" aria-selected="false") Services div(class="col-sm-9") if successes for success in successes diff --git a/views/EN/registration.pug b/views/EN/account/registration.pug similarity index 100% rename from views/EN/registration.pug rename to views/EN/account/registration.pug diff --git a/views/EN/reset.pug b/views/EN/account/reset.pug similarity index 100% rename from views/EN/reset.pug rename to views/EN/account/reset.pug diff --git a/views/EN/security.pug b/views/EN/account/security.pug similarity index 96% rename from views/EN/security.pug rename to views/EN/account/security.pug index cbe435cdbbd15f03a5f903899bc43ec3c59c035a..2a5c248ce1f9e98b429b52eb9261f322cd38fcf9 100644 --- a/views/EN/security.pug +++ b/views/EN/account/security.pug @@ -37,9 +37,9 @@ html(lang="en") h5 span #{user.firstName} #{user.lastName} 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") Profile + a(class="nav-link" href="/profile" aria-selected="true") Profile a(class="nav-link" href="#" aria-selected="false") Security - a(class="nav-link" href="/account/services" aria-selected="false") Services + a(class="nav-link" href="/services" aria-selected="false") Services div(class="col-sm-9") if successes for success in successes diff --git a/views/EN/services.pug b/views/EN/account/services.pug similarity index 94% rename from views/EN/services.pug rename to views/EN/account/services.pug index a62efed6f811ce760acdae761f8a5addb50e2647..f095144beb05de603a741230ae857d11b543b3f9 100644 --- a/views/EN/services.pug +++ b/views/EN/account/services.pug @@ -34,8 +34,8 @@ html(lang="en") h5 span #{user.firstName} #{user.lastName} 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") Profile - a(class="nav-link" href="/account/security" aria-selected="false") Security + a(class="nav-link" href="/profile" aria-selected="true") Profile + a(class="nav-link" href="/security" aria-selected="false") Security a(class="nav-link" href="#" aria-selected="false") Services div(class="col-sm-9") if successes diff --git a/views/EN/project/addProjectOverview.pug b/views/EN/project/addProjectOverview.pug new file mode 100644 index 0000000000000000000000000000000000000000..7b40b54fc63b3d774caf8d0b8af272f4e3a554ce --- /dev/null +++ b/views/EN/project/addProjectOverview.pug @@ -0,0 +1,115 @@ +doctype html +html(lang="de") + head + title= "Add Project Overview" + 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") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + style. + .collapse { + display: none; + } + .collapse.in { + display: block; + } + .collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height,visibility; + -o-transition-property: height,visibility; + transition-property: height,visibility; + } + .warning { + color: red; + font-size: 11px; + } + body + div(class="container-fluid") + div(class="row") + div(class="col-md-6 offset-md-2") + h4(class="mb-3 font-weight-bold") Neues Projekt + div(class="col-md-6 offset-md-3") + if errors + for error, i in errors + div.alert.alert-danger.alert-dismissible.fade.show #{ error } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + form(method="POST") + div(class='form-row') + div(class='form-group col-md-12') + input#inputPname(name="pname" class="form-control" type="text" placeholder="human-readable short project name*" required) + div(class="form-group col-md-12") + input#inputTitle(name="title" class="form-control" type="text" placeholder="official title of the project*" required) + div(class="form-group col-md-12") + input#inputSummary(name="summary" class="form-control" type="text" placeholder="one line summary of the project") + div(class="form-group col-md-12") + input#inputCategory(name="category" class="form-control" type="text" placeholder="category of the project") + div(class="form-group col-md-12") + input#inputLogo(name="logo" class="form-control" type="text" placeholder="official logo of the project") + div(class="form-group col-md-12") + div(class="input-group mb-3") + input#inputGitlabURL(name="gitlabURL" type="text" class="form-control" placeholder="M4_LAB GitLab Project URL, z.B. https://transfer.hft-stuttgart.de/gitlab/username/projectname") + div(class="input-group-prepend") + div(class="input-group-text") + input#inputWiki(name="wiki" type="checkbox") + | Wiki + + h5(class="mb-3 font-weight-bold") Content + div(class='form-row') + div(class='form-group col-md-12') + textarea#inputOverview(name="overview" class="form-control" type="text" rows="5" placeholder="overview") + div(class="form-group col-md-12") + textarea#inputQuestion(name="question" class="form-control" type="text" rows="5" placeholder="question") + div(class='form-group col-md-12') + textarea#inputApproach(name="approach" class="form-control" type="text" rows="5" placeholder="approach") + div(class="form-group col-md-12") + textarea#inputResult(name="result" class="form-control" type="text" rows="5" placeholder="result") + div(class="form-group col-md-12") + input#inputKeywords(name="keywords" class="form-control" type="text" placeholder="keywords") + h5(class="mb-3 font-weight-bold") Info + div(class='form-row') + div(class='form-group col-md-12') + textarea#inputAnnouncement(name="announcement" class="form-control" type="text" rows="5" placeholder="Ausschreibung") + div(class="form-group col-md-12") + input#inputTerm(name="term" class="form-control" type="text" placeholder="Laufzeit") + div(class='form-group col-md-12') + textarea#inputFurtherDetails(name="furtherDetails" class="form-control" type="text" rows="5" placeholder="Mehr informationen") + div(class="form-group col-md-12") + input#inputWebsite(name="website" class="form-control" type="text" placeholder="website") + h5(class="mb-3 font-weight-bold") Images + div(class='form-row') + div(class="form-group col-md-12") + input#inputSrc(name="src" class="form-control" type="text" placeholder="link to the image source") + div(class="form-group col-md-12") + input#inputCaption(name="caption" class="form-control" type="text" placeholder="caption of the image") + h5(class="mb-3 font-weight-bold") Contact + div(class='form-row') + div(class="form-group col-md-4") + input#inputContactFirstname(name="contactFirstname" class="form-control" type="text" placeholder="contact firstname") + div(class="form-group col-md-4") + input#inputContactLastname(name="contactLastname" class="form-control" type="text" placeholder="contact lastname") + div(class="form-group col-md-4") + input#inputContactEmail(name="contactEmail" class="form-control" type="email" placeholder="contact email") + div(class="form-group col-md-4") + input#inputLeaderFirstname(name="leaderFirstname" class="form-control" type="text" placeholder="leader firstname") + div(class="form-group col-md-4") + input#inputLeaderLastname(name="leaderLastname" class="form-control" type="text" placeholder="leader lastname") + div(class="form-group col-md-4") + input#inputLeaderEmail(name="leaderEmail" class="form-control" type="email" placeholder="leader email") + p <em><small>* Pflichtfeld</small></em> + input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Projekt Anlegen") + + // 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // Header + script(src="/js/headfootLogout.js") \ No newline at end of file diff --git a/views/EN/mailinglists.pug b/views/EN/project/mailinglists.pug similarity index 99% rename from views/EN/mailinglists.pug rename to views/EN/project/mailinglists.pug index 677d0f32d9ce58ecb0168f48ea42a1eab047dac9..f2ddbd8b8e7eb89a85e4dc16310b96acf74e06e3 100644 --- a/views/EN/mailinglists.pug +++ b/views/EN/project/mailinglists.pug @@ -1,4 +1,4 @@ -html(lang="de") +html(lang="en") head title= "Mailinglisten" meta(charset="UTF-8") diff --git a/views/EN/project/projects.pug b/views/EN/project/projects.pug new file mode 100644 index 0000000000000000000000000000000000000000..56f65c10de4655b786ec93a865b6e57adc5f5e10 --- /dev/null +++ b/views/EN/project/projects.pug @@ -0,0 +1,117 @@ +doctype html +html(lang="de") + head + title= "Project List" + 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") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + style. + .collapse { + display: none; + } + .collapse.in { + display: block; + } + .collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height,visibility; + -o-transition-property: height,visibility; + transition-property: height,visibility; + } + .warning { + color: red; + font-size: 11px; + } + body + div(class="container-fluid") + if isUserAuthenticated + p Auf dieser Seite sehen Sie die Liste der über dieses Portal veröffentlichten Projekte. + a(href="/addprojectoverview" class="btn btn-primary" role="button" aria-pressed="true") Projekt anlegen + else + p Auf dieser Seite sehen Sie die Liste der über dieses Portal veröffentlichten Projekte. + p Möchten Sie ein neues Projekt anlegen, dann klicken Sie bitte auf #[a(href="/addprojectoverview") Anmelden und Projekt anlegen] + if successes + for success in successes + div.alert.alert-success.alert-dismissible #{ success } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + // Active projects + h3(class="mb-3 font-weight-bold") Aktive Projekte + table(class="table table-striped") + thead + tr + th Logo + th Akronym + th Title + th Kernziel + th Kategorie + th Ansprechpartner + th Projektinhalte + tbody + for item in active + tr + //td #{item.status} + td + img(src=item.logo, width="40", height="40") + td #{item.akronym} + td #{item.title} + td #{item.summary} + td #{item.category} + td #[a(class="nav-link", href="mailto:"+ item.cp) #{item.cp}] + td #[a(class="nav-link", href="https://m4lab.hft-stuttgart.de/projectoverview?projectID="+item.id) Zur Projektübersicht] + if item.gitlab + a(class="nav-link", href=item.gitlab+"/tree/master") Projektdateien + a(class="nav-link", href=item.gitlab+"/wikis/home") Projektwiki + else + a(class="nav-link", href="#") Projektdateien + a(class="nav-link", href="#") Projektwiki + br + // Non-active projects + h3(class="mb-3 font-weight-bold") Abgeschlossene Projekte + table(class="table table-striped") + thead + tr + th Logo + th Akronym + th Title + th Kernziel + th Kategorie + th Ansprechpartner + th Projektinhalte + tbody + for item in nonActive + tr + //td #{item.status} + td + img(src=item.logo, width="40", height="40") + td #{item.akronym} + td #{item.title} + td #{item.summary} + td #{item.category} + td #[a(class="nav-link", href="mailto:"+ item.cp) #{item.cp}] + td #[a(class="nav-link", href="https://m4lab.hft-stuttgart.de/projectoverview?projectID="+item.id) Zur Projektübersicht] + if item.gitlab + a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/tree/master") Projektdateien + a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/wikis/home") Projektwiki + else + a(class="nav-link", href="#") Projektdateien + a(class="nav-link", href="#") Projektwiki + + // 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // Header + if isUserAuthenticated + script(src="/js/headfootLogout.js") + else + script(src="https://transfer.hft-stuttgart.de/js/headfoot.js") \ No newline at end of file