WIP more stuff lol
This commit is contained in:
5
dist/sql/pvv_mysql.sql
vendored
5
dist/sql/pvv_mysql.sql
vendored
@@ -37,11 +37,12 @@ CREATE TABLE project (
|
||||
`gitea_link` TEXT,
|
||||
`issue_board_link` TEXT,
|
||||
`wiki_link` TEXT,
|
||||
`languages` TEXT,
|
||||
`programming_languages` TEXT,
|
||||
`technologies` TEXT,
|
||||
`keywords` TEXT,
|
||||
`license` TEXT,
|
||||
`logo_url` TEXT,
|
||||
`is_hidden` BOOLEAN DEFAULT FALSE,
|
||||
FOREIGN KEY (group_id) REFERENCES project_group (id) ON DELETE SET DEFAULT
|
||||
);
|
||||
|
||||
@@ -50,7 +51,7 @@ CREATE TABLE project_maintainer (
|
||||
`project_id` INTEGER NOT NULL,
|
||||
`name` TEXT NOT NULL,
|
||||
`email` TEXT,
|
||||
`is_owner` BOOLEAN DEFAULT FALSE,
|
||||
`is_organizer` BOOLEAN DEFAULT FALSE,
|
||||
PRIMARY KEY (uname, project_id),
|
||||
FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
5
dist/sql/pvv_sqlite.sql
vendored
5
dist/sql/pvv_sqlite.sql
vendored
@@ -39,11 +39,12 @@ CREATE TABLE "project" (
|
||||
"gitea_link" TEXT,
|
||||
"issue_board_link" TEXT,
|
||||
"wiki_link" TEXT,
|
||||
"languages" TEXT,
|
||||
"programming_languages" TEXT,
|
||||
"technologies" TEXT,
|
||||
"keywords" TEXT,
|
||||
"license" TEXT,
|
||||
"logo_url" TEXT,
|
||||
"is_hidden" BOOLEAN DEFAULT FALSE,
|
||||
FOREIGN KEY (group_id) REFERENCES project_group (id) ON DELETE SET DEFAULT
|
||||
);
|
||||
|
||||
@@ -52,7 +53,7 @@ CREATE TABLE "project_maintainer" (
|
||||
"project_id" INTEGER NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"email" TEXT,
|
||||
"is_owner" BOOLEAN DEFAULT FALSE,
|
||||
"is_organizer" BOOLEAN DEFAULT FALSE,
|
||||
PRIMARY KEY (uname, project_id),
|
||||
FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
@@ -18,6 +18,7 @@ class Project {
|
||||
// NOTE: spdx identifier
|
||||
private ?string $license;
|
||||
private ?string $logo_url;
|
||||
private bool $is_hidden;
|
||||
|
||||
public function __construct(
|
||||
int $id,
|
||||
@@ -32,6 +33,7 @@ class Project {
|
||||
?string $keywords,
|
||||
?string $license,
|
||||
?string $logo_url,
|
||||
bool $is_hidden = false,
|
||||
) {
|
||||
$this->id = $id;
|
||||
$this->title = $title;
|
||||
@@ -58,6 +60,7 @@ class Project {
|
||||
= $keywords === null || $keywords === '' ? [] : explode(',', $keywords);
|
||||
$this->license = $license;
|
||||
$this->logo_url = $logo_url;
|
||||
$this->is_hidden = $is_hidden;
|
||||
}
|
||||
|
||||
public function getID(): int {
|
||||
@@ -122,4 +125,40 @@ class Project {
|
||||
public function getLogoURL(): ?string {
|
||||
return $this->logo_url;
|
||||
}
|
||||
|
||||
public function isHidden(): bool {
|
||||
return $this->is_hidden;
|
||||
}
|
||||
}
|
||||
|
||||
class ProjectMaintainer {
|
||||
private string $uname;
|
||||
private string $name;
|
||||
private string $email;
|
||||
private bool $is_organizer;
|
||||
|
||||
public function __construct(
|
||||
string $uname,
|
||||
string $name,
|
||||
string $email,
|
||||
bool $is_organizer,
|
||||
) {
|
||||
$this->uname = $uname;
|
||||
$this->name = $name;
|
||||
$this->email = $email;
|
||||
$this->is_organizer = $is_organizer;
|
||||
}
|
||||
|
||||
public function getUname(): string {
|
||||
return $this->uname;
|
||||
}
|
||||
public function getName(): string {
|
||||
return $this->name;
|
||||
}
|
||||
public function getEmail(): string {
|
||||
return $this->email;
|
||||
}
|
||||
public function isOrganizer(): bool {
|
||||
return $this->is_organizer;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,24 @@ class ProjectManager {
|
||||
* @return Project[]
|
||||
*/
|
||||
public function getAll(): array {
|
||||
$query = 'SELECT * FROM project ORDER BY id ASC';
|
||||
$query = '
|
||||
SELECT
|
||||
id,
|
||||
title,
|
||||
description_en,
|
||||
description_no,
|
||||
gitea_link,
|
||||
issue_board_link,
|
||||
wiki_link,
|
||||
programming_languages,
|
||||
technologies,
|
||||
keywords,
|
||||
license,
|
||||
logo_url,
|
||||
is_hidden
|
||||
FROM project
|
||||
ORDER BY title ASC
|
||||
';
|
||||
$statement = $this->pdo->prepare($query);
|
||||
$statement->execute();
|
||||
|
||||
@@ -31,11 +48,12 @@ class ProjectManager {
|
||||
$dbProj['gitea_link'],
|
||||
$dbProj['issue_board_link'],
|
||||
$dbProj['wiki_link'],
|
||||
$dbProj['languages'],
|
||||
$dbProj['programming_languages'],
|
||||
$dbProj['technologies'],
|
||||
$dbProj['keywords'],
|
||||
$dbProj['license'],
|
||||
$dbProj['logo_url']
|
||||
$dbProj['logo_url'],
|
||||
(bool) $dbProj['is_hidden']
|
||||
);
|
||||
$projects[] = $project;
|
||||
}
|
||||
@@ -45,7 +63,24 @@ class ProjectManager {
|
||||
|
||||
// TODO: groupid
|
||||
public function getByID(int $id): ?Project {
|
||||
$query = 'SELECT * FROM project WHERE id=:id LIMIT 1';
|
||||
$query = '
|
||||
SELECT
|
||||
id,
|
||||
title,
|
||||
description_en,
|
||||
description_no,
|
||||
gitea_link,
|
||||
issue_board_link,
|
||||
wiki_link,
|
||||
programming_languages,
|
||||
technologies,
|
||||
keywords,
|
||||
license,
|
||||
logo_url,
|
||||
is_hidden
|
||||
FROM project
|
||||
WHERE id = :id
|
||||
';
|
||||
$statement = $this->pdo->prepare($query);
|
||||
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
|
||||
$statement->execute();
|
||||
@@ -63,11 +98,12 @@ class ProjectManager {
|
||||
$dbProj['gitea_link'],
|
||||
$dbProj['issue_board_link'],
|
||||
$dbProj['wiki_link'],
|
||||
$dbProj['languages'],
|
||||
$dbProj['programming_languages'],
|
||||
$dbProj['technologies'],
|
||||
$dbProj['keywords'],
|
||||
$dbProj['license'],
|
||||
$dbProj['logo_url']
|
||||
$dbProj['logo_url'],
|
||||
(bool) $dbProj['is_hidden']
|
||||
);
|
||||
}
|
||||
|
||||
@@ -76,30 +112,33 @@ class ProjectManager {
|
||||
/**
|
||||
* @return Project[]
|
||||
*/
|
||||
public function getByOwner(string $uname): array {
|
||||
public function getByMaintainer(string $uname): array {
|
||||
$query = '
|
||||
SELECT project.id FROM project
|
||||
JOIN project_maintainer ON project.id = project_maintainer.project_id
|
||||
SELECT
|
||||
project.id,
|
||||
project.title
|
||||
project.description_en,
|
||||
project.description_no,
|
||||
project.gitea_link,
|
||||
project.issue_board_link,
|
||||
project.wiki_link,
|
||||
project.programming_languages,
|
||||
project.technologies,
|
||||
project.keywords,
|
||||
project.license,
|
||||
project.logo_url,
|
||||
project.is_hidden
|
||||
FROM project_maintainer
|
||||
JOIN project ON project.id = project_maintainer.project_id
|
||||
WHERE project_maintainer.uname = :uname
|
||||
AND project_maintainer.is_owner = TRUE
|
||||
';
|
||||
|
||||
$statement = $this->pdo->prepare($query);
|
||||
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
|
||||
$statement->execute();
|
||||
|
||||
$projectIDs = $statement->fetchAll();
|
||||
$projects = [];
|
||||
foreach ($projectIDs as $id) {
|
||||
$id = $id['projectid'];
|
||||
|
||||
$query = 'SELECT * FROM projects WHERE id=:id';
|
||||
$statement = $this->pdo->prepare($query);
|
||||
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
|
||||
$statement->execute();
|
||||
|
||||
foreach ($statement->fetchAll() as $dbProj) {
|
||||
$project = new Project(
|
||||
$result = array_map(
|
||||
function ($dbProj) {
|
||||
return new Project(
|
||||
$dbProj['id'],
|
||||
$dbProj['title'],
|
||||
$dbProj['description_en'],
|
||||
@@ -107,29 +146,30 @@ class ProjectManager {
|
||||
$dbProj['gitea_link'],
|
||||
$dbProj['issue_board_link'],
|
||||
$dbProj['wiki_link'],
|
||||
$dbProj['languages'],
|
||||
$dbProj['programming_languages'],
|
||||
$dbProj['technologies'],
|
||||
$dbProj['keywords'],
|
||||
$dbProj['license'],
|
||||
$dbProj['logo_url']
|
||||
$dbProj['logo_url'],
|
||||
(bool) $dbProj['is_hidden']
|
||||
);
|
||||
$projects[] = $project;
|
||||
}
|
||||
}
|
||||
},
|
||||
$statement->fetchAll()
|
||||
);
|
||||
|
||||
return $projects;
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {uname:string,name:string,link:string,email:string,is_owner:bool}[]
|
||||
* @return ProjectMaintainer[]
|
||||
*/
|
||||
public function getProjectMembers(int $project_id): array {
|
||||
public function getProjectMaintainers(int $project_id): array {
|
||||
$query = '
|
||||
SELECT
|
||||
project_maintainer.uname,
|
||||
project_maintainer.name,
|
||||
project_maintainer.email,
|
||||
project_maintainer.is_owner
|
||||
project_maintainer.is_organizer
|
||||
FROM project_maintainer
|
||||
WHERE project_maintainer.project_id = :id
|
||||
';
|
||||
@@ -138,49 +178,53 @@ class ProjectManager {
|
||||
$statement->bindParam(':id', $project_id, \PDO::PARAM_STR);
|
||||
$statement->execute();
|
||||
|
||||
$maintainers = [];
|
||||
foreach ($statement->fetchAll() as $dbUsr) {
|
||||
$maintainers[] = [
|
||||
'uname' => $dbUsr['uname'],
|
||||
'name' => $dbUsr['name'],
|
||||
'email' => $dbUsr['email'],
|
||||
'is_owner' => (bool)$dbUsr['is_owner'],
|
||||
];
|
||||
}
|
||||
$result = array_map(
|
||||
function ($dbUsr) {
|
||||
return new ProjectMaintainer(
|
||||
$dbUsr['uname'],
|
||||
$dbUsr['name'],
|
||||
$dbUsr['email'],
|
||||
(bool)$dbUsr['is_organizer']
|
||||
);
|
||||
},
|
||||
$statement->fetchAll()
|
||||
);
|
||||
|
||||
return $maintainers;
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array{name:string,uname:string,email:string,is_owner:bool}|null
|
||||
* @return ProjectMaintainer[]
|
||||
*/
|
||||
public function getProjectOwner(int $project_id): ?array {
|
||||
public function getProjectOrganizers(int $project_id): array {
|
||||
$query = '
|
||||
SELECT
|
||||
project_maintainer.name,
|
||||
project_maintainer.uname,
|
||||
project_maintainer.name,
|
||||
project_maintainer.email,
|
||||
project_maintainer.is_owner
|
||||
project_maintainer.is_organizer
|
||||
FROM project_maintainer
|
||||
WHERE project_maintainer.project_id = :id
|
||||
AND project_maintainer.is_owner = TRUE
|
||||
LIMIT 1
|
||||
WHERE
|
||||
project_maintainer.project_id = :id
|
||||
AND project_maintainer.is_organizer = True
|
||||
';
|
||||
|
||||
$statement = $this->pdo->prepare($query);
|
||||
$statement->bindParam(':id', $project_id, \PDO::PARAM_STR);
|
||||
$statement->execute();
|
||||
|
||||
$owner = $statement->fetch();
|
||||
if (!$owner) {
|
||||
return null;
|
||||
}
|
||||
$result = array_map(
|
||||
function ($dbUsr) {
|
||||
return new ProjectMaintainer(
|
||||
$dbUsr['uname'],
|
||||
$dbUsr['name'],
|
||||
$dbUsr['email'],
|
||||
(bool)$dbUsr['is_organizer']
|
||||
);
|
||||
},
|
||||
$statement->fetchAll()
|
||||
);
|
||||
|
||||
return [
|
||||
'name' => $owner['name'],
|
||||
'uname' => $owner['uname'],
|
||||
'email' => $owner['email'],
|
||||
'is_owner' => (bool)$owner['is_owner'],
|
||||
];
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,9 @@ if (!$userManager->hasGroup($uname, 'prosjekt')) {
|
||||
|
||||
$projectID = $_GET['id'];
|
||||
|
||||
$query = 'DELETE FROM project WHERE id=\'' . $projectID . '\'';
|
||||
$query = 'DELETE FROM project WHERE id=:projectID';
|
||||
$statement = $pdo->prepare($query);
|
||||
$statement->bindParam(':projectID', $projectID, PDO::PARAM_INT);
|
||||
$statement->execute();
|
||||
|
||||
header('Location: ' . $_SERVER['HTTP_REFERER']);
|
||||
|
||||
@@ -43,7 +43,7 @@ if(isset($_POST['organiser'])){
|
||||
// filter
|
||||
$projects = array_values(array_filter(
|
||||
$projects,
|
||||
static fn($project) => preg_match('/.*' . $filterTitle . '.*/i', $project->getName())
|
||||
static fn($project) => preg_match('/.*' . $filterTitle . '.*/i', $project->getTitle())
|
||||
));
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
@@ -87,17 +87,17 @@ $projects = array_values(array_filter(
|
||||
|
||||
$project = $projects[$i];
|
||||
$projectID = $project->getID();
|
||||
$owner = $projectManager->getProjectOwner($projectID);
|
||||
$organizers = $projectManager->getProjectOrganizers($projectID);
|
||||
?>
|
||||
|
||||
<li>
|
||||
<div class="event admin">
|
||||
<div class="event-info">
|
||||
<h3 class="no-chin"><?php echo $project->getName() . ' (ID: ' . $projectID . ')'; ?></h3>
|
||||
<p class="subnote"><?php echo 'Organisert av: ' . $owner['name']; ?></p>
|
||||
<h3 class="no-chin"><?php echo $project->getTitle() . ' (ID: ' . $projectID . ')'; ?></h3>
|
||||
<p class="subnote"><?php echo 'Organisert av: ' . implode(',', array_map(function($org) { return $org->getName(); }, $organizers)); ?></p>
|
||||
<?php
|
||||
$Parsedown = new Parsedown();
|
||||
echo $Parsedown->text(implode("\n", $project->getDescription()));
|
||||
echo $Parsedown->text(implode("\n", $project->getDescriptionNo()));
|
||||
?>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -91,14 +91,30 @@
|
||||
|
||||
/* edit */
|
||||
form .wide {
|
||||
min-width: 66%;
|
||||
min-width: 100%;
|
||||
}
|
||||
|
||||
form .tall {
|
||||
min-height: calc(100vh - 28em);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 50rem) {
|
||||
form .wide {
|
||||
width: calc(100% - 2em);
|
||||
margin: 0 1em;
|
||||
}
|
||||
}
|
||||
|
||||
form .input-group {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
form .input-group-item {
|
||||
flex: 1;
|
||||
margin: 0 0.5em;
|
||||
}
|
||||
|
||||
form .input-group-item input.boxinput,textarea {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@@ -70,68 +70,156 @@ if (!$project_is_new) {
|
||||
|
||||
|
||||
<body>
|
||||
<nav>
|
||||
<?php echo navbar(1, 'prosjekt'); ?>
|
||||
<?php echo loginbar(null, $pdo); ?>
|
||||
</nav>
|
||||
<nav>
|
||||
<?php echo navbar(1, 'prosjekt'); ?>
|
||||
<?php echo loginbar(null, $pdo); ?>
|
||||
</nav>
|
||||
|
||||
<main>
|
||||
<h2>Nytt prosjekt</h2>
|
||||
<main>
|
||||
<h2>Nytt prosjekt</h2>
|
||||
|
||||
<form action="update.php", method="post">
|
||||
<p class="subtitle no-chin">Prosjektnavn</p>
|
||||
<p class="subnote">Gi prosjektet ditt et passende navn</p>
|
||||
<input class="wide" type="text" name="title" value="<?php echo $project->getTitle(); ?>" class="boxinput" required><br>
|
||||
<form action="update.php", method="post">
|
||||
<p class="subtitle no-chin">Prosjektnavn</p>
|
||||
<p class="subnote">Gi prosjektet ditt et passende navn</p>
|
||||
<input class="wide" type="text" name="title" value="<?php echo $project->getTitle(); ?>" class="boxinput" required><br>
|
||||
|
||||
<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">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_no" style="width:100%" rows="8" class="boxinput" required><?php echo implode("\n", $project->getDescriptionNo()); ?></textarea>
|
||||
<div class="input-group">
|
||||
<div class="input-group-item">
|
||||
<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">De første to linjene blir vist på prosjektkortet, prøv å gjøre de til et fint sammendrag eller intro!</p>
|
||||
<textarea name="desc_no" rows="3" class="boxinput" required><?php echo implode("\n", $project->getDescriptionNo()); ?></textarea>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
<textarea class="tall" name="desc_en" style="width:100%" rows="8" class="boxinput" required><?php echo implode("\n", $project->getDescriptionEn()); ?></textarea>
|
||||
<div class="input-group-item">
|
||||
<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>
|
||||
<br>
|
||||
<textarea name="desc_en" rows="3" class="boxinput" required><?php echo implode("\n", $project->getDescriptionEn()); ?></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="subtitle no-chin">Gitea-link</p>
|
||||
<p class="subnote">Link til prosjektet på Gitea</p>
|
||||
<input class="wide" type="text" name="gitea" value="<?php echo $project->getGiteaLink(); ?>" class="boxinput"><br>
|
||||
<div class="input-group">
|
||||
<div class="input-group-item">
|
||||
<p class="subtitle no-chin">Gitea-link</p>
|
||||
<p class="subnote">Link til prosjektet på Gitea</p>
|
||||
<input
|
||||
type="text"
|
||||
name="gitea"
|
||||
placeholder="https://git.pvv.ntnu.no/Projects/mittprosjekt"
|
||||
value="<?php echo $project->getGiteaLink(); ?>"
|
||||
class="boxinput"
|
||||
>
|
||||
</div>
|
||||
|
||||
<p class="subtitle no-chin">Issue board-link</p>
|
||||
<p class="subnote">Link til issue board på Gitea</p>
|
||||
<input class="wide" type="text" name="issue" value="<?php echo $project->getIssueBoardLink(); ?>" class="boxinput"><br>
|
||||
<div class="input-group-item">
|
||||
<p class="subtitle no-chin">Issue board-link</p>
|
||||
<p class="subnote">Link til issue board på Gitea</p>
|
||||
<input
|
||||
type="text"
|
||||
name="issue"
|
||||
placeholder="https://git.pvv.ntnu.no/Projects/mittprosjekt/issues"
|
||||
value="<?php echo $project->getIssueBoardLink(); ?>"
|
||||
class="boxinput"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="subtitle no-chin">Wiki-link</p>
|
||||
<p class="subnote">Link til wiki-side</p>
|
||||
<input class="wide" type="text" name="wiki" value="<?php echo $project->getWikiLink(); ?>" class="boxinput"><br>
|
||||
<div class="input-group">
|
||||
<div class="input-group-item">
|
||||
<p class="subtitle no-chin">Logo-URL</p>
|
||||
<p class="subnote">Link til logo for prosjektet</p>
|
||||
<input
|
||||
type="text"
|
||||
name="logo"
|
||||
placeholder="https://www.pvv.ntnu.no/~user/pictures/logos/prosjektlogo.png"
|
||||
value="<?php echo $project->getLogoURL(); ?>"
|
||||
class="boxinput"
|
||||
>
|
||||
</div>
|
||||
|
||||
<p class="subtitle no-chin">Programmeringsspråk</p>
|
||||
<p class="subnote">Hvilke programmeringsspråk brukes i prosjektet?</p>
|
||||
<input class="wide" type="text" name="langs" value="<?php echo implode("\n", $project->getProgrammingLanguages()); ?>" class="boxinput"><br>
|
||||
<div class="input-group-item">
|
||||
<p class="subtitle no-chin">Wiki-link</p>
|
||||
<p class="subnote">Link til wiki-side</p>
|
||||
<input
|
||||
type="text"
|
||||
name="wiki"
|
||||
placeholder="https://wiki.pvv.ntnu.no/wiki/Prosjekter/Mitt_Prosjekt"
|
||||
value="<?php echo $project->getWikiLink(); ?>"
|
||||
class="boxinput"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="subtitle no-chin">Teknologier</p>
|
||||
<p class="subnote">Hvilke teknologier brukes i prosjektet?</p>
|
||||
<input class="wide" type="text" name="techs" value="<?php echo implode("\n", $project->getTechnologies()); ?>" class="boxinput"><br>
|
||||
<div class="input-group">
|
||||
<div class="input-group-item">
|
||||
<p class="subtitle no-chin">Programmeringsspråk</p>
|
||||
<p class="subnote">Hvilke programmeringsspråk brukes i prosjektet?</p>
|
||||
<input
|
||||
type="text"
|
||||
name="programming-languages"
|
||||
placeholder="php,javascript,html,css"
|
||||
value="<?php echo implode("\n", $project->getProgrammingLanguages()); ?>"
|
||||
class="boxinput"
|
||||
>
|
||||
</div>
|
||||
|
||||
<p class="subtitle no-chin">Nøkkelord</p>
|
||||
<p class="subnote">Nøkkelord som beskriver prosjektet</p>
|
||||
<input class="wide" type="text" name="keywords" value="<?php echo implode("\n", $project->getKeywords()); ?>" class="boxinput"><br>
|
||||
<div class="input-group-item">
|
||||
<p class="subtitle no-chin">Teknologier</p>
|
||||
<p class="subnote">Hvilke teknologier brukes i prosjektet?</p>
|
||||
<input
|
||||
type="text"
|
||||
name="technologies"
|
||||
placeholder="mysql,rest,ajax"
|
||||
value="<?php echo implode("\n", $project->getTechnologies()); ?>"
|
||||
class="boxinput"
|
||||
>
|
||||
</div>
|
||||
|
||||
<p class="subtitle no-chin">Lisens</p>
|
||||
<p class="subnote">Hvilken lisens bruker prosjektet?</p>
|
||||
<input class="wide" type="text" name="license" value="<?php echo $project->getLicense(); ?>" class="boxinput"><br>
|
||||
<div class="input-group-item">
|
||||
<p class="subtitle no-chin">Nøkkelord</p>
|
||||
<p class="subnote">Nøkkelord som beskriver prosjektet</p>
|
||||
<input
|
||||
type="text"
|
||||
name="keywords"
|
||||
placeholder="web,very-cool"
|
||||
value="<?php echo implode("\n", $project->getKeywords()); ?>"
|
||||
class="boxinput"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="subtitle no-chin">Logo-URL</p>
|
||||
<p class="subnote">Link til logo for prosjektet</p>
|
||||
<input class="wide" type="text" name="logo" value="<?php echo $project->getLogoURL(); ?>" class="boxinput"><br>
|
||||
<div class="input-group">
|
||||
<div class="input-group-item">
|
||||
<p class="subtitle no-chin">Lisens</p>
|
||||
<p class="subnote">Hvilken lisens bruker prosjektet?</p>
|
||||
<input
|
||||
type="text"
|
||||
name="license"
|
||||
placeholder="GPL-3.0"
|
||||
value="<?php echo $project->getLicense(); ?>"
|
||||
class="boxinput"
|
||||
>
|
||||
</div>
|
||||
<div class="input-group-item">
|
||||
<p class="subtitle no-chin">Skult</p>
|
||||
<p class="subnote">Skal prosjektet være skjult fra prosjektindeksen?</p>
|
||||
<input
|
||||
type="checkbox"
|
||||
name="is_hidden"
|
||||
value="<?php echo $project->isHidden(); ?>"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php echo '<input type="hidden" name="id" value="' . $project->getID() . '" />'; ?>
|
||||
<input type="hidden" name="active" value="1"/>
|
||||
<?php echo '<input type="hidden" name="id" value="' . $project->getID() . '" />'; ?>
|
||||
<input type="hidden" name="active" value="1"/>
|
||||
|
||||
<div style="margin-top: 0.2em;">
|
||||
<hr class="ruler">
|
||||
<input type="submit" class="btn" value="<?php echo $project_is_new ? 'Opprett prosjekt' : 'Lagre endringer'; ?>"></input>
|
||||
<?php if (!$project_is_new) {?><input type="submit" class="btn" name="delete" value="Slett"></input><?php } ?>
|
||||
</div>
|
||||
</form>
|
||||
</main>
|
||||
<div style="margin-top: 0.2em;">
|
||||
<hr class="ruler">
|
||||
<input type="submit" class="btn" value="<?php echo $project_is_new ? 'Opprett prosjekt' : 'Lagre endringer'; ?>"></input>
|
||||
<?php if (!$project_is_new) {?><input type="submit" class="btn" name="delete" value="Slett"></input><?php } ?>
|
||||
</div>
|
||||
</form>
|
||||
</main>
|
||||
</body>
|
||||
|
||||
@@ -89,7 +89,7 @@ $projects = $projectManager->getAll();
|
||||
}
|
||||
foreach ($randProjects as $i) {
|
||||
$project = $projects[$i];
|
||||
$owner = $projectManager->getProjectOwner($project->getID());
|
||||
$organizers = $projectManager->getProjectOrganizers($project->getID());
|
||||
?>
|
||||
|
||||
<a class="nostyle" href="info.php?id=<?php echo $project->getID(); ?>">
|
||||
@@ -128,7 +128,9 @@ $projects = $projectManager->getAll();
|
||||
|
||||
<footer class="project-footer">
|
||||
<span class="project-organizer">
|
||||
Organisert av <?php echo htmlspecialchars($owner['name']); ?>
|
||||
Organisert av <?php echo htmlspecialchars(implode(', ', array_map(function ($org) {
|
||||
return $org->getName();
|
||||
}, $organizers))); ?>
|
||||
</span>
|
||||
|
||||
<div class="project-links">
|
||||
|
||||
@@ -20,7 +20,7 @@ if (!$project) {
|
||||
exit;
|
||||
}
|
||||
|
||||
$members = $projectManager->getProjectMembers($projectID);
|
||||
$members = $projectManager->getProjectMaintainers($projectID);
|
||||
$normal_members = $members;
|
||||
foreach ($normal_members as $i => $data) {
|
||||
if ($data['lead']) {
|
||||
@@ -65,10 +65,10 @@ if ($attrs) {
|
||||
|
||||
<main class="contentsplit">
|
||||
<div class="gridr">
|
||||
<h2><?php echo $project->getName(); ?></h2>
|
||||
<h2><?php echo $project->getTitle(); ?></h2>
|
||||
<?php
|
||||
$Parsedown = new Parsedown();
|
||||
echo $Parsedown->text(implode("\n", $project->getDescription()));
|
||||
echo $Parsedown->text(implode("\n", $project->getDescriptionEn()));
|
||||
?>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@ $required_fields = [
|
||||
'gitea',
|
||||
'issue',
|
||||
'wiki',
|
||||
'langs',
|
||||
'techs',
|
||||
'programming-languages',
|
||||
'technologies',
|
||||
'keywords',
|
||||
'license',
|
||||
'logo'
|
||||
@@ -36,17 +36,24 @@ $id = $_POST['id'] ?? 0;
|
||||
$do_delete = isset($_POST['delete']);
|
||||
$do_join_or_leave = isset($_POST['join_or_leave']);
|
||||
|
||||
function clean_tags(string $raw): string {
|
||||
$tags = array_map('trim', explode(',', $raw));
|
||||
$tags = array_filter($tags, fn($tag) => !empty($tag));
|
||||
return implode(',', $tags);
|
||||
}
|
||||
|
||||
$title = $_POST['title'];
|
||||
$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'];
|
||||
$langs = clean_tags($_POST['programming-languages']);
|
||||
$techs = clean_tags($_POST['technologies']);
|
||||
$keywords = clean_tags($_POST['keywords']);
|
||||
$license = $_POST['license'];
|
||||
$logo = $_POST['logo'];
|
||||
$is_hidden = isset($_POST['is_hidden']) ? 1 : 0;
|
||||
|
||||
$name = $attrs['cn'][0];
|
||||
$uname = $attrs['uid'][0];
|
||||
@@ -62,11 +69,12 @@ if ($id == 0) { // Create new project
|
||||
gitea_link,
|
||||
issue_board_link,
|
||||
wiki_link,
|
||||
languages,
|
||||
programming_languages,
|
||||
technologies,
|
||||
keywords,
|
||||
license,
|
||||
logo_url
|
||||
logo_url,
|
||||
is_hidden
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@@ -76,11 +84,12 @@ if ($id == 0) { // Create new project
|
||||
:gitea,
|
||||
:issue,
|
||||
:wiki,
|
||||
:langs,
|
||||
:techs,
|
||||
:programming_languages,
|
||||
:technologies,
|
||||
:keywords,
|
||||
:license,
|
||||
:logo
|
||||
:logo,
|
||||
:is_hidden
|
||||
)
|
||||
END;
|
||||
$statement = $pdo->prepare($query);
|
||||
@@ -91,33 +100,36 @@ if ($id == 0) { // Create new project
|
||||
$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(':programming_languages', $langs, PDO::PARAM_STR);
|
||||
$statement->bindParam(':technologies', $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->bindParam(':is_hidden', $is_hidden, PDO::PARAM_BOOL);
|
||||
|
||||
$statement->execute();
|
||||
$new_project_id = $pdo->lastInsertId();
|
||||
|
||||
$ownerQuery = <<<END
|
||||
$insertOrganizerQuery = <<<END
|
||||
INSERT INTO
|
||||
project_maintainer (
|
||||
uname,
|
||||
project_id,
|
||||
name,
|
||||
email
|
||||
email,
|
||||
is_organizer
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
:username,
|
||||
:project_id,
|
||||
:user_real_name,
|
||||
:user_email
|
||||
:user_email,
|
||||
TRUE
|
||||
)
|
||||
END;
|
||||
|
||||
$statement = $pdo->prepare($ownerQuery);
|
||||
$statement = $pdo->prepare($insertOrganizerQuery);
|
||||
$statement->bindParam(':username', $uname, PDO::PARAM_STR);
|
||||
$statement->bindParam(':project_id', $new_project_id, PDO::PARAM_INT);
|
||||
$statement->bindParam(':user_real_name', $name, PDO::PARAM_STR);
|
||||
@@ -126,8 +138,8 @@ if ($id == 0) { // Create new project
|
||||
$statement->execute();
|
||||
} else { // Update existing project
|
||||
$projectManager = new pvv\side\ProjectManager($pdo);
|
||||
$owner = $projectManager->getProjectOwner($id);
|
||||
$members = $projectManager->getProjectMembers($id);
|
||||
// $owner = $projectManager->getProjectOwner($id);
|
||||
$members = $projectManager->getProjectMaintainers($id);
|
||||
|
||||
// if ($do_join_or_leave and $owner['uname'] != $uname) {
|
||||
if ($do_join_or_leave) {
|
||||
@@ -139,7 +151,12 @@ if ($id == 0) { // Create new project
|
||||
}
|
||||
}
|
||||
if ($is_member) {// leave
|
||||
$query = 'DELETE FROM projectmembers WHERE projectid=:id AND uname=:uname and lead=FALSE and owner=FALSE;';
|
||||
$query = '
|
||||
DELETE FROM projectmembers
|
||||
WHERE
|
||||
projectid = :id
|
||||
AND uname = :uname
|
||||
';
|
||||
$statement = $pdo->prepare($query);
|
||||
$statement->bindParam(':id', $id, PDO::PARAM_STR);
|
||||
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
|
||||
@@ -147,7 +164,12 @@ if ($id == 0) { // Create new project
|
||||
$statement->execute();
|
||||
echo 'leave';
|
||||
} else {// join
|
||||
$query = "INSERT INTO projectmembers (projectid, name, uname, mail, role, lead, owner) VALUES (:id, :name, :uname, :mail, 'Medlem', FALSE, FALSE)";
|
||||
$query = '
|
||||
INSERT INTO
|
||||
projectmembers(projectid, name, uname, mail, role)
|
||||
VALUES
|
||||
(:id, :name, :uname, :mail, \'Medlem\')
|
||||
';
|
||||
$statement = $pdo->prepare($query);
|
||||
$statement->bindParam(':id', $id, PDO::PARAM_STR);
|
||||
$statement->bindParam(':name', $name, PDO::PARAM_STR);
|
||||
@@ -171,19 +193,23 @@ if ($id == 0) { // Create new project
|
||||
// this should be done as a transaction...
|
||||
$pdo->beginTransaction();
|
||||
|
||||
// NOTE: project members are deleted via ON DELETE CASCADE
|
||||
$query = 'DELETE FROM projects WHERE id=:id';
|
||||
$statement = $pdo->prepare($query);
|
||||
$statement->bindParam(':id', $id, PDO::PARAM_INT);
|
||||
$statement->execute();
|
||||
|
||||
$query = 'DELETE FROM projectmembers WHERE projectid=:id';
|
||||
$statement = $pdo->prepare($query);
|
||||
$statement->bindParam(':id', $id, PDO::PARAM_INT);
|
||||
$statement->execute();
|
||||
|
||||
$pdo->commit();
|
||||
} else {
|
||||
$query = 'UPDATE projects SET name=:title, description=:desc WHERE id=:id';
|
||||
$query = '
|
||||
UPDATE
|
||||
projects
|
||||
SET
|
||||
name = :title,
|
||||
description = :desc
|
||||
WHERE
|
||||
id = :id
|
||||
';
|
||||
$statement = $pdo->prepare($query);
|
||||
|
||||
$statement->bindParam(':title', $title, PDO::PARAM_STR);
|
||||
|
||||
Reference in New Issue
Block a user