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

Merge branch 'testing' into devel

parents f1cef1b8 93f3cc4b
/built
/node_modules
\ No newline at end of file
pages-testing:
stage: deploy
script:
- cat $configfiledev > ./config/config.js
- npm install
- npm run clean
- npm run build
- rm -rf ./built/views
- cp -R ./views ./built
- cat $configfiledev > ./built/config/config.js
- "pm2 delete --silent project || :"
- pm2 start ./app.js --name=project
- pm2 start ./built/app.js --name=project
- pm2 save
tags:
- testing
......@@ -22,4 +26,4 @@ pages-production:
tags:
- production
only:
- master
\ No newline at end of file
- master
const gitlab = require('../functions/gitlab')
describe('GitLab API', () => {
test('get all projects', async () => {
let projects = await gitlab.getProjects(10, 0)
expect(projects).not.toBeNull()
})
test('get latest pipeline status of a project', async () => {
let status = await gitlab.getLatestPipelineStatus(81)
expect(status).not.toBeNull()
})
})
\ No newline at end of file
const methods = require('../functions/methods')
describe('DB methods', () => {
test('all mailinglists', async () => {
let lists = await methods.getAllMailinglists(0)
expect(lists).not.toBeNull()
})
test('project overview', async () => {
let overview = await methods.getProjectOverviewById(81)
expect(overview).not.toBeNull()
})
test('project images', async () => {
let images = await methods.getProjectImagesById(81)
expect(images).not.toBeNull()
})
})
\ No newline at end of file
import mysql from 'mysql'
import mysql from 'mysql2'
var env = process.env.NODE_ENV || 'development';
const config = require('./config')[env]
......@@ -17,13 +17,6 @@ userConnection.connect(function(err) {
if (err) throw err;
})
userConnection.query('USE '+config.database.dbUser)
// user db connection test
userConnection.query('SELECT 1 + 5 AS solution', function (err, rows, fields) {
if (err) throw err
console.log('Solution = ', rows[0].solution)
})
//userConnection.end()
// ==== PROJECT DB CONNECTION ====
var projectConnection = mysql.createConnection({
......@@ -38,13 +31,6 @@ projectConnection.connect(function(err) {
if (err) throw err;
})
projectConnection.query('USE '+config.database.dbProject)
// projectdb connection test
projectConnection.query('SELECT 10 + 5 AS project', function (err, rows, fields) {
if (err) throw err
console.log('Project = ', rows[0].project)
})
//projectConnection.end()
var connection = {
user: userConnection,
......
const dbconn = require('../config/dbconn');
var methods = {
// test method
currentDate: function() {
console.log('Current Date is: ' + new Date().toISOString().slice(0, 10));
},
// ===================== user db =====================
getUserIdByEmail: function(email:string, callback:any) {
var userId:number
dbconn.user.query('SELECT id FROM user WHERE email = "' +email+'"', function (err:any, rows:any) {
if (err) {
throw err;
}
else {
if ( rows.length > 0) {
userId = rows[0].id;
}
}
callback(userId, err);
});
},
/*
getUserProjectRole: function(userId, callback) {
dbconn.user.query('SELECT project_id, role_id FROM user_project_role WHERE user_id = "' +userId+'"', function (err, rows, fields) {
if (err) throw err;
callback(rows, err);
});
},
*/
addUserProjectRole: function(data:any, callback:any) {
dbconn.user.query('INSERT INTO user_project_role SET ?', data, function (err:any){
if (err) throw err;
callback(err);
})
},
// ======================= project db =======================
getAllProjects: function(callback:any) {
dbconn.project.query('CALL getAllprojects', function (err:any, rows:any){
if (err) throw err;
callback(rows[0], err);
})
},
getAllMailinglists: function(callback:any) {
dbconn.project.query('CALL getAllLists', function (err:any, rows:any){
if (err) throw err;
callback(rows[0], err);
})
},
getProjectOverviewById: function(projectId:number, callback:any) {
dbconn.project.query('CALL GetProjectInformationByProjectID(' + projectId+ ')', function (err:any, rows:any){
if (err) throw err;
callback(rows[0], err);
})
},
getProjectImagesById: function(projectId:number, callback:any) {
dbconn.project.query('CALL getImagesByProjectID(' + projectId+ ')', function (err:any, rows:any){
if (err) throw err;
callback(rows[0], err);
})
},
addProjectOverview: function(data:any, callback:any) {
dbconn.project.query('INSERT INTO project_overview SET ?', data, function (err:any, results:any){
if (err) {
console.error(err);
}
callback(results, err);
})
getAllMailinglists: async function() {
try {
let rows:any = await dbconn.project.promise().query('CALL getAllLists')
if (rows[0][0]) {
return rows[0][0]
} else { return null }
} catch (err) {
console.error(err)
}
return null
},
getProjectOverviewById: async function(projectId:number) {
try {
let rows:any = await dbconn.project.promise().query('CALL GetProjectInformationByProjectID(' + projectId+ ')')
if (rows[0][0]) {
return rows[0][0]
} else { return null }
} catch (err) {
console.error(err)
}
return null
},
getProjectImagesById: async function(projectId:number) {
try {
let rows:any = await dbconn.project.promise().query('CALL getImagesByProjectID(' + projectId+ ')')
if (rows[0][0]) {
return rows[0][0]
} else { return null }
} catch (err) {
console.error(err)
}
return null
}
};
export = methods;
\ No newline at end of file
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
};
\ No newline at end of file
This diff is collapsed.
......@@ -15,9 +15,9 @@
},
"scripts": {
"start": "nodemon app.ts",
"build": "tsc --build",
"clean": "tsc --build --clean",
"test": ""
"build": "tsc -build",
"clean": "tsc -build --clean",
"test": "jest"
},
"dependencies": {
"async": "^3.2.0",
......@@ -25,19 +25,11 @@
"body-parser": "^1.19.0",
"compression": "^1.7.4",
"cookie-parser": "1.4.3",
"errorhandler": "1.4.3",
"express": "^4.17.1",
"express-fileupload": "^1.1.7-alpha.2",
"express-flash": "0.0.2",
"express-session": "^1.17.1",
"fs": "0.0.1-security",
"helmet": "^3.23.3",
"helmet": "^4.6.0",
"morgan": "^1.10.0",
"mysql": "^2.18.1",
"passport": "0.3.2",
"passport-saml": "^2.0.6",
"pug": "^3.0.2",
"update": "^0.7.4"
"mysql2": "^2.2.5",
"pug": "^3.0.2"
},
"engines": {
"node": ">= 4.0.0"
......@@ -51,11 +43,12 @@
"@types/express-fileupload": "^1.1.6",
"@types/express-flash": "^0.0.2",
"@types/express-session": "^1.17.3",
"@types/helmet": "^4.0.0",
"@types/jest": "^28.1.2",
"@types/morgan": "^1.9.2",
"@types/mysql": "^2.15.18",
"@types/passport": "^1.0.6",
"jest": "^28.1.1",
"nodemon": "^2.0.9",
"ts-jest": "^27.0.3",
"ts-node": "^10.0.0",
"typescript": "^4.3.5"
}
......
//const SamlStrategy = require('passport-saml').Strategy
import async from 'async'
import methods from '../functions/methods'
import gitlab from '../functions/gitlab'
import helpers from '../functions/helpers'
const pictSizeLimit = 1000000 // 1 MB
import https from 'https'
module.exports = function (app:any, lang:string) {
// ======== APP ROUTES - PROJECT ====================
app.get('/', function (req:any, res:any) {
res.render(lang+'/project/project-simplified', {
isUserAuthenticated: req.isAuthenticated(),
user: req.user
});
res.render(lang+'/project/project-simplified')
})
app.get('/mailinglists', function (req:any, res:any) {
async.waterfall([
function(done:any) {
methods.getAllMailinglists(function(mailinglistOverview:any, err:any) {
if (!err) {
done(err, mailinglistOverview)
}
})
},
// create JSON object of mailinglists for front-end
function(mailinglistOverview:any) {
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,
keywords: mailinglistOverview[i].keywords
});
}
res.render(lang+'/project/mailinglists', {
isUserAuthenticated: req.isAuthenticated(),
user: req.user,
mailinglists: allMailingLists
app.get('/mailinglists', async function (req:any, res:any) {
let mailList = await methods.getAllMailinglists()
if (mailList) {
let allMailingLists = [] // JSON object
for (let i = 0; i < mailList.length; i++) {
// add data to JSON object
allMailingLists.push({
id: mailList[i].id,
name: mailList[i].name,
src: mailList[i].src,
projectstatus: mailList[i].projectstatus,
project_title: mailList[i].project_title,
keywords: mailList[i].keywords
});
}
])
})
app.get('/addprojectoverview', function (req:any, res:any) {
if (req.isAuthenticated()) {
res.render(lang+'/project/addProjectOverview')
}
else {
res.redirect('/login')
res.render(lang+'/project/mailinglists', {
//isUserAuthenticated: req.isAuthenticated(),
//user: req.user,
mailinglists: allMailingLists
});
} else {
res.render(lang+'/project/mailinglists', {
//isUserAuthenticated: req.isAuthenticated(),
//user: req.user,
mailinglists: null
})
}
})
app.post('/addprojectoverview', function (req:any, res:any) {
if (req.isAuthenticated()) {
var wiki = 0
if (req.body.wiki)
wiki = 1
var projectLogo = req.files.logo
var projectPicture = req.files.src
var projectLogoPath, projectPicturePath
if (projectLogo) {
// raise error if size limit is exceeded
if (projectLogo.size === pictSizeLimit) {
req.flash('error', 'Projektlogo exceeds 1 MB');
res.redirect('/addprojectoverview');
}
else {
// TEST PATH FOR DEVELOPMENT (LOCALHOST)
projectLogoPath = './folder-in-server-to-save-projektlogo/'+req.body.pname+'/'+projectLogo.name
// PATH FOR TEST/LIVE SERVER
// var projectLogoPath = to-be-defined
}
}
if (projectPicture) {
// raise error if size limit is exceeded
if (projectPicture.size === pictSizeLimit) {
req.flash('error', 'Projektbild exceeds 1 MB');
res.redirect('/addprojectoverview');
}
else {
// TEST PATH FOR DEVELOPMENT (LOCALHOST)
projectPicturePath = './folder-in-server-to-save-projektbild/'+req.body.pname+'/'+projectPicture.name
// PATH FOR TEST/LIVE SERVER
// var projectPicturePath = to-be-defined
}
}
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: projectLogoPath,
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: projectPicturePath,
caption: req.body.caption,
contact_lastname: req.body.contactName,
contact_email: req.body.contactEmail,
leader_lastname: req.body.leaderName,
leader_email: req.body.leaderEmail
}
// save pictures
if (projectLogo) {
projectLogo.mv(projectLogoPath, function(err:any) {
if (err) {
console.error(err)
res.status(500).render(lang+'/500', {
error: err
})
}
});
}
if (projectPicture) {
projectPicture.mv(projectPicturePath, function(err:any) {
if (err) {
console.error(err)
res.status(500).render(lang+'/500', {
error: err
})
}
});
}
/* RS: Temporary solution while Project DB is still in early phase.
When User DB and Project DB are integrated and quite stabil, this operation should be done in 1 transaction.
*/
var userId:number // todo: make this global variable?
async.waterfall([
// get userId by email from userdb
function(done:any) {
methods.getUserIdByEmail(req.user.email, function(id:number, err:any) {
if (!err) {
userId = id
done(err)
}
})
},
// add project overview
function(done:any) {
methods.addProjectOverview(projectOverviewData, function(data:any, err:any){
if (err) {
res.status(500).render(lang+'/500', {
error: err
})
}
else {
done(err, data.insertId)
}
})
},
// assign the created overview to logged-in user
function(projectOverviewId:number, done:any) {
var userProjectRoleData = {
project_id: projectOverviewId,
user_id: userId,
role_id: 3 // OVERVIEW_CREATOR
}
methods.addUserProjectRole(userProjectRoleData, function(userProjects:any, err:any) {
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('/projectoverview', async function(req:any, res:any){
let projectOverview = await methods.getProjectOverviewById(req.query.projectID)
if (projectOverview.length > 0) {
let partnerWebsites = helpers.stringToArray(projectOverview[0].partner_website)
let partnerNames = helpers.stringToArray(projectOverview[0].partner_name)
let awardSites = helpers.stringToArray(projectOverview[0].award_website)
let awardNames = helpers.stringToArray(projectOverview[0].award_name)
let sponsorWebsites = helpers.stringToArray(projectOverview[0].sponsor_website)
let sponsorImgs = helpers.stringToArray(projectOverview[0].sponsor_img)
let sponsorNames = helpers.stringToArray(projectOverview[0].sponsor_name)
let projectImages = await methods.getProjectImagesById(req.query.projectID)
res.render(lang+'/project/projectOverview', {
//isUserAuthenticated: req.isAuthenticated(),
//user: req.user,
projectOV: projectOverview,
projectImgs: projectImages,
partnerWS: partnerWebsites,
partnerN: partnerNames,
awardWS: awardSites,
awardN: awardNames,
sponsorWS: sponsorWebsites,
sponsorIMG: sponsorImgs,
sponsorN: sponsorNames
});
} else {
res.redirect('/')
}
})
app.post('/updateprojectoverview', function (req:any, res:any) {
// only their own project
})
app.get('/projectoverview', function(req:any, res:any){
async.waterfall([
function(done:any) {
methods.getProjectOverviewById(req.query.projectID, function(projectOverview:any, err:any) {
if (!err) {
done(err, projectOverview)
}
})
},
function(projectOverview:any, done:any){
methods.getProjectImagesById(req.query.projectID, function(projectImages:any, err:any) {
if (!err) {
done(err, projectImages, projectOverview)
}
})
},
// render projectOverview page
function(projectImages:any, projectOverview:any) {
//console.log(projectImages)
let partnerWebsites = helpers.stringToArray(projectOverview[0].partner_website)
let partnerNames = helpers.stringToArray(projectOverview[0].partner_name)
let awardSites = helpers.stringToArray(projectOverview[0].award_website)
let awardNames = helpers.stringToArray(projectOverview[0].award_name)
let sponsorWebsites = helpers.stringToArray(projectOverview[0].sponsor_website)
let sponsorImgs = helpers.stringToArray(projectOverview[0].sponsor_img)
let sponsorNames = helpers.stringToArray(projectOverview[0].sponsor_name)
res.render(lang+'/project/projectOverview', {
isUserAuthenticated: req.isAuthenticated(),
user: req.user,
projectOV: projectOverview,
projectImgs: projectImages,
partnerWS: partnerWebsites,
partnerN: partnerNames,
awardWS: awardSites,
awardN: awardNames,
sponsorWS: sponsorWebsites,
sponsorIMG: sponsorImgs,
sponsorN: sponsorNames
});
}
])
})
// Projektdaten
app.get('/projektdaten', async function(req:any, res:any){
let projectArr = []
let isProject = true
let firstId = 0
let orderKeyword = req.query.sort
while (isProject == true) {
let projects = await gitlab.getProjects(100, firstId)
......@@ -260,7 +90,7 @@ module.exports = function (app:any, lang:string) {
for(let i = 0; i < projectData.length; i++){
// M4_LAB logo for all projects that do not have logo
if (projectData[i].avatar_url == null) {
projectData[i].avatar_url = "https://m4lab.hft-stuttgart.de/img/footer/M4_LAB_LOGO_Graustufen.png"
projectData[i].avatar_url = "https://m4lab.hft-stuttgart.de/img/body/M4_LAB_LOGO_NO_TEXT.png"
}
// for all projects that have no description
if (projectData[i].description == "") {
......@@ -272,12 +102,38 @@ module.exports = function (app:any, lang:string) {
name: projectData[i].name,
weburl: projectData[i].web_url,
desc: projectData[i].description,
keywords: projectData[i].tag_list
keywords: projectData[i].tag_list,
createdAt: projectData[i].created_at,
lastUpdatedAt: projectData[i].last_activity_at
}
projectArr.push(project)
}
firstId = projectData[projectData.length-1].id
}
// MLAB-576
if (orderKeyword == "created_at") {
projectArr.sort((a, b) => {
let aDate:any = new Date(a.createdAt)
let bDate:any = new Date(b.createdAt)
return bDate - aDate
});
} else if (orderKeyword == "updated_at") {
projectArr.sort((a, b) => {
let aDate:any = new Date(a.lastUpdatedAt)
let bDate:any = new Date(b.lastUpdatedAt)
return bDate - aDate
});
} else { // default, sorted by name
projectArr.sort((a, b) => {
let fa = a.name.toLowerCase(),
fb = b.name.toLowerCase();
if (fa < fb) return -1;
if (fa > fb) return 1;
return 0;
});
}
}
res.render(lang+'/project/projectList', {
......@@ -287,9 +143,10 @@ module.exports = function (app:any, lang:string) {
// Projektinformationen
app.get('/projektinformationen', async function(req:any, res:any){
let pagesArr = []
let pagesArr: { logo: any; name: any; weburl: any; desc: any; keywords: any; createdAt: any; lastUpdatedAt: any; }[] = []
let isProject = true
let firstId = 0
let orderKeyword = req.query.sort
while (isProject == true) {
let projects = await gitlab.getProjects(100, firstId)
......@@ -303,29 +160,14 @@ module.exports = function (app:any, lang:string) {
if (status) {
// M4_LAB logo for all projects that do not have logo
if (pagesData[i].avatar_url == null) {
pagesData[i].avatar_url = "https://m4lab.hft-stuttgart.de/img/footer/M4_LAB_LOGO_Graustufen.png"
pagesData[i].avatar_url = "https://m4lab.hft-stuttgart.de/img/body/M4_LAB_LOGO_NO_TEXT.png"
}
// for all projects that have no description
if (pagesData[i].description == "") {
pagesData[i].description = "- no description -"
}
// customized website name
if (pagesData[i].name == "Visualization") {
//todo: update URL - user? group?
pagesData[i].web_url = "https://transfer.hft-stuttgart.de/pages/visualization"
}
else if (pagesData[i].name == "IN-Source") {
//todo: update URL
pagesData[i].web_url = "https://transfer.hft-stuttgart.de/pages/INsource"
}
else if (pagesData[i].name == "3DS_Visualization_Cesium") {
//todo: update URL
pagesData[i].web_url = "https://transfer.hft-stuttgart.de/pages/3ds_visualization_cesium"
}
else {
//todo: update URL
pagesData[i].web_url = "https://transfer.hft-stuttgart.de/pages/"+pagesData[i].name
}
// https://transfer.hft-stuttgart.de/pages/EIGENTUEMER/PROJEKTNAME/
pagesData[i].web_url = "https://transfer.hft-stuttgart.de/pages/"+pagesData[i].namespace.path+"/"+pagesData[i].name+"/"
// remove 'website' from tag list
let index = pagesData[i].tag_list.indexOf('website')
if (index > -1) {
......@@ -338,13 +180,45 @@ module.exports = function (app:any, lang:string) {
name: pagesData[i].name,
weburl: pagesData[i].web_url,
desc: pagesData[i].description,
keywords: pagesData[i].tag_list
keywords: pagesData[i].tag_list,
createdAt: pagesData[i].created_at,
lastUpdatedAt: pagesData[i].last_activity_at
}
pagesArr.push(pages)
https.get(pagesData[i].web_url, function (response:any) {
if (response.statusCode >= 200 && response.statusCode <= 299) {
pagesArr.push(pages)
}
})
}
}
firstId = pagesData[pagesData.length-1].id
}
// MLAB-576
if (orderKeyword == "created_at") {
pagesArr.sort((a, b) => {
let aDate:any = new Date(a.createdAt)
let bDate:any = new Date(b.createdAt)
return bDate - aDate
});
} else if (orderKeyword == "updated_at") {
pagesArr.sort((a, b) => {
let aDate:any = new Date(a.lastUpdatedAt)
let bDate:any = new Date(b.lastUpdatedAt)
return bDate - aDate
});
} else { // default, sorted by name
pagesArr.sort((a, b) => {
let fa = a.name.toLowerCase(),
fb = b.name.toLowerCase();
if (fa < fb) return -1;
if (fa > fb) return 1;
return 0;
});
}
}
res.render(lang+'/project/pagesList', {
......
{
"exclude": ["node_modules", "__test", "jest.config.js"],
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"rootDir": "./",
"strict": true,
"outDir": "./built",
"rootDir": "./",
"esModuleInterop": true,
"strict": true,
"allowJs": true
}
}
\ No newline at end of file
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.min.css")
link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/m4lab.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.
.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") &times;
form(method="POST" encType="multipart/form-data")
div(class='form-row')
div(class='form-group col-md-12')
input#inputPname(name="title" class="form-control" type="text" placeholder="Projekttitel*" required)
div(class="form-group col-md-12")
input#inputTitle(name="pname" class="form-control" type="text" placeholder="Akronym*" required)
div(class="form-group col-md-12")
input#inputSummary(name="summary" class="form-control" type="text" placeholder="Kurzbeschreibung")
div(class='form-group col-md-12')
select#inputCategory(name="category", class="form-control")
option(value="") - Projektkategorie -
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")
div(class='form-group row')
label(for="projectLogo" class="col-sm-3 col-form-label") Projektlogo (max. 1 MB)
div(class="col-md-9")
input#inputLogo(name="logo" class="form-control" type="file")
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")
| &nbsp; Wiki
h5(class="mb-3 font-weight-bold") Inhalte
div(class='form-row')
div(class='form-group col-md-12')
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="Fragestellung")
div(class='form-group col-md-12')
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="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") Projektinformationen
div(class='form-row')
div(class='form-group col-md-12')
input#inputAnnouncement(name="announcement" class="form-control" type="text" rows="5" placeholder="Ausschreibung")
div(class="form-group col-md-12")
div(class='form-group row')
label(for="projectLogo" class="col-sm-2 col-form-label") Laufzeit
div(class="col-md-5")
input#inputTermFrom(name="termForm" class="form-control" type="text" placeholder="von (dd.mm.yyyy)")
div(class="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="Weitere Informationen (bspw. Links zu Berichten)")
div(class="form-group col-md-12")
input#inputWebsite(name="website" class="form-control" type="text" placeholder="Projekt-Website")
h5(class="mb-3 font-weight-bold") Bilder
div(class='form-row')
div(class="form-group col-md-12")
div(class='form-group row')
label(for="projectPicture" class="col-sm-3 col-form-label") Projektbild (max. 1 MB)
div(class="col-md-9")
input#inputSrc(name="src" class="form-control" type="file")
div(class="form-group col-md-12")
input#inputCaption(name="caption" class="form-control" type="text" placeholder="Bildunterschrift/Bildquelle")
h5(class="mb-3 font-weight-bold") Kontakt
div(class='form-row')
div(class="form-group col-md-2")
<p class="font-weight-normal">Ansprechperson</p>
div(class="form-group col-md-5")
input#inputContactName(name="contactName" class="form-control" type="text" placeholder="Anrede, Titel, 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="Anrede, Titel, 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/headfoot.js")
script.
$( function() {
$.datepicker.setDefaults( $.datepicker.regional["de"] );
$("#inputTermFrom").datepicker();
$("#inputTermTo").datepicker();
});
\ No newline at end of file
......@@ -5,6 +5,7 @@ html(lang="de")
meta(name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no")
link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css")
link(rel="stylesheet", type="text/css", href="/css/m4lab.css")
link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css")
link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
link(rel="stylesheet" href="/fonts/ionicons.min.css")
link(rel="stylesheet" href="/css/Testimonials.css")
......@@ -20,6 +21,7 @@ html(lang="de")
div(class="col-md-12 margin_bottom_30")
h2(class="text-center color_708090") <strong>Aktive Mailinglisten</strong>
div(class="table-responsive table-borderless")
<<<<<<< HEAD
table(class="table table-striped table-bordered table-hover")
thead()
tr()
......@@ -35,6 +37,26 @@ html(lang="de")
td <a href="#{item.src}">#{item.src}</a>
td <a href='projectoverview?projectID=#{item.id}'>#{item.project_title}</a>
td #{item.keywords}
=======
if !mailinglists
p There is no active mailing list at the moment
else
table(class="table table-striped table-bordered table-hover")
thead()
tr()
th Name
th Zum Abonnement der Mailingliste
th Zum zugehörigen Projekt
th Keywords
tbody()
for item in mailinglists
if item.projectstatus == '1'
tr
td #{item.name}
td <a href="#{item.src}">#{item.src}</a>
td <a href='projectoverview?projectID=#{item.id}'>#{item.project_title}</a>
td #{item.keywords}
>>>>>>> testing
div(id="aboText" class="mailingList_aboText")
div(class="container")
div(class="row m_bottom_0 p_top_20 p_bottom_20")
......@@ -76,4 +98,5 @@ 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")
// Header
script(src="/js/headfoot.js")
\ No newline at end of file
script(src="/js/headfoot.js")
script(src="/js/mobile.js")
\ No newline at end of file
doctype html
html(lang="de")
head
title= "Manage 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.min.css")
link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/m4lab.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.
.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") Manage Project
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") &times;
form(method="POST" encType="multipart/form-data")
div(class='form-row')
div(class='form-group col-md-12')
input#inputPname(name="title" class="form-control" type="text" placeholder="Projekttitel*" value=overview.title required)
div(class="form-group col-md-12")
input#inputTitle(name="pname" class="form-control" type="text" placeholder="Akronym*" value=overview.pname required)
div(class="form-group col-md-12")
input#inputSummary(name="summary" class="form-control" type="text" placeholder="Kurzbeschreibung")
div(class='form-group col-md-12')
select#inputCategory(name="category", class="form-control")
option(value="") - Projektkategorie -
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")
div(class='form-group row')
label(for="projectLogo" class="col-sm-3 col-form-label") Projektlogo (max. 1 MB)
div(class="col-md-9")
input#inputLogo(name="logo" class="form-control" type="file")
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")
| &nbsp; Wiki
h5(class="mb-3 font-weight-bold") Inhalte
div(class='form-row')
div(class='form-group col-md-12')
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="Fragestellung")
div(class='form-group col-md-12')
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="Ergebnis und Nutzung")
div(class="form-group col-md-12")
input#inputKeywords(name="keywords" class="form-control" type="text" placeholder="keywords" value=overview.keywords)
h5(class="mb-3 font-weight-bold") Projektinformationen
div(class='form-row')
div(class='form-group col-md-12')
input#inputAnnouncement(name="announcement" class="form-control" type="text" rows="5" placeholder="Ausschreibung")
div(class="form-group col-md-12")
div(class='form-group row')
label(for="projectLogo" class="col-sm-2 col-form-label") Laufzeit
div(class="col-md-5")
input#inputTermFrom(name="termForm" class="form-control" type="text" placeholder="von (dd.mm.yyyy)")
div(class="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="Weitere Informationen (bspw. Links zu Berichten)")
div(class="form-group col-md-12")
input#inputWebsite(name="website" class="form-control" type="text" placeholder="Projekt-Website")
h5(class="mb-3 font-weight-bold") Bilder
div(class='form-row')
div(class="form-group col-md-12")
div(class='form-group row')
label(for="projectPicture" class="col-sm-3 col-form-label") Projektbild (max. 1 MB)
div(class="col-md-9")
input#inputSrc(name="src" class="form-control" type="file")
div(class="form-group col-md-12")
input#inputCaption(name="caption" class="form-control" type="text" placeholder="Bildunterschrift/Bildquelle")
h5(class="mb-3 font-weight-bold") Kontakt
div(class='form-row')
div(class="form-group col-md-2")
<p class="font-weight-normal">Ansprechperson</p>
div(class="form-group col-md-5")
input#inputContactName(name="contactName" class="form-control" type="text" placeholder="Anrede, Titel, Vorname, Nachname")
div(class="form-group col-md-5")
input#inputContactEmail(name="contactEmail" class="form-control" type="email" placeholder="E-Mail-Adresse" value=overview.contact_email)
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="Anrede, Titel, Vorname, Nachname")
div(class="form-group col-md-5")
input#inputLeaderEmail(name="leaderEmail" class="form-control" type="email" placeholder="E-Mail-Adresse" value=overview.leader_email)
p <em><small>* Pflichtfeld</small></em>
input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Submit")
// 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")
script.
$( function() {
$.datepicker.setDefaults( $.datepicker.regional["de"] );
$("#inputTermFrom").datepicker();
$("#inputTermTo").datepicker();
});
\ No newline at end of file
......@@ -6,11 +6,17 @@ 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="/css/bootstrap.min.css")
link(rel="stylesheet", type="text/css", href="/css/m4lab.css")
<<<<<<< HEAD
=======
link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css")
>>>>>>> testing
link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
style.
.title-container {
position: relative;
color: white;
height: 12rem;
overflow: hidden;
}
.card-title-bottom-left {
position: absolute;
......@@ -18,39 +24,72 @@ html(lang="de")
width: 100%;
color: black;
font-weight: bold;
background: rgb(255, 255, 255, 0.5);
background: rgb(255, 255, 255, 0.9);
text-align: left;
padding: 5px
}
.card-img-top {
height: 15vw;
object-fit: cover;
height: 100%;
object-fit: contain;
position: absolute;
top: 0;
left: 0;
right: 0;
margin-left: 0;
margin-right: 0;
}
.card-img-bg {
background-size: cover;
filter: blur(30px);
width: 100%;
height: 100%;
}
.clamp-lines {
display: -webkit-box;
-webkit-line-clamp: 6;
-webkit-box-orient: vertical;
overflow: hidden;
}
body
div(class="container")
<<<<<<< HEAD
div(class="row")
div(class="col-md-12 margin_bottom_40")
img(class="mx-auto" src="/img/Projektinformationen.png" width="100%")
=======
div(class="row")
div(class="col-md-12 margin_bottom_40")
img(class="mx-auto" src="/img/Projektinformationen.png" width="100%")
>>>>>>> testing
div(class="container")
div(class="pt-4 pb-4 form-row")
div(class="form-group col-md-10")
input(id="searchInput", class="form-control", type="text", placeholder="Suchen Sie hier nach Themen und Projekten", onkeyup="searchFunction()")
div(class="form-group col-md-2")
select(class="form-control")
option uncategorized
p Hier finden Sie Informationen zu den bei uns gehosteten Projekten, wie z.B. Projektbeschreibungen, Projektwebseiten, Visualisierungen, Demonstrationen.
p Für eine Übersicht über den bei uns gehosteten Projektcode und andere Projektdaten klicken Sie <a href="/projektdaten"> hier </a>.
p Wenn Sie zu einem Projekt beitragen möchten, oder eines erstellen möchten, finden Sie weitere Informationen <a href="/help/gitlab.html">hier</a>.
div(class="container")
p#pagesCounter #{pages.length} Projektinformationen werden angezeigt
div(class="pt-4 pb-4 form-row")
div(class="form-group col-md-10")
input(id="searchInput", class="form-control form-control-lg", type="text", placeholder="Suchen Sie hier nach Themen und Projekten", onkeyup="searchFunction()")
div(class="form-group col-md-2")
select#sortingSelect(class="form-control form-control-lg")
option(value="" disabled) Sort by
option(value="name") &nbsp; Name
option(value="created_at") &nbsp; Last created
option(value="updated_at") &nbsp; Last updated
| <div class="row">
for item in pages
div(class="card-deck py-4 col-sm")
<<<<<<< HEAD
div(class="card width_18")
=======
div(class="card card-portrait" style="transform: rotate(0);")
>>>>>>> testing
div(class="title-container")
h5(class="card-title-bottom-left") #{item.name}
div(class="card-img-bg" style=`background-image: url(${item.logo});`)
img(class="card-img-top", src=item.logo)
div(class="card-body")
h5(class="card-title-bottom-left") #{item.name}
div(class="card-body-fixed-height")
div(class="row")
each key in item.keywords
h6
......@@ -58,11 +97,16 @@ html(lang="de")
| &nbsp;
div(class="row")
div(class="col-9")
<<<<<<< HEAD
p(class="card-text") #{item.desc}
a(href=item.weburl, class="no_text_decoration", target="_blank")
div(class="col-3")
svg(class="bi bi-chevron-right", width="32", height="32", viewBox="0 0 20 20", fill="black", xmlns="http://www.w3.org/2000/svg")
| <path fill-rule="evenodd" d="M6.646 3.646a.5.5 0 01.708 0l6 6a.5.5 0 010 .708l-6 6a.5.5 0 01-.708-.708L12.293 10 6.646 4.354a.5.5 0 010-.708z"></path>
=======
p(class="card-text clamp-lines") #{item.desc}
a(href=item.weburl, class="no_text_decoration stretched-link", target="_blank")
>>>>>>> testing
| </div>
// jQuery
......@@ -72,26 +116,31 @@ html(lang="de")
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/headfoot.js")
script(src="/js/mobile.js")
// General functions
script(src="/js/generalFunction.js")
script.
function searchFunction() {
var input = document.getElementById("searchInput")
var filter = input.value.toUpperCase()
var cardsCol = document.getElementsByClassName("col-sm")
var cardTitle, cardText, titleValue, textValue
var cardTitle, cardBadges, cardText, titleValue, badgesValue, textValue, allValues;
var i
var counterBlock = 0
for (i = 0; i < cardsCol.length; i++) {
cardTitle = cardsCol[i].getElementsByClassName("card-title-bottom-left");
cardBody = cardsCol[i].getElementsByClassName("card-body");
//cardBody = cardsCol[i].getElementsByClassName("card-body");
cardBadges = [...cardsCol[i].getElementsByClassName("badge-pill")];
cardText = cardsCol[i].getElementsByClassName("card-text");
titleValue = cardTitle[0].textContent || cardTitle[0].innerText;
bodyValue = cardBody[0].textContent || cardBody[0].innerText;
badgesValue = cardBadges.map(b => b.textContent).join(" ");
//bodyValue = cardBody[0].textContent || cardBody[0].innerText;
textValue = cardText[0].textContent || cardText[0].innerText;
if (titleValue.toUpperCase().indexOf(filter) > -1 || bodyValue.toUpperCase().indexOf(filter) > -1 || textValue.toUpperCase().indexOf(filter) > -1) {
allValues = [titleValue, badgesValue, textValue].map(v => v.toUpperCase()).join(" ");
if (allValues.indexOf(filter)!= -1) {
cardsCol[i].style.display = "block"
counterBlock++
} else {
......@@ -100,4 +149,19 @@ html(lang="de")
}
document.getElementById("pagesCounter").innerHTML = counterBlock+" Projektinformationen werden angezeigt"
}
\ No newline at end of file
}
$("#sortingSelect").change(function() {
window.location.replace('/projektinformationen?sort='+$("#sortingSelect").val())
});
function setSortSelect() {
let sortKeyword = getQueryStringParams('sort', window.location.href)
if (sortKeyword == "created_at") {
$("#sortingSelect").val("created_at")
} else if(sortKeyword == "updated_at") {
$("#sortingSelect").val("updated_at")
} else {
$("#sortingSelect").val("name")
}
}
setSortSelect()
\ No newline at end of file
......@@ -7,6 +7,7 @@ html(lang="de")
link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css")
link(rel="stylesheet", type="text/css", href="/css/m4lab.css")
link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css")
link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
body
......@@ -19,4 +20,5 @@ 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")
// Header
script(src="/js/headfoot.js")
\ No newline at end of file
script(src="/js/headfoot.js")
script(src="/js/mobile.js")
\ No newline at end of file
......@@ -6,11 +6,17 @@ 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="/css/bootstrap.min.css")
link(rel="stylesheet", type="text/css", href="/css/m4lab.css")
<<<<<<< HEAD
=======
link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css")
>>>>>>> testing
link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
style.
.title-container {
position: relative;
color: white;
height: 12rem;
overflow: hidden;
}
.card-title-bottom-left {
position: absolute;
......@@ -18,39 +24,72 @@ html(lang="de")
width: 100%;
color: black;
font-weight: bold;
background: rgb(255, 255, 255, 0.5);
background: rgb(255, 255, 255, 0.9);
text-align: left;
padding: 5px
}
.card-img-top {
height: 15vw;
object-fit: cover;
height: 100%;
object-fit: contain;
position: absolute;
top: 0;
left: 0;
right: 0;
margin-left: 0;
margin-right: 0;
}
.card-img-bg {
background-size: cover;
filter: blur(30px);
width: 100%;
height: 100%;
}
.clamp-lines {
display: -webkit-box;
-webkit-line-clamp: 6;
-webkit-box-orient: vertical;
overflow: hidden;
}
body
div(class="container")
<<<<<<< HEAD
div(class="row")
div(class="col-md-12 margin_bottom_40")
img(class="mx-auto" src="/img/ProjektcodeDaten.png" width="100%")
=======
div(class="row")
div(class="col-md-12 margin_bottom_40")
img(class="mx-auto" src="https://transfer.hft-stuttgart.de/img/ProjektcodeDaten.png" width="100%")
>>>>>>> testing
div(class="container")
div(class="pt-4 pb-4 form-row")
div(class="form-group col-md-10")
input(id="searchInput", class="form-control", type="text", placeholder="Suchen Sie hier nach Themen und Projekten", onkeyup="searchFunction()")
div(class="form-group col-md-2")
select(class="form-control")
option uncategorized
p Hier finden Sie den direkten Zugang zu den Inhalten der bei uns gehosteten Projekte.
p Weitere Informationen zu den bei uns gehosteten Projekten finden Sie <a href="/projektinformationen">hier</a>.
p Wenn Sie zu einem Projekt beitragen möchten, oder eines erstellen möchten, finden Sie weitere Informationen <a href="/help/gitlab.html">hier</a>.
div(class="container")
p#projectCounter #{project.length} Projektdaten werden angezeigt
div(class="pt-4 pb-4 form-row")
div(class="form-group col-md-10")
input(id="searchInput", class="form-control form-control-lg", type="text", placeholder="Suchen Sie hier nach Themen und Projekten", onkeyup="searchFunction()")
div(class="form-group col-md-2")
select#sortingSelect(class="form-control form-control-lg")
option(value="" disabled) Sort by
option(value="name") &nbsp; Name
option(value="created_at") &nbsp; Last created
option(value="updated_at") &nbsp; Last updated
| <div class="row">
for item in project
div(class="card-deck py-4 col-sm")
<<<<<<< HEAD
div(class="card width_18")
=======
div(class="card card-portrait" style="transform: rotate(0);")
>>>>>>> testing
div(class="title-container")
h5(class="card-title-bottom-left") #{item.name}
div(class="card-img-bg" style=`background-image: url(${item.logo});`)
img(class="card-img-top", src=item.logo)
div(class="card-body")
h5(class="card-title-bottom-left") #{item.name}
div(class="card-body-fixed-height")
div(class="row")
each key in item.keywords
h6
......@@ -58,13 +97,21 @@ html(lang="de")
| &nbsp;
div(class="row")
div(class="col-9")
<<<<<<< HEAD
p(class="card-text") #{item.desc}
a(href=item.weburl, class="no_text_decoration", target="_blank")
div(class="col-3")
svg(class="bi bi-chevron-right", width="32", height="32", viewBox="0 0 20 20", fill="black", xmlns="http://www.w3.org/2000/svg")
| <path fill-rule="evenodd" d="M6.646 3.646a.5.5 0 01.708 0l6 6a.5.5 0 010 .708l-6 6a.5.5 0 01-.708-.708L12.293 10 6.646 4.354a.5.5 0 010-.708z"></path>
=======
p(class="card-text clamp-lines") #{item.desc}
a(href=item.weburl, class="no_text_decoration stretched-link", target="_blank")
>>>>>>> testing
| </div>
button(onclick="topFunction()" id="topBtn")
i(class="fa fa-chevron-up")
// 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")
......@@ -72,26 +119,31 @@ html(lang="de")
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/headfoot.js")
script(src="/js/mobile.js")
// General functions
script(src="/js/generalFunction.js")
script.
function searchFunction() {
var input = document.getElementById("searchInput")
var filter = input.value.toUpperCase()
var cardsCol = document.getElementsByClassName("col-sm")
var cardTitle, cardText, titleValue, textValue
var cardTitle, cardBadges, cardText, titleValue, badgesValue, textValue, allValues;
var i
var counterBlock = 0
for (i = 0; i < cardsCol.length; i++) {
cardTitle = cardsCol[i].getElementsByClassName("card-title-bottom-left");
cardBody = cardsCol[i].getElementsByClassName("card-body");
//cardBody = cardsCol[i].getElementsByClassName("card-body");
cardBadges = [...cardsCol[i].getElementsByClassName("badge-pill")];
cardText = cardsCol[i].getElementsByClassName("card-text");
titleValue = cardTitle[0].textContent || cardTitle[0].innerText;
bodyValue = cardBody[0].textContent || cardBody[0].innerText;
badgesValue = cardBadges.map(b => b.textContent).join(" ");
//bodyValue = cardBody[0].textContent || cardBody[0].innerText;
textValue = cardText[0].textContent || cardText[0].innerText;
if (titleValue.toUpperCase().indexOf(filter) > -1 || bodyValue.toUpperCase().indexOf(filter) > -1 || textValue.toUpperCase().indexOf(filter) > -1) {
allValues = [titleValue, badgesValue, textValue].map(v => v.toUpperCase()).join(" ");
if (allValues.indexOf(filter)!= -1) {
cardsCol[i].style.display = "block"
counterBlock++
} else {
......@@ -100,4 +152,19 @@ html(lang="de")
}
document.getElementById("projectCounter").innerHTML = counterBlock+" Projektdaten werden angezeigt"
}
\ No newline at end of file
}
$("#sortingSelect").change(function() {
window.location.replace('/projektdaten?sort='+$("#sortingSelect").val())
});
function setSortSelect() {
let sortKeyword = getQueryStringParams('sort', window.location.href)
if (sortKeyword == "created_at") {
$("#sortingSelect").val("created_at")
} else if(sortKeyword == "updated_at") {
$("#sortingSelect").val("updated_at")
} else {
$("#sortingSelect").val("name")
}
}
setSortSelect()
\ No newline at end of file
......@@ -6,6 +6,7 @@ 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="/css/bootstrap.min.css")
link(rel="stylesheet", type="text/css", href="/css/m4lab.css")
link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css")
link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
body
......@@ -132,4 +133,5 @@ 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")
// Header
script(src="/js/headfoot.js")
\ No newline at end of file
script(src="/js/headfoot.js")
script(src="/js/mobile.js")
\ No newline at end of file
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.min.css")
link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/m4lab.css")
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-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") &times;
// 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="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
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
script(src="/js/headfoot.js")
\ No newline at end of file
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.
.help .card-title > a:before {
float: right !important;
content: "-";
padding-right: 5px;
}
.help .card-title > a.collapsed:before {
float: right !important;
content: "+";
}
.help h3 > a {
color: #8a348b;
text-decoration: none;
display: block;
}
.help a {
display: inline;
}
.help .card > .card-header {
color: #fff;
}
.card-title {
margin-bottom: 0.5rem;
margin-top: 0.5rem;
}
#infoicon {
color: #8a348b;
}
body
include project.html
// 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="/js/headfoot.js")
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