fixup! WIP: revamp projects: redesign webpage
This commit is contained in:
30
dist/sql/pvv_mysql.sql
vendored
30
dist/sql/pvv_mysql.sql
vendored
@@ -17,30 +17,42 @@ CREATE TABLE project_group (
|
|||||||
`wiki_link` TEXT
|
`wiki_link` TEXT
|
||||||
);
|
);
|
||||||
|
|
||||||
|
INSERT INTO
|
||||||
|
project_group (title, description_en, description_no, gitea_link, wiki_link)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
'Projects',
|
||||||
|
'Projects developed by members of PVV.',
|
||||||
|
'Prosjekter utviklet av medlemmer i PVV.',
|
||||||
|
'https://git.pvv.ntnu.no/Projects',
|
||||||
|
'https://wiki.pvv.ntnu.no/wiki/Programvareutvikling'
|
||||||
|
);
|
||||||
|
|
||||||
CREATE TABLE project (
|
CREATE TABLE project (
|
||||||
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
|
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
|
||||||
`group_id` INTEGER NOT NULL REFERENCES project_group (id),
|
`group_id` INTEGER NOT NULL REFERENCES project_group (id) DEFAULT 1,
|
||||||
`title` TEXT NOT NULL,
|
`title` TEXT NOT NULL,
|
||||||
`description_en` TEXT NOT NULL,
|
`description_en` TEXT NOT NULL,
|
||||||
`description_no` TEXT NOT NULL,
|
`description_no` TEXT NOT NULL,
|
||||||
`gitea_link` TEXT NOT NULL,
|
`gitea_link` TEXT,
|
||||||
`issue_board_link` TEXT NOT NULL,
|
`issue_board_link` TEXT,
|
||||||
`wiki_link` TEXT,
|
`wiki_link` TEXT,
|
||||||
`languages` TEXT,
|
`languages` TEXT,
|
||||||
`technologies` TEXT,
|
`technologies` TEXT,
|
||||||
`keywords` TEXT,
|
`keywords` TEXT,
|
||||||
`license` TEXT,
|
`license` TEXT,
|
||||||
`logo_url` TEXT,
|
`logo_url` TEXT,
|
||||||
FOREIGN KEY (group_id) REFERENCES project_group (id)
|
FOREIGN KEY (group_id) REFERENCES project_group (id) ON DELETE SET DEFAULT
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE project_maintainer (
|
CREATE TABLE project_maintainer (
|
||||||
`uname` TEXT PRIMARY KEY,
|
`uname` TEXT NOT NULL,
|
||||||
|
`project_id` INTEGER NOT NULL,
|
||||||
`name` TEXT NOT NULL,
|
`name` TEXT NOT NULL,
|
||||||
`link` TEXT NOT NULL,
|
`email` TEXT,
|
||||||
`mail` TEXT NOT NULL,
|
`is_owner` BOOLEAN DEFAULT FALSE,
|
||||||
FOREIGN KEY (project_id) REFERENCES project (id),
|
PRIMARY KEY (uname, project_id),
|
||||||
FOREIGN KEY (uname) REFERENCES maintainer (uname),
|
FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE users (`uname` TEXT, `groups` INT DEFAULT 0);
|
CREATE TABLE users (`uname` TEXT, `groups` INT DEFAULT 0);
|
||||||
|
|||||||
37
dist/sql/pvv_sqlite.sql
vendored
37
dist/sql/pvv_sqlite.sql
vendored
@@ -8,6 +8,8 @@ CREATE TABLE "events" (
|
|||||||
"description" TEXT
|
"description" TEXT
|
||||||
);
|
);
|
||||||
|
|
||||||
|
-- PROJECTS
|
||||||
|
|
||||||
CREATE TABLE "project_group" (
|
CREATE TABLE "project_group" (
|
||||||
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
"title" TEXT NOT NULL,
|
"title" TEXT NOT NULL,
|
||||||
@@ -17,34 +19,45 @@ CREATE TABLE "project_group" (
|
|||||||
"wiki_link" TEXT
|
"wiki_link" TEXT
|
||||||
);
|
);
|
||||||
|
|
||||||
|
INSERT INTO
|
||||||
|
project_group (title, description_en, description_no, gitea_link, wiki_link)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
'Projects',
|
||||||
|
'Projects developed by members of PVV.',
|
||||||
|
'Prosjekter utviklet av medlemmer i PVV.',
|
||||||
|
'https://git.pvv.ntnu.no/Projects',
|
||||||
|
'https://wiki.pvv.ntnu.no/wiki/Programvareutvikling'
|
||||||
|
);
|
||||||
|
|
||||||
CREATE TABLE "project" (
|
CREATE TABLE "project" (
|
||||||
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
"group_id" INTEGER NOT NULL REFERENCES project_group (id),
|
"group_id" INTEGER NOT NULL DEFAULT 1,
|
||||||
"title" TEXT NOT NULL,
|
"title" TEXT NOT NULL,
|
||||||
"description_en" TEXT NOT NULL,
|
"description_en" TEXT NOT NULL,
|
||||||
"description_no" TEXT NOT NULL,
|
"description_no" TEXT NOT NULL,
|
||||||
"gitea_link" TEXT NOT NULL,
|
"gitea_link" TEXT,
|
||||||
"issue_board_link" TEXT NOT NULL,
|
"issue_board_link" TEXT,
|
||||||
"wiki_link" TEXT,
|
"wiki_link" TEXT,
|
||||||
"languages" TEXT,
|
"languages" TEXT,
|
||||||
"technologies" TEXT,
|
"technologies" TEXT,
|
||||||
"keywords" TEXT,
|
"keywords" TEXT,
|
||||||
"license" TEXT,
|
"license" TEXT,
|
||||||
"logo_url" TEXT
|
"logo_url" TEXT,
|
||||||
|
FOREIGN KEY (group_id) REFERENCES project_group (id) ON DELETE SET DEFAULT
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE "project_maintainer" (
|
CREATE TABLE "project_maintainer" (
|
||||||
"uname" TEXT PRIMARY KEY,
|
"uname" TEXT NOT NULL,
|
||||||
|
"project_id" INTEGER NOT NULL,
|
||||||
"name" TEXT NOT NULL,
|
"name" TEXT NOT NULL,
|
||||||
"link" TEXT NOT NULL,
|
"email" TEXT,
|
||||||
"mail" TEXT NOT NULL
|
"is_owner" BOOLEAN DEFAULT FALSE,
|
||||||
|
PRIMARY KEY (uname, project_id),
|
||||||
|
FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE "project__project_maintainer" (
|
--
|
||||||
"project_id" INTEGER REFERENCES project (id),
|
|
||||||
"uname" TEXT REFERENCES maintainer (uname),
|
|
||||||
PRIMARY KEY (project_id, uname)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "users" ("uname" TEXT, "groups" INT DEFAULT 0);
|
CREATE TABLE "users" ("uname" TEXT, "groups" INT DEFAULT 0);
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ class ProjectManager {
|
|||||||
$this->pdo = $pdo;
|
$this->pdo = $pdo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: groupid
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Project[]
|
* @return Project[]
|
||||||
*/
|
*/
|
||||||
@@ -41,6 +43,7 @@ class ProjectManager {
|
|||||||
return $projects;
|
return $projects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: groupid
|
||||||
public function getByID(int $id): ?Project {
|
public function getByID(int $id): ?Project {
|
||||||
$query = 'SELECT * FROM project WHERE id=:id LIMIT 1';
|
$query = 'SELECT * FROM project WHERE id=:id LIMIT 1';
|
||||||
$statement = $this->pdo->prepare($query);
|
$statement = $this->pdo->prepare($query);
|
||||||
@@ -68,15 +71,17 @@ class ProjectManager {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: groupid
|
||||||
/**
|
/**
|
||||||
* @return Project[]
|
* @return Project[]
|
||||||
*/
|
*/
|
||||||
public function getByOwner(string $uname): array {
|
public function getByOwner(string $uname): array {
|
||||||
$query = '
|
$query = '
|
||||||
SELECT projectid FROM project
|
SELECT project.id FROM project
|
||||||
JOIN project__project_maintainer ON project.id = project__project_maintainer.project_id
|
JOIN project_maintainer ON project.id = project_maintainer.project_id
|
||||||
JOIN project_maintainer ON project__project_maintainer.uname = project_maintainer.uname
|
|
||||||
WHERE project_maintainer.uname = :uname
|
WHERE project_maintainer.uname = :uname
|
||||||
|
AND project_maintainer.is_owner = TRUE
|
||||||
';
|
';
|
||||||
|
|
||||||
$statement = $this->pdo->prepare($query);
|
$statement = $this->pdo->prepare($query);
|
||||||
@@ -116,27 +121,30 @@ class ProjectManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array<int,array>
|
* @return {uname:string,name:string,link:string,email:string,is_owner:bool}[]
|
||||||
*/
|
*/
|
||||||
public function getProjectMembers(int $id): array {
|
public function getProjectMembers(int $project_id): array {
|
||||||
$query = '
|
$query = '
|
||||||
SELECT id FROM project
|
SELECT
|
||||||
JOIN project__project_maintainer ON project.id = project__project_maintainer.project_id
|
project_maintainer.uname,
|
||||||
JOIN project_maintainer ON project__project_maintainer.uname = project_maintainer.uname
|
project_maintainer.name,
|
||||||
WHERE project.id = :id
|
project_maintainer.email,
|
||||||
|
project_maintainer.is_owner
|
||||||
|
FROM project_maintainer
|
||||||
|
WHERE project_maintainer.project_id = :id
|
||||||
';
|
';
|
||||||
|
|
||||||
$statement = $this->pdo->prepare($query);
|
$statement = $this->pdo->prepare($query);
|
||||||
$statement->bindParam(':id', $id, \PDO::PARAM_STR);
|
$statement->bindParam(':id', $project_id, \PDO::PARAM_STR);
|
||||||
$statement->execute();
|
$statement->execute();
|
||||||
|
|
||||||
$maintainers = [];
|
$maintainers = [];
|
||||||
foreach ($statement->fetchAll() as $dbUsr) {
|
foreach ($statement->fetchAll() as $dbUsr) {
|
||||||
$maintainers[] = [
|
$maintainers[] = [
|
||||||
'name' => $dbUsr['name'],
|
|
||||||
'uname' => $dbUsr['uname'],
|
'uname' => $dbUsr['uname'],
|
||||||
'link' => $dbUsr['link'],
|
'name' => $dbUsr['name'],
|
||||||
'mail' => $dbUsr['mail'],
|
'email' => $dbUsr['email'],
|
||||||
|
'is_owner' => (bool)$dbUsr['is_owner'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,19 +152,23 @@ class ProjectManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array{name:string,uname:string,link:string,mail:string}|null
|
* @return array{name:string,uname:string,email:string,is_owner:bool}|null
|
||||||
*/
|
*/
|
||||||
public function getProjectOwner(int $id): ?array {
|
public function getProjectOwner(int $project_id): ?array {
|
||||||
$query = '
|
$query = '
|
||||||
SELECT name, uname, link, mail FROM project
|
SELECT
|
||||||
JOIN project__project_maintainer ON project.id = project__project_maintainer.project_id
|
project_maintainer.name,
|
||||||
JOIN project_maintainer ON project__project_maintainer.uname = project_maintainer.uname
|
project_maintainer.uname,
|
||||||
WHERE project.id = :id AND project__project_maintainer.owner = TRUE
|
project_maintainer.email,
|
||||||
|
project_maintainer.is_owner
|
||||||
|
FROM project_maintainer
|
||||||
|
WHERE project_maintainer.project_id = :id
|
||||||
|
AND project_maintainer.is_owner = TRUE
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
';
|
';
|
||||||
|
|
||||||
$statement = $this->pdo->prepare($query);
|
$statement = $this->pdo->prepare($query);
|
||||||
$statement->bindParam(':id', $id, \PDO::PARAM_STR);
|
$statement->bindParam(':id', $project_id, \PDO::PARAM_STR);
|
||||||
$statement->execute();
|
$statement->execute();
|
||||||
|
|
||||||
$owner = $statement->fetch();
|
$owner = $statement->fetch();
|
||||||
@@ -167,8 +179,8 @@ class ProjectManager {
|
|||||||
return [
|
return [
|
||||||
'name' => $owner['name'],
|
'name' => $owner['name'],
|
||||||
'uname' => $owner['uname'],
|
'uname' => $owner['uname'],
|
||||||
'link' => $owner['link'],
|
'email' => $owner['email'],
|
||||||
'mail' => $owner['mail'],
|
'is_owner' => (bool)$owner['is_owner'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ if (!$userManager->hasGroup($uname, 'prosjekt')) {
|
|||||||
|
|
||||||
$projectID = $_GET['id'];
|
$projectID = $_GET['id'];
|
||||||
|
|
||||||
$query = 'DELETE FROM projects WHERE id=\'' . $projectID . '\'';
|
$query = 'DELETE FROM project WHERE id=\'' . $projectID . '\'';
|
||||||
$statement = $pdo->prepare($query);
|
$statement = $pdo->prepare($query);
|
||||||
$statement->execute();
|
$statement->execute();
|
||||||
|
|
||||||
|
|||||||
@@ -37,13 +37,18 @@ if (isset($_GET['id'])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$project = new pvv\side\Project(
|
$project = new pvv\side\Project(
|
||||||
0,
|
id: 0,
|
||||||
'Kult Prosjekt',
|
title: 'Kult Prosjekt',
|
||||||
'',
|
description_en: '',
|
||||||
'kåre knoll',
|
description_no: '',
|
||||||
'pvvadmin',
|
gitea_link: 'https://git.pvv.ntnu.no/Projects/kultprosjekt',
|
||||||
'drift@pvv.ntnu.no',
|
issue_board_link: 'https://git.pvv.ntnu.no/Projects/kultprosjekt/issues',
|
||||||
0
|
wiki_link: 'https://wiki.pvv.ntnu.no/wiki/Kult_Prosjekt',
|
||||||
|
programming_languages: 'PHP, HTML, CSS, JavaScript',
|
||||||
|
technologies: 'MySQL, REST, AJAX',
|
||||||
|
keywords: 'web, very-cool',
|
||||||
|
license: 'GPL-3.0',
|
||||||
|
logo_url: '',
|
||||||
);
|
);
|
||||||
if ($new == 0) {
|
if ($new == 0) {
|
||||||
$project = $projectManager->getByID($projectID);
|
$project = $projectManager->getByID($projectID);
|
||||||
@@ -56,7 +61,7 @@ $owner = [
|
|||||||
'mail' => '',
|
'mail' => '',
|
||||||
];
|
];
|
||||||
foreach ($members as $i => $data) {
|
foreach ($members as $i => $data) {
|
||||||
if ($data['owner']) {
|
if ($data['is_owner']) {
|
||||||
$owner = $data;
|
$owner = $data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,161 +1,92 @@
|
|||||||
a.nostyle {
|
|
||||||
text-decoration: none;
|
|
||||||
color:inherit;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.project-card {
|
.project-card {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
border-radius: .15em;
|
border-radius: .2em;
|
||||||
border: 0 solid #048;
|
border-left: .3em solid #048;
|
||||||
border-left-width: .3em;
|
|
||||||
box-shadow: 0 .1em .3em -.1em rgba(0,0,0,0.5);
|
box-shadow: 0 .1em .3em -.1em rgba(0,0,0,0.5);
|
||||||
overflow: hidden;
|
background: #fff;
|
||||||
top: 0;
|
min-height: 8em;
|
||||||
min-height: 6em;
|
transition: box-shadow .15s ease, transform .15s ease;
|
||||||
margin: 0;
|
|
||||||
height: 100%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-card:hover {
|
.project-card:hover {
|
||||||
box-shadow: 0.1em 0.2em 0.5em 0em rgba(0,0,0,0.5);
|
box-shadow: 0.2em 0.3em 0.6em rgba(0,0,0,0.45);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header */
|
||||||
|
.project-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: .6em;
|
||||||
|
padding: .6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-logo {
|
||||||
|
width: 2.4em;
|
||||||
|
height: 2.4em;
|
||||||
|
object-fit: contain;
|
||||||
|
border-radius: .2em;
|
||||||
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-title {
|
.project-title {
|
||||||
padding-bottom: .1em;
|
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
font-size: 1.05em;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
|
||||||
|
|
||||||
.card-content {
|
|
||||||
display: block;
|
|
||||||
margin: .6em;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-content p {
|
|
||||||
line-height: 1.25em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-content * {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.project-organizer {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
margin: 0;
|
|
||||||
font-size: .8em;
|
|
||||||
text-align: right;
|
|
||||||
font-style: italic;
|
|
||||||
opacity: 0.5;
|
|
||||||
padding: 0.1em 0.4em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.projects-container {
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 3em;
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
grid-column-gap: 0.5em;
|
|
||||||
grid-row-gap: 1.3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: 60em) {
|
|
||||||
.projects-container {
|
|
||||||
grid-template-columns: 1fr 1fr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: 50rem) {
|
|
||||||
.contentsplit {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 17em 2.7fr;
|
|
||||||
grid-template-areas: "left right";
|
|
||||||
grid-column-gap: 0.9em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media screen and (max-width: 50rem) {
|
|
||||||
.contentsplit {
|
|
||||||
display: grid;
|
|
||||||
grid-template-rows: auto auto;
|
|
||||||
grid-template-areas: "right"
|
|
||||||
"left";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media screen and (min-width: 33rem) and (max-width: 50rem) {
|
|
||||||
.projectmember-container {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 1fr 1fr;
|
|
||||||
grid-template-rows: auto auto;
|
|
||||||
grid-template-areas: "organizers members"
|
|
||||||
"join join";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.gridl {
|
|
||||||
grid-area: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.projectmember-container {
|
|
||||||
padding: 0.1em 1em;
|
|
||||||
box-shadow: 0 2px 10px 0 rgba(0,0,0,0.2);
|
|
||||||
}
|
|
||||||
.projectmember-container h2 {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.projectmember-container >form {
|
|
||||||
text-align: center;
|
|
||||||
grid-area: join;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gridr {
|
|
||||||
border-left: 0;
|
|
||||||
grid-area: right;
|
|
||||||
padding:0;
|
|
||||||
margin:0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.projectmember {
|
|
||||||
margin-bottom: 1em;
|
|
||||||
padding: 0 .5em 0 .5em;
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
border-left: 4px solid #35a;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.projectmember p {
|
/* Content */
|
||||||
|
.card-content {
|
||||||
|
padding: 0 .6em .4em;
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-description {
|
||||||
|
line-height: 1.3em;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
color: #333;
|
||||||
}
|
}
|
||||||
|
|
||||||
.projectmember p {
|
/* Tags */
|
||||||
font-size: .8em;
|
.project-tags {
|
||||||
|
margin-top: .4em;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: .3em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.projectmember p:first-child {
|
.tag {
|
||||||
font-size: 1em;
|
font-size: .7em;
|
||||||
margin-bottom: .2em;
|
padding: .15em .45em;
|
||||||
|
border-radius: .3em;
|
||||||
|
background: #eef3f7;
|
||||||
|
color: #345;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.memberuname, .memberemail {
|
/* Footer */
|
||||||
display: inline-block;
|
.project-footer {
|
||||||
color: #888;
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: .2em .5em;
|
||||||
|
font-size: .75em;
|
||||||
|
opacity: .7;
|
||||||
}
|
}
|
||||||
|
|
||||||
.memberuname {
|
.project-links a {
|
||||||
float: left;
|
margin-left: .4em;
|
||||||
|
text-decoration: none;
|
||||||
|
opacity: .7;
|
||||||
}
|
}
|
||||||
|
|
||||||
.memberemail {
|
.project-links a:hover {
|
||||||
float: right;
|
opacity: 1;
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 50rem) {
|
|
||||||
.projects {
|
|
||||||
display: inline-block;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* edit */
|
/* edit */
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ if (!$project_is_new) {
|
|||||||
<p class="subtitle no-chin">Beskrivelse (<i style="opacity:0.5;">markdown</i>)</p>
|
<p class="subtitle no-chin">Beskrivelse (<i style="opacity:0.5;">markdown</i>)</p>
|
||||||
<p class="subnote no-chin">Hva går prosjektet ditt ut på?</p>
|
<p class="subnote no-chin">Hva går prosjektet ditt ut på?</p>
|
||||||
<p class="subnote">De første to linjene blir vist på prosjektkortet, prøv å gjøre de til et fint sammendrag eller intro!</p>
|
<p class="subnote">De første to linjene blir vist på prosjektkortet, prøv å gjøre de til et fint sammendrag eller intro!</p>
|
||||||
<textarea class="tall" name="desc" style="width:100%" rows="8" class="boxinput" required><?php echo implode("\n", $project->getDescriptionNo()); ?></textarea>
|
<textarea class="tall" name="desc_no" style="width:100%" rows="8" class="boxinput" required><?php echo implode("\n", $project->getDescriptionNo()); ?></textarea>
|
||||||
|
|
||||||
<p class="subtitle no-chin">Beskrivelse på engelsk (<i style="opacity:0.5;">markdown</i>)</p>
|
<p class="subtitle no-chin">Beskrivelse på engelsk (<i style="opacity:0.5;">markdown</i>)</p>
|
||||||
<p class="subnote no-chin">Gjenta på engelsk</p>
|
<p class="subnote no-chin">Gjenta på engelsk</p>
|
||||||
|
|||||||
@@ -93,26 +93,58 @@ $projects = $projectManager->getAll();
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
<a class="nostyle" href="info.php?id=<?php echo $project->getID(); ?>">
|
<a class="nostyle" href="info.php?id=<?php echo $project->getID(); ?>">
|
||||||
<div class="project-card">
|
<article class="project-card">
|
||||||
|
|
||||||
|
<header class="project-header">
|
||||||
|
<?php if (!empty($project->getLogoURL())): ?>
|
||||||
|
<img src="<?php echo htmlspecialchars($project->getLogoURL()); ?>"
|
||||||
|
alt=""
|
||||||
|
class="project-logo">
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<h4 class="project-title">
|
||||||
|
<?php echo htmlspecialchars($project->getTitle()); ?>
|
||||||
|
</h4>
|
||||||
|
</header>
|
||||||
|
|
||||||
<div class="card-content">
|
<div class="card-content">
|
||||||
<h4 class="project-title"><?php echo $project->getTitle(); ?></h4>
|
<p class="project-description">
|
||||||
<p>
|
|
||||||
<?php
|
<?php
|
||||||
$Parsedown = new Parsedown();
|
$Parsedown = new Parsedown();
|
||||||
echo $Parsedown->text(implode("\n", array_slice($project->getDescriptionNo(), 0, 2)));
|
echo $Parsedown->text(
|
||||||
|
implode("\n", $project->getDescriptionEn())
|
||||||
|
);
|
||||||
?>
|
?>
|
||||||
</p>
|
</p>
|
||||||
<?php echo $project->getGiteaLink() ?>
|
|
||||||
<?php echo $project->getIssueBoardLink() ?>
|
<?php if (!empty($project->getTechnologies())): ?>
|
||||||
<?php echo $project->getLogoURL() ?>
|
<div class="project-tags">
|
||||||
<?php echo $project->getProgrammingLanguages() ?>
|
<?php foreach ($project->getTechnologies() as $tech): ?>
|
||||||
<?php echo $project->getTechnologies() ?>
|
<span class="tag"><?php echo trim($tech); ?></span>
|
||||||
<?php echo $project->getKeywords() ?>
|
<?php endforeach; ?>
|
||||||
<?php echo $project->getLicense() ?>
|
|
||||||
<?php echo $project->getWikiLink() ?>
|
|
||||||
</div>
|
</div>
|
||||||
<p class="project-organizer">Organisert av <?php echo $owner['name']; ?></p>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<footer class="project-footer">
|
||||||
|
<span class="project-organizer">
|
||||||
|
Organisert av <?php echo htmlspecialchars($owner['name']); ?>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<div class="project-links">
|
||||||
|
<?php if ($project->getGiteaLink()): ?>
|
||||||
|
<a href="<?php echo $project->getGiteaLink(); ?>" title="Repository"></a>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($project->getIssueBoardLink()): ?>
|
||||||
|
<a href="<?php echo $project->getIssueBoardLink(); ?>" title="Issues">🐞</a>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($project->getWikiLink()): ?>
|
||||||
|
<a href="<?php echo $project->getWikiLink(); ?>" title="Wiki">📖</a>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</article>
|
||||||
</a>
|
</a>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -6,9 +6,25 @@ require __DIR__ . '/../../config.php';
|
|||||||
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
|
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
|
||||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
|
||||||
if (!isset($_POST['title']) || !isset($_POST['desc']) || !isset($_POST['active'])) {
|
$required_fields = [
|
||||||
|
'title',
|
||||||
|
'desc_no',
|
||||||
|
'desc_en',
|
||||||
|
'gitea',
|
||||||
|
'issue',
|
||||||
|
'wiki',
|
||||||
|
'langs',
|
||||||
|
'techs',
|
||||||
|
'keywords',
|
||||||
|
'license',
|
||||||
|
'logo'
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($required_fields as $field) {
|
||||||
|
if (!isset($_POST[$field])) {
|
||||||
header('Location: ' . $_SERVER['HTTP_REFERER']);
|
header('Location: ' . $_SERVER['HTTP_REFERER']);
|
||||||
exit;
|
exit;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once __DIR__ . '/../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
require_once __DIR__ . '/../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
@@ -16,41 +32,96 @@ $as = new SimpleSAML\Auth\Simple('default-sp');
|
|||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
|
|
||||||
$id = $_POST['id'];
|
$id = $_POST['id'] ?? 0;
|
||||||
$do_delete = isset($_POST['delete']);
|
$do_delete = isset($_POST['delete']);
|
||||||
$do_join_or_leave = isset($_POST['join_or_leave']);
|
$do_join_or_leave = isset($_POST['join_or_leave']);
|
||||||
|
|
||||||
$active = $_POST['active'];
|
|
||||||
|
|
||||||
$title = $_POST['title'];
|
$title = $_POST['title'];
|
||||||
$desc = $_POST['desc'];
|
$desc_no = $_POST['desc_no'];
|
||||||
|
$desc_en = $_POST['desc_en'];
|
||||||
|
$gitea = $_POST['gitea'];
|
||||||
|
$issue = $_POST['issue'];
|
||||||
|
$wiki = $_POST['wiki'];
|
||||||
|
$langs = $_POST['langs'];
|
||||||
|
$techs = $_POST['techs'];
|
||||||
|
$keywords = $_POST['keywords'];
|
||||||
|
$license = $_POST['license'];
|
||||||
|
$logo = $_POST['logo'];
|
||||||
|
|
||||||
$name = $attrs['cn'][0];
|
$name = $attrs['cn'][0];
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
$mail = $attrs['mail'][0];
|
$mail = $attrs['mail'][0];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if ($id == 0) { // Create new project
|
if ($id == 0) { // Create new project
|
||||||
$query = <<<END
|
$query = <<<END
|
||||||
INSERT INTO
|
INSERT INTO
|
||||||
project(name, description, active)
|
project(
|
||||||
|
title,
|
||||||
|
description_no,
|
||||||
|
description_en,
|
||||||
|
gitea_link,
|
||||||
|
issue_board_link,
|
||||||
|
wiki_link,
|
||||||
|
languages,
|
||||||
|
technologies,
|
||||||
|
keywords,
|
||||||
|
license,
|
||||||
|
logo_url
|
||||||
|
)
|
||||||
VALUES
|
VALUES
|
||||||
(:title, :desc, :active)
|
(
|
||||||
|
:title,
|
||||||
|
:desc_no,
|
||||||
|
:desc_en,
|
||||||
|
:gitea,
|
||||||
|
:issue,
|
||||||
|
:wiki,
|
||||||
|
:langs,
|
||||||
|
:techs,
|
||||||
|
:keywords,
|
||||||
|
:license,
|
||||||
|
:logo
|
||||||
|
)
|
||||||
END;
|
END;
|
||||||
$statement = $pdo->prepare($query);
|
$statement = $pdo->prepare($query);
|
||||||
|
|
||||||
$statement->bindParam(':title', $title, PDO::PARAM_STR);
|
$statement->bindParam(':title', $title, PDO::PARAM_STR);
|
||||||
$statement->bindParam(':desc', $desc, PDO::PARAM_STR);
|
$statement->bindParam(':desc_no', $desc_no, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':desc_en', $desc_en, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':gitea', $gitea, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':issue', $issue, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':wiki', $wiki, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':langs', $langs, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':techs', $techs, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':keywords', $keywords, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':license', $license, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':logo', $logo, PDO::PARAM_STR);
|
||||||
|
|
||||||
$statement->execute();
|
$statement->execute();
|
||||||
$new_id = $pdo->lastInsertId();
|
$new_project_id = $pdo->lastInsertId();
|
||||||
|
|
||||||
|
$ownerQuery = <<<END
|
||||||
|
INSERT INTO
|
||||||
|
project_maintainer (
|
||||||
|
uname,
|
||||||
|
project_id,
|
||||||
|
name,
|
||||||
|
email
|
||||||
|
)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
:username,
|
||||||
|
:project_id,
|
||||||
|
:user_real_name,
|
||||||
|
:user_email
|
||||||
|
)
|
||||||
|
END;
|
||||||
|
|
||||||
$ownerQuery = "INSERT INTO project_maintainer (projectid, name, uname, mail, role, lead, owner) VALUES (:id, :owner, :owneruname, :owneremail, 'Prosjektleder', TRUE, TRUE)";
|
|
||||||
$statement = $pdo->prepare($ownerQuery);
|
$statement = $pdo->prepare($ownerQuery);
|
||||||
$statement->bindParam(':id', $new_id, PDO::PARAM_STR);
|
$statement->bindParam(':username', $uname, PDO::PARAM_STR);
|
||||||
$statement->bindParam(':owner', $name, PDO::PARAM_STR);
|
$statement->bindParam(':project_id', $new_project_id, PDO::PARAM_INT);
|
||||||
$statement->bindParam(':owneruname', $uname, PDO::PARAM_STR);
|
$statement->bindParam(':user_real_name', $name, PDO::PARAM_STR);
|
||||||
$statement->bindParam(':owneremail', $mail, PDO::PARAM_STR);
|
$statement->bindParam(':user_email', $mail, PDO::PARAM_STR);
|
||||||
|
|
||||||
$statement->execute();
|
$statement->execute();
|
||||||
} else { // Update existing project
|
} else { // Update existing project
|
||||||
|
|||||||
Reference in New Issue
Block a user