20 Commits

Author SHA1 Message Date
3d843667ad update /tjenester for mobile devices 2025-08-31 01:13:26 +02:00
617a799ad8 Merge pull request 'remove duplicated Kalender button at /hendelser' (#89) from vegardbm/nettsiden:main into main
Reviewed-on: #89
2025-08-18 02:03:29 +02:00
0be8e51af4 remove duplicated Kalender button at /hendelser 2025-08-18 01:59:37 +02:00
381f67189a Merge pull request 'fix missing port for buttercup' (#88) from vegardbm/nettsiden:main into main
Reviewed-on: #88
2025-08-17 20:57:52 +02:00
2e56c7aed4 fix missing port for buttercup 2025-08-17 20:54:21 +02:00
5b7a04dc69 Merge pull request 'update dead links for VM hosts at /tjenester' (#87) from vegardbm/nettsiden:main into main
Reviewed-on: #87
2025-08-17 20:45:06 +02:00
485110bf43 update dead links for VM hosts at /tjenester 2025-08-17 20:43:05 +02:00
3498cb7d8e Merge pull request 'fix minecraft map link at /tjenester' (#86) from vegardbm/nettsiden:main into main
Reviewed-on: #86
2025-08-17 00:13:58 +02:00
ed3f307b9b fix minecraft map link at /tjenester 2025-08-17 00:04:51 +02:00
7070a12e16 Merge pull request 'render /hendelser tid, sted, arrangør nicely on mobile' (#85) from vegardbm/nettsiden:main into main
Reviewed-on: #85
Reviewed-by: Oystein Kristoffer Tveit <oysteikt@pvv.ntnu.no>
2025-08-14 22:47:21 +02:00
6bda1a91bd render /hendelser tid, sted, arrangør nicely on mobile 2025-08-14 22:46:06 +02:00
559b7ec03b Merge pull request 'fix mobile experience for /aktiviteter' (#84) from vegardbm/nettsiden:main into main
Reviewed-on: #84
Reviewed-by: Oystein Kristoffer Tveit <oysteikt@pvv.ntnu.no>
2025-08-14 22:20:24 +02:00
602ae1f396 fix mobile experience for /aktiviteter 2025-08-14 22:17:25 +02:00
f3c439d038 fix README 2025-08-14 21:20:05 +02:00
2b3a9dd6ec update README to reflect changes in dev environment 2025-08-14 21:09:33 +02:00
59b071d8be Fix oopsie, gitignore cache 2025-08-14 19:00:44 +02:00
f732582d0d Merge pull request 'Høst 2025; Legg til fadderuke, pause events' (#83) from fall-2025 into main
Reviewed-on: #83
Reviewed-by: Peder Bergebakken Sundt <pederbs@pvv.ntnu.no>
2025-07-18 21:05:40 +02:00
de72342018 activities: disable recurring events for the summer 2025-07-17 23:39:56 +02:00
b54bbda71f index.php: add fadderuke 2025 poster 2025-07-17 23:35:07 +02:00
20bab54235 dist/simplesamlphp-authsources: set entityID for service provider 2025-03-19 01:34:39 +01:00
20 changed files with 262 additions and 316 deletions

5
.gitignore vendored
View File

@@ -1,6 +1,7 @@
/result
/config.php
*.sqlite
/cache
/config.php
/result
/test.sql
/vendor/
/www/simplesaml

View File

@@ -1,3 +1,4 @@
# Programvareverkstedets nettside
A website created with the latest and greatest web technologies.
@@ -5,59 +6,25 @@ May contain blackjack and other things one tends to include in awesome projects.
## Installation
git clone --recursive https://github.com/Programvareverkstedet/nettsiden.git
git clone --recursive https://github.com/Programvareverkstedet/nettsiden.git
Put it in a folder your webserver can find.
## Development setup
Make sure you have `sqlite3`, `php` and `pdo-sqlite` installed.
These can be obtained from your package manager.
Then make sure PHP has the `curl`, `pdo-sqlite`, `ext-dom` and `sqlite3` extensions enabled, see `/etc/php/php.ini`.
The development environment can be setup with:
To install all mentioned requirements on debian: `apt install composer sqlite3 php8.1-sqlite3 simplesamlphp php-xml`, followed by `composer update`.
nix develop
./dev.sh
For this you will need to install the nix package manager and possibly set the experimental features in your nix config, likely located at /etc/nix/nix.conf or $HOME/.config/nix/nix.conf.
On Windows you can use chocolatey and git bash to run `./dev.sh`.
Install `php` and `sqlite`, then enable these extensions in `C:\tools\php80\php.ini`:
`mbstring`, `openssl`, `curl`, `pdo-sqlite` and `sqlite3`
Installing nix with your package manager might not work without some tweaking, but the upstream script should just work which you can find [here](https://nixos.org/download/).
Alternatively you may use `cmd` on Windows.
In this case you'll have to perform a `composer install` manually beforehand.
Good luck.
experimental-features = flakes nix-command
dev.bat
### Dependency management
`dev.sh` will ensure the git submodules have been properly pulled, then download the `composer` package manager to a php archive file named `composer.phar`, then run it.
Composer will then check for the php extensions needed, such as `pdo_sqlite`, which must be enabled on your system.
This usually includes installing a php-sqlite3 package and enabling it in `/etc/php/php.ini`:
[PHP]
extension=pdo_sqlite
extension=sqlite3
extension=ext-curl
Composer is used as such:
php composer.phar update
php composer.phar install
### Docker
We provide a simple docker-compose setup for local development.
First ensure that docker is running:
sudo systemctl start docker
then
DOCKER_USER=$(id -u):$(id -g) docker-compose up
You can then run the server with:
runDev
### Admin account
@@ -65,15 +32,6 @@ Login goes through `idp.pvv.ntnu.no` via SAML, so you have to use your PVV accou
(This only works if you use access the local development site via the the hostname `localhost`)
To make your account into an admin account, run:
sqlite3 pvv.sqlite 'INSERT INTO users (uname, groups) VALUES ("YOUR_USERNAME", 1);'
If using docker, when already running:
DOCKER_USER=$(id -u):$(id -g) docker-compose exec nettside sqlite3 pvv.sqlite 'INSERT INTO users (uname, groups) VALUES ("YOUR_USERNAME", 1);'
If not already running:
DOCKER_USER=$(id -u):$(id -g) docker-compose run nettside sqlite3 pvv.sqlite 'INSERT INTO users (uname, groups) VALUES ("YOUR_USERNAME", 1);'
sqlite3 pvv.sqlite "INSERT INTO users (uname, groups) VALUES ('YOUR_USERNAME', 1);"
## Hosting

42
dist/pvv_mysql.sql vendored
View File

@@ -8,39 +8,21 @@ CREATE TABLE events (
`description` TEXT
);
CREATE TABLE project_group (
CREATE TABLE projects (
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
`title` TEXT NOT NULL,
`description_en` TEXT NOT NULL,
`description_no` TEXT NOT NULL,
`gitea_link` TEXT NOT NULL,
`wiki_link` TEXT
`name` TEXT,
`description` TEXT,
`active` BOOLEAN
);
CREATE TABLE project (
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
`group_id` INTEGER NOT NULL REFERENCES project_group (id),
`title` TEXT NOT NULL,
`description_en` TEXT NOT NULL,
`description_no` TEXT NOT NULL,
`gitea_link` TEXT NOT NULL,
`issue_board_link` TEXT NOT NULL,
`wiki_link` TEXT,
`languages` TEXT,
`technologies` TEXT,
`keywords` TEXT,
`license` TEXT,
`logo_url` TEXT,
FOREIGN KEY (group_id) REFERENCES project_group (id)
);
CREATE TABLE project_maintainer (
`uname` TEXT PRIMARY KEY,
`name` TEXT NOT NULL,
`link` TEXT NOT NULL,
`mail` TEXT NOT NULL,
FOREIGN KEY (project_id) REFERENCES project (id),
FOREIGN KEY (uname) REFERENCES maintainer (uname),
CREATE TABLE projectmembers (
`projectid` INTEGER,
`name` TEXT,
`uname` TEXT,
`mail` TEXT,
`role` TEXT,
`lead` BOOLEAN DEFAULT 0,
`owner` BOOLEAN DEFAULT 0
);
CREATE TABLE users (`uname` TEXT, `groups` INT DEFAULT 0);

45
dist/pvv_sqlite.sql vendored
View File

@@ -8,42 +8,21 @@ CREATE TABLE "events" (
"description" TEXT
);
CREATE TABLE "project_group" (
CREATE TABLE "projects" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" TEXT NOT NULL,
"description_en" TEXT NOT NULL,
"description_no" TEXT NOT NULL,
"gitea_link" TEXT NOT NULL,
"wiki_link" TEXT
"name" TEXT,
"description" TEXT,
"active" BOOLEAN
);
CREATE TABLE "project" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"group_id" INTEGER NOT NULL REFERENCES project_group (id),
"title" TEXT NOT NULL,
"description_en" TEXT NOT NULL,
"description_no" TEXT NOT NULL,
"gitea_link" TEXT NOT NULL,
"issue_board_link" TEXT NOT NULL,
"wiki_link" TEXT,
"languages" TEXT,
"technologies" TEXT,
"keywords" TEXT,
"license" TEXT,
"logo_url" TEXT
);
CREATE TABLE "project_maintainer" (
"uname" TEXT PRIMARY KEY,
"name" TEXT NOT NULL,
"link" TEXT NOT NULL,
"mail" TEXT NOT NULL
);
CREATE TABLE "project__project_maintainer" (
"project_id" INTEGER REFERENCES project (id),
"uname" TEXT REFERENCES maintainer (uname),
PRIMARY KEY (project_id, uname)
CREATE TABLE "projectmembers" (
"projectid" INTEGER,
"name" TEXT,
"uname" TEXT,
"mail" TEXT,
"role" TEXT,
"lead" BOOLEAN DEFAULT 0,
"owner" BOOLEAN DEFAULT 0
);
CREATE TABLE "users" ("uname" TEXT, "groups" INT DEFAULT 0);

View File

@@ -6,6 +6,7 @@ $config = [
/* This is the name of this authentication source, and will be used to access it later. */
'default-sp' => [
'saml:SP',
'entityID' => 'https://www.pvv.ntnu.no/simplesaml/',
'idp' => 'https://idp.pvv.ntnu.no/',
],
];

View File

@@ -27,9 +27,9 @@ use pvv\side\Agenda;
$agenda = new Agenda([
// new \pvv\side\social\NerdepitsaActivity,
// new \pvv\side\social\AnimekveldActivity,
new pvv\side\social\HackekveldActivity(),
new pvv\side\social\BrettspillActivity(),
new pvv\side\social\DriftkveldActivity(),
// new pvv\side\social\HackekveldActivity(),
// new pvv\side\social\BrettspillActivity(),
// new pvv\side\social\DriftkveldActivity(),
new pvv\side\DBActivity($pdo),
]);

View File

@@ -35,7 +35,7 @@ pkgs.mkShellNoCC {
cp dist/config.local.php config.php
ln -s ../vendor/simplesamlphp/simplesamlphp/public/ www/simplesaml
popd "$PROJECT_ROOT"
popd
fi
'';
}

View File

@@ -6,91 +6,30 @@ namespace pvv\side;
class Project {
private $id;
private $title;
private $descrition_en;
private $description_no;
private $gitea_link;
private $issue_board_link;
private $wiki_link;
private $languages;
private $technologies;
private $keywords;
private $license;
private $logo_url;
private $name;
private $descr;
private $active;
public function __construct(
int $id,
string $title,
string $description_en,
string $description_no,
string $gitea_link,
string $issue_board_link,
string $wiki_link,
string $languages,
string $technologies,
string $keywords,
string $license,
string $logo_url
) {
public function __construct($id, $name, $descr, $active) {
$this->id = $id;
$this->title = $title;
$this->description_en = explode("\n", $description_en);
$this->description_no = explode("\n", $description_no);
$this->gitea_link = $gitea_link;
$this->issue_board_link = $issue_board_link;
$this->wiki_link = $wiki_link;
$this->languages = $languages;
$this->technologies = $technologies;
$this->keywords = $keywords;
$this->license = $license;
$this->logo_url = $logo_url;
$this->name = $name;
$this->descr = explode("\n", $descr);
$this->active = $active;
}
public function getID() {
return $this->id;
}
public function getTitle() {
return $this->title;
public function getName() {
return $this->name;
}
public function getDescriptionEn() {
return $this->description_en;
public function getDescription() {
return $this->descr;
}
public function getDescriptionNo() {
return $this->description_no;
}
public function getGiteaLink() {
return $this->gitea_link;
}
public function getIssueBoardLink() {
return $this->issue_board_link;
}
public function getWikiLink() {
return $this->wiki_link;
}
public function getLanguages() {
return $this->languages;
}
public function getTechnologies() {
return $this->technologies;
}
public function getKeywords() {
return $this->keywords;
}
public function getLicense() {
return $this->license;
}
public function getLogoURL() {
return $this->logo_url;
public function getActive() {
return $this->active;
}
}

View File

@@ -12,7 +12,7 @@ class ProjectManager {
}
public function getAll() {
$query = 'SELECT * FROM project ORDER BY id ASC';
$query = 'SELECT * FROM projects ORDER BY id ASC';
$statement = $this->pdo->prepare($query);
$statement->execute();
@@ -20,17 +20,9 @@ class ProjectManager {
foreach ($statement->fetchAll() as $dbProj) {
$project = new Project(
$dbProj['id'],
$dbProj['title'],
$dbProj['description_en'],
$dbProj['description_no'],
$dbProj['gitea_link'],
$dbProj['issue_board_link'],
$dbProj['wiki_link'],
$dbProj['languages'],
$dbProj['technologies'],
$dbProj['keywords'],
$dbProj['license'],
$dbProj['logo_url']
$dbProj['name'],
$dbProj['description'],
$dbProj['active']
);
$projects[] = $project;
}
@@ -39,7 +31,7 @@ class ProjectManager {
}
public function getByID($id) {
$query = 'SELECT * FROM project WHERE id=:id LIMIT 1';
$query = 'SELECT * FROM projects WHERE id=:id LIMIT 1';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
$statement->execute();
@@ -51,28 +43,14 @@ class ProjectManager {
return new Project(
$dbProj['id'],
$dbProj['title'],
$dbProj['description_en'],
$dbProj['description_no'],
$dbProj['gitea_link'],
$dbProj['issue_board_link'],
$dbProj['wiki_link'],
$dbProj['languages'],
$dbProj['technologies'],
$dbProj['keywords'],
$dbProj['license'],
$dbProj['logo_url']
$dbProj['name'],
$dbProj['description'],
$dbProj['active']
);
}
public function getByOwner($uname) {
$query = '
SELECT projectid FROM project
JOIN project__project_maintainer ON project.id = project__project_maintainer.project_id
JOIN project_maintainer ON project__project_maintainer.uname = project_maintainer.uname
WHERE project_maintainer.uname = :uname
';
$query = 'SELECT projectid FROM projectmembers WHERE uname=:uname';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute();
@@ -90,17 +68,9 @@ class ProjectManager {
foreach ($statement->fetchAll() as $dbProj) {
$project = new Project(
$dbProj['id'],
$dbProj['title'],
$dbProj['description_en'],
$dbProj['description_no'],
$dbProj['gitea_link'],
$dbProj['issue_board_link'],
$dbProj['wiki_link'],
$dbProj['languages'],
$dbProj['technologies'],
$dbProj['keywords'],
$dbProj['license'],
$dbProj['logo_url']
$dbProj['name'],
$dbProj['description'],
$dbProj['active']
);
$projects[] = $project;
}
@@ -109,28 +79,42 @@ class ProjectManager {
return $projects;
}
public function getProjectMaintainers($id) {
$query = '
SELECT id FROM project
JOIN project__project_maintainer ON project.id = project__project_maintainer.project_id
JOIN project_maintainer ON project__project_maintainer.uname = project_maintainer.uname
WHERE project.id = :id
';
public function getProjectMembers($id) {
$query = 'SELECT * FROM projectmembers WHERE projectid=:id';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, \PDO::PARAM_STR);
$statement->execute();
$maintainers = [];
$members = [];
foreach ($statement->fetchAll() as $dbUsr) {
$maintainers[] = [
$members[] = [
'name' => $dbUsr['name'],
'uname' => $dbUsr['uname'],
'link' => $dbOwner['link'],
'mail' => $dbUsr['mail'],
'role' => $dbUsr['role'],
'lead' => $dbUsr['lead'],
'owner' => $dbUsr['owner'],
];
}
return maintainers;
return $members;
}
public function getProjectOwner($id) {
$query = 'SELECT * FROM projectmembers WHERE (projectid=:id AND owner=1)';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, \PDO::PARAM_STR);
$statement->execute();
$dbOwner = $statement->fetch();
return [
'name' => $dbOwner['name'],
'uname' => $dbOwner['uname'],
'mail' => $dbOwner['mail'],
'role' => $dbOwner['role'],
'lead' => $dbOwner['lead'],
'owner' => $dbOwner['owner'],
];
}
}

View File

@@ -55,6 +55,7 @@ $day = (isset($_GET['day']))
<em><?php echo $event->getRelativeDate(); ?></em>
<?php if (Agenda::isToday($event->getStart())) { ?></strong><?php } ?>
<?php if ($event->getURL()) { ?>
<br>
<a href="<?php echo $event->getURL(); ?>"><?php echo $event->getName(); ?></a>
<?php } else { ?>
<?php echo $event->getName(); ?>

View File

@@ -11,7 +11,6 @@ h2 em {
font-size: .5em;
line-height: 2em;
float: left;
margin-right: 1em;
border: .1em solid gray;
padding: 0 1em;
border-radius: .25em;
@@ -107,7 +106,6 @@ p + .subtext {
}
@media screen and (max-width: 50rem) {
h2 {
text-align: center;
position: relative;
border-bottom-left-radius: 0.3em;
border-bottom-right-radius: 0.3em;
@@ -133,4 +131,8 @@ p + .subtext {
article >.subtext {
margin-top: -1em !important;
}
.subtext li {
display: block;
}
}

View File

@@ -45,6 +45,7 @@ main {
.serviceContent {
flex-grow: 1;
margin-right: 4%;
}
.serviceTitle {
@@ -91,3 +92,18 @@ main {
}
}
@media (max-width: 400px) {
.serviceImage {
width: 25%;
height: auto;
}
.serviceContent {
width: 50%;
}
}
@media (max-width: 360px) {
.serviceContent {
font-size: 14px;
}
}

View File

@@ -66,9 +66,5 @@ $translation = ['I dag', 'I morgen', 'Denne uka', 'Neste uke', 'Denne måneden',
<?php } ?>
<?php } ?>
<div style="text-align: center; margin-bottom: 2em;">
<a style="padding-left: 2em; padding-right: 2em;" class="btn" style="" href="../kalender/">Kalender</a>
</div>
</main>
</body>

View File

@@ -37,7 +37,7 @@ if (!$event) {
<?php if (Agenda::isToday($event->getStart())) { ?><strong><?php } ?>
<em><?php echo $event->getRelativeDate(); ?></em>
<?php if (Agenda::isToday($event->getStart())) { ?></strong><?php } ?>
<br>
<?php echo $event->getName(); ?>
</h2>
<ul class="subtext">

View File

@@ -109,6 +109,8 @@ $doorTime = date('H:i', $doorEntry->time);
</div>
<div class="gridl">
<img src="/sosiale/fadderuke-2025.png" width="100%">
<br>
<?php
$title = $motd['title'];

View File

@@ -36,16 +36,16 @@ $project = new pvv\side\Project(
$attrs['mail'][0],
1
);
// if ($new == 0) {
// $project = $projectManager->getByID($projectID);
// $maintainers = $projectManager->getProjectMaintainers($projectID);
if ($new == 0) {
$project = $projectManager->getByID($projectID);
$owner = $projectManager->getProjectOwner($projectID);
// if ($owner['uname'] != $attrs['uid'][0]) {
// header('HTTP/1.0 403 Forbidden');
// echo 'wrong user';
// exit;
// }
// }
if ($owner['uname'] != $attrs['uid'][0]) {
header('HTTP/1.0 403 Forbidden');
echo 'wrong user';
exit;
}
}
?>
<!DOCTYPE html>
<html lang="no">
@@ -74,48 +74,12 @@ $project = new pvv\side\Project(
<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>
<input class="wide" type="text" name="title" value="<?php echo $project->getName(); ?>" class="boxinput"><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" 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="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>
<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" required><br>
<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" required><br>
<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>
<p class="subtitle no-chin">Programmeringsspråk</p>
<p class="subnote">Hvilke språk brukes i prosjektet?</p>
<input class="wide" type="text" name="langs" value="<?php echo $project->getLanguages(); ?>" class="boxinput"><br>
<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 $project->getTechnologies(); ?>" class="boxinput"><br>
<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 $project->getKeywords(); ?>" class="boxinput"><br>
<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>
<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>
<textarea class="tall" name="desc" style="width:100%" rows="8" class="boxinput"><?php echo implode("\n", $project->getDescription()); ?></textarea>
<?php echo '<input type="hidden" name="id" value="' . $project->getID() . '" />'; ?>
<input type="hidden" name="active" value="1"/>

View File

@@ -71,6 +71,7 @@ $projects = $projectManager->getAll();
<br>
<center>
<a class="btn" href="edit.php?new=1">Lag prosjekt</a>
<a class="btn" href="mine.php">Mine prosjekter</a>
</center>
<br>
<?php

120
www/prosjekt/mine.php Normal file
View File

@@ -0,0 +1,120 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'nb_NO');
require __DIR__ . '/../../inc/navbar.php';
require __DIR__ . '/../../src/_autoload.php';
require __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$projectManager = new pvv\side\ProjectManager($pdo);
$projects = $projectManager->getByOwner($attrs['uid'][0]);
$page = 1;
if (isset($_GET['page'])) {
$page = $_GET['page'];
}
$filter = '';
if (isset($_GET['filter'])) {
$filter = $_GET['filter'];
}
// filter
$projects = array_values(array_filter(
$projects,
static fn($project) => (preg_match('/.*' . $filter . '.*/i', $project->getName()) || preg_match('/.*' . $filter . '.*/i', implode(' ', $project->getDescription())))
));
?>
<!DOCTYPE html>
<html lang="no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../css/normalize.css">
<link rel="stylesheet" href="../css/style.css">
<link rel="stylesheet" href="../css/events.css">
<link rel="stylesheet" href="../css/admin.css">
<meta name="theme-color" content="#024" />
<title>Prosjektverkstedet</title>
<header>Prosjekt&shy;verk&shy;stedet</header>
<body>
<nav>
<?php echo navbar(1, 'prosjekt'); ?>
<?php echo loginbar(); ?>
</nav>
<main class="gridsplit">
<div class="gridl">
<h2 class="no-chin">Mine Prosjekter</h2>
<ul class="event-list">
<?php
$counter = 0;
$pageLimit = 8;
for ($i = ($pageLimit * ($page - 1)); $i < count($projects); ++$i) {
if ($counter == $pageLimit) {
break;
}
$project = $projects[$i];
$projectID = $project->getID();
$owner = $projectManager->getProjectOwner($projectID);
if ($owner['uname'] != $attrs['uid'][0]) {
continue;
}
?>
<li>
<div class="event">
<div class="event-info">
<a href="edit.php?id=<?php echo $project->getID(); ?>">
<h3 class="no-chin"><?php echo $project->getName(); ?></h3>
</a>
<p style="text-decoration: none;"><?php echo implode('<br>', array_slice($project->getDescription(), 0, 4)); ?></p>
</div>
</div>
</li>
<?php
++$counter;
}
?>
</ul>
<?php
if ($page != 1) {
echo '<a class="btn float-left" href="?page=' . ($page - 1) . '&filter=' . urlencode($filter) . '">Forrige side</a>';
}
if (($counter == $pageLimit) && (($pageLimit * $page) < count($projects))) {
echo '<a class="btn float-right" href="?page=' . ($page + 1) . '&filter=' . urlencode($filter) . '">Neste side</a>';
}
?>
</div>
<div class="gridr">
<h2>Verktøy</h2>
<a class="btn" href="edit.php?new=1">Lag prosjekt</a>
<h2>Filter</h2>
<form action="mine.php" method="get">
<p class="no-chin">Navn</p>
<?php echo '<input type="text" name="filter" class="boxinput" value="' . $filter . '">'; ?><br>
<div style="margin-top: 2em;">
<input type="submit" class="btn" value="Filtrer"></input>
</div>
</form>
</div>
</main>
</body>

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

View File

@@ -129,29 +129,29 @@ require_once \dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'i
<div class="service">
<div class="serviceContent">
<h2 class="serviceTitle">Proxmox @joshua</h2>
<p class="serviceDescription">Joshua er en av våre VM-tjenere, her kan du kjøre enten fulle VM-er eller konteinere. Bare Drift har tilgang på disse tjenerne.</p>
<div class="serviceLink"><a href="https://joshua.pvv.ntnu.no:8006" target="_blank">Gå til joshua.pvv.ntnu.no</a></div>
<h2 class="serviceTitle">Proxmox @blossom</h2>
<p class="serviceDescription">Blossom er den sterkeste av våre VM-tjenere, her kan du kjøre enten fulle VM-er eller konteinere. Bare Drift har tilgang på disse tjenerne.</p>
<div class="serviceLink"><a href="https://blossom.pvv.ntnu.no:8006" target="_blank">Gå til blossom.pvv.ntnu.no</a></div>
</div>
<img class="serviceImage" src="img/proxmox.png" alt="Proxmox-logo">
</div>
<div class="service">
<div class="serviceContent">
<h2 class="serviceTitle">Proxmox @andresbu</h2>
<p class="serviceDescription">Andresbu er en kraftigere VM-tjener, men har fortsatt en del rusk i maskineriet.</p>
<div class="serviceLink"><a href="https://andresbu.pvv.ntnu.no:8006" target="_blank">Gå til andresbu.pvv.ntnu.no</a></div>
<h2 class="serviceTitle">Proxmox @bubbles</h2>
<p class="serviceDescription">Bubbles er den svakeste av våre VM-tjenere.</p>
<div class="serviceLink"><a href="https://bubbles.pvv.ntnu.no:8006" target="_blank">Gå til bubbles.pvv.ntnu.no</a></div>
</div>
<img class="serviceImage" src="img/proxmox.png" alt="Proxmox-logo">
</div>
<div class="service">
<div class="serviceContent">
<h2 class="serviceTitle">ESXI @asgore</h2>
<p class="serviceDescription">Asgore er vår eldste og største VM-tjener, og kjører ESXI.</p>
<div class="serviceLink"><a href="https://asgore.pvv.ntnu.no" target="_blank">Gå til asgore.pvv.ntnu.no</a></div>
<h2 class="serviceTitle">Proxmox @buttercup</h2>
<p class="serviceDescription">Buttercup er en av våre VM-tjenere.</p>
<div class="serviceLink"><a href="https://buttercup.pvv.ntnu.no:8006" target="_blank">Gå til buttercup.pvv.ntnu.no</a></div>
</div>
<img class="serviceImage" src="img/esxi.png" alt="ESXI-logo">
<img class="serviceImage" src="img/proxmox.png" alt="Proxmox-logo">
</div>
</div>
</div>
@@ -164,7 +164,7 @@ require_once \dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'i
<div class="serviceContent">
<h2 class="serviceTitle">Minecraft</h2>
<p class="serviceDescription">Vi har en egen Minecraft-server <b>for medlemmer</b>, som du kan koble til med IP-adressen <b>minecraft.pvv.ntnu.no</b>. Spør om whitelist på matrix/discord.</p>
<div class="serviceLink"><a href="https://isvegg.pvv.ntnu.no/kart/" target="_blank">Gå til verdenskartet vårt</a></div>
<div class="serviceLink"><a href="https://minecraft.pvv.ntnu.no" target="_blank">Gå til verdenskartet vårt</a></div>
</div>
<img class="serviceImage" src="img/minecraft.png" alt="Minecraft-logo">
</div>