Compare commits
352 Commits
Author | SHA1 | Date | |
---|---|---|---|
f732582d0d | |||
de72342018 | |||
b54bbda71f | |||
20bab54235
|
|||
c3d8ce017d
|
|||
02cfe9feaa
|
|||
4d4ec78ea3
|
|||
a74ea31356
|
|||
0653672a17
|
|||
8a1ff1a265
|
|||
c1802e7cf2
|
|||
84de16fc25
|
|||
23b8e91a6c
|
|||
da8afe735c
|
|||
b6697e5750
|
|||
ece3c8ab80
|
|||
7297c83cea
|
|||
74662af3ef
|
|||
32e147fd02
|
|||
d5c28d4e0f
|
|||
f1b3c63311
|
|||
a4ebe6ded0 | |||
2930f9863f | |||
e7b66b4bc6 | |||
c62f4d4705 | |||
814e5bc6c7 | |||
f57edf60c1
|
|||
a29d3fe803 | |||
8bcadd1d2d | |||
8a82e2795c | |||
4ee8b73044 | |||
6580cfe546 | |||
a0f9e71d46
|
|||
6e4a79ed3d | |||
ce99b309f8 | |||
37445f42b5 | |||
9717c11af5 | |||
2cab4df4b1 | |||
18c8426246 | |||
4890a0af04
|
|||
7bf2c31db3 | |||
13a6df92ce | |||
f87c6820d7
|
|||
592c6d46c4
|
|||
9d9d99e6ba | |||
216e153f89 | |||
d528df5f99 | |||
faf93cc45a | |||
1aa4f4fc8a | |||
f1958d9afc | |||
7f269f05d6 | |||
7e158c9fc3 | |||
d79cd3ad37 | |||
f5a6868301 | |||
310246dd20 | |||
151a0d44f6 | |||
10c70e89f6 | |||
318e9cfe6b | |||
1f60b80b98 | |||
517f39eee9 | |||
2f6553225a | |||
1eb84eaec8 | |||
3e1a21741f | |||
da6c1963f8 | |||
0da5d44ea1 | |||
133c4e269d | |||
850c8da95a | |||
1ae6356aa5 | |||
fa4fa9ad7d | |||
d43e5faf3c | |||
57055c9c6f | |||
5fbc1dbc00 | |||
e364a5fee0 | |||
a4a6553329 | |||
ae81d269fa
|
|||
31d9a955df | |||
6bd3ce7731 | |||
9f45271b18 | |||
567962c947 | |||
7defd8b388 | |||
a7f2c4f2d3 | |||
847fe67534 | |||
79854aee6f | |||
699876405c | |||
a734fe6bd3 | |||
c33736a501 | |||
3a39ca0f73 | |||
d8f8aafdd9 | |||
79ffb1fff5 | |||
29c4c67645 | |||
98da6ada23 | |||
1c1656c3bc | |||
c489f303ea | |||
fc0286c277 | |||
f4407fde4a | |||
9f11d442fe | |||
1bc41124c0 | |||
72fb9e9915 | |||
b555f915a0 | |||
4b9957e9c5 | |||
b42214b404 | |||
fcef05d439 | |||
0f8b15715b | |||
8a79d9d016 | |||
f507b0cddd | |||
0b25f8d54a | |||
4f504e9456 | |||
1f32c03d86 | |||
fc6d5d5f8e | |||
1cde0a2a93 | |||
65c0bad9b0 | |||
9fa6066724 | |||
a506dc44cc | |||
a80114be7a | |||
ab6edd92e1 | |||
6070cf4bd3 | |||
fdd1d12e9e | |||
6cae4cb0e2 | |||
15c9431c10 | |||
500ea63c77 | |||
bbe51e702b | |||
ab1bbdd3df | |||
893f57c9b7 | |||
184d40266b | |||
516287ee85 | |||
3335f5958e | |||
a7d7ce4da0 | |||
1711ce2e5d | |||
31e104a150 | |||
c57276b779 | |||
9e7436684c | |||
a500b5eecc | |||
fb5b66f12b | |||
e7f9799285 | |||
25212940dd | |||
![]() |
a1d56570b1 | ||
15f2154f6a | |||
![]() |
6b81b0785f | ||
6b243ad91b | |||
63e49417a7 | |||
6c891b3f79 | |||
a4ce890a36 | |||
2ba0266fca | |||
9f3812b8a5 | |||
a9ee7cd6f7 | |||
1c4eb5cfe4 | |||
9162ee70a7 | |||
bdbab5be9e | |||
0d87d37c72 | |||
728f8a6179 | |||
8fd03c9824 | |||
fdbbaee175 | |||
9dad49738c | |||
0336236fda | |||
9a5e444041 | |||
cfeba9f8da | |||
9691433917 | |||
db6af95063 | |||
cd1792c130 | |||
dc99df21c2 | |||
ecf40334e4 | |||
e1686cd8c5 | |||
![]() |
06bfa81d6e | ||
5ade47f6dd | |||
7b237f1656 | |||
80198d0d98 | |||
3c24435688 | |||
b50a4a7ad4 | |||
523b30d6f5 | |||
06e530061d | |||
c0c324217c | |||
9b3735ea75 | |||
9997b8fca9 | |||
27986e0b1d | |||
fe129fe1b0 | |||
e08b23be05 | |||
![]() |
089b34833b | ||
![]() |
995b8d7ae7 | ||
d248c94a3d | |||
![]() |
d3584dae44 | ||
a45eaab050 | |||
![]() |
c6795dc1bf | ||
d1734e8762 | |||
![]() |
69582db88f | ||
![]() |
66eb6f0907 | ||
74e86ded33 | |||
ea7c33cb8e | |||
5ad772fc26 | |||
39126936b0 | |||
c549890b7e | |||
09d5ebc249 | |||
ead8f3a19c | |||
c3ada63c69 | |||
eb39821f20 | |||
59463ebdfb | |||
d1612e2804 | |||
07c1a90845 | |||
d0613a8734 | |||
dd2ca22bba | |||
69ed1df0d1 | |||
386b0bfcbf | |||
2b3d6d7026 | |||
b29106bcbe | |||
6cc8e5e0da | |||
221f61c496 | |||
f37919c850 | |||
d3234d0204 | |||
6d13f47815 | |||
e54142021a | |||
cc2241f71a | |||
cb9283be16 | |||
22a08bfb04 | |||
2f22451fa6 | |||
7dc892b757 | |||
7b08ea6a22 | |||
fc35b804e4 | |||
376c7ad890 | |||
9f7ef8bdb1 | |||
d4bdad8d5e | |||
7669566f81 | |||
023b53fa95 | |||
17ef9288ef | |||
a600f8170a | |||
1540292458 | |||
3dc3b37044 | |||
52a50017c6 | |||
fbcae7b67d | |||
69dcc15bea | |||
31a7470b37 | |||
79e413d194 | |||
307eba4218 | |||
5ef3bc68a0 | |||
5205a3f095 | |||
309e308518 | |||
90297af982 | |||
e1e053af27 | |||
e72bd066be | |||
474895c2a3 | |||
1066f42861 | |||
928647e6cc | |||
47c8ac90cb | |||
618c7c3eef | |||
2c2d1ab446 | |||
88e258a0fb | |||
29a41f5ad8 | |||
13518f7fff | |||
90ece46dd7 | |||
d92e53f0b7 | |||
b965da0a6c | |||
a63bc3e6a9 | |||
1147c1a7af | |||
34668cb0ea | |||
adab82964d | |||
21390d8ce8 | |||
6601ec041e | |||
4445f659a7 | |||
202f2ce12a | |||
734a3b023f | |||
be5b1d7b81 | |||
cb3949f6e8 | |||
f5c088fdc1 | |||
6c7241a2ac | |||
8dcc899c34 | |||
32cc4ec27f | |||
29ac0ece7e | |||
3117f466b5 | |||
9fec2d56f4 | |||
e60195d431 | |||
54467ab9b9 | |||
30c8aa2032 | |||
d984dfb89c | |||
63200f863b | |||
2a3f0d7be7 | |||
5412414ce1 | |||
ebe3ce0e1e | |||
43fb843b17 | |||
3ccaf69549 | |||
ec69d5f724 | |||
6777048dac | |||
3832d3fde0 | |||
32f9653a6d | |||
48d79f2635 | |||
54428c2bab | |||
4ca408b8fe | |||
550161bba2 | |||
f6174706f8 | |||
c2374d999d | |||
66504057b2 | |||
f3b95fe641 | |||
b016d27adb | |||
d44cf95736 | |||
cf058dc7a9 | |||
9f935cd810 | |||
e88411eea4 | |||
0bce2053cf | |||
1d65cab11d | |||
8f2299cee5 | |||
ba0fe09d06 | |||
73efba625b | |||
f2b75c81c1 | |||
060d37c040 | |||
24b6af1799 | |||
edde8b6927 | |||
528ea62f38 | |||
87c6523f35 | |||
a4b01d1259 | |||
f811286e52 | |||
c38932046a | |||
f2a14f3791 | |||
53af8dae44 | |||
1db31b9e56 | |||
af97383e01 | |||
c12f38f133 | |||
e7f11aee54 | |||
98f882233c | |||
5e10d53c36 | |||
fe1e012db3 | |||
e93b07f890 | |||
46eed1c223 | |||
1e973c31b2 | |||
84b6b60a37 | |||
774f2754a0 | |||
89ce6773a8 | |||
1f2de139eb | |||
4efe0aaefa | |||
05dee57ded | |||
2d850c719d | |||
0d0305cf04 | |||
02f54c4458 | |||
39dfafd538 | |||
6162e2662c | |||
8a47ad96de | |||
61e7c73901 | |||
e98084aaf4 | |||
9f38e2af1a | |||
8b148fe0e3 | |||
ebedc31fb6 | |||
25da4a80f2 | |||
b914590ea8 | |||
5dd2260948 | |||
6f2ab1ac00 | |||
689428241c | |||
0b0707eafe | |||
c4c5389fe8 | |||
32aa9e077c | |||
56e6766520 | |||
b1623f9da1 | |||
1ea96f5c0d | |||
2ee9a98277 | |||
1f47b3849e | |||
ede224c2f2 | |||
c6cd02486d |
1
.envrc
Normal file
@@ -0,0 +1 @@
|
|||||||
|
use flake
|
3
.git-blame-ignore-revs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# The formattening
|
||||||
|
c5d308654744e116090e9ba165a968b8bf66006c
|
||||||
|
da8afe735c62e1f8ee9ad5f71291d87102fe126b
|
2
.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*.sh text eol=lf
|
||||||
|
*.bat text eol=crlf
|
4
.gitignore
vendored
@@ -1,5 +1,5 @@
|
|||||||
/sql_config.php
|
/result
|
||||||
/dataporten_config.php
|
/config.php
|
||||||
*.sqlite
|
*.sqlite
|
||||||
/test.sql
|
/test.sql
|
||||||
/vendor/
|
/vendor/
|
||||||
|
58
.php-cs-fixer.php
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$finder = (new PhpCsFixer\Finder())
|
||||||
|
->ignoreDotFiles(false)
|
||||||
|
->ignoreVCSIgnored(true)
|
||||||
|
->in([
|
||||||
|
'inc',
|
||||||
|
'src',
|
||||||
|
'dist',
|
||||||
|
])
|
||||||
|
->exclude([
|
||||||
|
'vendor',
|
||||||
|
])
|
||||||
|
->append([
|
||||||
|
__DIR__ . '/config.php',
|
||||||
|
__DIR__ . '/.php-cs-fixer',
|
||||||
|
])
|
||||||
|
;
|
||||||
|
|
||||||
|
return (new PhpCsFixer\Config())
|
||||||
|
->setRiskyAllowed(true)
|
||||||
|
->setRules([
|
||||||
|
'@PhpCsFixer' => true,
|
||||||
|
'@Symfony' => true,
|
||||||
|
'@PER-CS' => true,
|
||||||
|
'@PHP71Migration' => true,
|
||||||
|
'@PHP73Migration' => true,
|
||||||
|
'@PHP74Migration' => true,
|
||||||
|
'@PHP80Migration' => true,
|
||||||
|
'@PHP81Migration' => true,
|
||||||
|
'@PHP82Migration' => true,
|
||||||
|
'@PHP83Migration' => true,
|
||||||
|
'@PHP84Migration' => true,
|
||||||
|
|
||||||
|
'@PhpCsFixer:risky' => true,
|
||||||
|
'@Symfony:risky' => true,
|
||||||
|
'@PER-CS:risky' => true,
|
||||||
|
'@PHP74Migration:risky' => true,
|
||||||
|
'@PHP80Migration:risky' => true,
|
||||||
|
'@PHP82Migration:risky' => true,
|
||||||
|
|
||||||
|
'strict_param' => true,
|
||||||
|
'array_syntax' => ['syntax' => 'short'],
|
||||||
|
'braces_position' => [
|
||||||
|
'functions_opening_brace' => 'same_line',
|
||||||
|
'classes_opening_brace' => 'same_line',
|
||||||
|
],
|
||||||
|
'simplified_if_return' => true,
|
||||||
|
'simplified_null_return' => true,
|
||||||
|
'yoda_style' => false,
|
||||||
|
|
||||||
|
// TODO: fix these
|
||||||
|
'psr_autoloading' => false,
|
||||||
|
])
|
||||||
|
->setFinder($finder)
|
||||||
|
->setIndent(" ")
|
||||||
|
->setLineEnding("\n")
|
||||||
|
;
|
7
Dockerfile
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# this is a development container, not hardened for hosting
|
||||||
|
FROM php:7.4-cli
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y \
|
||||||
|
sqlite3 \
|
||||||
|
unzip \
|
||||||
|
git
|
64
README.md
@@ -1,4 +1,4 @@
|
|||||||
# Programvareverkstedet nettside
|
# Programvareverkstedets nettside
|
||||||
|
|
||||||
A website created with the latest and greatest web technologies.
|
A website created with the latest and greatest web technologies.
|
||||||
May contain blackjack and other things one tends to include in awesome projects.
|
May contain blackjack and other things one tends to include in awesome projects.
|
||||||
@@ -11,11 +11,69 @@ Put it in a folder your webserver can find.
|
|||||||
|
|
||||||
## Development setup
|
## Development setup
|
||||||
|
|
||||||
Make sure you have sqlite3 and PHP installed, with pdo-sqlite module.
|
Make sure you have `sqlite3`, `php` and `pdo-sqlite` installed.
|
||||||
These can be obtained from your package manager.
|
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`.
|
||||||
|
|
||||||
|
To install all mentioned requirements on debian: `apt install composer sqlite3 php8.1-sqlite3 simplesamlphp php-xml`, followed by `composer update`.
|
||||||
|
|
||||||
./dev.sh
|
./dev.sh
|
||||||
|
|
||||||
or on Windows, if you have PHP and sqlite3 available in path:
|
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`
|
||||||
|
|
||||||
|
Alternatively you may use `cmd` on Windows.
|
||||||
|
In this case you'll have to perform a `composer install` manually beforehand.
|
||||||
|
Good luck.
|
||||||
|
|
||||||
dev.bat
|
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
|
||||||
|
|
||||||
|
|
||||||
|
### Admin account
|
||||||
|
|
||||||
|
Login goes through `idp.pvv.ntnu.no` via SAML, so you have to use your PVV account.
|
||||||
|
(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);'
|
||||||
|
|
||||||
|
|
||||||
|
## Hosting
|
||||||
|
@@ -1,8 +1,16 @@
|
|||||||
{
|
{
|
||||||
"require": {
|
"name": "programvareverkstedet/nettsiden",
|
||||||
"simplesamlphp/simplesamlphp": "~1"
|
"description": "Programvareverkstedets nettside",
|
||||||
},
|
"license": "proprietary",
|
||||||
"require-dev": {
|
|
||||||
"ext-pdo_sqlite": "*"
|
"config": {
|
||||||
}
|
"allow-plugins": {
|
||||||
}
|
"simplesamlphp/composer-module-installer": true,
|
||||||
|
"simplesamlphp/composer-xmlprovider-installer": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"simplesamlphp/simplesamlphp": "^2.2.1",
|
||||||
|
"erusev/parsedown": "^1.7.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
3976
composer.lock
generated
11
dev.bat
@@ -1,11 +0,0 @@
|
|||||||
REM php og sqlite3 må være tilgjengelig i PATH
|
|
||||||
|
|
||||||
IF EXIST "sql_config.php" goto config_end
|
|
||||||
cp sql_config_example.php sql_config.php
|
|
||||||
:config_end
|
|
||||||
|
|
||||||
IF EXIST "pvv.sqlite" goto sqlite_end
|
|
||||||
sqlite3 pvv.sqlite < pvv.sql
|
|
||||||
:sqlite_end
|
|
||||||
|
|
||||||
php -S [::1]:1080 -t www/ -c php.ini
|
|
19
dev.sh
@@ -1,19 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
which sqlite3 > /dev/null 2>&1 && test \! -e pvv.sqlite && sqlite3 pvv.sqlite < dist/pvv.sql
|
|
||||||
test \! -e sql_config.php && cp -v dist/sql_config_example.php sql_config.php
|
|
||||||
|
|
||||||
test \! -e dataporten_config.php && cp -v dist/dataporten_config.php dataporten_config.php
|
|
||||||
|
|
||||||
test -e composer.phar || curl -O https://getcomposer.org/composer.phar
|
|
||||||
|
|
||||||
if test \! -d vendor; then
|
|
||||||
php composer.phar install
|
|
||||||
cp -v dist/authsources_example.php vendor/simplesamlphp/simplesamlphp/config/authsources.php
|
|
||||||
cp -v dist/saml20-idp-remote.php vendor/simplesamlphp/simplesamlphp/metadata/saml20-idp-remote.php
|
|
||||||
# cp -v vendor/simplesamlphp/simplesamlphp/config-templates/config.php vendor/simplesamlphp/simplesamlphp/config/config.php
|
|
||||||
sed -e "s/'trusted.url.domains' => array()/'trusted.url.domains' => array('localhost:1080')/g" < vendor/simplesamlphp/simplesamlphp/config-templates/config.php > vendor/simplesamlphp/simplesamlphp/config/config.php
|
|
||||||
ln -s ../vendor/simplesamlphp/simplesamlphp/www/ www/simplesaml
|
|
||||||
fi
|
|
||||||
|
|
||||||
php -S [::1]:1080 -d error_reporting=E_ALL -d display_errors=1 -t www/
|
|
9
dist/authsources_example.php
vendored
@@ -1,9 +0,0 @@
|
|||||||
<?php
|
|
||||||
$config = array(
|
|
||||||
|
|
||||||
/* This is the name of this authentication source, and will be used to access it later. */
|
|
||||||
'default-sp' => array(
|
|
||||||
'saml:SP',
|
|
||||||
'idp' => 'https://www.pvv.ntnu.no/idp',
|
|
||||||
),
|
|
||||||
);
|
|
24
dist/config.local.php
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
$DB_DSN = 'sqlite:' . __DIR__ . \DIRECTORY_SEPARATOR . 'pvv.sqlite';
|
||||||
|
$DB_USER = null;
|
||||||
|
$DB_PASS = null;
|
||||||
|
|
||||||
|
$DOOR_SECRET = 'changeme';
|
||||||
|
|
||||||
|
$GALLERY_DIR = __DIR__ . \DIRECTORY_SEPARATOR . 'www' . \DIRECTORY_SEPARATOR . 'galleri' . \DIRECTORY_SEPARATOR . 'bilder' . \DIRECTORY_SEPARATOR . 'gallery';
|
||||||
|
$GALLERY_SERVER_PATH = '/images/gallery/';
|
||||||
|
|
||||||
|
$SLIDESHOW_DIR = __DIR__ . \DIRECTORY_SEPARATOR . 'www' . \DIRECTORY_SEPARATOR . 'galleri' . \DIRECTORY_SEPARATOR . 'bilder' . \DIRECTORY_SEPARATOR . 'slideshow';
|
||||||
|
$SLIDESHOW_SERVER_PATH = '/images/slideshow/';
|
||||||
|
|
||||||
|
$SAML_COOKIE_SALT = 'changeme';
|
||||||
|
$SAML_COOKIE_SECURE = false;
|
||||||
|
$SAML_TRUSTED_DOMAINS = ['localhost:1080'];
|
||||||
|
$SAML_ADMIN_PASSWORD = 'changeme';
|
||||||
|
$SAML_ADMIN_NAME = 'PVV Drift';
|
||||||
|
$SAML_ADMIN_EMAIL = 'drift@pvv.ntnu.no';
|
||||||
|
|
||||||
|
$CACHE_DIRECTORY = __DIR__ . \DIRECTORY_SEPARATOR . 'cache';
|
6
dist/config.source-env.php
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
$configFile = getenv('PVV_CONFIG_FILE');
|
||||||
|
require_once $configFile;
|
21
dist/dataporten_config.php
vendored
@@ -1,21 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
# go to https://auth.dataporten.no/
|
|
||||||
|
|
||||||
$dataportenConfig = [
|
|
||||||
'client_id' => "",
|
|
||||||
'client_secret' => "",
|
|
||||||
//'redirect_uri' => "https://pvv.ntnu.no/paamelding/",
|
|
||||||
'redirect_uri' => "http://localhost:1080/paamelding/",
|
|
||||||
'auth' => "https://auth.dataporten.no/oauth/authorization",#Authorization endpoint
|
|
||||||
'token' => "https://auth.dataporten.no/oauth/token",#Token endpoint
|
|
||||||
|
|
||||||
/* OPTIONAL */
|
|
||||||
|
|
||||||
# 'authorization_type' => "Bearer",
|
|
||||||
# 'session' => false,
|
|
||||||
# 'verify' => 1,
|
|
||||||
# 'grant_type' => "authorization_code",
|
|
||||||
# 'response_type' => "code",
|
|
||||||
# 'scope' => "",
|
|
||||||
];
|
|
23
dist/pvv.sql
vendored
@@ -1,23 +0,0 @@
|
|||||||
CREATE TABLE "events" (
|
|
||||||
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
"name" TEXT,
|
|
||||||
"start" TEXT,
|
|
||||||
"stop" TEXT,
|
|
||||||
"organiser" TEXT,
|
|
||||||
"location" TEXT,
|
|
||||||
"description" TEXT
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "projects" (
|
|
||||||
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
"name" TEXT,
|
|
||||||
"owner" TEXT,
|
|
||||||
"owneruname" TEXT,
|
|
||||||
"description" TEXT,
|
|
||||||
"active" BOOLEAN
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "users" (
|
|
||||||
"uname" TEXT,
|
|
||||||
"groups" INT DEFAULT 0
|
|
||||||
);
|
|
45
dist/pvv_mysql.sql
vendored
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
CREATE TABLE events (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
|
||||||
|
`name` TEXT,
|
||||||
|
`start` TEXT,
|
||||||
|
`stop` TEXT,
|
||||||
|
`organiser` TEXT,
|
||||||
|
`location` TEXT,
|
||||||
|
`description` TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE projects (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
|
||||||
|
`name` TEXT,
|
||||||
|
`description` TEXT,
|
||||||
|
`active` BOOLEAN
|
||||||
|
);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
CREATE TABLE motd (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
|
||||||
|
`title` TEXT,
|
||||||
|
`content` TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
INSERT INTO motd (title, content)
|
||||||
|
VALUES ("MOTD ./dev.sh", "du kan endre motd i admin panelet");
|
||||||
|
*/
|
||||||
|
CREATE TABLE door (`time` INTEGER PRIMARY KEY, `open` BOOLEAN);
|
||||||
|
|
||||||
|
INSERT INTO
|
||||||
|
door (time, open)
|
||||||
|
VALUES
|
||||||
|
(0, FALSE);
|
54
dist/pvv_sqlite.sql
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
CREATE TABLE "events" (
|
||||||
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"name" TEXT,
|
||||||
|
"start" TEXT,
|
||||||
|
"stop" TEXT,
|
||||||
|
"organiser" TEXT,
|
||||||
|
"location" TEXT,
|
||||||
|
"description" TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "projects" (
|
||||||
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"name" TEXT,
|
||||||
|
"description" TEXT,
|
||||||
|
"active" BOOLEAN
|
||||||
|
);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
CREATE TABLE "motd" (
|
||||||
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"title" TEXT,
|
||||||
|
"content" TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO
|
||||||
|
motd (title, content)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
'MOTD ./dev.sh',
|
||||||
|
'du kan endre motd i admin panelet'
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "door" ("time" INTEGER PRIMARY KEY, "open" BOOLEAN);
|
||||||
|
|
||||||
|
INSERT INTO
|
||||||
|
door (time, open)
|
||||||
|
VALUES
|
||||||
|
(0, FALSE);
|
||||||
|
|
||||||
|
INSERT INTO
|
||||||
|
users (uname, groups)
|
||||||
|
VALUES
|
||||||
|
('min_test_bruker', 1);
|
23
dist/saml20-idp-remote.php
vendored
@@ -1,23 +0,0 @@
|
|||||||
<?php
|
|
||||||
$metadata['https://www.pvv.ntnu.no/idp'] = array (
|
|
||||||
'metadata-set' => 'saml20-idp-remote',
|
|
||||||
'entityid' => 'https://www.pvv.ntnu.no/idp',
|
|
||||||
'SingleSignOnService' =>
|
|
||||||
array (
|
|
||||||
0 =>
|
|
||||||
array (
|
|
||||||
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
|
|
||||||
'Location' => 'https://www.pvv.ntnu.no/idp/saml2/idp/SSOService.php',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'SingleLogoutService' =>
|
|
||||||
array (
|
|
||||||
0 =>
|
|
||||||
array (
|
|
||||||
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
|
|
||||||
'Location' => 'https://www.pvv.ntnu.no/idp/saml2/idp/SingleLogoutService.php',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'certData' => 'MIICgDCCAemgAwIBAgIJAP13Q5w2R3KgMA0GCSqGSIb3DQEBBQUAMDUxCzAJBgNVBAYTAk5PMRgwFgYDVQQIFA9Tw7hyLVRyw7huZGVsYWcxDDAKBgNVBAoTA1BWVjAeFw0xNDAzMTMxODIzNTVaFw0yNDAzMTIxODIzNTVaMDUxCzAJBgNVBAYTAk5PMRgwFgYDVQQIFA9Tw7hyLVRyw7huZGVsYWcxDDAKBgNVBAoTA1BWVjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAzckfyofefuJr/gDl0vj7gbIGiwXD825c3YidWK2Cg37ZmSycVk3mng4OqZkQbKY8wRaHg/fruqicDhodCPq9dF7/+QmYAG8PMKmpCIvnKaT7EjOGQtCnxv2+17CF0c7IuLjlwNZG8m0xDBZZp8ymj6QK+mJfVEahBPbkMaCBGIsCAwEAAaOBlzCBlDAdBgNVHQ4EFgQUNEuP7yZVDneEA4uTfJv/UFA9gjcwZQYDVR0jBF4wXIAUNEuP7yZVDneEA4uTfJv/UFA9gjehOaQ3MDUxCzAJBgNVBAYTAk5PMRgwFgYDVQQIFA9Tw7hyLVRyw7huZGVsYWcxDDAKBgNVBAoTA1BWVoIJAP13Q5w2R3KgMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAg8hx8aRy/Fz9PK9UckOQ92WSoRCyr/ldQSf0OTRTMyG+zsSrzVsDX3+BFWbMAFrEu7SZAakd9FQajTUw0d930iaDP+ptX1uIxb64OOY0glLOW3Ru/CL309JwUIkDADa8drpRK4IFDvzs5nVpaj75X1pp583e+psuNST8f+mLspw=',
|
|
||||||
'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
|
|
||||||
);
|
|
12
dist/simplesamlphp-authsources.php
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
$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/',
|
||||||
|
],
|
||||||
|
];
|
1302
dist/simplesamlphp-config.php
vendored
Normal file
21
dist/simplesamlphp-idp.php
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
$metadata['https://idp.pvv.ntnu.no/'] = [
|
||||||
|
'metadata-set' => 'saml20-idp-remote',
|
||||||
|
'entityid' => 'https://idp.pvv.ntnu.no/',
|
||||||
|
'SingleSignOnService' => [
|
||||||
|
0 => [
|
||||||
|
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
|
||||||
|
'Location' => 'https://idp.pvv.ntnu.no/simplesaml/saml2/idp/SSOService.php',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'SingleLogoutService' => [
|
||||||
|
0 => [
|
||||||
|
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
|
||||||
|
'Location' => 'https://idp.pvv.ntnu.no/simplesaml/saml2/idp/SingleLogoutService.php',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'certData' => 'MIIDpTCCAo2gAwIBAgIJAJIgibrB7NvsMA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAk5PMR4wHAYDVQQKDBVQcm9ncmFtdmFyZXZlcmtzdGVkZXQxGDAWBgNVBAMMD2lkcC5wdnYubnRudS5ubzEgMB4GCSqGSIb3DQEJARYRZHJpZnRAcHZ2Lm50bnUubm8wHhcNMTcxMTEzMjI0NTQyWhcNMjcxMTEzMjI0NTQyWjBpMQswCQYDVQQGEwJOTzEeMBwGA1UECgwVUHJvZ3JhbXZhcmV2ZXJrc3RlZGV0MRgwFgYDVQQDDA9pZHAucHZ2Lm50bnUubm8xIDAeBgkqhkiG9w0BCQEWEWRyaWZ0QHB2di5udG51Lm5vMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAveLujCsgVCRA360y5yezy8FcSPhaqodggDqY12UTkYOMQLBFaph6uUL4oCUlXZqxScrAYVRt9yw+7BYpcm0p51VZzVCsfMxRVkn+O1eUvsaXq3f13f87QHKYP2f0uqkGf5PvnKIdSaI/ix8WJhD8XT+h0OkHEcaBvUtSG7zbEhvG21WPHwgw2rvZSneArQ8tOitZC0u8VXSfdhtf6ynRseo0xC95634UwQAZivhQ2v4A6Tp57QG5DCXIJ9/z3PkINx3KB/hOeh0EP6Dpbp+7V0/t9778E3whpm4llrH144kzROhA7EgUgkZOjAVjxGCYlcj3xQPnnItihVOZ5B5qLwIDAQABo1AwTjAdBgNVHQ4EFgQUPLhrB+Qb/Kzz7Car9GJkKmEkz6swHwYDVR0jBBgwFoAUPLhrB+Qb/Kzz7Car9GJkKmEkz6swDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAd+4E6t0j8/p8rbZE8y/gZ9GsiRhxkR4l6JbMRUfEpqHKi415qstChRcP2Lo3Yd5qdmj9tLDWoPsqet1QgyTTmQTgUmPhhMOQDqSh90LuqEJseKWafXGS/SfWLH6MWVmzDV5YofJEw2ThPiU58GiS06OLS2poq1eAesa2LQ22J8yYisXM4sxImIFte+LYQ1+1evfBWcvU1vrGsQ0VLJHdef9WoXp1swUFhq4Zk0c7gjHiB1CFVlExAAlk9L6W3CVXmKIYlf4eUnEBGkC061Ir42+uhAMWO9Y/L1NEuboTyd2KAI/6JdKdzpmfk7zPVxWlNxNCZ7OPNuvOKp6VlpB2EA==',
|
||||||
|
'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
|
||||||
|
];
|
5
dist/sql_config_example.php
vendored
@@ -1,5 +0,0 @@
|
|||||||
<?php
|
|
||||||
$dbDsn = 'sqlite:'.__DIR__.DIRECTORY_SEPARATOR.'pvv.sqlite';
|
|
||||||
$dbUser = null;
|
|
||||||
$dbPass = null;
|
|
||||||
|
|
21
docker-compose.yaml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
version: "3.9"
|
||||||
|
|
||||||
|
# cleanup:
|
||||||
|
|
||||||
|
# docker container prune -f && docker volume prune -f
|
||||||
|
# docker system prune -a
|
||||||
|
|
||||||
|
services:
|
||||||
|
nettside: # https://hub.docker.com/_/php
|
||||||
|
#image: php:7.4-cli
|
||||||
|
build: .
|
||||||
|
volumes:
|
||||||
|
- .:/usr/src/nettside
|
||||||
|
working_dir: /usr/src/nettside
|
||||||
|
command: ./dev.sh
|
||||||
|
environment:
|
||||||
|
- DOCKER_HOST=0.0.0.0
|
||||||
|
- DOCKER_PORT=1080
|
||||||
|
ports:
|
||||||
|
- 1080:1080
|
||||||
|
user: "${DOCKER_USER}"
|
27
flake.lock
generated
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1741678040,
|
||||||
|
"narHash": "sha256-rmBsz7BBcDwfvDkxnKHmolKceGJrr0nyz5PQYZg0kMk=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "3ee8818da146871cd570b164fc4f438f78479a50",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
37
flake.nix
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
description = "Programvareverkstedet/nettsiden PHP environment";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs }:
|
||||||
|
let
|
||||||
|
systems = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
"aarch64-darwin"
|
||||||
|
];
|
||||||
|
forAllSystems = f: nixpkgs.lib.genAttrs systems (system: let
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
in f system pkgs);
|
||||||
|
in {
|
||||||
|
packages = forAllSystems (system: pkgs: {
|
||||||
|
default = self.packages.${system}.pvv-nettsiden;
|
||||||
|
pvv-nettsiden = pkgs.callPackage ./nix/package.nix { php = pkgs.php84; };
|
||||||
|
});
|
||||||
|
|
||||||
|
overlays.default = final: prev: {
|
||||||
|
inherit (self.packages.${final.system}) pvv-nettsiden;
|
||||||
|
formats = prev.formats // {
|
||||||
|
php = import ./nix/php-generator.nix { pkgs = prev; lib = prev.lib; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nixosModules.default = nix/module.nix;
|
||||||
|
|
||||||
|
devShells = forAllSystems (system: pkgs: {
|
||||||
|
default = pkgs.callPackage ./nix/shell.nix { inherit pkgs; };
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
13
inc/agenda.php
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
require __DIR__ . '/../src/_autoload.php';
|
||||||
|
require __DIR__ . '/../config.php';
|
||||||
|
|
||||||
|
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
|
||||||
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
$agenda = new pvv\side\Agenda([
|
||||||
|
new pvv\side\social\NerdepitsaActivity(),
|
||||||
|
new pvv\side\social\AnimekveldActivity(),
|
||||||
|
new pvv\side\DBActivity($pdo),
|
||||||
|
]);
|
36
inc/include.php
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
// Set up database and user system,
|
||||||
|
// and include common files such as HTML includes or SimplSAMLphp.
|
||||||
|
|
||||||
|
require_once __DIR__ . \DIRECTORY_SEPARATOR . 'agenda.php';
|
||||||
|
require_once __DIR__ . \DIRECTORY_SEPARATOR . 'navbar.php';
|
||||||
|
|
||||||
|
require_once dirname(__DIR__) . implode(\DIRECTORY_SEPARATOR, ['', 'config.php']);
|
||||||
|
|
||||||
|
require_once dirname(__DIR__) . implode(\DIRECTORY_SEPARATOR, ['', 'src', '_autoload.php']);
|
||||||
|
require_once dirname(__DIR__) . implode(\DIRECTORY_SEPARATOR, ['', 'vendor', 'simplesamlphp', 'simplesamlphp', 'lib', '_autoload.php']);
|
||||||
|
|
||||||
|
date_default_timezone_set('Europe/Oslo');
|
||||||
|
setlocale(\LC_ALL, 'nb_NO');
|
||||||
|
|
||||||
|
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
|
||||||
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
|
$sp = 'default-sp';
|
||||||
|
$as = new SimpleSAML\Auth\Simple($sp);
|
||||||
|
|
||||||
|
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\DBActivity($pdo),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$months_translations = ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'];
|
102
inc/navbar.php
@@ -1,40 +1,74 @@
|
|||||||
<?php
|
<?php
|
||||||
function navbar($depth, $active = NULL) {
|
|
||||||
$result = "\n\t<ul>\n";
|
declare(strict_types=1);
|
||||||
$menuItems = [
|
function navbar($depth, $active = null) {
|
||||||
'hjem' => '',
|
$result = "\n\t<ul id=\"menu\">\n";
|
||||||
'kalender' => 'kalender',
|
$menuItems = [
|
||||||
'aktiviteter' => 'aktiviteter',
|
'Hjem' => '',
|
||||||
'prosjekter' => 'prosjekt',
|
'Hendelser' => 'hendelser',
|
||||||
'kontakt' => 'kontakt',
|
// 'Kalender' => 'kalender',
|
||||||
'webmail' => 'https://webmail.pvv.ntnu.no/',
|
// 'Aktiviteter' => 'aktiviteter',
|
||||||
'wiki' => 'pvv',
|
'Prosjekter' => 'prosjekt',
|
||||||
];
|
'Kontakt' => 'kontakt',
|
||||||
foreach($menuItems as $caption => $link) {
|
'Webmail' => 'https://webmail.pvv.ntnu.no/roundcube/',
|
||||||
if ($caption !== 'webmail') {
|
'Galleri' => 'galleri',
|
||||||
$link = rtrim(str_repeat('../', $depth) . $link, '/') . '/';
|
'Wiki' => 'https://wiki.pvv.ntnu.no/',
|
||||||
}
|
'Git' => 'https://git.pvv.ntnu.no/',
|
||||||
$result .= "\t\t<li" . ($active === $link ? ' class="active"' : '') . '>'
|
'Tjenester' => 'tjenester',
|
||||||
. '<a href="' . $link . '">'
|
];
|
||||||
. $caption
|
foreach ($menuItems as $caption => $link) {
|
||||||
. "</a></li>\n"
|
$isActive = $active === $link;
|
||||||
;
|
if (substr($link, 0, 4) !== 'http') {
|
||||||
}
|
$link = rtrim(str_repeat('../', $depth) . $link, '/') . '/';
|
||||||
return $result . "\t</ul>\n";
|
}
|
||||||
|
|
||||||
|
// if ($isActive) $link = '#';
|
||||||
|
|
||||||
|
$result .= "\t\t<li" . ($isActive ? ' class="active"' : '') . '>'
|
||||||
|
. '<a href="' . $link . '">'
|
||||||
|
. $caption
|
||||||
|
. "</a></li>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result . "\t</ul>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
function loginBar($sp = 'default-sp') {
|
function loginBar($sp = null, $pdo = null) {
|
||||||
$result = "\n";
|
if (null === $sp) {
|
||||||
require_once(__DIR__ . '/../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
$sp = 'default-sp';
|
||||||
$as = new SimpleSAML_Auth_Simple($sp);
|
}
|
||||||
|
$result = "\n";
|
||||||
|
require_once __DIR__ . '/../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
|
$as = new SimpleSAML\Auth\Simple($sp);
|
||||||
|
|
||||||
$attr = $as->getAttributes();
|
$svg = '<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 64 64">
|
||||||
if($attr) {
|
<circle cx="32" cy="27" r="14" stroke-width="0" />
|
||||||
$uname = $attr['uid'][0];
|
<ellipse cx="32" cy="66" rx="24" ry="28" stroke-width="0" />
|
||||||
$result .= "\t<p class=\"login\">logget inn som: " . htmlspecialchars($uname) . "</p>\n";
|
</svg>
|
||||||
} else {
|
';
|
||||||
$result .= "\t<a class=\"login\" href=\"" . htmlspecialchars($as->getLoginURL()) . "\">logg inn</a>\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $result;
|
$attr = $as->getAttributes();
|
||||||
|
if ($attr) {
|
||||||
|
$uname = $attr['uid'][0];
|
||||||
|
$isAdmin = false;
|
||||||
|
if (isset($pdo)) {
|
||||||
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
$isAdmin = $userManager->isAdmin($uname);
|
||||||
|
}
|
||||||
|
$result .= "\t<a id=\"login\" href=\"#usermenu\" aria-hidden=\"true\">{$svg}" . htmlspecialchars($uname) . "</a>\n";
|
||||||
|
|
||||||
|
$result .= "\n\t<ul id=\"usermenu\">\n";
|
||||||
|
$result .= "\n\t\t<li><a id=\"login\" href=\"#\">{$svg}" . htmlspecialchars($uname) . "</a></li>\n";
|
||||||
|
if ($isAdmin) {
|
||||||
|
$result .= "\n\t\t<li><a href=\"/admin/\">Admin</a></li>\n";
|
||||||
|
}
|
||||||
|
$result .= "\n\t\t<li><a href=\"" . htmlspecialchars($as->getLogoutURL()) . "\">Logg ut</a></li>\n";
|
||||||
|
$result .= "\n\t</ul>\n";
|
||||||
|
} else {
|
||||||
|
$result .= "\t<a id=\"login\" href=\"" . htmlspecialchars($as->getLoginURL()) . "\">{$svg}Logg inn</a>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$result .= "\n\t<a href=\"#menu\" id=\"menu_toggle\" aria-hidden=\"true\"><big>☰ </big>MENU</a>\n";
|
||||||
|
|
||||||
|
return $result;
|
||||||
}
|
}
|
||||||
|
@@ -1,35 +0,0 @@
|
|||||||
<ul id="ticker">
|
|
||||||
<?php
|
|
||||||
{
|
|
||||||
require __DIR__ . '/../src/_autoload.php';
|
|
||||||
require __DIR__ . '/../sql_config.php';
|
|
||||||
$translation = ['i dag', 'i morgen', 'denne uken', 'neste uke', 'denne måneden', 'neste måned'];
|
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
|
||||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
||||||
$agenda = new \pvv\side\Agenda([
|
|
||||||
new \pvv\side\social\NerdepitsaActivity,
|
|
||||||
new \pvv\side\social\AnimekveldActivity,
|
|
||||||
new \pvv\side\DBActivity($pdo),
|
|
||||||
]);
|
|
||||||
|
|
||||||
$test = true;
|
|
||||||
foreach($agenda->getNextDays() as $period => $events) {
|
|
||||||
if (!$events) continue;
|
|
||||||
$i = 0;
|
|
||||||
$n = count($events);
|
|
||||||
foreach($events as $event){
|
|
||||||
if ($i == 0){
|
|
||||||
echo '<li style="text-align: center;"><span style="text-transform: uppercase;">' . $translation[$period] . '</span>: ';
|
|
||||||
} else if ($i < $n-1) {
|
|
||||||
echo '<i style="opacity:0.7;">, </i>';
|
|
||||||
} else{
|
|
||||||
echo '<i style="opacity:0.7;"> og </i>';
|
|
||||||
}
|
|
||||||
echo '<a href="' . $event->getURL() . '">' . $event->getName() . '</a>';
|
|
||||||
$i = $i + 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</ul>
|
|
254
nix/module.nix
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.services.pvv-nettsiden;
|
||||||
|
inherit (lib) mkDefault mkEnableOption mkPackageOption mkIf mkOption types mdDoc;
|
||||||
|
format = pkgs.formats.php { };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.pvv-nettsiden = {
|
||||||
|
enable = mkEnableOption (lib.mdDoc "Enable pvv-nettsiden");
|
||||||
|
|
||||||
|
package = mkPackageOption pkgs "pvv-nettsiden" { };
|
||||||
|
|
||||||
|
user = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "pvv-nettsiden";
|
||||||
|
description = mdDoc "User to run php-fpm and own the image directories";
|
||||||
|
};
|
||||||
|
|
||||||
|
group = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "pvv-nettsiden";
|
||||||
|
description = mdDoc "Group to run php-fpm and own the image directories";
|
||||||
|
};
|
||||||
|
|
||||||
|
domainName = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "www.pvv.no";
|
||||||
|
description = mdDoc "Domain name for the website";
|
||||||
|
};
|
||||||
|
|
||||||
|
enableNginx = mkEnableOption "nginx" // { default = true; };
|
||||||
|
useSSL = mkEnableOption "secure cookies" // { default = true; };
|
||||||
|
|
||||||
|
settings = mkOption {
|
||||||
|
description = "Settings for the website";
|
||||||
|
default = { };
|
||||||
|
type = types.submodule {
|
||||||
|
freeformType = format.type;
|
||||||
|
options = lib.mapAttrsRecursiveCond
|
||||||
|
(attrs: !(attrs ? "type"))
|
||||||
|
(_: option: option // { type = types.either option.type format.lib.types.raw; })
|
||||||
|
{
|
||||||
|
DOOR_SECRET = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = mdDoc "Secret for the door sensor API";
|
||||||
|
};
|
||||||
|
|
||||||
|
GALLERY = {
|
||||||
|
DIR = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
default = "/var/lib/pvv-nettsiden/gallery";
|
||||||
|
description = mdDoc "Directory where the gallery is located. See documentation at TODO";
|
||||||
|
};
|
||||||
|
|
||||||
|
SERVER_PATH = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "/static/gallery";
|
||||||
|
description = mdDoc "Path to the gallery on the server";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
SLIDESHOW = {
|
||||||
|
DIR = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
default = "/var/lib/pvv-nettsiden/slideshow";
|
||||||
|
description = mdDoc "Directory where the slideshow is located. See documentation at TODO";
|
||||||
|
};
|
||||||
|
|
||||||
|
SERVER_PATH = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "/static/slideshow";
|
||||||
|
description = mdDoc "Path to the slideshow on the server";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
DB = {
|
||||||
|
DSN = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "sqlite:/var/lib/pvv-nettsiden/pvv-nettsiden.db";
|
||||||
|
example = "pgsql:host=localhost;port=5432;dbname=testdb;user=bruce;password=mypass";
|
||||||
|
description = mdDoc "Database connection string, see https://www.php.net/manual/en/pdo.construct.php";
|
||||||
|
};
|
||||||
|
|
||||||
|
USER = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
example = "pvv-nettsiden";
|
||||||
|
description = mdDoc "Database user";
|
||||||
|
};
|
||||||
|
|
||||||
|
PASS = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = mdDoc "Database password. Recommends: null, set in extraConfig";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
SAML = {
|
||||||
|
COOKIE_SALT = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = mdDoc "Salt for the SAML cookies";
|
||||||
|
};
|
||||||
|
|
||||||
|
COOKIE_SECURE = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = mdDoc "Whether to set the secure flag on the SAML cookies";
|
||||||
|
};
|
||||||
|
|
||||||
|
ADMIN_NAME = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = mdDoc "Name for the admin user";
|
||||||
|
};
|
||||||
|
|
||||||
|
ADMIN_EMAIL = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = mdDoc "Email for the admin user";
|
||||||
|
};
|
||||||
|
|
||||||
|
ADMIN_PASSWORD = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = mdDoc "Password for the admin user";
|
||||||
|
};
|
||||||
|
|
||||||
|
TRUSTED_DOMAINS = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [ cfg.domainName ];
|
||||||
|
description = mdDoc "List of trusted domains for the SAML service";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
CACHE_DIRECTORY = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
default = "/var/cache/pvv-nettsiden/simplesamlphp";
|
||||||
|
description = mdDoc "List of trusted domains for the SAML service";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
config = mkIf cfg.enable (let
|
||||||
|
# NOTE: This should absolutely not be necessary, but for some reason this file refuses to import
|
||||||
|
# the toplevel configuration file.
|
||||||
|
# NOTE: Nvm, don't this this was the problem after all?
|
||||||
|
finalPackage = cfg.package.overrideAttrs (_: _: {
|
||||||
|
postInstall = let
|
||||||
|
f = x: lib.escapeShellArg (format.lib.valueToString x);
|
||||||
|
in cfg.package.postInstall + ''
|
||||||
|
substituteInPlace $out/${cfg.package.passthru.simplesamlphpPath}/config/config.php \
|
||||||
|
--replace '$SAML_COOKIE_SECURE' ${f cfg.settings.SAML.COOKIE_SECURE} \
|
||||||
|
--replace '$SAML_COOKIE_SALT' ${f cfg.settings.SAML.COOKIE_SALT} \
|
||||||
|
--replace '$SAML_ADMIN_PASSWORD' ${f cfg.settings.SAML.ADMIN_PASSWORD} \
|
||||||
|
--replace '$SAML_ADMIN_NAME' ${f cfg.settings.SAML.ADMIN_NAME} \
|
||||||
|
--replace '$SAML_ADMIN_EMAIL' ${f cfg.settings.SAML.ADMIN_EMAIL} \
|
||||||
|
--replace '$SAML_TRUSTED_DOMAINS' ${f cfg.settings.SAML.TRUSTED_DOMAINS} \
|
||||||
|
--replace '$CACHE_DIRECTORY' ${f cfg.settings.CACHE_DIRECTORY}
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
in {
|
||||||
|
users.users = mkIf (cfg.user == "pvv-nettsiden") {
|
||||||
|
"pvv-nettsiden" = {
|
||||||
|
description = "PVV Website Service User";
|
||||||
|
group = cfg.group;
|
||||||
|
createHome = false;
|
||||||
|
isSystemUser = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
users.groups = mkIf (cfg.group == "pvv-nettsiden") {
|
||||||
|
"pvv-nettsiden" = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.tmpfiles.settings."10-pvv-nettsiden".${cfg.settings.CACHE_DIRECTORY}.d = {
|
||||||
|
inherit (cfg) user group;
|
||||||
|
mode = "0770";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx = mkIf cfg.enableNginx {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
recommendedGzipSettings = mkDefault true;
|
||||||
|
recommendedProxySettings = mkDefault true;
|
||||||
|
|
||||||
|
virtualHosts."${cfg.domainName}" = {
|
||||||
|
forceSSL = mkDefault cfg.useSSL;
|
||||||
|
enableACME = mkDefault true;
|
||||||
|
locations = {
|
||||||
|
"/" = {
|
||||||
|
root = "${finalPackage}/share/php/pvv-nettsiden/www/";
|
||||||
|
index = "index.php";
|
||||||
|
};
|
||||||
|
|
||||||
|
"~ \\.php$".extraConfig = ''
|
||||||
|
include ${pkgs.nginx}/conf/fastcgi_params;
|
||||||
|
fastcgi_param SCRIPT_FILENAME ${finalPackage}/share/php/pvv-nettsiden/www$fastcgi_script_name;
|
||||||
|
fastcgi_pass unix:${config.services.phpfpm.pools."pvv-nettsiden".socket};
|
||||||
|
'';
|
||||||
|
|
||||||
|
# based on https://simplesamlphp.org/docs/stable/simplesamlphp-install.html#configuring-nginx
|
||||||
|
"^~ /simplesaml/" = {
|
||||||
|
alias = "${finalPackage}/${finalPackage.passthru.simplesamlphpPath}/public/";
|
||||||
|
index = "index.php";
|
||||||
|
|
||||||
|
extraConfig = ''
|
||||||
|
location ~ ^/simplesaml/(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
|
||||||
|
include ${pkgs.nginx}/conf/fastcgi_params;
|
||||||
|
fastcgi_pass unix:${config.services.phpfpm.pools."pvv-nettsiden".socket};
|
||||||
|
fastcgi_param SCRIPT_FILENAME ${finalPackage}/${finalPackage.passthru.simplesamlphpPath}/public/$phpfile;
|
||||||
|
|
||||||
|
# Must be prepended with the baseurlpath
|
||||||
|
fastcgi_param SCRIPT_NAME /simplesaml/$phpfile;
|
||||||
|
|
||||||
|
fastcgi_param PATH_INFO $pathinfo if_not_empty;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
"^~ ${cfg.settings.GALLERY.SERVER_PATH}" = {
|
||||||
|
root = cfg.settings.GALLERY.DIR;
|
||||||
|
extraConfig = ''
|
||||||
|
rewrite ^${cfg.settings.GALLERY.SERVER_PATH}/(.*)$ /$1 break;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
"^~ ${cfg.settings.SLIDESHOW.SERVER_PATH}" = {
|
||||||
|
root = cfg.settings.SLIDESHOW.DIR;
|
||||||
|
extraConfig = ''
|
||||||
|
rewrite ^${cfg.settings.SLIDESHOW.SERVER_PATH}/(.*)$ /$1 break;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
services.phpfpm.pools.pvv-nettsiden = {
|
||||||
|
user = cfg.user;
|
||||||
|
group = cfg.group;
|
||||||
|
|
||||||
|
phpEnv.PVV_CONFIG_FILE = toString (format.generate "pvv-nettsiden-conf.php" cfg.settings);
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
"listen.owner" = config.services.nginx.user;
|
||||||
|
"listen.group" = config.services.nginx.group;
|
||||||
|
"pm" = mkDefault "ondemand";
|
||||||
|
"pm.max_children" = mkDefault 32;
|
||||||
|
"pm.process_idle_timeout" = mkDefault "10s";
|
||||||
|
"pm.max_requests" = mkDefault 500;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
28
nix/package.nix
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{ lib
|
||||||
|
, php
|
||||||
|
, extra_files ? { }
|
||||||
|
}:
|
||||||
|
|
||||||
|
php.buildComposerProject rec {
|
||||||
|
src = ./..;
|
||||||
|
pname = "pvv-nettsiden";
|
||||||
|
version = "0.0.1";
|
||||||
|
vendorHash = "sha256-8UYf7FhrTKgCa2e8GwhU8EF1AfWzZtgseTZqUAGOL0U=";
|
||||||
|
|
||||||
|
passthru.simplesamlphpPath = "share/php/pvv-nettsiden/vendor/simplesamlphp/simplesamlphp";
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
install -Dm644 dist/simplesamlphp-config.php $out/${passthru.simplesamlphpPath}/config/config.php
|
||||||
|
install -Dm644 dist/simplesamlphp-authsources.php $out/${passthru.simplesamlphpPath}/config/authsources.php
|
||||||
|
install -Dm644 dist/simplesamlphp-idp.php $out/${passthru.simplesamlphpPath}/metadata/saml20-idp-remote.php
|
||||||
|
install -Dm644 dist/config.source-env.php $out/share/php/pvv-nettsiden/config.php
|
||||||
|
|
||||||
|
${lib.pipe extra_files [
|
||||||
|
(lib.mapAttrsToList (target_path: source_path: ''
|
||||||
|
mkdir -p $(dirname "$out/${target_path}")
|
||||||
|
cp -r "${source_path}" "$out/${target_path}"
|
||||||
|
''))
|
||||||
|
(lib.concatStringsSep "\n")
|
||||||
|
]}
|
||||||
|
'';
|
||||||
|
}
|
62
nix/php-generator.nix
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
{ pkgs, lib }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
{ }: let
|
||||||
|
valueToString = val:
|
||||||
|
if val == null then
|
||||||
|
"null"
|
||||||
|
else if isString val then
|
||||||
|
builtins.toJSON val
|
||||||
|
else if isBool val then
|
||||||
|
boolToString val
|
||||||
|
else if isInt val || isFloat val then
|
||||||
|
toString val
|
||||||
|
else if isList val then
|
||||||
|
"array(${concatMapStringsSep ", " valueToString val})"
|
||||||
|
else if isAttrs val && val ? value && (val._type or "") == "raw" then
|
||||||
|
val.value
|
||||||
|
else if isAttrs val then
|
||||||
|
throw "Found unexpected attrs, that were not created by mkRaw. Have you put attrs in an array?\n${val}"
|
||||||
|
else throw "unsupported :')";
|
||||||
|
in {
|
||||||
|
inherit (pkgs.formats.json { }) type;
|
||||||
|
|
||||||
|
generate = name: value: let
|
||||||
|
flattenStructuredSettings = attrs: let
|
||||||
|
partitionAttrs = pred: attrs: lib.pipe attrs [
|
||||||
|
attrsToList
|
||||||
|
(partition ({ name, value }: pred name value))
|
||||||
|
(mapAttrs (_: listToAttrs))
|
||||||
|
];
|
||||||
|
|
||||||
|
partitionedAttrs = partitionAttrs (_: v: isAttrs v && !(v ? value && (v._type or "") == "raw")) attrs;
|
||||||
|
|
||||||
|
flattenedAttrs = lib.pipe partitionedAttrs.right [
|
||||||
|
(mapAttrs (n1: mapAttrs' (n2: v2: nameValuePair "${n1}_${n2}" v2)))
|
||||||
|
attrValues
|
||||||
|
(map flattenStructuredSettings)
|
||||||
|
(foldl recursiveUpdate { })
|
||||||
|
];
|
||||||
|
in recursiveUpdate flattenedAttrs partitionedAttrs.wrong;
|
||||||
|
|
||||||
|
content = lib.pipe value [
|
||||||
|
flattenStructuredSettings
|
||||||
|
(mapAttrs (_: valueToString))
|
||||||
|
(mapAttrsToList (n: v: ''''$${n} = ${v};''))
|
||||||
|
(concatStringsSep "\n")
|
||||||
|
(content: "<?php\n${content}\n?>")
|
||||||
|
];
|
||||||
|
in pkgs.writeText name content;
|
||||||
|
|
||||||
|
lib = {
|
||||||
|
inherit valueToString;
|
||||||
|
|
||||||
|
mkRaw = value: {
|
||||||
|
inherit value;
|
||||||
|
_type = "raw";
|
||||||
|
};
|
||||||
|
|
||||||
|
types.raw = lib.types.attrs;
|
||||||
|
};
|
||||||
|
}
|
41
nix/shell.nix
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{ pkgs, lib }:
|
||||||
|
let
|
||||||
|
phpEnv = pkgs.php84.buildEnv {
|
||||||
|
extensions = { enabled, all }: enabled ++ (with all; [ iconv mbstring pdo_mysql pdo_sqlite ]);
|
||||||
|
};
|
||||||
|
in
|
||||||
|
pkgs.mkShellNoCC {
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
phpEnv
|
||||||
|
php84Packages.composer
|
||||||
|
php84Packages.php-parallel-lint
|
||||||
|
php84Packages.php-cs-fixer
|
||||||
|
sqlite-interactive
|
||||||
|
sql-formatter
|
||||||
|
];
|
||||||
|
|
||||||
|
# Prepare dev environment with sqlite and config files
|
||||||
|
shellHook = ''
|
||||||
|
alias runDev='php -S localhost:1080 -d error_reporting=E_ALL -d display_errors=1 -t www/'
|
||||||
|
|
||||||
|
declare -a PROJECT_ROOT="$("${lib.getExe pkgs.git}" rev-parse --show-toplevel)"
|
||||||
|
|
||||||
|
mkdir -p "$PROJECT_ROOT/www/galleri/bilder/slideshow"
|
||||||
|
test -e "$PROJECT_ROOT/pvv.sqlite" || sqlite3 "$PROJECT_ROOT/pvv.sqlite" < "$PROJECT_ROOT/dist/pvv_sqlite.sql"
|
||||||
|
test -e "$PROJECT_ROOT/config.php" || cp -v "$PROJECT_ROOT/dist/config.local.php" "$PROJECT_ROOT/config.php"
|
||||||
|
|
||||||
|
if [ ! -d "$PROJECT_ROOT/vendor" ] ; then
|
||||||
|
pushd "$PROJECT_ROOT"
|
||||||
|
composer install || exit $?
|
||||||
|
|
||||||
|
cp dist/simplesamlphp-authsources.php vendor/simplesamlphp/simplesamlphp/config/authsources.php
|
||||||
|
cp dist/simplesamlphp-idp.php vendor/simplesamlphp/simplesamlphp/metadata/saml20-idp-remote.php
|
||||||
|
cp dist/simplesamlphp-config.php vendor/simplesamlphp/simplesamlphp/config/config.php
|
||||||
|
|
||||||
|
cp dist/config.local.php config.php
|
||||||
|
|
||||||
|
ln -s ../vendor/simplesamlphp/simplesamlphp/public/ www/simplesaml
|
||||||
|
popd "$PROJECT_ROOT"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
}
|
23
pvv.sql
@@ -1,23 +0,0 @@
|
|||||||
CREATE TABLE "events" (
|
|
||||||
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
"name" TEXT,
|
|
||||||
"start" TEXT,
|
|
||||||
"stop" TEXT,
|
|
||||||
"organiser" TEXT,
|
|
||||||
"location" TEXT,
|
|
||||||
"description" TEXT
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "projects" (
|
|
||||||
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
"name" TEXT,
|
|
||||||
"owner" TEXT,
|
|
||||||
"owneruname" TEXT,
|
|
||||||
"description" TEXT,
|
|
||||||
"active" BOOLEAN
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "users" (
|
|
||||||
"uname" TEXT,
|
|
||||||
"groups" INT DEFAULT 0
|
|
||||||
);
|
|
@@ -1,4 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2014-2015, Jørn Åne de Jong <@jornane>
|
* Copyright (c) 2014-2015, Jørn Åne de Jong <@jornane>
|
||||||
*
|
*
|
||||||
@@ -14,7 +16,7 @@
|
|||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/**
|
/*
|
||||||
* Register SPL autoloading for classes and interfaces. Put this file in your
|
* Register SPL autoloading for classes and interfaces. Put this file in your
|
||||||
* namespace root and make sure it gets included from your PHP entry-point.
|
* namespace root and make sure it gets included from your PHP entry-point.
|
||||||
*
|
*
|
||||||
@@ -34,6 +36,6 @@
|
|||||||
* @link http://php.net/manual/en/function.spl-autoload.php
|
* @link http://php.net/manual/en/function.spl-autoload.php
|
||||||
* @license http://choosealicense.com/licenses/isc/ ISC license
|
* @license http://choosealicense.com/licenses/isc/ ISC license
|
||||||
*/
|
*/
|
||||||
spl_autoload_extensions( '.php' );
|
spl_autoload_extensions('.php');
|
||||||
spl_autoload_register( 'spl_autoload' );
|
spl_autoload_register('spl_autoload');
|
||||||
set_include_path( realpath( __DIR__ ) . PATH_SEPARATOR . get_include_path() );
|
set_include_path(realpath(__DIR__) . \PATH_SEPARATOR . get_include_path());
|
||||||
|
@@ -1,132 +1,138 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\admin;
|
namespace pvv\admin;
|
||||||
|
|
||||||
use \PDO;
|
class UserManager {
|
||||||
|
private $pdo;
|
||||||
|
|
||||||
class UserManager{
|
public $usergroups = [
|
||||||
private $pdo;
|
'admin' => 1,
|
||||||
|
'prosjekt' => 2,
|
||||||
|
'aktiviteter' => 4,
|
||||||
|
];
|
||||||
|
|
||||||
public $usergroups = [
|
public function __construct($pdo) {
|
||||||
'admin' => 1,
|
$this->pdo = $pdo;
|
||||||
'prosjekt' => 2,
|
}
|
||||||
'aktiviteter' => 4
|
|
||||||
];
|
|
||||||
|
|
||||||
public function __construct($pdo){
|
public function setupUser($uname, $groups = 0): void {
|
||||||
$this->pdo = $pdo;
|
$query = 'INSERT INTO users (uname, groups) VALUES (:uname, :groups)';
|
||||||
}
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':groups', $groups, \PDO::PARAM_INT);
|
||||||
|
$statement->execute();
|
||||||
|
}
|
||||||
|
|
||||||
public function setupUser($uname, $groups=0){
|
public function updateFlags($uname, $flags): void {
|
||||||
$query = 'INSERT INTO users (uname, groups) VALUES (:uname, :groups)';
|
$query = 'UPDATE users set groups=:groups WHERE uname=:uname';
|
||||||
$statement = $this->pdo->prepare($query);
|
$statement = $this->pdo->prepare($query);
|
||||||
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
|
$statement->bindParam(':groups', $flags, \PDO::PARAM_INT);
|
||||||
$statement->bindParam(':groups', $groups, PDO::PARAM_INT);
|
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
|
||||||
$statement->execute();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public function updateFlags($uname, $flags){
|
public function addGroup($uname, $group): void {
|
||||||
$query = 'UPDATE users set groups=:groups WHERE uname=:uname';
|
$userFlags = $this->getUsergroups($uname);
|
||||||
$statement = $this->pdo->prepare($query);
|
|
||||||
$statement->bindParam(':groups', $flags, PDO::PARAM_INT);
|
|
||||||
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function addGroup($uname, $group){
|
if ($userFlags) {
|
||||||
$userFlags = $this->getUsergroups();
|
$newFlags = ($group | $userFlags);
|
||||||
|
$this->updateFlags($uname, $newFlags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if($userFlags){
|
public function removeGroup($uname, $group): void {
|
||||||
$newFlags = ($group | $userFlags);
|
$userFlags = $this->getUsergroups($uname);
|
||||||
$this->updateFlags($uname, $newFlags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function removeGroup($uname, $group){
|
if ($userFlags) {
|
||||||
$userFlags = $this->getUsergroups();
|
$newFlags = ($userFlags & (~ $group));
|
||||||
|
$this->updateFlags($uname, $newFlags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if($userFlags){
|
public function setGroups($uname, $groups): void {
|
||||||
$newFlags = ($userFlags & (~ $group));
|
$query = 'SELECT * FROM users WHERE uname=:uname LIMIT 1';
|
||||||
$this->updateFlags($uname, $newFlags);
|
$statement = $this->pdo->prepare($query);
|
||||||
}
|
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
|
||||||
}
|
$statement->execute();
|
||||||
|
$row = $statement->fetch();
|
||||||
|
|
||||||
public function setGroups($uname, $groups){
|
if ($row) {
|
||||||
$query = 'SELECT * FROM users WHERE uname=:uname LIMIT 1';
|
$query = 'UPDATE users set groups=:groups WHERE uname=:uname';
|
||||||
$statement = $this->pdo->prepare($query);
|
$statement = $this->pdo->prepare($query);
|
||||||
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
|
$statement->bindParam(':groups', $groups, \PDO::PARAM_INT);
|
||||||
$statement->execute();
|
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
|
||||||
$row = $statement->fetch();
|
$statement->execute();
|
||||||
|
} else {
|
||||||
|
$this->setupUser($uname, $groups);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if($row){
|
public function hasGroup($uname, $groupName) {
|
||||||
$query = 'UPDATE users set groups=:groups WHERE uname=:uname';
|
$userFlags = $this->getUsergroups($uname);
|
||||||
$statement = $this->pdo->prepare($query);
|
|
||||||
$statement->bindParam(':groups', $groups, PDO::PARAM_INT);
|
|
||||||
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
|
|
||||||
$statement->execute();
|
|
||||||
}else{
|
|
||||||
$this->setupUser($uname, $groups);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function hasGroup($uname, $groupName){
|
return $userFlags & $this->usergroups[$groupName];
|
||||||
$userFlags = $this->getUsergroups($uname);
|
}
|
||||||
|
|
||||||
return ($userFlags & $this->usergroups[$groupName]);
|
// for convenience
|
||||||
}
|
public function isAdmin($uname) {
|
||||||
|
return $this->hasGroup($uname, 'admin');
|
||||||
|
}
|
||||||
|
|
||||||
// for convenience
|
public function getFlagfromNames($names) {
|
||||||
public function isAdmin($uname){
|
$resultFlag = 0;
|
||||||
return $this->hasGroup($uname, 'admin');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getFlagfromNames($names){
|
foreach ($this->usergroups as $name => $flag) {
|
||||||
$resultFlag = 0;
|
if (\in_array($name, $names, true)) {
|
||||||
|
$resultFlag = ($resultFlag | $flag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach($this->usergroups as $name => $flag){
|
return $resultFlag;
|
||||||
if(in_array($name, $names)){
|
}
|
||||||
$resultFlag = ($resultFlag | $flag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $resultFlag;
|
public function getUsergroups($uname) {
|
||||||
}
|
$query = 'SELECT groups FROM users WHERE uname=:uname LIMIT 1';
|
||||||
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
|
||||||
|
$statement->execute();
|
||||||
|
|
||||||
public function getUsergroups($uname){
|
$row = $statement->fetch();
|
||||||
$query = 'SELECT groups FROM users WHERE uname=:uname LIMIT 1';
|
if ($row === false) {
|
||||||
$statement = $this->pdo->prepare($query);
|
return 0;
|
||||||
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
|
}
|
||||||
$statement->execute();
|
|
||||||
|
|
||||||
return $statement->fetch()[0];
|
return $row[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUsergroupNames($uname){
|
public function getUsergroupNames($uname) {
|
||||||
$usersGroups = [];
|
$usersGroups = [];
|
||||||
|
|
||||||
$userFlags = $this->getUsergroups($uname);
|
$userFlags = $this->getUsergroups($uname);
|
||||||
|
|
||||||
foreach($this->usergroups as $name => $flag){
|
foreach ($this->usergroups as $name => $flag) {
|
||||||
if($userFlags & $flag){
|
if ($userFlags & $flag) {
|
||||||
$usersGroups[] = $name;
|
$usersGroups[] = $name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $usersGroups;
|
return $usersGroups;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getAllUserData(){
|
public function getAllUserData() {
|
||||||
$query = 'SELECT uname FROM users ORDER BY uname ASC';
|
$query = 'SELECT uname FROM users ORDER BY uname ASC';
|
||||||
$statement = $this->pdo->prepare($query);
|
$statement = $this->pdo->prepare($query);
|
||||||
$statement->execute();
|
$statement->execute();
|
||||||
|
|
||||||
$users = [];
|
$users = [];
|
||||||
foreach($statement->fetchAll() as $userData){
|
foreach ($statement->fetchAll() as $userData) {
|
||||||
$uname = $userData['uname'];
|
$uname = $userData['uname'];
|
||||||
$users[] = [
|
$users[] = [
|
||||||
'name' => $uname,
|
'name' => $uname,
|
||||||
'groups' => $this->getUsergroupNames($uname)
|
'groups' => $this->getUsergroupNames($uname),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $users;
|
return $users;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +1,11 @@
|
|||||||
<?php //declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side;
|
namespace pvv\side;
|
||||||
|
|
||||||
use \DateTimeImmutable;
|
|
||||||
|
|
||||||
interface Activity {
|
interface Activity {
|
||||||
|
public function getNextEventFrom(\DateTimeImmutable $date) /* : Event */;
|
||||||
|
|
||||||
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */;
|
public function getPreviousEventFrom(\DateTimeImmutable $date) /* : Event */;
|
||||||
|
|
||||||
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1,106 +1,114 @@
|
|||||||
<?php //declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side;
|
namespace pvv\side;
|
||||||
|
|
||||||
use \DateTimeImmutable;
|
|
||||||
use \DateInterval;
|
|
||||||
|
|
||||||
class Agenda {
|
class Agenda {
|
||||||
|
private $activities;
|
||||||
|
|
||||||
const TODAY = 0;
|
public const TODAY = 0;
|
||||||
const TOMORROW = 1;
|
public const TOMORROW = 1;
|
||||||
const THIS_WEEK = 2;
|
public const THIS_WEEK = 2;
|
||||||
const NEXT_WEEK = 3;
|
public const NEXT_WEEK = 3;
|
||||||
const THIS_MONTH = 4;
|
public const THIS_MONTH = 4;
|
||||||
const NEXT_MONTH = 5;
|
public const NEXT_MONTH = 5;
|
||||||
|
|
||||||
public function __construct($activities) {
|
public function __construct($activities) {
|
||||||
$this->activities = $activities;
|
$this->activities = $activities;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getFormattedDate($date) {
|
public static function getFormattedDate($date) {
|
||||||
return trim(strftime('%A %e. %b %H.%M', $date->getTimeStamp()));
|
return $date->format('l j. M H.i');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getEventsBetween(\DateTimeImmutable $from, \DateTimeImmutable $to) {
|
||||||
|
$results = [];
|
||||||
|
for ($i = 0; $i < \count($this->activities); ++$i) {
|
||||||
|
$result = [];
|
||||||
|
do {
|
||||||
|
$run = false;
|
||||||
|
if (\count($result)) {
|
||||||
|
$date = end($result)->getStop();
|
||||||
|
} else {
|
||||||
|
$date = $from;
|
||||||
|
}
|
||||||
|
$next = $this->activities[$i]->getNextEventFrom($date);
|
||||||
|
if (isset($next) && $next->getStart() < $to) {
|
||||||
|
$result[] = $this->activities[$i]->getNextEventFrom($date);
|
||||||
|
$run = true;
|
||||||
|
}
|
||||||
|
} while ($run);
|
||||||
|
$results[] = $result;
|
||||||
|
}
|
||||||
|
$result = [];
|
||||||
|
foreach ($results as $a) {
|
||||||
|
foreach ($a as $b) {
|
||||||
|
$result[] = $b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
usort($result, static fn($a, $b) => ($a->getStart() < $b->getStart()) ? -1 : 1);
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNextDays() {
|
||||||
|
$result = [[], [], [], [], [], []];
|
||||||
|
$events = $this->getEventsBetween(
|
||||||
|
(new \DateTimeImmutable())->setTime(0, 0),
|
||||||
|
(new \DateTimeImmutable())->setTime(23, 59)->add(new \DateInterval('P1M'))
|
||||||
|
);
|
||||||
|
foreach ($events as $event) {
|
||||||
|
$index = self::NEXT_MONTH;
|
||||||
|
if (self::isToday($event->getStart())) {
|
||||||
|
$index = self::TODAY;
|
||||||
|
} elseif (self::isTomorrow($event->getStart())) {
|
||||||
|
$index = self::TOMORROW;
|
||||||
|
} elseif (self::isThisWeek($event->getStart())) {
|
||||||
|
$index = self::THIS_WEEK;
|
||||||
|
} elseif (self::isNextWeek($event->getStart())) {
|
||||||
|
$index = self::NEXT_WEEK;
|
||||||
|
} elseif (self::isThisMonth($event->getStart())) {
|
||||||
|
$index = self::THIS_MONTH;
|
||||||
|
}
|
||||||
|
$result[$index][] = $event;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getEventsBetween(DateTimeImmutable $from, DateTimeImmutable $to) {
|
return $result;
|
||||||
$results = [];
|
}
|
||||||
for($i = 0; $i < sizeof($this->activities); $i++) {
|
|
||||||
$result = [];
|
|
||||||
do {
|
|
||||||
$run = false;
|
|
||||||
if (sizeof($result)) {
|
|
||||||
$date = end($result)->getStop();
|
|
||||||
} else {
|
|
||||||
$date = $from;
|
|
||||||
}
|
|
||||||
$next = $this->activities[$i]->getNextEventFrom($date);
|
|
||||||
if (isset($next) && $next->getStart() < $to) {
|
|
||||||
$result[] = $this->activities[$i]->getNextEventFrom($date);
|
|
||||||
$run = true;
|
|
||||||
}
|
|
||||||
} while ($run);
|
|
||||||
$results[] = $result;
|
|
||||||
}
|
|
||||||
$result = [];
|
|
||||||
foreach($results as $a) foreach($a as $b) $result[] = $b;
|
|
||||||
usort($result, function($a, $b) {
|
|
||||||
return ($a->getStart() < $b->getStart()) ? -1 : 1;
|
|
||||||
});
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getNextDays() {
|
public function getNextOfEach(\DateTimeImmutable $startDate) {
|
||||||
$result = [[], [], [], [], [], []];
|
$result = array_filter(array_map(
|
||||||
$events = $this->getEventsBetween(
|
static fn($a) => $a->getNextEventFrom($startDate),
|
||||||
(new DateTimeImmutable)->sub(new DateInterval('PT1H')),
|
$this->activities
|
||||||
(new DateTimeImmutable)->add(new DateInterval('P1M'))
|
), static fn($a) => isset($a));
|
||||||
);
|
usort(
|
||||||
foreach ($events as $event) {
|
$result,
|
||||||
$index = self::NEXT_MONTH;
|
static fn($a, $b) => ($a->getStart()->getTimeStamp() < $b->getStart()->getTimeStamp())
|
||||||
if (self::isToday($event->getStart())) $index = self::TODAY;
|
? -1
|
||||||
elseif (self::isTomorrow($event->getStart())) $index = self::TOMORROW;
|
: 1
|
||||||
elseif (self::isThisWeek($event->getStart())) $index = self::THIS_WEEK;
|
);
|
||||||
elseif (self::isNextWeek($event->getStart())) $index = self::NEXT_WEEK;
|
|
||||||
elseif (self::isThisMonth($event->getStart())) $index = self::THIS_MONTH;
|
|
||||||
$result[$index][] = $event;
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getNextOfEach(DateTimeImmutable $startDate) {
|
return $result;
|
||||||
$result = array_filter(array_map(
|
}
|
||||||
function($a) use ($startDate){
|
|
||||||
return $a->getNextEventFrom($startDate);
|
|
||||||
}, $this->activities
|
|
||||||
), function($a){
|
|
||||||
return isset($a);
|
|
||||||
});
|
|
||||||
usort($result, function($a, $b) {
|
|
||||||
return ($a->getStart()->getTimeStamp() < $b->getStart()->getTimeStamp())
|
|
||||||
? -1
|
|
||||||
: 1
|
|
||||||
;
|
|
||||||
});
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function isToday(DateTimeImmutable $date) {
|
public static function isToday(\DateTimeImmutable $date) {
|
||||||
return $date->format('dmY') == date('dmY');
|
return $date->format('dmY') == date('dmY');
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function isTomorrow(DateTimeImmutable $date) {
|
public static function isTomorrow(\DateTimeImmutable $date) {
|
||||||
return $date->sub(new DateInterval('P1D'))->format('dmY') == date('dmY');
|
return $date->sub(new \DateInterval('P1D'))->format('dmY') == date('dmY');
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function isThisWeek(DateTimeImmutable $date) {
|
public static function isThisWeek(\DateTimeImmutable $date) {
|
||||||
return $date->format('WY') == date('WY');
|
return $date->format('WY') == date('WY');
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function isNextWeek(DateTimeImmutable $date) {
|
public static function isNextWeek(\DateTimeImmutable $date) {
|
||||||
return $date->sub(new DateInterval('P7D'))->format('WY') == date('WY');
|
return $date->sub(new \DateInterval('P7D'))->format('WY') == date('WY');
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function isThisMonth(DateTimeImmutable $date) {
|
|
||||||
return $date->format('mY') == date('mY');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public static function isThisMonth(\DateTimeImmutable $date) {
|
||||||
|
return $date->format('mY') == date('mY');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,84 +1,83 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side;
|
namespace pvv\side;
|
||||||
|
|
||||||
use \DateTimeImmutable;
|
|
||||||
use \PDO;
|
|
||||||
|
|
||||||
class DBActivity implements Activity {
|
class DBActivity implements Activity {
|
||||||
|
private $pdo;
|
||||||
|
|
||||||
public function __construct(PDO $pdo) {
|
public function __construct(\PDO $pdo) {
|
||||||
$this->pdo = $pdo;
|
$this->pdo = $pdo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getAllEvents() {
|
public function getAllEvents() {
|
||||||
$query = 'SELECT * FROM events ORDER BY id ASC';
|
$query = 'SELECT * FROM events ORDER BY id DESC';
|
||||||
$statement = $this->pdo->prepare($query);
|
$statement = $this->pdo->prepare($query);
|
||||||
$statement->execute();
|
$statement->execute();
|
||||||
|
|
||||||
$events = [];
|
$events = [];
|
||||||
foreach($statement->fetchAll() as $dbEvent){
|
foreach ($statement->fetchAll() as $dbEvent) {
|
||||||
$event = new SimpleEvent(
|
$event = new SimpleEvent(
|
||||||
$dbEvent['id'],
|
$dbEvent['id'],
|
||||||
$dbEvent['name'],
|
$dbEvent['name'],
|
||||||
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['start']),
|
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['start']),
|
||||||
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['stop']),
|
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['stop']),
|
||||||
$dbEvent['organiser'],
|
$dbEvent['organiser'],
|
||||||
$dbEvent['location'],
|
$dbEvent['location'],
|
||||||
$dbEvent['description']
|
$dbEvent['description']
|
||||||
);
|
);
|
||||||
$events[] = $event;
|
$events[] = $event;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $events;
|
return $events;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getEventByID($id) {
|
public function getEventByID($id) {
|
||||||
$query = 'SELECT * FROM events WHERE id=:id LIMIT 1';
|
$query = 'SELECT * FROM events WHERE id=:id LIMIT 1';
|
||||||
$statement = $this->pdo->prepare($query);
|
$statement = $this->pdo->prepare($query);
|
||||||
$statement->bindParam(':id', $id, PDO::PARAM_INT);
|
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
|
||||||
$statement->execute();
|
$statement->execute();
|
||||||
|
|
||||||
$dbEvent = $statement->fetch();
|
$dbEvent = $statement->fetch();
|
||||||
$event = new SimpleEvent(
|
|
||||||
$dbEvent['id'],
|
|
||||||
$dbEvent['name'],
|
|
||||||
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['start']),
|
|
||||||
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['stop']),
|
|
||||||
$dbEvent['organiser'],
|
|
||||||
$dbEvent['location'],
|
|
||||||
$dbEvent['description']
|
|
||||||
);
|
|
||||||
|
|
||||||
return $event;
|
return new SimpleEvent(
|
||||||
}
|
$dbEvent['id'],
|
||||||
|
$dbEvent['name'],
|
||||||
|
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['start']),
|
||||||
|
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['stop']),
|
||||||
|
$dbEvent['organiser'],
|
||||||
|
$dbEvent['location'],
|
||||||
|
$dbEvent['description']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNextEventFrom(\DateTimeImmutable $date) {
|
||||||
|
$query = 'SELECT id,name,start,stop,organiser,location,description FROM events WHERE start > :date ORDER BY start ASC LIMIT 1';
|
||||||
|
|
||||||
public function getNextEventFrom(DateTimeImmutable $date) {
|
return $this->retrieve($date, $query);
|
||||||
$query = 'SELECT name,start,stop,organiser,location,description FROM events WHERE start > :date ORDER BY start ASC LIMIT 1';
|
}
|
||||||
return $this->retrieve($date, $query);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getPreviousEventFrom(DateTimeImmutable $date) {
|
public function getPreviousEventFrom(\DateTimeImmutable $date) {
|
||||||
$query = 'SELECT name,start,stop,organiser,location,description FROM events WHERE start < :date ORDER BY start DESC LIMIT 1';
|
$query = 'SELECT id,name,start,stop,organiser,location,description FROM events WHERE start < :date ORDER BY start DESC LIMIT 1';
|
||||||
return $this->retrieve($date, $query);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function retrieve($date, $query) {
|
return $this->retrieve($date, $query);
|
||||||
$stmt = $this->pdo->prepare($query);
|
}
|
||||||
$stmt->execute(['date' => $date->format('Y-m-d H:i:s')]);
|
|
||||||
if ($result = $stmt->fetch(PDO::FETCH_ASSOC)){
|
|
||||||
$ev = new SimpleEvent(
|
|
||||||
$result['id'],
|
|
||||||
$result['name'],
|
|
||||||
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $result['start']),
|
|
||||||
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $result['stop']),
|
|
||||||
$result['organiser'],
|
|
||||||
$result['location'],
|
|
||||||
$result['description']
|
|
||||||
);
|
|
||||||
return $ev;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
private function retrieve($date, $query) {
|
||||||
|
$stmt = $this->pdo->prepare($query);
|
||||||
|
$stmt->execute(['date' => $date->format('Y-m-d H:i:s')]);
|
||||||
|
if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
|
||||||
|
return new SimpleEvent(
|
||||||
|
$result['id'],
|
||||||
|
$result['name'],
|
||||||
|
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $result['start']),
|
||||||
|
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $result['stop']),
|
||||||
|
$result['organiser'],
|
||||||
|
$result['location'],
|
||||||
|
$result['description']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
76
src/pvv/side/door.php
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace pvv\side;
|
||||||
|
|
||||||
|
class Door {
|
||||||
|
private $pdo;
|
||||||
|
|
||||||
|
public function __construct(\PDO $pdo) {
|
||||||
|
$this->pdo = $pdo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAll() {
|
||||||
|
$query = 'SELECT time, open FROM door ORDER BY time DESC';
|
||||||
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->execute();
|
||||||
|
|
||||||
|
$doorEvents = [];
|
||||||
|
foreach ($statement->fetchAll() as $row) {
|
||||||
|
$doorEvents[] = [
|
||||||
|
'time' => (int) $row['time'],
|
||||||
|
'open' => (bool) $row['open'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $doorEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getEntriesAfter($startTime) {
|
||||||
|
$query = 'SELECT time, open FROM door WHERE time > :startTime ORDER BY time DESC';
|
||||||
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->bindParam(':startTime', $startTime, \PDO::PARAM_STR);
|
||||||
|
$statement->execute();
|
||||||
|
|
||||||
|
$doorEvents = [];
|
||||||
|
foreach ($statement->fetchAll() as $row) {
|
||||||
|
$doorEvents[] = [
|
||||||
|
'time' => (int) $row['time'],
|
||||||
|
'open' => (bool) $row['open'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $doorEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCurrent() {
|
||||||
|
$query = 'SELECT time, open FROM door ORDER BY time DESC LIMIT 1';
|
||||||
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->execute();
|
||||||
|
$row = $statement->fetch();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'time' => (int) $row['time'],
|
||||||
|
'open' => (bool) $row['open'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function removeOld(): void {
|
||||||
|
$firstValidTime = time() - 60 * 60 * 24 * 7; // One week before now
|
||||||
|
$query = 'DELETE FROM door WHERE time < :firstValid';
|
||||||
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->bindParam(':firstValid', $firstValidTime, \PDO::PARAM_STR);
|
||||||
|
$statement->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function createEvent($time, $open): void {
|
||||||
|
$query = 'INSERT INTO door(time, open) VALUES (:time, :open)';
|
||||||
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->bindParam(':time', $time, \PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':open', $open, \PDO::PARAM_STR);
|
||||||
|
$statement->execute();
|
||||||
|
|
||||||
|
$this->removeOld();
|
||||||
|
}
|
||||||
|
}
|
@@ -1,52 +1,55 @@
|
|||||||
<?php //declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side;
|
namespace pvv\side;
|
||||||
|
|
||||||
use \DateTimeImmutable;
|
use DateTimeImmutable;
|
||||||
use \DateInterval;
|
|
||||||
|
|
||||||
abstract class Event {
|
abstract class Event {
|
||||||
|
private $start;
|
||||||
|
|
||||||
private $start;
|
public function __construct(\DateTimeImmutable $start) {
|
||||||
|
$this->start = $start;
|
||||||
|
}
|
||||||
|
|
||||||
public function __construct(DateTimeImmutable $start) {
|
public function getStart() {
|
||||||
$this->start = $start;
|
return $this->start;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getStart() {
|
public function getRelativeDate() {
|
||||||
return $this->start;
|
if (Agenda::isToday($this->getStart())) {
|
||||||
}
|
return 'i dag';
|
||||||
|
}
|
||||||
|
if (Agenda::isTomorrow($this->getStart())) {
|
||||||
|
return 'i morgen';
|
||||||
|
}
|
||||||
|
if (Agenda::isThisWeek($this->getStart()) || $this->getStart()->sub(new \DateInterval('P4D'))->getTimestamp() < time()) {
|
||||||
|
return $this->getStart()->format('l');
|
||||||
|
}
|
||||||
|
if (Agenda::isNextWeek($this->getStart())) {
|
||||||
|
return 'neste uke';
|
||||||
|
}
|
||||||
|
if (Agenda::isThisMonth($this->getStart())) {
|
||||||
|
return 'denne måneden';
|
||||||
|
}
|
||||||
|
|
||||||
public function getRelativeDate() {
|
return $this->getStart()->format('j. F');
|
||||||
if (Agenda::isToday($this->getStart())) {
|
}
|
||||||
return 'i dag';
|
|
||||||
}
|
|
||||||
if (Agenda::isTomorrow($this->getStart())) {
|
|
||||||
return 'i morgen';
|
|
||||||
}
|
|
||||||
if (Agenda::isThisWeek($this->getStart()) || $this->getStart()->sub(new DateInterval('P4D'))->getTimestamp() < time()) {
|
|
||||||
return strftime('%A', $this->getStart()->getTimestamp());
|
|
||||||
}
|
|
||||||
if (Agenda::isNextWeek($this->getStart())) {
|
|
||||||
return 'neste uke';
|
|
||||||
}
|
|
||||||
if (Agenda::isThisMonth($this->getStart())) {
|
|
||||||
return 'denne måneden';
|
|
||||||
}
|
|
||||||
return trim(strftime('%e. %B', $this->getStart()->getTimestamp()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract function getStop(); /* : DateTimeImmutable */
|
abstract public function getStop(); /* : DateTimeImmutable */
|
||||||
|
|
||||||
public abstract function getName();
|
abstract public function getName();
|
||||||
|
|
||||||
public abstract function getLocation();
|
abstract public function getLocation();
|
||||||
|
|
||||||
public abstract function getOrganiser();
|
abstract public function getOrganiser();
|
||||||
|
|
||||||
public abstract function getURL(); /* : string */
|
abstract public function getURL(); /* : string */
|
||||||
|
|
||||||
public abstract function getImageURL(); /* : string */
|
abstract public function getImageURL(); /* : string */
|
||||||
|
|
||||||
public abstract function getDescription(); /* : string */
|
abstract public function getDescription(); /* : string */
|
||||||
|
|
||||||
|
abstract public function getColor(); /* : string */
|
||||||
}
|
}
|
||||||
|
47
src/pvv/side/motd.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace pvv\side;
|
||||||
|
|
||||||
|
class MOTD {
|
||||||
|
private $pdo;
|
||||||
|
|
||||||
|
public function __construct($pdo) {
|
||||||
|
$this->pdo = $pdo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setMOTD($title, $content): void {
|
||||||
|
if (\is_array($content)) {
|
||||||
|
$content = implode('_', $content);
|
||||||
|
}
|
||||||
|
$query = 'INSERT INTO motd(title, content) VALUES (:title, :content);';
|
||||||
|
$statement = $this->pdo->prepare($query);
|
||||||
|
|
||||||
|
$statement->bindParam(':title', $title, \PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':content', $content, \PDO::PARAM_STR);
|
||||||
|
|
||||||
|
$statement->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMOTD() {
|
||||||
|
$query = 'SELECT motd.title, motd.content FROM motd ORDER BY motd.id DESC LIMIT 1';
|
||||||
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->execute();
|
||||||
|
|
||||||
|
$data = $statement->fetch();
|
||||||
|
|
||||||
|
return ['title' => $data[0], 'content' => explode("\n", $data[1])];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMOTD_history($limit = 5) {
|
||||||
|
$query = 'SELECT motd.title, motd.content FROM motd ORDER BY motd.id DESC LIMIT :limit';
|
||||||
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->bindParam(':limit', $limit, \PDO::PARAM_STR);
|
||||||
|
$statement->execute();
|
||||||
|
|
||||||
|
$data = $statement->fetch();
|
||||||
|
|
||||||
|
return ['title' => $data[0], 'content' => explode("\n", $data[1])];
|
||||||
|
}
|
||||||
|
}
|
@@ -1,39 +1,35 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side;
|
namespace pvv\side;
|
||||||
|
|
||||||
class Project{
|
class Project {
|
||||||
private $id, $name, $owner, $owneruname, $descr, $active;
|
private $id;
|
||||||
|
private $name;
|
||||||
|
private $descr;
|
||||||
|
private $active;
|
||||||
|
|
||||||
public function __construct($id, $name, $descr, $owner, $owneruname, $active){
|
public function __construct($id, $name, $descr, $active) {
|
||||||
$this->id = $id;
|
$this->id = $id;
|
||||||
$this->name = $name;
|
$this->name = $name;
|
||||||
$this->descr = $descr;
|
$this->descr = explode("\n", $descr);
|
||||||
$this->owner = $owner;
|
$this->active = $active;
|
||||||
$this->owneruname = $owneruname;
|
}
|
||||||
$this->active = $active;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getID(){
|
public function getID() {
|
||||||
return $this->id;
|
return $this->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getName(){
|
public function getName() {
|
||||||
return $this->name;
|
return $this->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDescription(){
|
public function getDescription() {
|
||||||
return $this->descr;
|
return $this->descr;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getOwner(){
|
public function getActive() {
|
||||||
return $this->owner;
|
return $this->active;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
public function getOwnerUName(){
|
|
||||||
return $this->owneruname;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getActive(){
|
|
||||||
return $this->active;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,74 +1,120 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side;
|
namespace pvv\side;
|
||||||
|
|
||||||
use \PDO;
|
class ProjectManager {
|
||||||
|
private $pdo;
|
||||||
|
|
||||||
class ProjectManager{
|
public function __construct(\PDO $pdo) {
|
||||||
private $pdo;
|
$this->pdo = $pdo;
|
||||||
|
}
|
||||||
|
|
||||||
public function __construct(PDO $pdo){
|
public function getAll() {
|
||||||
$this->pdo = $pdo;
|
$query = 'SELECT * FROM projects ORDER BY id ASC';
|
||||||
}
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->execute();
|
||||||
|
|
||||||
public function getAll() {
|
$projects = [];
|
||||||
$query = 'SELECT * FROM projects ORDER BY id ASC';
|
foreach ($statement->fetchAll() as $dbProj) {
|
||||||
$statement = $this->pdo->prepare($query);
|
$project = new Project(
|
||||||
$statement->execute();
|
$dbProj['id'],
|
||||||
|
$dbProj['name'],
|
||||||
|
$dbProj['description'],
|
||||||
|
$dbProj['active']
|
||||||
|
);
|
||||||
|
$projects[] = $project;
|
||||||
|
}
|
||||||
|
|
||||||
$projects = [];
|
return $projects;
|
||||||
foreach($statement->fetchAll() as $dbProj){
|
}
|
||||||
$project = new Project(
|
|
||||||
$dbProj['id'],
|
|
||||||
$dbProj['name'],
|
|
||||||
$dbProj['description'],
|
|
||||||
$dbProj['owner'],
|
|
||||||
$dbProj['owneruname'],
|
|
||||||
$dbProj['active']
|
|
||||||
);
|
|
||||||
$projects[] = $project;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $projects;
|
public function getByID($id) {
|
||||||
}
|
$query = 'SELECT * FROM projects WHERE id=:id LIMIT 1';
|
||||||
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
|
||||||
|
$statement->execute();
|
||||||
|
|
||||||
public function getByID($id){
|
$dbProj = $statement->fetch();
|
||||||
$query = 'SELECT * FROM projects WHERE id=:id LIMIT 1';
|
if (!$dbProj) {
|
||||||
$statement = $this->pdo->prepare($query);
|
return false;
|
||||||
$statement->bindParam(':id', $id, PDO::PARAM_INT);
|
}
|
||||||
$statement->execute();
|
|
||||||
|
|
||||||
$dbProj = $statement->fetch();
|
return new Project(
|
||||||
$project = new Project(
|
$dbProj['id'],
|
||||||
$dbProj['id'],
|
$dbProj['name'],
|
||||||
$dbProj['name'],
|
$dbProj['description'],
|
||||||
$dbProj['description'],
|
$dbProj['active']
|
||||||
$dbProj['owner'],
|
);
|
||||||
$dbProj['owneruname'],
|
}
|
||||||
$dbProj['active']
|
|
||||||
);
|
|
||||||
|
|
||||||
return $project;
|
public function getByOwner($uname) {
|
||||||
}
|
$query = 'SELECT projectid FROM projectmembers WHERE uname=:uname';
|
||||||
|
$statement = $this->pdo->prepare($query);
|
||||||
|
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
|
||||||
|
$statement->execute();
|
||||||
|
|
||||||
public function getByUName($uname){
|
$projectIDs = $statement->fetchAll();
|
||||||
$query = 'SELECT * FROM projects WHERE owneruname=:uname';
|
$projects = [];
|
||||||
$statement = $this->pdo->prepare($query);
|
foreach ($projectIDs as $id) {
|
||||||
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
|
$id = $id['projectid'];
|
||||||
$statement->execute();
|
|
||||||
|
|
||||||
$projects = [];
|
$query = 'SELECT * FROM projects WHERE id=:id';
|
||||||
foreach($statement->fetchAll() as $dbProj){
|
$statement = $this->pdo->prepare($query);
|
||||||
$project = new Project(
|
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
|
||||||
$dbProj['id'],
|
$statement->execute();
|
||||||
$dbProj['name'],
|
|
||||||
$dbProj['description'],
|
|
||||||
$dbProj['owner'],
|
|
||||||
$dbProj['owneruname'],
|
|
||||||
$dbProj['active']
|
|
||||||
);
|
|
||||||
$projects[] = $project;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $projects;
|
foreach ($statement->fetchAll() as $dbProj) {
|
||||||
}
|
$project = new Project(
|
||||||
}
|
$dbProj['id'],
|
||||||
|
$dbProj['name'],
|
||||||
|
$dbProj['description'],
|
||||||
|
$dbProj['active']
|
||||||
|
);
|
||||||
|
$projects[] = $project;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $projects;
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
$members = [];
|
||||||
|
foreach ($statement->fetchAll() as $dbUsr) {
|
||||||
|
$members[] = [
|
||||||
|
'name' => $dbUsr['name'],
|
||||||
|
'uname' => $dbUsr['uname'],
|
||||||
|
'mail' => $dbUsr['mail'],
|
||||||
|
'role' => $dbUsr['role'],
|
||||||
|
'lead' => $dbUsr['lead'],
|
||||||
|
'owner' => $dbUsr['owner'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
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'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1,59 +1,63 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side;
|
namespace pvv\side;
|
||||||
|
|
||||||
class SimpleEvent extends Event {
|
class SimpleEvent extends Event {
|
||||||
|
private $id;
|
||||||
|
private $name;
|
||||||
|
private $descr;
|
||||||
|
private $start;
|
||||||
|
private $end;
|
||||||
|
private $org;
|
||||||
|
private $loc;
|
||||||
|
|
||||||
private $id, $name, $descr, $start, $end, $org, $loc;
|
public function __construct($id, $name, \DateTimeImmutable $start, \DateTimeImmutable $end, $org, $loc, $descr, $_isDBEvent = false) {
|
||||||
|
$this->id = $id;
|
||||||
|
$this->name = $name;
|
||||||
|
$this->start = $start;
|
||||||
|
$this->end = $end;
|
||||||
|
$this->org = $org;
|
||||||
|
$this->loc = $loc;
|
||||||
|
$this->descr = explode("\n", $descr);
|
||||||
|
}
|
||||||
|
|
||||||
public function __construct($id, $name,\DateTimeImmutable $start,\DateTimeImmutable $end,$org, $loc, $descr, $isDBEvent = false){
|
public function getID() {
|
||||||
$this->id = $id;
|
return $this->id;
|
||||||
$this->name = $name;
|
}
|
||||||
$this->start = $start;
|
|
||||||
$this->end = $end;
|
|
||||||
$this->org = $org;
|
|
||||||
$this->loc = $loc;
|
|
||||||
$this->descr = explode("\n", $descr);
|
|
||||||
$this->isDBEvent = $isDBEvent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getID(){
|
public function getStart() {
|
||||||
return $this->id;
|
return $this->start;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getStart(){
|
public function getStop() {
|
||||||
return $this->start;
|
return $this->end;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getStop(){
|
public function getOrganiser() {
|
||||||
return $this->end;
|
return $this->org;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getOrganiser(){
|
public function getLocation() {
|
||||||
return $this->org;
|
return $this->loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLocation(){
|
public function getName() {
|
||||||
return $this->loc;
|
return $this->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getName(){
|
public function getURL() {
|
||||||
return $this->name;
|
return '/hendelser/info.php?id=' . $this->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getURL() {
|
public function getImageURL(): void {}
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getImageURL() {
|
public function getDescription() {
|
||||||
return null;
|
return $this->descr;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDescription() {
|
|
||||||
return $this->descr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function isDBEvent() {
|
|
||||||
return $this->isDBEvent;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public function getColor() {
|
||||||
|
return '#3b7';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,36 +1,41 @@
|
|||||||
<?php //declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side\social;
|
namespace pvv\side\social;
|
||||||
|
|
||||||
use \pvv\side\Activity;
|
use pvv\side\Activity;
|
||||||
use \DateTimeImmutable;
|
|
||||||
use \DateInterval;
|
|
||||||
|
|
||||||
class AnimekveldActivity implements Activity {
|
class AnimekveldActivity implements Activity {
|
||||||
|
public function nextDate(\DateTimeImmutable $date) {
|
||||||
|
if (intval($date->format('H')) > 20 || intval($date->format('H')) === 19 && intval($date->format('i')) > 30) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(19, 30, 0));
|
||||||
|
}
|
||||||
|
$date = $date->setTime(19, 30, 0);
|
||||||
|
if (intval($date->format('N')) !== 5) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P1D')));
|
||||||
|
}
|
||||||
|
|
||||||
public function nextDate(DateTimeImmutable $date) {
|
return $date;
|
||||||
if ($date->format('H') > 20 || $date->format('H') == 19 && $date->format('i') > 30)
|
}
|
||||||
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(19, 30, 0));
|
|
||||||
$date = $date->setTime(19, 30, 0);
|
|
||||||
if ($date->format('N') != 5)
|
|
||||||
return $this->nextDate($date->add(new DateInterval('P1D')));
|
|
||||||
return $date;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function prevDate(DateTimeImmutable $date) {
|
public function prevDate(\DateTimeImmutable $date) {
|
||||||
if ($date->format('H') < 19 || $date->format('H') == 20 && $date->format('i') < 30)
|
if (intval($date->format('H')) < 19 || intval($date->format('H')) === 20 && intval($date->format('i')) < 30) {
|
||||||
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(19, 30, 0));
|
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(19, 30, 0));
|
||||||
$date = $date->setTime(19, 30, 0);
|
}
|
||||||
if ($date->format('N') != 5)
|
$date = $date->setTime(19, 30, 0);
|
||||||
return $this->prevDate($date->sub(new DateInterval('P1D')));
|
if (intval($date->format('N')) !== 5) {
|
||||||
return $date;
|
return $this->prevDate($date->sub(new \DateInterval('P1D')));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ {
|
return $date;
|
||||||
return new AnimekveldEvent($this->nextDate($date));
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ {
|
public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
|
||||||
return new AnimekveldEvent($this->prevDate($date));
|
return new AnimekveldEvent($this->nextDate($date));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
|
||||||
|
return new AnimekveldEvent($this->prevDate($date));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,44 +1,47 @@
|
|||||||
<?php //declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side\social;
|
namespace pvv\side\social;
|
||||||
|
|
||||||
use \pvv\side\Event;
|
use pvv\side\Event;
|
||||||
|
|
||||||
use \DateInterval;
|
|
||||||
|
|
||||||
class AnimekveldEvent extends Event {
|
class AnimekveldEvent extends Event {
|
||||||
|
public function getStop() {
|
||||||
|
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
|
||||||
|
}
|
||||||
|
|
||||||
public function getStop() {
|
public function getName() { /* : string */
|
||||||
return $this->getStart()->add(new DateInterval('PT4H1800S'));
|
return 'Animekveld';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getName() /* : string */ {
|
public function getLocation() { /* : Location */
|
||||||
return "Animekveld";
|
return 'Koserommet';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLocation() /* : Location */ {
|
public function getOrganiser() { /* : User */
|
||||||
return "Koserommet";
|
return 'Christoffer Viken';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getOrganiser() /* : User */ {
|
public function getURL() { /* : string */
|
||||||
return "Liang Zhu";
|
return '/anime/';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getURL() /* : string */ {
|
public function getImageURL() {
|
||||||
return '/anime/';
|
return '/sosiale/animekveld.jpg';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getImageURL() {
|
public function getDescription() {
|
||||||
return '/sosiale/animekveld.jpg';
|
return [
|
||||||
}
|
'Er du glad i japanske tegneserier eller bare nysgjerrig på hva anime er?',
|
||||||
|
'Bli med oss hver fredag, der vi finner frem de nyeste episodene for sesongen!',
|
||||||
public function getDescription() {
|
'',
|
||||||
return [
|
'Alle kan være med på å anbefale eller veto serier.',
|
||||||
'<p>Er du glad i japansk tegnefilm eller er du bare nysgjerrige på hva anime er?' . "\n" .
|
'',
|
||||||
'Bli med oss! Hver fredag finner vi de nyeste episodene for sesongen.' . "\n" .
|
];
|
||||||
'Vi viser denne senongens nye animeer.',
|
}
|
||||||
|
|
||||||
'<p>Alle kan være med på å anbefale eller veto serier.'
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public function getColor() {
|
||||||
|
return '#35a';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,36 +1,47 @@
|
|||||||
<?php //declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side\social;
|
namespace pvv\side\social;
|
||||||
|
|
||||||
use \pvv\side\Activity;
|
use pvv\side\Activity;
|
||||||
use \DateTimeImmutable;
|
|
||||||
use \DateInterval;
|
|
||||||
|
|
||||||
class BrettspillActivity implements Activity {
|
class BrettspillActivity implements Activity {
|
||||||
|
public function nextDate(\DateTimeImmutable $date) {
|
||||||
|
if (intval($date->format('H')) > 17 || intval($date->format('H')) === 16 && intval($date->format('i')) > 15) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(16, 15, 0));
|
||||||
|
}
|
||||||
|
$date = $date->setTime(16, 15, 0);
|
||||||
|
if (intval($date->format('N')) !== 7) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P1D')));
|
||||||
|
}
|
||||||
|
if (intval($date->format('W')) % 2 - 1) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P7D')));
|
||||||
|
}
|
||||||
|
|
||||||
public function nextDate(DateTimeImmutable $date) {
|
return $date;
|
||||||
if ($date->format('H') > 20 || $date->format('H') == 19 && $date->format('i') > 30)
|
}
|
||||||
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(19, 30, 0));
|
|
||||||
$date = $date->setTime(19, 30, 0);
|
|
||||||
if ($date->format('N') != 4)
|
|
||||||
return $this->nextDate($date->add(new DateInterval('P1D')));
|
|
||||||
return $date;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function prevDate(DateTimeImmutable $date) {
|
public function prevDate(\DateTimeImmutable $date) {
|
||||||
if ($date->format('H') < 19 || $date->format('H') == 20 && $date->format('i') < 30)
|
if (intval($date->format('H')) < 16 || intval($date->format('H')) === 17 && intval($date->format('i')) < 15) {
|
||||||
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(19, 30, 0));
|
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(16, 15, 0));
|
||||||
$date = $date->setTime(19, 30, 0);
|
}
|
||||||
if ($date->format('N') != 4)
|
$date = $date->setTime(16, 15, 0);
|
||||||
return $this->prevDate($date->sub(new DateInterval('P1D')));
|
if (intval($date->format('N')) !== 7) {
|
||||||
return $date;
|
return $this->prevDate($date->sub(new \DateInterval('P1D')));
|
||||||
}
|
}
|
||||||
|
if (intval($date->format('W')) % 2 - 1) {
|
||||||
|
return $this->prevDate($date->sub(new \DateInterval('P7D')));
|
||||||
|
}
|
||||||
|
|
||||||
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ {
|
return $date;
|
||||||
return new BrettspillEvent($this->nextDate($date));
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ {
|
public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
|
||||||
return new BrettspillEvent($this->prevDate($date));
|
return new BrettspillEvent($this->nextDate($date));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
|
||||||
|
return new BrettspillEvent($this->prevDate($date));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,63 +1,64 @@
|
|||||||
<?php //declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side\social;
|
namespace pvv\side\social;
|
||||||
|
|
||||||
use \pvv\side\Event;
|
use pvv\side\Event;
|
||||||
|
|
||||||
use \DateInterval;
|
|
||||||
|
|
||||||
class BrettspillEvent extends Event {
|
class BrettspillEvent extends Event {
|
||||||
|
public function getStop() {
|
||||||
|
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
|
||||||
|
}
|
||||||
|
|
||||||
public function getStop() {
|
public function getName() { /* : string */
|
||||||
return $this->getStart()->add(new DateInterval('PT4H1800S'));
|
return 'Brettspillkveld';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getName() /* : string */ {
|
public function getLocation() { /* : Location */
|
||||||
return "Brettspillkveld";
|
return 'Programvareverkstedet';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLocation() /* : Location */ {
|
public function getOrganiser() { /* : User */
|
||||||
return "Koserommet";
|
return 'Programvareverkstedet';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getOrganiser() /* : User */ {
|
public function getURL() { /* : string */
|
||||||
return "Robert Maikher";
|
return '/brettspill/';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getURL() /* : string */ {
|
public function getImageURL() {
|
||||||
return '/brettspill/';
|
return '/sosiale/brettspill.jpg';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getImageURL() {
|
public function getDescription() {
|
||||||
return '/sosiale/brettspill.jpg';
|
return [
|
||||||
}
|
'Er du en hardcore brettspillentusiast eller en nybegynner som har så vidt spilt ludo? ' .
|
||||||
|
'Da er vår brettspillkveld noe for deg! ' .
|
||||||
public function getDescription() {
|
'Vi tar ut et par spill fra vårt samling of spiller så mye vi orker. Kom innom!',
|
||||||
return [
|
'',
|
||||||
'<p>Er du en hardcore brettspillentusiast eller en nybegynner som har så vidt spilt ludo?' . "\n" .
|
'## Vår samling',
|
||||||
'Da er vår brettspillkveld noe for deg!' . "\n" .
|
'',
|
||||||
'Vi tar ut et par spill fra vårt samling of spiller så mye vi orker. Kom innom!',
|
'* Dominion\*',
|
||||||
|
'* Three cheers for master',
|
||||||
'<p><a class="btn" href="#b_spill">Vår samling</a>',
|
'* Avalon',
|
||||||
|
'* Hanabi',
|
||||||
'<div id="b_spill" class="collapsable">' . "\n" .
|
'* Cards aginst humanity\*',
|
||||||
'<ul>' . "\n" .
|
'* Citadels',
|
||||||
'<li>Dominion*' . "\n" .
|
'* Munchkin\*\*',
|
||||||
'<li>Three cheers for master' . "\n" .
|
'* Exploding kittens\*\*',
|
||||||
'<li>Avalon' . "\n" .
|
'* Aye dark overlord',
|
||||||
'<li>Hanabi' . "\n" .
|
'* Settlers of catan\*',
|
||||||
'<li>Cards aginst humanity*' . "\n" .
|
'* Risk\*\*',
|
||||||
'<li>Citadels' . "\n" .
|
'* og mange flere...',
|
||||||
'<li>Munchkin**' . "\n" .
|
'',
|
||||||
'<li>Exploding kittens**' . "\n" .
|
'\* Vi har flere ekspansjoner til spillet',
|
||||||
'<li>Aye dark overlord' . "\n" .
|
'',
|
||||||
'<li>Settlers of catan*' . "\n" .
|
'\*\* Vi har flere varianter av spillet',
|
||||||
'<li>Risk**' . "\n" .
|
];
|
||||||
'<li>og mange flere...' . "\n" .
|
}
|
||||||
'</ul>',
|
|
||||||
'<p>* Vi har flere ekspansjoner til spillet',
|
|
||||||
'<p>** Vi har flere varianter av spillet',
|
|
||||||
'</div>'
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public function getColor() {
|
||||||
|
return '#000';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
47
src/pvv/side/social/driftkveldactivity.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace pvv\side\social;
|
||||||
|
|
||||||
|
use pvv\side\Activity;
|
||||||
|
|
||||||
|
class DriftkveldActivity implements Activity {
|
||||||
|
public function nextDate(\DateTimeImmutable $date) {
|
||||||
|
if (intval($date->format('H')) > 18 || intval($date->format('H')) === 17 && intval($date->format('i')) > 30) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(18, 15, 0));
|
||||||
|
}
|
||||||
|
$date = $date->setTime(18, 15, 0);
|
||||||
|
if (intval($date->format('N')) !== 6) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P1D')));
|
||||||
|
}
|
||||||
|
if (intval($date->format('W')) % 2 - 1) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P7D')));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function prevDate(\DateTimeImmutable $date) {
|
||||||
|
if (intval($date->format('H')) < 17 || intval($date->format('H')) === 18 && intval($date->format('i')) < 30) {
|
||||||
|
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(18, 15, 0));
|
||||||
|
}
|
||||||
|
$date = $date->setTime(18, 15, 0);
|
||||||
|
if (intval($date->format('N')) !== 6) {
|
||||||
|
return $this->prevDate($date->sub(new \DateInterval('P1D')));
|
||||||
|
}
|
||||||
|
if (intval($date->format('W')) % 2 - 1) {
|
||||||
|
return $this->prevDate($date->sub(new \DateInterval('P7D')));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
|
||||||
|
return new DriftkveldEvent($this->nextDate($date));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
|
||||||
|
return new DriftkveldEvent($this->prevDate($date));
|
||||||
|
}
|
||||||
|
}
|
48
src/pvv/side/social/driftkveldevent.php
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace pvv\side\social;
|
||||||
|
|
||||||
|
use pvv\side\Event;
|
||||||
|
|
||||||
|
class DriftkveldEvent extends Event {
|
||||||
|
public function getStop() {
|
||||||
|
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getName() { /* : string */
|
||||||
|
return 'Driftkveld';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLocation() { /* : Location */
|
||||||
|
return 'Terminalrommet / Discord / IRC';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getOrganiser() { /* : User */
|
||||||
|
return 'Torstein Nordgård-Hansen';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getURL() { /* : string */
|
||||||
|
return '/driftkveld/';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getImageURL() {
|
||||||
|
return '/sosiale/drift.jpg';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDescription() {
|
||||||
|
return [
|
||||||
|
'Vil du drifte?',
|
||||||
|
'Vil du være kul kis TM?',
|
||||||
|
'Kom på driftkveld!',
|
||||||
|
'',
|
||||||
|
'Vi møtes annenhver uke for å ta unna driftarbeid og drikke kaffe.',
|
||||||
|
'Alle PVVere er velkommene, enten de er erfarne driftere eller helt utenforstående!',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getColor() {
|
||||||
|
return '#35a';
|
||||||
|
}
|
||||||
|
}
|
47
src/pvv/side/social/hackekveldactivity.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace pvv\side\social;
|
||||||
|
|
||||||
|
use pvv\side\Activity;
|
||||||
|
|
||||||
|
class HackekveldActivity implements Activity {
|
||||||
|
public function nextDate(\DateTimeImmutable $date) {
|
||||||
|
if (intval($date->format('H')) > 18 || intval($date->format('H')) === 17 && intval($date->format('i')) > 30) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(18, 15, 0));
|
||||||
|
}
|
||||||
|
$date = $date->setTime(16, 15, 0);
|
||||||
|
if (intval($date->format('N')) !== 6) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P1D')));
|
||||||
|
}
|
||||||
|
if (intval($date->format('W')) % 2) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P7D')));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function prevDate(\DateTimeImmutable $date) {
|
||||||
|
if (intval($date->format('H')) < 17 || intval($date->format('H')) === 18 && intval($date->format('i')) < 30) {
|
||||||
|
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(18, 15, 0));
|
||||||
|
}
|
||||||
|
$date = $date->setTime(18, 15, 0);
|
||||||
|
if (intval($date->format('N')) !== 6) {
|
||||||
|
return $this->prevDate($date->sub(new \DateInterval('P1D')));
|
||||||
|
}
|
||||||
|
if (intval($date->format('W')) % 2) {
|
||||||
|
return $this->prevDate($date->sub(new \DateInterval('P7D')));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
|
||||||
|
return new HackekveldEvent($this->nextDate($date));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
|
||||||
|
return new HackekveldEvent($this->prevDate($date));
|
||||||
|
}
|
||||||
|
}
|
44
src/pvv/side/social/hackekveldevent.php
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace pvv\side\social;
|
||||||
|
|
||||||
|
use pvv\side\Event;
|
||||||
|
|
||||||
|
class HackekveldEvent extends Event {
|
||||||
|
public function getStop() {
|
||||||
|
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getName() { /* : string */
|
||||||
|
return 'Hackekveld';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLocation() { /* : Location */
|
||||||
|
return 'Terminalrommet / Discord / IRC';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getOrganiser() { /* : User */
|
||||||
|
return 'PVV';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getURL() { /* : string */
|
||||||
|
return '#';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getImageURL() {
|
||||||
|
return '/pvv-logo.png';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDescription() {
|
||||||
|
return [
|
||||||
|
'Mange PVV-medlemmer liker å programmere.',
|
||||||
|
'Hvis du også liker å programmere, så bli med! Her kan du jobbe med dine egne prosjekter eller starte noe med andre nerder her på huset. Vi møtes for en hyggelig prat, mye god programmering og delsponset pizza.',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getColor() {
|
||||||
|
return '#35a';
|
||||||
|
}
|
||||||
|
}
|
@@ -1,40 +1,47 @@
|
|||||||
<?php //declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side\social;
|
namespace pvv\side\social;
|
||||||
|
|
||||||
use \pvv\side\Activity;
|
use pvv\side\Activity;
|
||||||
use \DateTimeImmutable;
|
|
||||||
use \DateInterval;
|
|
||||||
|
|
||||||
class NerdepitsaActivity implements Activity {
|
class NerdepitsaActivity implements Activity {
|
||||||
|
public function nextDate(\DateTimeImmutable $date) {
|
||||||
|
if (intval($date->format('H')) > 19) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(19, 0, 0));
|
||||||
|
}
|
||||||
|
$date = $date->setTime(19, 0, 0);
|
||||||
|
if (intval($date->format('N')) !== 5) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P1D')));
|
||||||
|
}
|
||||||
|
if (intval($date->format('W')) % 2) {
|
||||||
|
return $this->nextDate($date->add(new \DateInterval('P7D')));
|
||||||
|
}
|
||||||
|
|
||||||
public function nextDate(DateTimeImmutable $date) {
|
return $date;
|
||||||
if ($date->format('H') > 19)
|
}
|
||||||
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(19, 0, 0));
|
|
||||||
$date = $date->setTime(19, 0, 0);
|
|
||||||
if ($date->format('N') != 5)
|
|
||||||
return $this->nextDate($date->add(new DateInterval('P1D')));
|
|
||||||
if ($date->format('W') % 2)
|
|
||||||
return $this->nextDate($date->add(new DateInterval('P7D')));
|
|
||||||
return $date;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function prevDate(DateTimeImmutable $date) {
|
public function prevDate(\DateTimeImmutable $date) {
|
||||||
if ($date->format('H') < 19)
|
if (intval($date->format('H')) < 19) {
|
||||||
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(19, 0, 0));
|
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(19, 0, 0));
|
||||||
$date = $date->setTime(19, 0, 0);
|
}
|
||||||
if ($date->format('N') != 5)
|
$date = $date->setTime(19, 0, 0);
|
||||||
return $this->prevDate($date->sub(new DateInterval('P1D')));
|
if (intval($date->format('N')) !== 5) {
|
||||||
if ($date->format('W') % 2)
|
return $this->prevDate($date->sub(new \DateInterval('P1D')));
|
||||||
return $this->prevDate($date->sub(new DateInterval('P7D')));
|
}
|
||||||
return $date;
|
if (intval($date->format('W')) % 2) {
|
||||||
}
|
return $this->prevDate($date->sub(new \DateInterval('P7D')));
|
||||||
|
}
|
||||||
|
|
||||||
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ {
|
return $date;
|
||||||
return new NerdepitsaEvent($this->nextDate($date));
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ {
|
public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
|
||||||
return new NerdepitsaEvent($this->prevDate($date));
|
return new NerdepitsaEvent($this->nextDate($date));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
|
||||||
|
return new NerdepitsaEvent($this->prevDate($date));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,46 +1,49 @@
|
|||||||
<?php //declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side\social;
|
namespace pvv\side\social;
|
||||||
|
|
||||||
use \pvv\side\Event;
|
use pvv\side\Event;
|
||||||
|
|
||||||
use \DateInterval;
|
|
||||||
|
|
||||||
class NerdepitsaEvent extends Event {
|
class NerdepitsaEvent extends Event {
|
||||||
|
public function getStop() {
|
||||||
|
return $this->getStart()->add(new \DateInterval('PT2H1800S'));
|
||||||
|
}
|
||||||
|
|
||||||
public function getStop() {
|
public function getName() {
|
||||||
return $this->getStart()->add(new DateInterval('PT2H1800S'));
|
return 'Nerdepitsa';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getName() {
|
public function getLocation() { /* : Location */
|
||||||
return "Nerdepitsa";
|
return 'Peppes Kjøpmansgata';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLocation() /* : Location */ {
|
public function getOrganiser() { /* : User */
|
||||||
return "Peppes Kjøpmansgata";
|
return 'Anders Christensen';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getOrganiser() /* : User */ {
|
public function getURL() { /* : string */
|
||||||
return "Anders Christensen";
|
return '/nerdepitsa/';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getURL() /* : string */ {
|
public function getImageURL() {
|
||||||
return '/nerdepitsa/';
|
return '/sosiale/nerdepitsa.jpg';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getImageURL() {
|
public function getDescription() {
|
||||||
return '/sosiale/nerdepitsa.jpg';
|
return [
|
||||||
}
|
'Hei, har du lyst til å bli med på pizzaspising annenhver fredag? Vi møtes på Peppes i Kjøpmannsgata fredag klokken 19.00 hver partallsuke!',
|
||||||
|
'',
|
||||||
public function getDescription() {
|
'Vi er en trivelig gjeng hvis der fellestrekk er en viss interesse for data, samt har eller har hatt en tilknytning til studentmiljøet ved NTNU. For å treffe andre som også faller inn under disse kriteriene treffes vi over pizza på Peppes annenhver fredag. (Definisjon: En fredag er annenhver dersom den ligger i en partallsuke). Vi har reservasjon under navnet Christensen med storkunderabatt.',
|
||||||
return [
|
'',
|
||||||
'<p>Hei, har du lyst til å bli med på pizzaspising på Peppes i Kjøpmannsgata annenhver fredag klokken 19.00?',
|
'Det er ikke noe krav at du er nerd... noen av oss virker faktisk nesten normale! Det er heller ikke noe krav at du kjenner noen fra før. Det er ikke engang et krav at du må like pizza! (selv om det hjelper) Dersom du har lyst til å treffe personer fra datamiljøet ved NTNU så bare still opp! Vi biter ikke, vel, bortsett fra pizzaen da.',
|
||||||
|
'',
|
||||||
'<p>Vi er en gjeng hvis eneste gjennomgående fellestrekk er en viss interesse for data, samt at vi har eller har hatt en tilknytning til studentmiljøet ved NTNU. For å treffe andre som også faller inn under disse kriteriene treffes vi over pizza på Peppes annenhver fredag. (Definisjon: En fredag er annenhver dersom den ligger i en partallsuke). Vi har reservasjon under navnet Christensen.',
|
'Vi bestiller så mye pizza som vi i fellesskap klarer å stappe i oss, og splitter dermed pizza-regningen broderlig, mens hver enkelt betaler for sin egen drikke, dessert mm. Vell møtt!',
|
||||||
|
];
|
||||||
'<p>Det er ikke noe krav at du er nerd ... noen av oss virker faktisk nesten normale. Det er heller ikke noe krav at du kjenner noen fra før. Det er ikke engang et krav at du må like pizza (selv om det hjelper). Dersom du har lyst til å treffe personer fra datamiljøet ved NTNU så still opp, vi biter ikke (vel, bortsett fra pizzaen da ...)',
|
}
|
||||||
|
|
||||||
'<p>Strategien er at vi bestiller så mye pizza som vi i fellesskap klarer å stappe ned, for deretter splitte pizza-regningen broderlig; mens hver enkelt betaler for sin egen drikke, dessert mm. '
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public function getColor() {
|
||||||
|
return '#c35';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,12 @@
|
|||||||
<?php //declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side\social;
|
namespace pvv\side\social;
|
||||||
|
|
||||||
ini_set('date.timezone', 'Europe/Oslo');
|
ini_set('date.timezone', 'Europe/Oslo');
|
||||||
|
|
||||||
require implode(DIRECTORY_SEPARATOR, [dirname(dirname(dirname(__DIR__))), '', '_autoload.php']);
|
require implode(\DIRECTORY_SEPARATOR, [\dirname(__DIR__, 3), '', '_autoload.php']);
|
||||||
|
|
||||||
$c = new AnimekveldActivity;
|
$c = new AnimekveldActivity();
|
||||||
die($c->nextDate(new \DateTimeImmutable)->format(DATE_RFC2822));
|
exit($c->nextDate(new \DateTimeImmutable())->format(\DATE_RFC2822));
|
||||||
|
@@ -1,9 +1,12 @@
|
|||||||
<?php //declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace pvv\side\social;
|
namespace pvv\side\social;
|
||||||
|
|
||||||
ini_set('date.timezone', 'Europe/Oslo');
|
ini_set('date.timezone', 'Europe/Oslo');
|
||||||
|
|
||||||
require implode(DIRECTORY_SEPARATOR, [dirname(dirname(dirname(__DIR__))), '', '_autoload.php']);
|
require implode(\DIRECTORY_SEPARATOR, [\dirname(__DIR__, 3), '', '_autoload.php']);
|
||||||
|
|
||||||
$c = new NerdepitsaActivity;
|
$c = new NerdepitsaActivity();
|
||||||
die($c->prevDate(new \DateTimeImmutable)->format(DATE_RFC2822));
|
exit($c->prevDate(new \DateTimeImmutable())->format(\DATE_RFC2822));
|
||||||
|
31
www/.well-known/autoconfig/mail/config-v1.1.xml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<clientConfig version="1.1">
|
||||||
|
<emailProvider id="pvv.ntnu.no">
|
||||||
|
<domain>pvv.ntnu.no</domain>
|
||||||
|
<domain>pvv.org</domain>
|
||||||
|
|
||||||
|
<displayName>Programvareverkstedet</displayName>
|
||||||
|
|
||||||
|
<incomingServer type="imap">
|
||||||
|
<hostname>imap.pvv.ntnu.no</hostname>
|
||||||
|
<port>993</port>
|
||||||
|
<socketType>SSL</socketType>
|
||||||
|
<username>%EMAILLOCALPART%</username>
|
||||||
|
<authentication>password-cleartext</authentication>
|
||||||
|
</incomingServer>
|
||||||
|
|
||||||
|
<outgoingServer type="smtp">
|
||||||
|
<hostname>smtp.pvv.ntnu.no</hostname>
|
||||||
|
<port>587</port>
|
||||||
|
<socketType>STARTTLS</socketType>
|
||||||
|
<username>%EMAILLOCALPART%</username>
|
||||||
|
<authentication>password-cleartext</authentication>
|
||||||
|
<useGlobalPreferredServer>true</useGlobalPreferredServer>
|
||||||
|
</outgoingServer>
|
||||||
|
|
||||||
|
<documentation url="https://www.pvv.ntnu.no/pvv/Drift/Mail/IMAP_POP3">
|
||||||
|
<descr lang="en">Setup programvareverkstedet email user with IMAP or POP3</descr>
|
||||||
|
<descr lang="nb">Sett opp programvareverkstedet email bruker med IMAP eller POP3</descr>
|
||||||
|
</documentation>
|
||||||
|
</emailProvider>
|
||||||
|
</clientConfig>
|
3
www/.well-known/matrix/server
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"m.server": "matrix.pvv.ntnu.no:443"
|
||||||
|
}
|
BIN
www/PNG/PVV-logo-big-bluebg.png
Normal file
After ![]() (image error) Size: 61 KiB |
BIN
www/PNG/PVV-logo-big-thick.png
Normal file
After ![]() (image error) Size: 43 KiB |
BIN
www/PNG/PVV-logo-big.png
Normal file
After ![]() (image error) Size: 41 KiB |
BIN
www/PNG/PVV-logo-white.png
Normal file
After ![]() (image error) Size: 52 KiB |
141
www/PNG/PVV-logo-white.svg
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
version="1.1"
|
||||||
|
x="0px"
|
||||||
|
y="0px"
|
||||||
|
viewBox="0 0 800 800"
|
||||||
|
style="enable-background:new 0 0 800 800;"
|
||||||
|
xml:space="preserve"
|
||||||
|
id="svg45"
|
||||||
|
sodipodi:docname="Pvv logoBW.svg"
|
||||||
|
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||||
|
id="metadata51"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||||
|
id="defs49" /><sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1027"
|
||||||
|
id="namedview47"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.834386"
|
||||||
|
inkscape:cx="590.94635"
|
||||||
|
inkscape:cy="338.49599"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="Layer_5" /><style
|
||||||
|
type="text/css"
|
||||||
|
id="style2">
|
||||||
|
.st0{fill:#ffffff;}
|
||||||
|
.st1{fill:none;stroke:#ffffff;stroke-width:2;stroke-miterlimit:10;}
|
||||||
|
.st2{fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
|
||||||
|
.st3{fill:none;}
|
||||||
|
.st4{stroke:#000000;stroke-miterlimit:10;}
|
||||||
|
.st5{font-family:'OCRAStd';}
|
||||||
|
.st6{font-size:126px;}
|
||||||
|
</style><g
|
||||||
|
id="Layer_2"><rect
|
||||||
|
y="0"
|
||||||
|
class="st0"
|
||||||
|
width="800"
|
||||||
|
height="800"
|
||||||
|
id="rect4" /></g><g
|
||||||
|
id="Layer_4"><path
|
||||||
|
class="st1"
|
||||||
|
d="M294.6,720.3"
|
||||||
|
id="path7" /><line
|
||||||
|
class="st1"
|
||||||
|
x1="478.4"
|
||||||
|
y1="720.3"
|
||||||
|
x2="313.2"
|
||||||
|
y2="720.3"
|
||||||
|
id="line9" /><path
|
||||||
|
class="st1"
|
||||||
|
d="M478.4,720.3"
|
||||||
|
id="path11" /><polyline
|
||||||
|
class="st2"
|
||||||
|
points="717.1,223.3 717.1,720.3 497.3,720.3 "
|
||||||
|
id="polyline13" /><path
|
||||||
|
class="st2"
|
||||||
|
d="M498.3,720.3c0-5.6-4.5-10.1-10.1-10.1c-5.6,0-10.1,4.5-10.1,10.1H314.3c0-5.6-4.5-10.1-10.1-10.1 c-5.6,0-10.1,4.5-10.1,10.1h0.6H76.5V79.7h640.5v120.8v-0.8h-17.3v24.8h17.3"
|
||||||
|
id="path15" /></g><g
|
||||||
|
id="Layer_3"><circle
|
||||||
|
class="st2"
|
||||||
|
cx="396.8"
|
||||||
|
cy="400"
|
||||||
|
r="320.3"
|
||||||
|
id="circle18" /></g><g
|
||||||
|
id="Layer_1"><polyline
|
||||||
|
class="st2"
|
||||||
|
points="514.5,173.5 170.2,173.5 170.3,626.6 623.3,626.5 623.3,215.7 584.4,173.4 557,173.4 548,180.6 526.5,180.7 "
|
||||||
|
id="polyline21" /><path
|
||||||
|
class="st1"
|
||||||
|
d="M396.8,173.5"
|
||||||
|
id="path23" /><path
|
||||||
|
class="st1"
|
||||||
|
d="M396.8,173.3"
|
||||||
|
id="path25" /><path
|
||||||
|
class="st2"
|
||||||
|
d="M526.5,331.8c0,7.6-5.4,13.7-12,13.7H227.7c-6.6,0-12-6.1-12-13.7V187.2c0-7.6,5.4-13.7,12-13.7h286.8 c6.6,0,12,6.1,12,13.7V331.8z"
|
||||||
|
id="path27" /><path
|
||||||
|
class="st2"
|
||||||
|
d="M526.7,333.6c0,6.6-5.4,12-12,12H296.8c-6.6,0-12-5.4-12-12V185.5c0-6.6,5.4-12,12-12h217.9 c6.6,0,12,5.4,12,12V333.6z"
|
||||||
|
id="path29" /><path
|
||||||
|
class="st2"
|
||||||
|
d="M577.9,613.7c0,6.6-5.4,12-12,12H227.7c-6.6,0-12-5.4-12-12V381.1c0-6.6,5.4-12,12-12h338.2 c6.6,0,12,5.4,12,12V613.7z"
|
||||||
|
id="path31" /><rect
|
||||||
|
x="179.9"
|
||||||
|
y="590.2"
|
||||||
|
class="st2"
|
||||||
|
width="25.7"
|
||||||
|
height="23"
|
||||||
|
id="rect33" /><rect
|
||||||
|
x="587.6"
|
||||||
|
y="590.2"
|
||||||
|
class="st2"
|
||||||
|
width="25.7"
|
||||||
|
height="23"
|
||||||
|
id="rect35" /><rect
|
||||||
|
x="433.6"
|
||||||
|
y="193.5"
|
||||||
|
class="st2"
|
||||||
|
width="64.9"
|
||||||
|
height="137.8"
|
||||||
|
id="rect37" /></g><g
|
||||||
|
id="Layer_5"><rect
|
||||||
|
x="258"
|
||||||
|
y="442.5"
|
||||||
|
class="st3"
|
||||||
|
width="277.5"
|
||||||
|
height="109.7"
|
||||||
|
id="rect40" /><g
|
||||||
|
aria-label="PVV"
|
||||||
|
transform="matrix(1 0 0 1 260.7021 547.998)"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:126px;font-family:OCRA;-inkscape-font-specification:OCRA;stroke:#000000;stroke-miterlimit:10"
|
||||||
|
id="text42"><path
|
||||||
|
d="m 14.238,-6.426 c 0,3.528 2.772,6.426 6.3,6.426 3.528,0 6.426,-2.898 6.426,-6.426 v -30.996 h 30.87 c 10.458,0 19.152,-8.694 19.152,-19.152 v -22.68 c 0,-10.332 -8.694,-19.026 -19.152,-19.026 H 14.238 Z m 12.726,-43.722 v -35.406 h 30.87 c 3.276,0 6.426,2.898 6.426,6.3 v 22.68 c 0,3.528 -3.024,6.426 -6.426,6.426 z"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:126px;font-family:OCRA;-inkscape-font-specification:OCRA;stroke:#000000;stroke-miterlimit:10"
|
||||||
|
id="path55" /><path
|
||||||
|
d="m 105.29269,-69.174 25.326,65.142 c 1.008,2.394 3.276,4.032 6.048,4.032 2.646,0 4.914,-1.638 5.922,-4.032 l 25.452,-65.268 v -22.68 c 0,-3.402 -2.898,-6.3 -6.426,-6.3 -3.528,0 -6.3,2.898 -6.3,6.3 v 20.286 l -18.648,47.628 -18.648,-47.628 V -91.98 c 0,-3.402 -2.898,-6.3 -6.426,-6.3 -3.528,0 -6.3,2.898 -6.3,6.3 z"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:126px;font-family:OCRA;-inkscape-font-specification:OCRA;stroke:#000000;stroke-miterlimit:10"
|
||||||
|
id="path57" /><path
|
||||||
|
d="m 196.34737,-69.174 25.326,65.142 c 1.008,2.394 3.276,4.032 6.048,4.032 2.646,0 4.914,-1.638 5.922,-4.032 l 25.452,-65.268 v -22.68 c 0,-3.402 -2.898,-6.3 -6.426,-6.3 -3.528,0 -6.3,2.898 -6.3,6.3 v 20.286 l -18.648,47.628 -18.648,-47.628 V -91.98 c 0,-3.402 -2.898,-6.3 -6.426,-6.3 -3.528,0 -6.3,2.898 -6.3,6.3 z"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:126px;font-family:OCRA;-inkscape-font-specification:OCRA;stroke:#000000;stroke-miterlimit:10"
|
||||||
|
id="path59" /></g></g></svg>
|
After (image error) Size: 6.0 KiB |
BIN
www/PNG/PVV-logo.png
Normal file
After ![]() (image error) Size: 3.8 KiB |
BIN
www/PNG/PVV-logo2.png
Normal file
After ![]() (image error) Size: 12 KiB |
BIN
www/PNG/PVV-logo3.png
Normal file
After ![]() (image error) Size: 10 KiB |
BIN
www/PNG/old/PVV-logo.png
Normal file
After ![]() (image error) Size: 8.5 KiB |
BIN
www/PNG/old/PVV-logo2.png
Normal file
After ![]() (image error) Size: 33 KiB |
BIN
www/PNG/old/PVV-logo3.png
Normal file
After ![]() (image error) Size: 32 KiB |
BIN
www/PNG/old/pvv-header.png
Normal file
After ![]() (image error) Size: 7.1 KiB |
BIN
www/PNG/pvv-header.png
Normal file
After ![]() (image error) Size: 7.1 KiB |
@@ -1,19 +1,19 @@
|
|||||||
<?php
|
<?php
|
||||||
require __DIR__ . '/../../../src/_autoload.php';
|
require __DIR__ . '/../../../src/_autoload.php';
|
||||||
require __DIR__ . '/../../../sql_config.php';
|
require __DIR__ . '/../../../config.php';
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
$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);
|
||||||
$userManager = new \pvv\admin\UserManager($pdo);
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
|
|
||||||
if(!$userManager->hasGroup($uname, 'aktiviteter')){
|
if (!$userManager->hasGroup($uname, 'aktiviteter')) {
|
||||||
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$eventID = $_GET['id'];
|
$eventID = $_GET['id'];
|
||||||
|
@@ -1,112 +1,142 @@
|
|||||||
<?php
|
<?php
|
||||||
date_default_timezone_set('Europe/Oslo');
|
date_default_timezone_set('Europe/Oslo');
|
||||||
setlocale(LC_ALL, 'no_NO');
|
setlocale(\LC_ALL, 'nb_NO');
|
||||||
require __DIR__ . '/../../../inc/navbar.php';
|
require __DIR__ . '/../../../inc/navbar.php';
|
||||||
require __DIR__ . '/../../../src/_autoload.php';
|
require __DIR__ . '/../../../src/_autoload.php';
|
||||||
require __DIR__ . '/../../../sql_config.php';
|
require __DIR__ . '/../../../config.php';
|
||||||
|
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
$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);
|
||||||
$userManager = new \pvv\admin\UserManager($pdo);
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
|
$name = $attrs['cn'][0];
|
||||||
|
|
||||||
if(!$userManager->hasGroup($uname, 'aktiviteter')){
|
if (!$userManager->hasGroup($uname, 'aktiviteter')) {
|
||||||
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$customActivity = new \pvv\side\DBActivity($pdo);
|
$customActivity = new pvv\side\DBActivity($pdo);
|
||||||
|
|
||||||
$new = 0;
|
$new = 0;
|
||||||
if(isset($_GET['new'])){
|
if (isset($_GET['new'])) {
|
||||||
$new = $_GET['new'];
|
$new = $_GET['new'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$eventID = 0;
|
$eventID = 0;
|
||||||
if(isset($_GET['id'])){
|
if (isset($_GET['id'])) {
|
||||||
$eventID = $_GET['id'];
|
$eventID = $_GET['id'];
|
||||||
}else if($new == 0){
|
} elseif ($new == 0) {
|
||||||
echo "\nID not set";
|
echo "\nID not set";
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$today = new DateTimeImmutable;
|
$today = new DateTimeImmutable();
|
||||||
$defaultStart = $today->format("Y-m-d H:00:00");
|
$today = $today->setTime(18, 15);
|
||||||
$inOneHour = $today->add(new DateInterval('PT1H'));
|
$defaultStart = $today->format('Y-m-d H:15:00');
|
||||||
$defaultEnd = $inOneHour->format("Y-m-d H:00:00");
|
$inTwoHours = $today->add(new DateInterval('PT1H45M'));
|
||||||
|
$defaultEnd = $inTwoHours->format('Y-m-d H:00:00');
|
||||||
|
|
||||||
$event = new \pvv\side\SimpleEvent(
|
|
||||||
0,
|
if ($new == 0) {
|
||||||
'Kul Hendelse',
|
$event = $customActivity->getEventByID($eventID);
|
||||||
$today,
|
} else {
|
||||||
$inOneHour,
|
$event = new pvv\side\SimpleEvent(
|
||||||
'PVV',
|
0,
|
||||||
'Norge et sted',
|
'',
|
||||||
'her skjer det noe altså'
|
$today,
|
||||||
);
|
$inTwoHours,
|
||||||
if($new == 0){
|
'',
|
||||||
$event = $customActivity->getEventByID($eventID);
|
'',
|
||||||
|
''
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="no" locale="no">
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<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/normalize.css">
|
||||||
<link rel="stylesheet" href="../../css/style.css">
|
<link rel="stylesheet" href="../../css/style.css">
|
||||||
|
<link rel="stylesheet" href="../../css/nav.css">
|
||||||
<link rel="stylesheet" href="../../css/events.css">
|
<link rel="stylesheet" href="../../css/events.css">
|
||||||
<link rel="stylesheet" href="../../css/admin.css">
|
<link rel="stylesheet" href="../../css/admin.css">
|
||||||
|
<meta name="theme-color" content="#024" />
|
||||||
|
<title>Adminverkstedet</title>
|
||||||
|
|
||||||
<header class="admin">Aktivitets­administrasjon</header>
|
<header>Admin­verk­stedet</header>
|
||||||
|
|
||||||
<main>
|
|
||||||
|
|
||||||
<article>
|
<body>
|
||||||
<h2><?= ($new == 1 ? "Ny hendelse" : "Rediger hendelse"); ?></h2>
|
<nav>
|
||||||
|
<?php echo navbar(3, 'admin'); ?>
|
||||||
|
<?php echo loginbar(null, $pdo); ?>
|
||||||
|
</nav>
|
||||||
|
|
||||||
<form action="update.php", method="post" class="gridsplit5050">
|
<main>
|
||||||
<div class="gridl">
|
<h2>Aktivietsadministrasjon</h2>
|
||||||
<p class="subtitle">Tittel</p>
|
<hr class="ruler">
|
||||||
<?= '<input type="text" name="title" value="' . $event->getName(). '" class="boxinput">' ?><br>
|
|
||||||
|
|
||||||
<p class="subtitle">Beskrivelse</p>
|
<h2><?php echo $new == 1 ? 'Ny hendelse' : 'Rediger hendelse'; ?></h2>
|
||||||
<textarea name="desc" cols="40" rows="5" class="boxinput"><?= implode($event->getDescription(), "\n"); ?></textarea>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="gridr noborder">
|
<form action="update.php", method="post" class="gridsplit fullwidth_inputs">
|
||||||
<p class="subtitle">Starttid (YYYY-MM-DD HH:MM:SS)</p>
|
<div class="gridl">
|
||||||
<?= '<input name="start" type="text" class="boxinput" value="' . $event->getStart()->format('Y-m-d H:00:00') . '"><br>' ?>
|
<p class="subtitle">Tittel</p>
|
||||||
|
<input type="text" name="title" value="<?php echo $event->getName(); ?>" class="boxinput" required placeholder="En kul hendelse"><br>
|
||||||
|
|
||||||
<p class="subtitle">Sluttid (YYYY-MM-DD HH:MM:SS)</p>
|
<div class="gridsplit5050">
|
||||||
<?= '<input name="end" type="text" class="boxinput" value="' . $event->getStop()->format('Y-m-d H:00:00') . '"><br>' ?>
|
<div class="gridl">
|
||||||
|
<p class="subtitle">Arrangør</p>
|
||||||
|
<input type="text" name="organiser" value="<?php echo $event->getOrganiser(); ?>" class="boxinput" required placeholder="<?php echo $name; ?>"><br>
|
||||||
|
</div>
|
||||||
|
<div class="gridr noborder">
|
||||||
|
<p class="subtitle">Sted</p>
|
||||||
|
<input type="text" name="location" value="<?php echo $event->getLocation(); ?>" class="boxinput" required placeholder="Terminalrommet"><br>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<p class="subtitle">Organisert av</p>
|
<p class="subtitle">Beskrivelse (<i>markdown</i>)</p>
|
||||||
<?= '<input type="text" name="organiser" value="' . $event->getOrganiser(). '" class="boxinput">' ?><br>
|
<textarea name="desc" rows="8" class="boxinput" placeholder="Beskrivelse" required><?php echo implode("\n", $event->getDescription()); ?></textarea>
|
||||||
|
|
||||||
<p class="subtitle">Hvor?</p>
|
|
||||||
<?= '<input type="text" name="location" value="' . $event->getLocation(). '" class="boxinput">' ?><br>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?= '<input type="hidden" name="id" value="' . $event->getID() . '" />' ?>
|
</div>
|
||||||
|
|
||||||
<div class="allgrids" style="margin-top: 2em;">
|
<div class="gridr" style="line-height: 1.3em;">
|
||||||
<hr class="ruler">
|
<h4>Starttid</h4><br>
|
||||||
|
<i>Måned:</i><br>
|
||||||
|
<input name="start_mon" type="month" class="boxinput" required value="<?php echo $event->getStart()->format('Y-m'); ?>"><br>
|
||||||
|
<i>Dag:</i><br>
|
||||||
|
<input name="start_day" type="number" min="1" max="31" required class="boxinput" value="<?php echo $event->getStart()->format('d'); ?>"><br>
|
||||||
|
<i>Klokkeslett:</i><br>
|
||||||
|
<input name="start_time" type="time" class="boxinput" required value="<?php echo $event->getStart()->format('H:i:s'); ?>"><br>
|
||||||
|
<br>
|
||||||
|
<h4>Varighet</h4><br>
|
||||||
|
<?php $diff = $event->getStart()->diff($event->getStop()); ?>
|
||||||
|
<i>Timer:</i><br>
|
||||||
|
<input name="lasts_hours" type="number" min="0" class="boxinput" required value="<?php echo $diff->h; ?>"><br>
|
||||||
|
<i>Minutter:</i><br>
|
||||||
|
<input name="lasts_minutes" type="number" min="0" max="59" class="boxinput" required value="<?php echo $diff->i; ?>"><br>
|
||||||
|
|
||||||
<input type="submit" class="btn" value="Lagre"></a>
|
</div>
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
|
<input type="hidden" name="id" value="<?php echo $event->getID(); ?>" />
|
||||||
|
|
||||||
<p>
|
<div class="allgrids" style="margin-top: 2em;">
|
||||||
</article>
|
<hr class="ruler">
|
||||||
|
<input type="submit" class="btn" value="Lagre"></a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<nav>
|
|
||||||
<?= navbar(2); ?>
|
<p>
|
||||||
<?= loginbar(); ?>
|
</main>
|
||||||
</nav>
|
</body>
|
||||||
|
@@ -1,136 +1,146 @@
|
|||||||
<?php
|
<?php
|
||||||
date_default_timezone_set('Europe/Oslo');
|
date_default_timezone_set('Europe/Oslo');
|
||||||
setlocale(LC_ALL, 'no_NO');
|
setlocale(\LC_ALL, 'nb_NO');
|
||||||
require __DIR__ . '/../../../inc/navbar.php';
|
require __DIR__ . '/../../../inc/navbar.php';
|
||||||
require __DIR__ . '/../../../src/_autoload.php';
|
require __DIR__ . '/../../../src/_autoload.php';
|
||||||
require __DIR__ . '/../../../sql_config.php';
|
require __DIR__ . '/../../../config.php';
|
||||||
|
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
$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);
|
||||||
$userManager = new \pvv\admin\UserManager($pdo);
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
|
|
||||||
if(!$userManager->hasGroup($uname, 'aktiviteter')){
|
if (!$userManager->hasGroup($uname, 'aktiviteter')) {
|
||||||
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$customActivity = new \pvv\side\DBActivity($pdo);
|
$customActivity = new pvv\side\DBActivity($pdo);
|
||||||
$events = $customActivity->getAllEvents();
|
$events = $customActivity->getAllEvents();
|
||||||
|
|
||||||
$page = 1;
|
$page = 1;
|
||||||
if(isset($_GET['page'])){
|
if (isset($_GET['page'])) {
|
||||||
$page = $_GET['page'];
|
$page = $_GET['page'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$filterTitle = '';
|
$filterTitle = '';
|
||||||
if(isset($_POST['title'])){
|
if (isset($_GET['title'])) {
|
||||||
$filterTitle = $_POST['title'];
|
$filterTitle = $_GET['title'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$filterOrganiser = '';
|
$filterOrganiser = '';
|
||||||
if(isset($_POST['organiser'])){
|
if (isset($_GET['organiser'])) {
|
||||||
$filterOrganiser = $_POST['organiser'];
|
$filterOrganiser = $_GET['organiser'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// filter
|
// filter
|
||||||
$events = array_values(array_filter(
|
$events = array_values(array_filter(
|
||||||
$events,
|
$events,
|
||||||
function($event) use ($filterTitle, $filterOrganiser){
|
static fn($event) => (preg_match('/.*' . $filterTitle . '.*/i', $event->getName()) && preg_match('/.*' . $filterOrganiser . '.*/i', $event->getOrganiser()))
|
||||||
return (preg_match('/.*'.$filterTitle.'.*/i', $event->getName()) and preg_match('/.*'.$filterOrganiser.'.*/i', $event->getOrganiser()));
|
|
||||||
}
|
|
||||||
));
|
));
|
||||||
?>
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="no">
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<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/normalize.css">
|
||||||
<link rel="stylesheet" href="../../css/style.css">
|
<link rel="stylesheet" href="../../css/style.css">
|
||||||
|
<link rel="stylesheet" href="../../css/nav.css">
|
||||||
<link rel="stylesheet" href="../../css/events.css">
|
<link rel="stylesheet" href="../../css/events.css">
|
||||||
<link rel="stylesheet" href="../../css/admin.css">
|
<link rel="stylesheet" href="../../css/admin.css">
|
||||||
|
<meta name="theme-color" content="#024" />
|
||||||
|
<title>Aktivitetsadministrasjonsverkstedet</title>
|
||||||
|
|
||||||
<header class="admin">Aktivitets­administrasjon</header>
|
<header>Aktivitets­administrasjons­verk­stedet</header>
|
||||||
|
|
||||||
<main>
|
<body>
|
||||||
|
|
||||||
<article class="gridsplit">
|
<nav>
|
||||||
<div class="gridl">
|
<?php echo navbar(2, 'admin'); ?>
|
||||||
<h2 class="no-chin">Aktive aktiviteter</h2>
|
<?php echo loginbar(null, $pdo); ?>
|
||||||
<p class="subnote">Gjentagende aktiviteter vises ikke</p>
|
</nav>
|
||||||
|
|
||||||
<ul class="event-list">
|
<main>
|
||||||
<?php
|
<h2>Aktivitetsadministrasjon</h2>
|
||||||
$counter = 0;
|
<hr class="ruler">
|
||||||
$pageLimit = 4;
|
|
||||||
|
|
||||||
for($i = ($pageLimit * ($page - 1)); $i < count($events) ;$i++){
|
<div class="gridsplit">
|
||||||
if($counter == $pageLimit){
|
<div class="gridl">
|
||||||
break;
|
<h2 class="no-chin">Aktive aktiviteter</h2>
|
||||||
}
|
<p class="subnote">Gjentagende aktiviteter vises ikke</p>
|
||||||
|
|
||||||
$event = $events[$i];
|
<ul class="event-list">
|
||||||
$eventID = $event->getID();
|
<?php
|
||||||
?>
|
$counter = 0;
|
||||||
|
$pageLimit = 10;
|
||||||
|
|
||||||
<li>
|
for ($i = ($pageLimit * ($page - 1)); $i < count($events); ++$i) {
|
||||||
<div class="event admin">
|
if ($counter == $pageLimit) {
|
||||||
<div class="event-info">
|
break;
|
||||||
<h3 class="no-chin"><?= $event->getName() . " (ID: " . $eventID . ")"; ?></h3>
|
}
|
||||||
<p class="subnote">
|
|
||||||
<?= $event->getStart()->format("(Y-m-d H:i:s)") . " - " . $event->getStop()->format("(Y-m-d H:i:s)"); ?>
|
|
||||||
</p>
|
|
||||||
<p><?= implode($event->getDescription(), "</p>\n<p>"); ?></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="event-actions">
|
$event = $events[$i];
|
||||||
<!-- emojis are for big boys -->
|
$eventID = $event->getID();
|
||||||
<?= '<a href="edit.php?id=' . $eventID . '">🖊</a>'; ?>
|
?>
|
||||||
<?= '<a href="delete.php?id=' . $eventID . '" onclick="return confirm(\'Knallsikker? (ID: ' . $eventID . ')\');">🗑</a>'; ?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<?php
|
<li>
|
||||||
$counter++;
|
<div class="event admin">
|
||||||
}
|
<div class="event-info">
|
||||||
?>
|
<h3 class="no-chin"><?php echo $event->getName() . ' (ID: ' . $eventID . ')'; ?></h3>
|
||||||
</ul>
|
<p class="subnote">
|
||||||
|
<?php echo $event->getStart()->format('(Y-m-d H:i:s)') . ' - ' . $event->getStop()->format('(Y-m-d H:i:s)'); ?>
|
||||||
|
</p>
|
||||||
|
<?php
|
||||||
|
$Parsedown = new Parsedown();
|
||||||
|
echo $Parsedown->text(implode("\n", $event->getDescription()));
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?php
|
<div class="event-actions">
|
||||||
if($page != 1){
|
<a class="btn" href="edit.php?id=<?php echo $eventID; ?>">Rediger</a><br>
|
||||||
echo '<a class="btn float-left" href="?page=' . ($page - 1) . '">Forrige side</a>';
|
<a class="btn" href="delete.php?id=<?php echo $eventID; ?>" onclick="return confirm('Knallsikker? (ID: <?php echo $eventID; ?>)');">Slett</a>
|
||||||
}
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
if(($counter == $pageLimit) and (($pageLimit * $page) < count($events))){
|
<?php
|
||||||
echo '<a class="btn float-right" href="?page=' . ($page + 1) . '">Neste side</a>';
|
++$counter;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</div>
|
</ul>
|
||||||
|
|
||||||
<div class="gridr">
|
<?php
|
||||||
<h2>Verktøy</h2>
|
if ($page != 1) {
|
||||||
<a class="btn adminbtn" href="edit.php?new=1">Legg inn ny aktivitet</a>
|
echo '<a class="btn float-left" href="?page=' . ($page - 1) . '&title=' . urlencode($filterTitle) . '&organiser=' . urlencode($filterOrganiser) . '">Forrige side</a>';
|
||||||
<h2>Filter</h2>
|
}
|
||||||
<form action="." method="post">
|
|
||||||
<p class="no-chin">Navn</p>
|
|
||||||
<?= '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">' ?><br>
|
|
||||||
<p class="no-chin">Organisator</p>
|
|
||||||
<?= '<input type="text" name="organiser" class="boxinput" value="' . $filterOrganiser . '">' ?><br>
|
|
||||||
|
|
||||||
<div style="margin-top: 2em;">
|
if (($counter == $pageLimit) && (($pageLimit * $page) < count($events))) {
|
||||||
<input type="submit" class="btn" value="Filtrer"></input>
|
echo '<a class="btn float-right" href="?page=' . ($page + 1) . '&title=' . urlencode($filterTitle) . '&organiser=' . urlencode($filterOrganiser) . '">Neste side</a>';
|
||||||
|
}
|
||||||
|
?>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
|
|
||||||
</main>
|
<div class="gridr">
|
||||||
|
<h2>Verktøy</h2>
|
||||||
|
<a class="btn adminbtn" href="edit.php?new=1">Legg inn ny aktivitet</a>
|
||||||
|
<h2>Filter</h2>
|
||||||
|
<form action="." method="get">
|
||||||
|
<p class="no-chin">Navn</p>
|
||||||
|
<?php echo '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">'; ?><br>
|
||||||
|
<p class="no-chin">Organisator</p>
|
||||||
|
<?php echo '<input type="text" name="organiser" class="boxinput" value="' . $filterOrganiser . '">'; ?><br>
|
||||||
|
|
||||||
<nav>
|
<div style="margin-top: 2em;">
|
||||||
<?= navbar(2); ?>
|
<input type="submit" class="btn" value="Filtrer"></input>
|
||||||
<?= loginbar(); ?>
|
</div>
|
||||||
</nav>
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
@@ -1,62 +1,95 @@
|
|||||||
<?php
|
<?php
|
||||||
date_default_timezone_set('Europe/Oslo');
|
date_default_timezone_set('Europe/Oslo');
|
||||||
setlocale(LC_ALL, 'no_NO');
|
setlocale(\LC_ALL, 'nb_NO');
|
||||||
require __DIR__ . '/../../../src/_autoload.php';
|
require __DIR__ . '/../../../src/_autoload.php';
|
||||||
require __DIR__ . '/../../../sql_config.php';
|
require __DIR__ . '/../../../config.php';
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
$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);
|
||||||
$userManager = new \pvv\admin\UserManager($pdo);
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
|
|
||||||
if(!$userManager->hasGroup($uname, 'aktiviteter')){
|
if (!$userManager->hasGroup($uname, 'aktiviteter')) {
|
||||||
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isset($_POST['title']) or !isset($_POST['desc']) or !isset($_POST['start']) or !isset($_POST['end']) or !isset($_POST['organiser']) or !isset($_POST['location'])){
|
if ((!isset($_POST['title']))
|
||||||
header('Location: ' . $_SERVER['HTTP_REFERER']);
|
|| (!isset($_POST['desc']))
|
||||||
exit();
|
|| (!isset($_POST['organiser']))
|
||||||
|
|| (!isset($_POST['location']))
|
||||||
|
|| (!isset($_POST['start_mon']))
|
||||||
|
|| (!isset($_POST['start_day']))
|
||||||
|
|| (!isset($_POST['start_time']))
|
||||||
|
|| (!isset($_POST['lasts_hours']))
|
||||||
|
|| (!isset($_POST['lasts_minutes']))) {
|
||||||
|
header('Location: ' . $_SERVER['HTTP_REFERER']);
|
||||||
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$id = 0;
|
$id = 0;
|
||||||
if(isset($_POST['id'])){
|
if (isset($_POST['id'])) {
|
||||||
$id = $_POST['id'];
|
$id = $_POST['id'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$title = $_POST['title'];
|
$title = $_POST['title'];
|
||||||
$desc = $_POST['desc'];
|
$desc = $_POST['desc'];
|
||||||
$start = $_POST['start'];
|
// $start = $_POST['start'];
|
||||||
$stop = $_POST['end'];
|
// $stop = $_POST['end'];
|
||||||
$organiser = $_POST['organiser'];
|
$organiser = $_POST['organiser'];
|
||||||
$location = $_POST['location'];
|
$location = $_POST['location'];
|
||||||
|
|
||||||
$statement;
|
$date_part_start_mon = $_POST['start_mon'];
|
||||||
if($id == 0){
|
$date_part_start_day = $_POST['start_day'];
|
||||||
$query = 'INSERT INTO events (name, start, stop, organiser, location, description) VALUES (:title, :start, :stop, :organiser, :loc, :desc)';
|
$date_part_start_time = $_POST['start_time'];
|
||||||
$statement = $pdo->prepare($query);
|
$date_part_lasts_hours = $_POST['lasts_hours'];
|
||||||
|
$date_part_lasts_minutes = $_POST['lasts_minutes'];
|
||||||
|
|
||||||
$statement->bindParam(':title', $title, PDO::PARAM_STR);
|
while (strlen($date_part_start_day) < 2) {
|
||||||
$statement->bindParam(':desc', $desc, PDO::PARAM_STR);
|
$date_part_start_day = '0' . $date_part_start_day;
|
||||||
$statement->bindParam(':start', $start, PDO::PARAM_STR);
|
}
|
||||||
$statement->bindParam(':stop', $stop, PDO::PARAM_STR);
|
|
||||||
$statement->bindParam(':organiser', $organiser, PDO::PARAM_STR);
|
|
||||||
$statement->bindParam(':loc', $location, PDO::PARAM_STR);
|
|
||||||
}else{
|
|
||||||
$query = 'UPDATE events SET name=:title, start=:start, stop=:stop, organiser=:organiser, location=:loc, description=:desc WHERE id=:id';
|
|
||||||
$statement = $pdo->prepare($query);
|
|
||||||
|
|
||||||
$statement->bindParam(':title', $title, PDO::PARAM_STR);
|
$start = ($date_part_start_mon . '-' . $date_part_start_day . ' ' . $date_part_start_time);
|
||||||
$statement->bindParam(':desc', $desc, PDO::PARAM_STR);
|
if (count(explode(':', $date_part_start_time)) == 2) {
|
||||||
$statement->bindParam(':start', $start, PDO::PARAM_STR);
|
$start .= ':00';
|
||||||
$statement->bindParam(':stop', $stop, PDO::PARAM_STR);
|
}
|
||||||
$statement->bindParam(':organiser', $organiser, PDO::PARAM_STR);
|
|
||||||
$statement->bindParam(':loc', $location, PDO::PARAM_STR);
|
$start_date = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $start);
|
||||||
$statement->bindParam(':id', $id, PDO::PARAM_INT);
|
$stop_date = $start_date->add(new DateInterval('PT' . $date_part_lasts_hours . 'H' . $date_part_lasts_minutes . 'M'));
|
||||||
|
$start = $start_date->format('Y-m-d H:i:s');
|
||||||
|
$stop = $stop_date->format('Y-m-d H:i:s');
|
||||||
|
|
||||||
|
if ($start_date >= $stop_date) {
|
||||||
|
echo 'Invalid dates. End date must come after the start date!';
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($id == 0) {
|
||||||
|
$query = 'INSERT INTO events (name, start, stop, organiser, location, description) VALUES (:title, :start, :stop, :organiser, :loc, :desc)';
|
||||||
|
$statement = $pdo->prepare($query);
|
||||||
|
|
||||||
|
$statement->bindParam(':title', $title, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':desc', $desc, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':start', $start, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':stop', $stop, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':organiser', $organiser, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':loc', $location, PDO::PARAM_STR);
|
||||||
|
} else {
|
||||||
|
$query = 'UPDATE events SET name=:title, start=:start, stop=:stop, organiser=:organiser, location=:loc, description=:desc WHERE id=:id';
|
||||||
|
$statement = $pdo->prepare($query);
|
||||||
|
|
||||||
|
$statement->bindParam(':title', $title, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':desc', $desc, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':start', $start, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':stop', $stop, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':organiser', $organiser, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':loc', $location, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':id', $id, PDO::PARAM_INT);
|
||||||
}
|
}
|
||||||
|
|
||||||
$statement->execute();
|
$statement->execute();
|
||||||
@@ -64,4 +97,4 @@ $statement->execute();
|
|||||||
header('Location: .');
|
header('Location: .');
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<a href=".?page=1">Om du ikke ble automatisk omdirigert tilbake klikk her</a>
|
<a href=".?page=1">Om du ikke ble automatisk omdirigert tilbake klikk her</a>
|
||||||
|
@@ -1,105 +1,99 @@
|
|||||||
<?php
|
<?php
|
||||||
ini_set('display_errors', '1');
|
ini_set('display_errors', '1');
|
||||||
date_default_timezone_set('Europe/Oslo');
|
date_default_timezone_set('Europe/Oslo');
|
||||||
setlocale(LC_ALL, 'no_NO');
|
setlocale(\LC_ALL, 'nb_NO');
|
||||||
error_reporting(E_ALL);
|
error_reporting(\E_ALL);
|
||||||
|
require __DIR__ . '/../../../inc/navbar.php';
|
||||||
require __DIR__ . '/../../../src/_autoload.php';
|
require __DIR__ . '/../../../src/_autoload.php';
|
||||||
require __DIR__ . '/../../../sql_config.php';
|
require __DIR__ . '/../../../config.php';
|
||||||
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
|
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
$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);
|
||||||
$userManager = new \pvv\admin\UserManager($pdo);
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
|
|
||||||
if(!$userManager->isAdmin($uname)){
|
if (!$userManager->isAdmin($uname)) {
|
||||||
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$users = $userManager->getAllUserData();
|
$users = $userManager->getAllUserData();
|
||||||
?>
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="no">
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<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/normalize.css">
|
||||||
<link rel="stylesheet" href="../../css/style.css">
|
<link rel="stylesheet" href="../../css/style.css">
|
||||||
<link rel="stylesheet" href="../../css/events.css">
|
<link rel="stylesheet" href="../../css/events.css">
|
||||||
<link rel="stylesheet" href="../../css/admin.css">
|
<link rel="stylesheet" href="../../css/admin.css">
|
||||||
|
<meta name="theme-color" content="#024" />
|
||||||
|
<title>Brukeradministrasjonsverkstedet</title>
|
||||||
|
|
||||||
<nav>
|
<header>Bruker­administrasjons­verk­stedet</header>
|
||||||
<ul>
|
|
||||||
<li class="active"><a href="index.php">hjem</a></li>
|
|
||||||
<li><a href="aktiviteter/">aktiviteter</a></li>
|
|
||||||
<li><a href="../prosjekt/">prosjekter</a></li>
|
|
||||||
<li><a href="kontakt">kontakt</a></li>
|
|
||||||
<li><a href="pvv/">wiki</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<?php
|
<body>
|
||||||
$attr = $as->getAttributes();
|
<nav>
|
||||||
if($attr){
|
<?php echo navbar(2, 'admin'); ?>
|
||||||
$uname = $attr["uid"][0];
|
<?php echo loginbar(null, $pdo); ?>
|
||||||
echo '<p class="login">logget inn som: ' . $uname . '</p>';
|
</nav>
|
||||||
}else{
|
|
||||||
echo '<a class="login" href="' . $as->getLoginURL() . '">logg inn</a>';
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<header class="admin">Bruker­administrasjon</header>
|
<main>
|
||||||
|
<h2>Brukeradministrasjon</h2>
|
||||||
|
<hr class="ruler">
|
||||||
|
|
||||||
<main>
|
<form action="./update.php" method="post">
|
||||||
<article>
|
<table class="userlist">
|
||||||
|
<tr>
|
||||||
|
<th>Brukernavn</th>
|
||||||
|
<th>Brukergrupper</th>
|
||||||
|
</tr>
|
||||||
|
|
||||||
<form action="./update.php" method="post">
|
|
||||||
<table class="userlist">
|
|
||||||
<tr><th>Brukernavn</th><th>Brukergrupper</th></tr>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
$users_value = '';
|
|
||||||
foreach($users as $i => $data){
|
|
||||||
$uname = $data['name'];
|
|
||||||
$groupFlag = $userManager->getUsergroups($uname);
|
|
||||||
|
|
||||||
if(!$users_value){
|
|
||||||
$users_value = $uname;
|
|
||||||
}else{
|
|
||||||
$users_value = $users_value . '_' . $uname;
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td><?= $uname ?></td>
|
|
||||||
<?php
|
<?php
|
||||||
foreach($userManager->usergroups as $name => $group){
|
$users_to_update = [];
|
||||||
echo '<td><input type="checkbox" ' . (($groupFlag & $group) ? 'checked' : '') . ' name="' . $uname . '_' . $name . '" class="usergroupcheckbox">' . $name . '</td>';
|
foreach ($users as $i => $data) {
|
||||||
}
|
$uname = $data['name'];
|
||||||
?>
|
$groupFlag = $userManager->getUsergroups($uname);
|
||||||
</tr>
|
|
||||||
|
|
||||||
<?php
|
$users_to_update[] = $uname;
|
||||||
}
|
?>
|
||||||
echo '<input type="hidden" name="users" value="' . $users_value . '" />';
|
|
||||||
?>
|
|
||||||
|
|
||||||
<tr class="newuserrow">
|
<tr>
|
||||||
<td class="newuserelement"><input type="text" name="newuser" class="newuserinput"></td>
|
<td><?php echo $uname; ?></td>
|
||||||
<?php
|
<?php
|
||||||
foreach($userManager->usergroups as $name => $group){
|
foreach ($userManager->usergroups as $name => $group) {
|
||||||
echo '<td><input type="checkbox" name="newuser_' . $name . '" class="usergroupcheckbox">' . $name . '</td>';
|
echo '<td><input type="checkbox" ' . (($groupFlag & $group) ? 'checked' : '') . ' name="' . $uname . '_' . $name . '" class="usergroupcheckbox">' . $name . '</td>';
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
|
||||||
<input type="submit" class="btn" value="Lagre">
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</article>
|
<?php
|
||||||
</main>
|
}
|
||||||
|
foreach ($users_to_update as $uname) {
|
||||||
|
echo '<input type="hidden" name="user_to_update" value="' . $uname . '" />';
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
<tr class="newuserrow">
|
||||||
|
<td class="newuserelement"><input type="text" name="newuser" class="newuserinput"></td>
|
||||||
|
<?php
|
||||||
|
foreach ($userManager->usergroups as $name => $group) {
|
||||||
|
echo '<td><input type="checkbox" name="newuser_' . $name . '" class="usergroupcheckbox">' . $name . '</td>';
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<input type="submit" class="btn" value="Lagre">
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
@@ -1,68 +1,76 @@
|
|||||||
<?php
|
<?php
|
||||||
ini_set('display_errors', '1');
|
ini_set('display_errors', '1');
|
||||||
date_default_timezone_set('Europe/Oslo');
|
date_default_timezone_set('Europe/Oslo');
|
||||||
setlocale(LC_ALL, 'no_NO');
|
setlocale(\LC_ALL, 'nb_NO');
|
||||||
error_reporting(E_ALL);
|
error_reporting(\E_ALL);
|
||||||
require __DIR__ . '/../../../src/_autoload.php';
|
require __DIR__ . '/../../../src/_autoload.php';
|
||||||
require __DIR__ . '/../../../sql_config.php';
|
require __DIR__ . '/../../../config.php';
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
$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);
|
||||||
$userManager = new \pvv\admin\UserManager($pdo);
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
|
|
||||||
if(!$userManager->isAdmin($uname)){
|
if (!$userManager->isAdmin($uname)) {
|
||||||
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$newUser;
|
|
||||||
if(isset($_POST['newuser'])){
|
if (isset($_POST['newuser'])) {
|
||||||
$newUser = $_POST['newuser'];
|
$newUser = $_POST['newuser'];
|
||||||
unset($_POST['newuser']);
|
unset($_POST['newuser']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$updatingUsers = explode('_', $_POST['users']);
|
// $updatingUsers = explode('_', $_POST['users']);
|
||||||
unset($_POST['users']);
|
$updatingUsers = [];
|
||||||
|
foreach ($_POST as $key => $value) {
|
||||||
|
if ($key === 'user_to_update') {
|
||||||
|
$updatingUsers[] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unset($_POST['user_to_update']);
|
||||||
|
|
||||||
// 2d array of usernames and their corresponding group flags
|
// 2d array of usernames and their corresponding group flags
|
||||||
$userFlags = [];
|
$userFlags = [];
|
||||||
if($newUser){
|
if ($newUser) {
|
||||||
$userFlags[$newUser] = 0;
|
$userFlags[$newUser] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($_POST as $namegroup => $info){
|
foreach ($_POST as $namegroup => $info) {
|
||||||
$data = explode('_', $namegroup);
|
$data = explode('_', $namegroup);
|
||||||
if($data[0] == 'newuser'){
|
$group = array_pop($data);
|
||||||
if(!$newUser){
|
$uname = implode('_', $data);
|
||||||
continue;
|
if ($uname == 'newuser') {
|
||||||
}
|
if (!$newUser) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$data[0] = $newUser;
|
$uname = $newUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isset($userFlags[$data[0]])){
|
if (!isset($userFlags[$uname])) {
|
||||||
$userFlags[$data[0]] = 0;
|
$userFlags[$uname] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
$userFlags[$data[0]] = ($userFlags[$data[0]] | $userManager->usergroups[$data[1]]);
|
$userFlags[$uname] = ($userFlags[$uname] | $userManager->usergroups[$group]);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($updatingUsers as $uname){
|
foreach ($updatingUsers as $uname) {
|
||||||
if(!array_key_exists($uname, $userFlags)){
|
if (!array_key_exists($uname, $userFlags)) {
|
||||||
$userFlags[$uname] = 0;
|
$userFlags[$uname] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($userFlags as $uname => $flag){
|
foreach ($userFlags as $uname => $flag) {
|
||||||
$userManager->setGroups($uname, $flag);
|
$userManager->setGroups($uname, $flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
header('Location: .');
|
header('Location: .');
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<a href=".">Om du ikke ble automatisk omdirigert tilbake klikk her</a>
|
<a href=".">Om du ikke ble automatisk omdirigert tilbake klikk her</a>
|
||||||
|
@@ -1,14 +1,11 @@
|
|||||||
<?php
|
<?php
|
||||||
require __DIR__ . '/../../inc/navbar.php';
|
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
|
||||||
require __DIR__ . '/../../src/_autoload.php';
|
|
||||||
require_once __DIR__ . '/../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
|
||||||
require __DIR__ . '/../../sql_config.php';
|
|
||||||
|
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
$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);
|
||||||
$userManager = new \pvv\admin\UserManager($pdo);
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
@@ -17,42 +14,53 @@ $isAdmin = $userManager->isAdmin($uname);
|
|||||||
$projectGroup = $userManager->hasGroup($uname, 'prosjekt');
|
$projectGroup = $userManager->hasGroup($uname, 'prosjekt');
|
||||||
$activityGroup = $userManager->hasGroup($uname, 'aktiviteter');
|
$activityGroup = $userManager->hasGroup($uname, 'aktiviteter');
|
||||||
|
|
||||||
if(!($isAdmin | $projectGroup | $activityGroup)){
|
if (!($isAdmin | $projectGroup | $activityGroup)) {
|
||||||
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
header('Content-Type: text/plain', true, 403);
|
||||||
exit();
|
echo "Her har du ikke lov't'å'værra!!!\r\n";
|
||||||
|
exit;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="no">
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<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/normalize.css">
|
||||||
<link rel="stylesheet" href="../css/style.css">
|
<link rel="stylesheet" href="../css/style.css">
|
||||||
<link rel="stylesheet" href="../css/events.css">
|
<link rel="stylesheet" href="../css/events.css">
|
||||||
<link rel="stylesheet" href="../css/admin.css">
|
<link rel="stylesheet" href="../css/admin.css">
|
||||||
|
<meta name="theme-color" content="#024" />
|
||||||
|
<title>Administrasjonsverkstedet</title>
|
||||||
|
|
||||||
<header class="admin">Stor-­gutt-­leketøy</header>
|
<header>Administrasjons­verk­stedet</header>
|
||||||
|
|
||||||
<main>
|
|
||||||
|
|
||||||
<article>
|
<body>
|
||||||
<h2>Verktøy</h2>
|
<nav id="navbar">
|
||||||
<?php
|
<?php echo navbar(1, 'admin'); ?>
|
||||||
if($isAdmin | $activityGroup){
|
<?php echo loginbar(null, $pdo); ?>
|
||||||
echo '<a class="btn adminbtn" href="aktiviteter/?page=1">Aktiviteter/Hendelser</a>';
|
</nav>
|
||||||
}
|
|
||||||
|
|
||||||
if($isAdmin | $projectGroup){
|
<main>
|
||||||
echo '<a class="btn adminbtn" href="prosjekter/">Prosjekter</a>';
|
<h2>Administrasjon</h2>
|
||||||
}
|
<ul class="tools">
|
||||||
|
<?php
|
||||||
|
if ($isAdmin | $activityGroup) {
|
||||||
|
echo '<li><a class="btn" href="aktiviteter/?page=1">Aktiviteter/Hendelser</a></li>';
|
||||||
|
}
|
||||||
|
|
||||||
if($isAdmin){
|
if ($isAdmin | $projectGroup) {
|
||||||
echo '<a class="btn adminbtn" href="brukere/">Brukere</a>';
|
echo '<li><a class="btn" href="prosjekter/">Prosjekter</a></li>';
|
||||||
}
|
}
|
||||||
?>
|
|
||||||
</article>
|
|
||||||
|
|
||||||
</main>
|
if ($isAdmin) {
|
||||||
|
echo '<li><a class="btn" href="motd/">Dagens melding</a></li>';
|
||||||
|
}
|
||||||
|
|
||||||
<nav>
|
if ($isAdmin) {
|
||||||
<?= navbar(1); ?>
|
echo '<li><a class="btn" href="brukere/">Brukerrettigheter</a></li>';
|
||||||
<?= loginbar(); ?>
|
}
|
||||||
</nav>
|
?>
|
||||||
|
<ul>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
71
www/admin/motd/index.php
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
<?php
|
||||||
|
ini_set('display_errors', '1');
|
||||||
|
date_default_timezone_set('Europe/Oslo');
|
||||||
|
setlocale(\LC_ALL, 'no_NO');
|
||||||
|
error_reporting(\E_ALL);
|
||||||
|
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');
|
||||||
|
$attrs = $as->getAttributes();
|
||||||
|
|
||||||
|
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
|
||||||
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
|
$as->requireAuth();
|
||||||
|
$attrs = $as->getAttributes();
|
||||||
|
$uname = $attrs['uid'][0];
|
||||||
|
|
||||||
|
if (!$userManager->isAdmin($uname)) {
|
||||||
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$motdfetcher = new pvv\side\MOTD($pdo);
|
||||||
|
$motd = $motdfetcher->getMOTD();
|
||||||
|
?>
|
||||||
|
<!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/nav.css">
|
||||||
|
<link rel="stylesheet" href="../../css/events.css">
|
||||||
|
<link rel="stylesheet" href="../../css/admin.css">
|
||||||
|
<meta name="theme-color" content="#024" />
|
||||||
|
<title>MOTDadministrasjonsverkstedet</title>
|
||||||
|
|
||||||
|
<header>MOTD­administrasjons­verk­stedet</header>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<nav>
|
||||||
|
<?php echo navbar(2, 'admin'); ?>
|
||||||
|
<?php echo loginbar(null, $pdo); ?>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<h2>Dagens melding</h2>
|
||||||
|
<hr class="ruler">
|
||||||
|
|
||||||
|
<form action="update.php", method="post">
|
||||||
|
<p class="subtitle no-chin">Tittel</p>
|
||||||
|
<p class="subnote">Ikke nødvendig</p>
|
||||||
|
<input type="text" name="title" value="<?php echo $motd['title']; ?>" class="boxinput" style="width:66%;"><br>
|
||||||
|
|
||||||
|
<p class="subtitle no-chin">Innhold (<i>markdown</i>)</p>
|
||||||
|
<textarea name="content" style="width:100%" rows="8" class="boxinput"><?php echo implode("\n", $motd['content']); ?></textarea>
|
||||||
|
|
||||||
|
<div style="margin-top: 2em;">
|
||||||
|
<hr class="ruler">
|
||||||
|
|
||||||
|
<?php echo '<input type="submit" class="btn" value="Lagre endringer"></a>'; ?>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
</body>
|
35
www/admin/motd/update.php
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
ini_set('display_errors', '1');
|
||||||
|
date_default_timezone_set('Europe/Oslo');
|
||||||
|
setlocale(\LC_ALL, 'no_NO');
|
||||||
|
error_reporting(\E_ALL);
|
||||||
|
require __DIR__ . '/../../../src/_autoload.php';
|
||||||
|
require __DIR__ . '/../../../config.php';
|
||||||
|
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
|
||||||
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
|
$as->requireAuth();
|
||||||
|
$attrs = $as->getAttributes();
|
||||||
|
$uname = $attrs['uid'][0];
|
||||||
|
|
||||||
|
if (!isset($_POST['title']) || !isset($_POST['content'])) {
|
||||||
|
header('Location: ' . $_SERVER['HTTP_REFERER']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$userManager->isAdmin($uname)) {
|
||||||
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$motdfetcher = new pvv\side\MOTD($pdo);
|
||||||
|
$motdfetcher->setMOTD($_POST['title'], $_POST['content']);
|
||||||
|
|
||||||
|
header('Location: .');
|
||||||
|
?>
|
||||||
|
|
||||||
|
<a href=".">Om du ikke ble automatisk omdirigert tilbake klikk her</a>
|
@@ -1,19 +1,19 @@
|
|||||||
<?php
|
<?php
|
||||||
require __DIR__ . '/../../../src/_autoload.php';
|
require __DIR__ . '/../../../src/_autoload.php';
|
||||||
require __DIR__ . '/../../../sql_config.php';
|
require __DIR__ . '/../../../config.php';
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
$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);
|
||||||
$userManager = new \pvv\admin\UserManager($pdo);
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
|
|
||||||
if(!$userManager->hasGroup($uname, 'prosjekt')){
|
if (!$userManager->hasGroup($uname, 'prosjekt')) {
|
||||||
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$projectID = $_GET['id'];
|
$projectID = $_GET['id'];
|
||||||
|
@@ -1,101 +1,148 @@
|
|||||||
<?php
|
<?php
|
||||||
date_default_timezone_set('Europe/Oslo');
|
date_default_timezone_set('Europe/Oslo');
|
||||||
setlocale(LC_ALL, 'no_NO');
|
setlocale(\LC_ALL, 'nb_NO');
|
||||||
require __DIR__ . '/../../../inc/navbar.php';
|
require __DIR__ . '/../../../inc/navbar.php';
|
||||||
require __DIR__ . '/../../../src/_autoload.php';
|
require __DIR__ . '/../../../src/_autoload.php';
|
||||||
require __DIR__ . '/../../../sql_config.php';
|
require __DIR__ . '/../../../config.php';
|
||||||
|
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
$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);
|
||||||
$userManager = new \pvv\admin\UserManager($pdo);
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
|
|
||||||
if(!$userManager->hasGroup($uname, 'prosjekt')){
|
if (!$userManager->hasGroup($uname, 'prosjekt')) {
|
||||||
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$projectManager = new \pvv\side\ProjectManager($pdo);
|
$projectManager = new pvv\side\ProjectManager($pdo);
|
||||||
$projects = $projectManager->getAll();
|
$projects = $projectManager->getAll();
|
||||||
|
|
||||||
$new = 0;
|
$new = 0;
|
||||||
if(isset($_GET['new'])){
|
if (isset($_GET['new'])) {
|
||||||
$new = $_GET['new'];
|
$new = $_GET['new'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$projectID = 0;
|
$projectID = 0;
|
||||||
if(isset($_GET['id'])){
|
if (isset($_GET['id'])) {
|
||||||
$projectID = $_GET['id'];
|
$projectID = $_GET['id'];
|
||||||
}else if($new == 0){
|
} elseif ($new == 0) {
|
||||||
echo "\nID not set";
|
echo "\nID not set";
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$project = new \pvv\side\Project(
|
$project = new pvv\side\Project(
|
||||||
0,
|
0,
|
||||||
'Kult Prosjekt',
|
'Kult Prosjekt',
|
||||||
'',
|
'',
|
||||||
'kåre knoll',
|
'kåre knoll',
|
||||||
'pvvadmin',
|
'pvvadmin',
|
||||||
0
|
'drift@pvv.ntnu.no',
|
||||||
|
0
|
||||||
);
|
);
|
||||||
if($new == 0){
|
if ($new == 0) {
|
||||||
$project = $projectManager->getByID($projectID);
|
$project = $projectManager->getByID($projectID);
|
||||||
|
}
|
||||||
|
|
||||||
|
$members = $projectManager->getProjectMembers($projectID);
|
||||||
|
$owner = [
|
||||||
|
'name' => '',
|
||||||
|
'uname' => '',
|
||||||
|
'mail' => '',
|
||||||
|
];
|
||||||
|
foreach ($members as $i => $data) {
|
||||||
|
if ($data['owner']) {
|
||||||
|
$owner = $data;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="no">
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<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/normalize.css">
|
||||||
<link rel="stylesheet" href="../../css/style.css">
|
<link rel="stylesheet" href="../../css/style.css">
|
||||||
<link rel="stylesheet" href="../../css/events.css">
|
<link rel="stylesheet" href="../../css/events.css">
|
||||||
<link rel="stylesheet" href="../../css/admin.css">
|
<link rel="stylesheet" href="../../css/admin.css">
|
||||||
|
<meta name="theme-color" content="#024" />
|
||||||
|
<title>Prosjektadministrasjonsverkstedet</title>
|
||||||
|
|
||||||
<header class="admin">Prosjekt­administrasjon</header>
|
<header>Prosjekt­administrasjons­verk­stedet</header>
|
||||||
|
|
||||||
<main>
|
<body>
|
||||||
|
<nav>
|
||||||
|
<?php echo navbar(3, 'admin'); ?>
|
||||||
|
<?php echo loginbar(null, $pdo); ?>
|
||||||
|
</nav>
|
||||||
|
|
||||||
<article>
|
<main>
|
||||||
<h2><?= ($new == 1 ? "Nytt prosjekt" : "Rediger prosjekt"); ?></h2>
|
<h2>Prosjektadministrasjon</h2>
|
||||||
|
<hr class="ruler">
|
||||||
|
|
||||||
<form action="update.php", method="post" class="gridsplit5050">
|
<h2><?php echo $new == 1 ? 'Nytt prosjekt' : 'Rediger prosjekt'; ?></h2>
|
||||||
<div class="gridl">
|
|
||||||
<p class="subtitle">Tittel</p>
|
|
||||||
<?= '<input type="text" name="title" value="' . $project->getName() . '" class="boxinput">' ?><br>
|
|
||||||
|
|
||||||
<p class="subtitle">Beskrivelse</p>
|
<form action="update.php", method="post" class="gridsplit5050">
|
||||||
<textarea name="desc" cols="40" rows="5" class="boxinput"><?= $project->getDescription(); ?></textarea>
|
<div class="gridl">
|
||||||
</div>
|
<p class="subtitle">Tittel</p>
|
||||||
|
<?php echo '<input type="text" name="title" value="' . $project->getName() . '" class="boxinput">'; ?><br>
|
||||||
|
|
||||||
<div class="gridr noborder">
|
<p class="subtitle">Beskrivelse (<i>markdown</i>)</p>
|
||||||
<p class="subtitle">Prosjekteier (Brukernavn)</p>
|
<textarea name="desc" cols="40" rows="5" class="boxinput"><?php echo implode("\n", $project->getDescription()); ?></textarea>
|
||||||
<?= '<input type="text" name="organiser" value="' . $project->getOwnerUName(). '" class="boxinput">' ?><br>
|
</div>
|
||||||
|
|
||||||
<p class="subtitle">Prosjekteier (Navn)</p>
|
<div class="gridr noborder">
|
||||||
<?= '<input type="text" name="organisername" value="' . $project->getOwner(). '" class="boxinput">' ?>
|
<p class="subtitle">Prosjektleder (Brukernavn)</p>
|
||||||
|
<?php echo '<input type="text" name="organiser" value="' . $owner['uname'] . '" class="boxinput">'; ?><br>
|
||||||
|
|
||||||
<p class="subtitle">Aktiv</p>
|
<p class="subtitle">Prosjektleder (Navn)</p>
|
||||||
<?= '<input type="checkbox" '. ($project->getActive() ? 'checked' : '') . ' name="active"/>' ?>
|
<?php echo '<input type="text" name="organisername" value="' . $owner['name'] . '" class="boxinput">'; ?>
|
||||||
</div>
|
|
||||||
|
|
||||||
<?= '<input type="hidden" name="id" value="' . $project->getID() . '" />' ?>
|
<p class="subtitle">Prosjektleder E-post</p>
|
||||||
|
<?php echo '<input type="text" name="organiseremail" value="' . $owner['mail'] . '" class="boxinput">'; ?><br>
|
||||||
|
|
||||||
<div class="allgrids" style="margin-top: 2em;">
|
<p class="subtitle">Aktiv</p>
|
||||||
<hr class="ruler">
|
<?php echo '<input type="checkbox" ' . ($project->getActive() ? 'checked' : '') . ' name="active"/>'; ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
<input type="submit" class="btn" value="Lagre">
|
<?php echo '<input type="hidden" name="id" value="' . $project->getID() . '" />'; ?>
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<p>
|
|
||||||
</article>
|
|
||||||
|
|
||||||
</main>
|
<?php if (!$new) { ?>
|
||||||
|
<div style="grid-column: span 2;">
|
||||||
|
<hr class="ruler">
|
||||||
|
</div>
|
||||||
|
|
||||||
<nav>
|
<h2 style="grid-column: span 2">Prosjektmedlemmer</h2>
|
||||||
<?= navbar(2); ?>
|
|
||||||
<?= loginbar(); ?>
|
<table class="userlist" style="grid-column: span 2;">
|
||||||
</nav>
|
<tr><th>Brukernavn</th><th>Navn</th><th>Rolle</th></tr>
|
||||||
|
<?php foreach ($members as $i => $data) { ?>
|
||||||
|
<tr>
|
||||||
|
<td><?php echo $data['uname']; ?></td>
|
||||||
|
<td><?php echo $data['name']; ?></td>
|
||||||
|
<td><?php echo $data['role']; ?></td>
|
||||||
|
</tr>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
<tr class="newuserrow">
|
||||||
|
<td class="newuserelement"><input type="text" name="newuser_uname"></td>
|
||||||
|
<td class="newuserelement"><input type="text" name="newuser_name"></td>
|
||||||
|
<td class="newuserelement"><input type="text" name="newuser_role"></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
<div class="allgrids" style="margin-top: 2em;">
|
||||||
|
<hr class="ruler">
|
||||||
|
|
||||||
|
<input type="submit" class="btn" value="Lagre">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<p>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
@@ -1,132 +1,146 @@
|
|||||||
<?php
|
<?php
|
||||||
date_default_timezone_set('Europe/Oslo');
|
date_default_timezone_set('Europe/Oslo');
|
||||||
setlocale(LC_ALL, 'no_NO');
|
setlocale(\LC_ALL, 'nb_NO');
|
||||||
require __DIR__ . '/../../../inc/navbar.php';
|
require __DIR__ . '/../../../inc/navbar.php';
|
||||||
require __DIR__ . '/../../../src/_autoload.php';
|
require __DIR__ . '/../../../src/_autoload.php';
|
||||||
require __DIR__ . '/../../../sql_config.php';
|
require __DIR__ . '/../../../config.php';
|
||||||
|
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
$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);
|
||||||
$userManager = new \pvv\admin\UserManager($pdo);
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
|
|
||||||
if(!$userManager->hasGroup($uname, 'prosjekt')){
|
if (!$userManager->hasGroup($uname, 'prosjekt')) {
|
||||||
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$projectManager = new \pvv\side\ProjectManager($pdo);
|
$projectManager = new pvv\side\ProjectManager($pdo);
|
||||||
$projects = $projectManager->getAll();
|
$projects = $projectManager->getAll();
|
||||||
|
|
||||||
$page = 1;
|
$page = 1;
|
||||||
if(isset($_GET['page'])){
|
if (isset($_GET['page'])) {
|
||||||
$page = $_GET['page'];
|
$page = $_GET['page'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$filterTitle = '';
|
$filterTitle = '';
|
||||||
if(isset($_POST['title'])){
|
if (isset($_POST['title'])) {
|
||||||
$filterTitle = $_POST['title'];
|
$filterTitle = $_POST['title'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Temporarily out of service :<
|
||||||
$filterOrganiser = '';
|
$filterOrganiser = '';
|
||||||
if(isset($_POST['organiser'])){
|
if(isset($_POST['organiser'])){
|
||||||
$filterOrganiser = $_POST['organiser'];
|
$filterOrganiser = $_POST['organiser'];
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// filter
|
// filter
|
||||||
$projects = array_values(array_filter(
|
$projects = array_values(array_filter(
|
||||||
$projects,
|
$projects,
|
||||||
function($project) use ($filterTitle, $filterOrganiser){
|
static fn($project) => preg_match('/.*' . $filterTitle . '.*/i', $project->getName())
|
||||||
return (preg_match('/.*'.$filterTitle.'.*/i', $project->getName()) and preg_match('/.*'.$filterOrganiser.'.*/i', $project->getOwner()));
|
|
||||||
}
|
|
||||||
));
|
));
|
||||||
?>
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="no">
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<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/normalize.css">
|
||||||
<link rel="stylesheet" href="../../css/style.css">
|
<link rel="stylesheet" href="../../css/style.css">
|
||||||
|
<link rel="stylesheet" href="../../css/nav.css">
|
||||||
<link rel="stylesheet" href="../../css/events.css">
|
<link rel="stylesheet" href="../../css/events.css">
|
||||||
<link rel="stylesheet" href="../../css/admin.css">
|
<link rel="stylesheet" href="../../css/admin.css">
|
||||||
|
<meta name="theme-color" content="#024" />
|
||||||
|
<title>Prosjektadministrasjonsverkstedet</title>
|
||||||
|
|
||||||
<header class="admin">Prosjekt­administrasjon</header>
|
<header>Prosjekt­administrasjons­verk­stedet</header>
|
||||||
|
|
||||||
<main>
|
<body>
|
||||||
|
<nav>
|
||||||
|
<?php echo navbar(2, 'admin'); ?>
|
||||||
|
<?php echo loginbar(null, $pdo); ?>
|
||||||
|
</nav>
|
||||||
|
|
||||||
<article class="gridsplit">
|
<main>
|
||||||
<div class="gridl">
|
<h2>Prosjektadministrasjon</h2>
|
||||||
<h2 class="no-chin">Prosjekter</h2>
|
<hr class="ruler">
|
||||||
|
|
||||||
<ul class="event-list">
|
<div class="gridsplit">
|
||||||
<?php
|
<div class="gridl">
|
||||||
$counter = 0;
|
<h2 class="no-chin">Prosjekter</h2>
|
||||||
$pageLimit = 4;
|
|
||||||
|
|
||||||
for($i = ($pageLimit * ($page - 1)); $i < count($projects); $i++){
|
<ul class="event-list">
|
||||||
if($counter == $pageLimit){
|
<?php
|
||||||
break;
|
$counter = 0;
|
||||||
}
|
$pageLimit = 4;
|
||||||
|
|
||||||
$project = $projects[$i];
|
for ($i = ($pageLimit * ($page - 1)); $i < count($projects); ++$i) {
|
||||||
$projectID = $project->getID();
|
if ($counter == $pageLimit) {
|
||||||
?>
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
<li>
|
$project = $projects[$i];
|
||||||
<div class="event admin">
|
$projectID = $project->getID();
|
||||||
<div class="event-info">
|
$owner = $projectManager->getProjectOwner($projectID);
|
||||||
<h3 class="no-chin"><?= $project->getName() . " (ID: " . $projectID . ")"; ?></h3>
|
?>
|
||||||
<p class="subnote"><?= 'Organisert av: ' . $project->getOwner(); ?></p>
|
|
||||||
<p><?= $project->getDescription(); ?></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="event-actions">
|
<li>
|
||||||
<?= '<a href="edit.php?id=' . $projectID . '">🖊</a>'; ?>
|
<div class="event admin">
|
||||||
<?= '<a href="delete.php?id=' . $projectID . '" onclick="return confirm(\'Knallsikker? (ID: ' . $projectID . ')\');">🗑</a>'; ?>
|
<div class="event-info">
|
||||||
</div>
|
<h3 class="no-chin"><?php echo $project->getName() . ' (ID: ' . $projectID . ')'; ?></h3>
|
||||||
</div>
|
<p class="subnote"><?php echo 'Organisert av: ' . $owner['name']; ?></p>
|
||||||
</li>
|
<?php
|
||||||
|
$Parsedown = new Parsedown();
|
||||||
|
echo $Parsedown->text(implode("\n", $project->getDescription()));
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?php
|
<div class="event-actions">
|
||||||
$counter++;
|
<?php echo '<a href="edit.php?id=' . $projectID . '">🖊</a>'; ?>
|
||||||
}
|
<?php echo '<a href="delete.php?id=' . $projectID . '" onclick="return confirm(\'Knallsikker? (ID: ' . $projectID . ')\');">🗑</a>'; ?>
|
||||||
?>
|
</div>
|
||||||
</ul>
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
if($page != 1){
|
++$counter;
|
||||||
echo '<a class="btn float-left" href="?page=' . ($page - 1) . '">Forrige side</a>';
|
}
|
||||||
}
|
?>
|
||||||
|
</ul>
|
||||||
|
|
||||||
if(($counter == $pageLimit) and (($pageLimit * $page) < count($projects))){
|
<?php
|
||||||
echo '<a class="btn float-right" href="?page=' . ($page + 1) . '">Neste side</a>';
|
if ($page != 1) {
|
||||||
}
|
echo '<a class="btn float-left" href="?page=' . ($page - 1) . '">Forrige side</a>';
|
||||||
?>
|
}
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="gridr">
|
if (($counter == $pageLimit) && (($pageLimit * $page) < count($projects))) {
|
||||||
<h2>Verktøy</h2>
|
echo '<a class="btn float-right" href="?page=' . ($page + 1) . '">Neste side</a>';
|
||||||
<a class="btn adminbtn" href="edit.php?new=1">Legg inn nytt prosjekt</a>
|
}
|
||||||
<h2>Filter</h2>
|
?>
|
||||||
<form action="." method="post">
|
|
||||||
<p class="no-chin">Navn</p>
|
|
||||||
<?= '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">' ?><br>
|
|
||||||
<p class="no-chin">Organisator</p>
|
|
||||||
<?= '<input type="text" name="organiser" class="boxinput" value="' . $filterOrganiser . '">' ?><br>
|
|
||||||
|
|
||||||
<div style="margin-top: 2em;">
|
|
||||||
<input type="submit" class="btn" value="Filtrer"></input>
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
|
|
||||||
</main>
|
<div class="gridr">
|
||||||
|
<h2>Verktøy</h2>
|
||||||
|
<a class="btn adminbtn" href="edit.php?new=1">Legg inn nytt prosjekt</a>
|
||||||
|
<h2>Filter</h2>
|
||||||
|
<form action="." method="post">
|
||||||
|
<p class="no-chin">Prosjektnavn</p>
|
||||||
|
<?php echo '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">'; ?><br>
|
||||||
|
<p class="no-chin">Leders brukernavn</p>
|
||||||
|
<?php echo '<input type="text" name="organiser" class="boxinput" value="">'; ?><br>
|
||||||
|
|
||||||
<nav>
|
<div style="margin-top: 2em;">
|
||||||
<?= navbar(2); ?>
|
<input type="submit" class="btn" value="Filtrer"></input>
|
||||||
<?= loginbar(); ?>
|
</div>
|
||||||
</nav>
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
@@ -1,63 +1,79 @@
|
|||||||
<?php
|
<?php
|
||||||
date_default_timezone_set('Europe/Oslo');
|
date_default_timezone_set('Europe/Oslo');
|
||||||
setlocale(LC_ALL, 'no_NO');
|
setlocale(\LC_ALL, 'nb_NO');
|
||||||
require __DIR__ . '/../../../src/_autoload.php';
|
require __DIR__ . '/../../../src/_autoload.php';
|
||||||
require __DIR__ . '/../../../sql_config.php';
|
require __DIR__ . '/../../../config.php';
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
$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);
|
||||||
$userManager = new \pvv\admin\UserManager($pdo);
|
$userManager = new pvv\admin\UserManager($pdo);
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
|
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
|
||||||
$as = new SimpleSAML_Auth_Simple('default-sp');
|
$as = new SimpleSAML\Auth\Simple('default-sp');
|
||||||
$as->requireAuth();
|
$as->requireAuth();
|
||||||
$attrs = $as->getAttributes();
|
$attrs = $as->getAttributes();
|
||||||
$uname = $attrs['uid'][0];
|
$uname = $attrs['uid'][0];
|
||||||
|
|
||||||
if(!$userManager->hasGroup($uname, 'prosjekt')){
|
if (!$userManager->hasGroup($uname, 'prosjekt')) {
|
||||||
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
echo 'Her har du ikke lov\'t\'å\'værra!!!';
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isset($_POST['title']) or !isset($_POST['desc']) or !isset($_POST['organisername']) or !isset($_POST['organiser'])){
|
if (!isset($_POST['title']) || !isset($_POST['desc']) || !isset($_POST['organisername']) || !isset($_POST['organiser'])) {
|
||||||
header('Location: ' . $_SERVER['HTTP_REFERER']);
|
header('Location: ' . $_SERVER['HTTP_REFERER']);
|
||||||
exit();
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$id = 0;
|
$id = 0;
|
||||||
if(isset($_POST['id'])){
|
if (isset($_POST['id'])) {
|
||||||
$id = $_POST['id'];
|
$id = $_POST['id'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$title = $_POST['title'];
|
$title = $_POST['title'];
|
||||||
$desc = $_POST['desc'];
|
$desc = $_POST['desc'];
|
||||||
$owner = $_POST['organisername'];
|
$name = $_POST['organisername'];
|
||||||
$uname = $_POST['organiser'];
|
$uname = $_POST['organiser'];
|
||||||
$active = (isset($_POST['active']) ? $_POST['active'] : 0);
|
$mail = $_POST['organiseremail'];
|
||||||
|
$active = ($_POST['active'] ?? 0);
|
||||||
|
|
||||||
$statement;
|
|
||||||
if($id == 0){
|
|
||||||
$query = 'INSERT INTO projects (name, owner, owneruname, description, active) VALUES (:title, :owner, :uname, :desc, :active)';
|
|
||||||
$statement = $pdo->prepare($query);
|
|
||||||
|
|
||||||
$statement->bindParam(':title', $title, PDO::PARAM_STR);
|
if ($id == 0) {
|
||||||
$statement->bindParam(':desc', $desc, PDO::PARAM_STR);
|
$query = 'INSERT INTO projects (name, description, active) VALUES (:title, :desc, :active)';
|
||||||
$statement->bindParam(':owner', $owner, PDO::PARAM_STR);
|
$statement = $pdo->prepare($query);
|
||||||
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
|
|
||||||
$statement->bindParam(':active', $active, PDO::PARAM_INT);
|
|
||||||
}else{
|
|
||||||
$query = 'UPDATE projects SET name=:title, owner=:owner, owneruname=:uname, description=:desc, active=:active WHERE id=:id';
|
|
||||||
$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', $desc, PDO::PARAM_STR);
|
||||||
$statement->bindParam(':owner', $owner, PDO::PARAM_STR);
|
$statement->bindParam(':active', $active, PDO::PARAM_INT);
|
||||||
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
|
|
||||||
$statement->bindParam(':active', $active, PDO::PARAM_INT);
|
$statement->execute();
|
||||||
$statement->bindParam(':id', $id, PDO::PARAM_INT);
|
|
||||||
|
$ownerQuery = 'INSERT INTO projectmembers (projectid, name, uname, mail, role, lead, owner) VALUES (last_insert_rowid(), :owner, :owneruname, :owneremail, \'Prosjektleder\', 1, 1)';
|
||||||
|
$statement = $pdo->prepare($ownerQuery);
|
||||||
|
$statement->bindParam(':owner', $name, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':owneruname', $uname, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':owneremail', $mail, PDO::PARAM_STR);
|
||||||
|
|
||||||
|
$statement->execute();
|
||||||
|
} else {
|
||||||
|
$query = 'UPDATE projects SET name=:title, description=:desc, active=:active WHERE id=:id';
|
||||||
|
$statement = $pdo->prepare($query);
|
||||||
|
|
||||||
|
$statement->bindParam(':title', $title, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':desc', $desc, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':active', $active, PDO::PARAM_INT);
|
||||||
|
$statement->bindParam(':id', $id, PDO::PARAM_INT);
|
||||||
|
|
||||||
|
$statement->execute();
|
||||||
|
|
||||||
|
$query = 'UPDATE projectmembers SET name=:name, uname=:uname, mail=:mail';
|
||||||
|
$statement = $pdo->prepare($query);
|
||||||
|
|
||||||
|
$statement->bindParam(':name', $name, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
|
||||||
|
$statement->bindParam(':mail', $mail, PDO::PARAM_STR);
|
||||||
|
|
||||||
|
$statement->execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
$statement->execute();
|
|
||||||
|
|
||||||
header('Location: .');
|
header('Location: .');
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
@@ -1,84 +1,85 @@
|
|||||||
<?php
|
<?php
|
||||||
date_default_timezone_set('Europe/Oslo');
|
|
||||||
setlocale(LC_ALL, 'no_NO');
|
|
||||||
require_once __DIR__ . '/../../inc/navbar.php';
|
|
||||||
require_once __DIR__ . '/../../src/_autoload.php';
|
|
||||||
require_once __DIR__ . '/../../sql_config.php';
|
|
||||||
|
|
||||||
$pdo = new \PDO($dbDsn, $dbUser, $dbPass);
|
namespace pvv\side;
|
||||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
||||||
use \pvv\side\Agenda;
|
require_once \dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
|
||||||
$agenda = new \pvv\side\Agenda([
|
|
||||||
new \pvv\side\social\NerdepitsaActivity,
|
|
||||||
new \pvv\side\social\AnimekveldActivity,
|
|
||||||
new \pvv\side\DBActivity($pdo),
|
|
||||||
]);
|
|
||||||
|
|
||||||
$year = (isset($_GET['year']))
|
$year = (isset($_GET['year']))
|
||||||
? $_GET['year']
|
? $_GET['year']
|
||||||
: date("Y");
|
: date('Y');
|
||||||
$month = (isset($_GET['month']))
|
$month = (isset($_GET['month']))
|
||||||
? $_GET['month']
|
? $_GET['month']
|
||||||
: date("m");
|
: date('m');
|
||||||
$day = (isset($_GET['day']))
|
$day = (isset($_GET['day']))
|
||||||
? $_GET['day']
|
? $_GET['day']
|
||||||
: -1;
|
: -1;
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="no">
|
<html lang="no">
|
||||||
<title>Aktivitetsverkstedet</title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<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">
|
<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/normalize.css">
|
||||||
<link rel="stylesheet" href="../css/style.css">
|
<link rel="stylesheet" href="../css/style.css">
|
||||||
<link rel="stylesheet" href="../css/events.css">
|
<link rel="stylesheet" href="../css/events.css">
|
||||||
|
<meta name="theme-color" content="#024" />
|
||||||
|
<title>Aktivitetsverkstedet</title>
|
||||||
|
|
||||||
<header>Aktivitets­verk­stedet</header>
|
<header>Aktivitets­verk­stedet</header>
|
||||||
|
|
||||||
<main>
|
|
||||||
|
|
||||||
<?php
|
<body>
|
||||||
$events = ($day==-1)
|
<nav>
|
||||||
? $agenda->getNextOfEach(new \DateTimeImmutable)
|
<?php echo navbar(1, 'aktiviteter'); ?>
|
||||||
: $agenda->getEventsBetween(
|
<?php echo loginbar(null, $pdo); ?>
|
||||||
new DateTimeImmutable("$year-$month-$day 00:00:00"),
|
</nav>
|
||||||
new DateTimeImmutable("$year-$month-$day 23:59:59"));
|
|
||||||
|
<main>
|
||||||
|
<?php
|
||||||
|
use DateTimeImmutable;
|
||||||
|
|
||||||
|
$events = ($day == -1)
|
||||||
|
? $agenda->getNextOfEach(new DateTimeImmutable())
|
||||||
|
: $agenda->getEventsBetween(
|
||||||
|
new DateTimeImmutable("{$year}-{$month}-{$day} 00:00:00"),
|
||||||
|
new DateTimeImmutable("{$year}-{$month}-{$day} 23:59:59")
|
||||||
|
);
|
||||||
|
|
||||||
|
$limit = 0;
|
||||||
|
foreach ($events as $event) {
|
||||||
|
?>
|
||||||
|
<article>
|
||||||
|
<h2>
|
||||||
|
<?php if (Agenda::isToday($event->getStart())) { ?><strong><?php } ?>
|
||||||
|
<em><?php echo $event->getRelativeDate(); ?></em>
|
||||||
|
<?php if (Agenda::isToday($event->getStart())) { ?></strong><?php } ?>
|
||||||
|
<?php if ($event->getURL()) { ?>
|
||||||
|
<a href="<?php echo $event->getURL(); ?>"><?php echo $event->getName(); ?></a>
|
||||||
|
<?php } else { ?>
|
||||||
|
<?php echo $event->getName(); ?>
|
||||||
|
<?php } ?>
|
||||||
|
<?php if ($event->getImageURL()) { ?>
|
||||||
|
<img src="<?php echo $event->getImageURL(); ?>">
|
||||||
|
<?php } ?>
|
||||||
|
</h2>
|
||||||
|
<ul class="subtext">
|
||||||
|
<li>Tid: <strong><?php echo Agenda::getFormattedDate($event->getStart()); ?></strong></li>
|
||||||
|
<li>Sted: <strong><?php echo $event->getLocation(); ?></strong></li>
|
||||||
|
<li>Arrangør: <strong><?php echo $event->getOrganiser(); ?></strong></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<?php $description = $event->getDescription(); ?>
|
||||||
|
<?php if ($limit) {
|
||||||
|
array_splice($description, $limit);
|
||||||
|
} ?>
|
||||||
|
<?php
|
||||||
|
$Parsedown = new \Parsedown();
|
||||||
|
echo $Parsedown->text(implode("\n", $description));
|
||||||
|
?>
|
||||||
|
</article>
|
||||||
|
|
||||||
$limit = 0;
|
|
||||||
foreach($events as $event) {
|
|
||||||
?>
|
|
||||||
<article>
|
|
||||||
<h2>
|
|
||||||
<?php if ($event->getImageURL()) { ?>
|
|
||||||
<img src="<?= $event->getImageURL() ?>">
|
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<?php if (\pvv\side\Agenda::isToday($event->getStart())) { ?><strong><?php } ?>
|
</main>
|
||||||
<em><?= $event->getRelativeDate() ?></em>
|
|
||||||
<?php if (\pvv\side\Agenda::isToday($event->getStart())) { ?></strong><?php } ?>
|
|
||||||
<?php if ($event->getURL()) { ?>
|
|
||||||
<a href="<?= $event->getURL() ?>"><?= $event->getName() ?></a>
|
|
||||||
<?php } else { ?>
|
|
||||||
<?= $event->getName() ?>
|
|
||||||
<?php } ?>
|
|
||||||
</h2>
|
|
||||||
<ul class="subtext">
|
|
||||||
<li>Tid: <strong><?= Agenda::getFormattedDate($event->getStart()) ?></strong>
|
|
||||||
<li>Sted: <strong><?= $event->getLocation() ?></strong>
|
|
||||||
<li>Arrangør: <strong><?= $event->getOrganiser() ?></strong>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<?php $description = $event->getDescription(); ?>
|
</body>
|
||||||
<?php if ($limit) array_splice($description, $limit); ?>
|
|
||||||
<?= implode($description, "</p>\n<p>") ?>
|
|
||||||
</article>
|
|
||||||
|
|
||||||
<?php if (!$limit || $limit > 4) {$limit = 4;} else $limit = 2; ?>
|
|
||||||
<?php } ?>
|
|
||||||
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<nav>
|
|
||||||
<?= navbar(1, 'aktiviteter'); ?>
|
|
||||||
<?= loginbar(); ?>
|
|
||||||
</nav>
|
|
||||||
|
@@ -1,56 +1,60 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<?php
|
<?php
|
||||||
date_default_timezone_set('Europe/Oslo');
|
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
|
||||||
setlocale(LC_ALL, 'no_NO');
|
use pvv\side\Agenda;
|
||||||
require __DIR__ . '/../../src/_autoload.php';
|
|
||||||
require __DIR__ . '/../../sql_config.php';
|
|
||||||
use \pvv\side\Agenda;
|
|
||||||
?>
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
<html lang="no">
|
<html lang="no">
|
||||||
<title>Sosialverkstedet</title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<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">
|
<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/normalize.css">
|
||||||
<link rel="stylesheet" href="../css/style.css">
|
<link rel="stylesheet" href="../css/style.css">
|
||||||
|
<link rel="stylesheet" href="../css/nav.css">
|
||||||
<link rel="stylesheet" href="../css/events.css">
|
<link rel="stylesheet" href="../css/events.css">
|
||||||
|
<meta name="theme-color" content="#024" />
|
||||||
|
<title>Animeverkstedet</title>
|
||||||
|
|
||||||
<header>Sosial­verk­stedet</header>
|
<header>Sosial­verk­stedet</header>
|
||||||
|
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
$activity = new \pvv\side\social\AnimekveldActivity;
|
$activity = new pvv\side\social\AnimekveldActivity();
|
||||||
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
|
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable());
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<article>
|
<article>
|
||||||
<h2><img src="../sosiale/animekveld.jpg"><em><?= $nextEvent->getRelativeDate()?></em> Animekveld</h2>
|
<h2><em><?php echo $nextEvent->getRelativeDate(); ?></em> Animekveld
|
||||||
|
<?php if ($nextEvent->getImageURL()) { ?>
|
||||||
|
<img src="<?php echo $nextEvent->getImageURL(); ?>">
|
||||||
|
<?php } ?>
|
||||||
|
</h2>
|
||||||
<ul class="subtext">
|
<ul class="subtext">
|
||||||
<li>Tid:
|
<li>Tid:
|
||||||
<strong>
|
<strong>
|
||||||
<?= Agenda::getFormattedDate($nextEvent->getStart());?>
|
<?php echo Agenda::getFormattedDate($nextEvent->getStart()); ?>
|
||||||
</strong>
|
</strong>
|
||||||
<li>Sted:
|
<li>Sted:
|
||||||
<strong>
|
<strong>
|
||||||
<?= $nextEvent->getLocation();?>
|
<?php echo $nextEvent->getLocation(); ?>
|
||||||
</strong>
|
</strong>
|
||||||
<li>Arrangør:
|
<li>Arrangør:
|
||||||
<strong>
|
<strong>
|
||||||
<?= $nextEvent->getOrganiser();?>
|
<?php echo $nextEvent->getOrganiser(); ?>
|
||||||
</strong>
|
</strong>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<?= implode($nextEvent->getDescription(), "<p>\n</p>")?>
|
<?php
|
||||||
|
$Parsedown = new Parsedown();
|
||||||
|
echo $Parsedown->text(implode("\n", $nextEvent->getDescription()));
|
||||||
|
?>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<nav><ul>
|
<nav>
|
||||||
<li><a href="../">hjem</a></li>
|
<?php echo navbar(1, 'aktiviteter'); ?>
|
||||||
<!--<li><a href="../prosjekt/">prosjekter</a></li>-->
|
<?php echo loginbar($sp, $pdo); ?>
|
||||||
<li><a href="../kalender/">kalender</a></li>
|
|
||||||
<li class="active"><a href="../aktiviteter/">aktiviteter</a></li>
|
|
||||||
<li><a href="../prosjekt/">prosjekter</a></li>
|
|
||||||
<li><a href="../kontakt/">kontakt</a></li>
|
|
||||||
<li><a href="../pvv/">wiki</a></li>
|
|
||||||
</nav>
|
</nav>
|
||||||
|
@@ -1,61 +1,61 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<?php
|
<?php
|
||||||
date_default_timezone_set('Europe/Oslo');
|
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
|
||||||
setlocale(LC_ALL, 'no_NO');
|
use pvv\side\Agenda;
|
||||||
require __DIR__ . '/../../src/_autoload.php';
|
|
||||||
require __DIR__ . '/../../sql_config.php';
|
|
||||||
use \pvv\side\Agenda;
|
|
||||||
?>
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
<html lang="no">
|
<html lang="no">
|
||||||
<title>Sosialverkstedet</title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<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">
|
<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/normalize.css">
|
||||||
<link rel="stylesheet" href="../css/style.css">
|
<link rel="stylesheet" href="../css/style.css">
|
||||||
|
<link rel="stylesheet" href="../css/nav.css">
|
||||||
<link rel="stylesheet" href="../css/events.css">
|
<link rel="stylesheet" href="../css/events.css">
|
||||||
|
<meta name="theme-color" content="#024" />
|
||||||
|
<title>Sosialverkstedet</title>
|
||||||
|
|
||||||
<header>Sosial­verk­stedet</header>
|
<header>Sosial­verk­stedet</header>
|
||||||
|
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
$activity = new \pvv\side\social\BrettspillActivity;
|
$activity = new pvv\side\social\BrettspillActivity();
|
||||||
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
|
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable());
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<article>
|
<article>
|
||||||
|
|
||||||
<h2><em><?= $nextEvent->getRelativeDate()?></em> Brettspillkveld
|
<h2><em><?php echo $nextEvent->getRelativeDate(); ?></em> Brettspillkveld
|
||||||
<?php if ($nextEvent->getImageURL()) { ?>
|
<?php if ($nextEvent->getImageURL()) { ?>
|
||||||
<img src="<?= $nextEvent->getImageURL() ?>">
|
<img src="<?php echo $nextEvent->getImageURL(); ?>">
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</h2>
|
</h2>
|
||||||
<ul class="subtext">
|
<ul class="subtext">
|
||||||
<li>Tid:
|
<li>Tid:
|
||||||
<strong>
|
<strong>
|
||||||
<?= Agenda::getFormattedDate($nextEvent->getStart());?>
|
<?php echo Agenda::getFormattedDate($nextEvent->getStart()); ?>
|
||||||
</strong>
|
</strong>
|
||||||
<li>Sted:
|
<li>Sted:
|
||||||
<strong>
|
<strong>
|
||||||
<?= $nextEvent->getLocation();?>
|
<?php echo $nextEvent->getLocation(); ?>
|
||||||
</strong>
|
</strong>
|
||||||
<li>Arrangør:
|
<li>Arrangør:
|
||||||
<strong>
|
<strong>
|
||||||
<?= $nextEvent->getOrganiser();?>
|
<?php echo $nextEvent->getOrganiser(); ?>
|
||||||
</strong>
|
</strong>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<?= implode($nextEvent->getDescription(), "<p>\n</p>")?>
|
<?php
|
||||||
|
$Parsedown = new Parsedown();
|
||||||
|
echo $Parsedown->text(implode("\n", $nextEvent->getDescription()));
|
||||||
|
?>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<nav><ul>
|
<nav>
|
||||||
<li><a href="../">hjem</a></li>
|
<?php echo navbar(1, 'aktiviteter'); ?>
|
||||||
<!--<li><a href="../prosjekt/">prosjekter</a></li>-->
|
<?php echo loginbar($sp, $pdo); ?>
|
||||||
<li><a href="../kalender/">kalender</a></li>
|
|
||||||
<li class="active"><a href="../aktiviteter/">aktiviteter</a></li>
|
|
||||||
<li><a href="../prosjekt/">prosjekter</a></li>
|
|
||||||
<li><a href="../kontakt/">kontakt</a></li>
|
|
||||||
<li><a href="../pvv/">wiki</a></li>
|
|
||||||
</nav>
|
</nav>
|
||||||
|
@@ -1,14 +1,12 @@
|
|||||||
header.admin {
|
.tools {
|
||||||
margin-top: 3rem;
|
width: 100%;
|
||||||
height: 16rem;
|
margin: 0;
|
||||||
overflow: hidden;
|
padding: 0;
|
||||||
text-align: right;
|
list-style: none;
|
||||||
color: #fff;
|
}
|
||||||
font-family: monospace;
|
|
||||||
padding: 1rem;
|
.tools li {
|
||||||
font-size: 4em;
|
margin: 1.5em 0;
|
||||||
background: url('ja.png') no-repeat 1% 50% #024;
|
|
||||||
background-size: contain;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.event-list {
|
.event-list {
|
||||||
@@ -18,7 +16,8 @@ header.admin {
|
|||||||
|
|
||||||
.event {
|
.event {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 90% 10%;
|
grid-template-columns: auto 5em;
|
||||||
|
|
||||||
margin-bottom: 2em;
|
margin-bottom: 2em;
|
||||||
padding-bottom: .5em;
|
padding-bottom: .5em;
|
||||||
border-bottom: 1px dotted rgba(0,0,0,0.5);
|
border-bottom: 1px dotted rgba(0,0,0,0.5);
|
||||||
@@ -26,6 +25,8 @@ header.admin {
|
|||||||
|
|
||||||
.event-info {
|
.event-info {
|
||||||
grid-column: 1;
|
grid-column: 1;
|
||||||
|
overflow-x: hidden; /*force text wrap*/
|
||||||
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
.event-info h3 {
|
.event-info h3 {
|
||||||
@@ -48,45 +49,16 @@ header.admin {
|
|||||||
|
|
||||||
.event-actions {
|
.event-actions {
|
||||||
grid-column: 2;
|
grid-column: 2;
|
||||||
text-align: center;
|
text-align: right;
|
||||||
|
}
|
||||||
|
.event-actions .btn {
|
||||||
|
margin: 0.3em 0;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.event-actions a {
|
.fullwidth_inputs input,
|
||||||
text-decoration: none;
|
.fullwidth_inputs textarea {
|
||||||
}
|
width: 100%;
|
||||||
|
|
||||||
.gridsplit {
|
|
||||||
padding-top: 1.3em;
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 3fr 1fr;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gridsplit5050 {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 1fr 1fr;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gridl {
|
|
||||||
height: 100%;
|
|
||||||
grid-column: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gridr {
|
|
||||||
height: 100%;
|
|
||||||
padding: 0 1em;
|
|
||||||
margin-left: 1em;
|
|
||||||
border-left: 1px dotted rgba(0,0,0,0.5);
|
|
||||||
grid-column: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gridsplit h1:first-child,
|
|
||||||
.gridsplit h2:first-child,
|
|
||||||
.gridsplit h3:first-child,
|
|
||||||
.gridsplit h4:first-child,
|
|
||||||
.gridsplit h5:first-child,
|
|
||||||
.gridsplit h6:first-child {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.allgrids {
|
.allgrids {
|
||||||
@@ -101,27 +73,6 @@ header.admin {
|
|||||||
float: left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn {
|
|
||||||
text-decoration: none;
|
|
||||||
border: 1px solid #048;
|
|
||||||
color: #048;
|
|
||||||
padding: .2em 1em;
|
|
||||||
border-radius: .2em;
|
|
||||||
white-space: nowrap;
|
|
||||||
display: inline-block;
|
|
||||||
margin-bottom: .25em;
|
|
||||||
}
|
|
||||||
.btn:hover {
|
|
||||||
border-color: #084;
|
|
||||||
background: #eee;
|
|
||||||
color: #084;
|
|
||||||
}
|
|
||||||
.btn:active {
|
|
||||||
border-color: #084;
|
|
||||||
background: #084;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.userlist {
|
.userlist {
|
||||||
table-layout: fixed;
|
table-layout: fixed;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -153,4 +104,4 @@ header.admin {
|
|||||||
.newuserelement input {
|
.newuserelement input {
|
||||||
border: none;
|
border: none;
|
||||||
background-color: #ddd;
|
background-color: #ddd;
|
||||||
}
|
}
|
||||||
|
1
www/css/afterlogic.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 17.01 14.258" enable-background="new 0 0 17.01 14.258"><style type="text/css">.st0{fill:#004166;}</style><path class="st0" d="M14.009 8.551l.01-.019.005-.023.003-.014-.001-.006-.004-.022-.007-.021-.002-.006-4.629-8.382-.006-.006-.009-.013-.01-.01-.012-.009-.006-.005-.006-.002-.013-.005-.015-.004-.016-.002-.006-.002h-1.642l-.015.003-.021.004-.02.01-.017.012-.015.017-.009.011-4.233 7.425-.002.006-.007.021-.005.022-.001.006v2.86l.003.014.005.023.009.019.012.018.017.015.011.009.008.003.009.004.039.008h1.421l.038-.008.009-.004.031-.021.001-.001.019-.025 1.017-1.844h5.067l1.007 1.844.019.025.002.001.03.02.009.004.038.008h1.125l.04-.008.011-.005.023-.015.01-.009.015-.023.006-.011.002-.004.649-1.869.009-.014zm-.843 1.734h-.859l.582-1.678h.859l-.582 1.678zm-1.996-1.855l-.015-.018-.017-.012-.019-.01-.023-.005-.014-.003h-5.2l-.015.003-.023.005-.019.01-.018.012-.015.018-.01.011-1.017 1.844h-1.161l5.679-9.944 4.44 8.041h-.846l-3.426-6.236-.006-.007-.014-.017-.018-.015-.006-.006-.012-.003-.022-.007-.021-.002-.021.002-.021.007-.012.003-.007.006-.017.014-.014.018-.006.006-2.776 5.035-.002.005-.006.021-.005.023-.001.005.003.014.005.024.009.018.012.018.017.015.012.01.007.003.008.003.039.007h3.788l.039-.008.009-.004.007-.003.011-.009.018-.015.012-.017.01-.019.005-.023.003-.015-.001-.006-.004-.022-.007-.022-.002-.005-1.842-3.315-.037-.038.768-1.392 3.335 6.073-.572 1.649-.936-1.714-.01-.011zm-7.647-.863l4.186-7.342h1.383l-5.569 9.75v-2.408zm3.619-1.127h2.653l.378.682h-3.407l.376-.682zm.124-.225l1.198-2.173 1.206 2.173h-2.404zM1.197 14.258l-.13-.325h-.729l-.13.325h-.208l.588-1.464h.226l.591 1.464h-.208zm-.494-1.276l-.312.788h.621l-.309-.788zM2.123 14.258v-1.464h.959v.162h-.776v.472h.762v.162h-.762v.667h-.183zM4.22 14.258v-1.302h-.463v-.162h1.111v.162h-.465v1.302h-.183zM5.637 14.258v-1.464h.959v.162h-.777v.472h.762v.162h-.762v.505h.777v.162h-.959zM8.261 14.258l-.373-.582h-.292v.582h-.183v-1.464h.588c.268 0 .459.171.459.441 0 .263-.18.408-.38.426l.395.597h-.214zm.011-1.023c0-.165-.119-.279-.292-.279h-.384v.56h.384c.173 0 .292-.117.292-.281zM9.275 14.258v-1.464h.182v1.302h.681v.162h-.863zM10.613 13.527c0-.433.292-.757.727-.757.432 0 .727.325.727.757 0 .433-.294.758-.727.758-.435-.001-.727-.326-.727-.758zm1.264 0c0-.342-.211-.595-.538-.595-.329 0-.538.252-.538.595 0 .34.209.595.538.595.328 0 .538-.255.538-.595zM12.644 13.527c0-.454.336-.757.753-.757.259 0 .439.114.569.275l-.145.09c-.092-.119-.248-.202-.424-.202-.321 0-.564.246-.564.595 0 .347.244.597.564.597.176 0 .321-.086.393-.158v-.299h-.503v-.162h.685v.529c-.136.151-.336.252-.575.252-.417-.001-.753-.306-.753-.76zM14.84 14.258v-1.464h.182v1.464h-.182zM15.699 13.527c0-.45.332-.757.753-.757.259 0 .439.125.555.29l-.154.086c-.083-.123-.235-.213-.402-.213-.321 0-.564.246-.564.595 0 .347.244.595.564.595.167 0 .318-.088.402-.213l.156.086c-.123.167-.299.29-.558.29-.421-.002-.752-.309-.752-.759z"/></svg>
|
After (image error) Size: 2.9 KiB |
@@ -1,9 +1,24 @@
|
|||||||
|
.pagination_bar {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 8em auto 8em;
|
||||||
|
grid-template-areas: "left . right";
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.pagination_bar >*:nth-child(1) {
|
||||||
|
grid-area: left;
|
||||||
|
}
|
||||||
|
.pagination_bar >*:nth-child(2) {
|
||||||
|
grid-area: right;
|
||||||
|
}
|
||||||
|
|
||||||
figure.calendar {
|
figure.calendar {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding:0;
|
padding:0;
|
||||||
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calendar ul {
|
.calendar ul {
|
||||||
|
min-width: 43em;
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
padding-left:0;
|
padding-left:0;
|
||||||
|
|
||||||
@@ -35,7 +50,7 @@ figure.calendar {
|
|||||||
min-height: 4.8em;
|
min-height: 4.8em;
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
color: #444;
|
color: #444;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calendar ul li.header {
|
.calendar ul li.header {
|
||||||
@@ -57,7 +72,7 @@ figure.calendar {
|
|||||||
|
|
||||||
.calendar ul li.active {
|
.calendar ul li.active {
|
||||||
color: #222;
|
color: #222;
|
||||||
border-color: #456;
|
border-color: #679;
|
||||||
box-shadow: 0 0 3px #89f;
|
box-shadow: 0 0 3px #89f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,8 +80,34 @@ figure.calendar {
|
|||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.calendar ul li .day{
|
||||||
.calendar ul li section::before {
|
display: inline-block;
|
||||||
content: "\26AB ";
|
width: 1.75em;
|
||||||
color: #038;
|
height: 1.75em;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 1.75em;
|
||||||
|
background: #9ab;
|
||||||
|
color: white;
|
||||||
|
border-radius: 0.875em;
|
||||||
|
margin-bottom: 0.1em;
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar ul li.active .day{
|
||||||
|
background: #248;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar ul li section {
|
||||||
|
line-height: 1.5em;
|
||||||
|
background: #038;
|
||||||
|
color: white;
|
||||||
|
border-radius: 0.75em;
|
||||||
|
text-align: center;
|
||||||
|
padding: 0 0.2em;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.calendar ul li section + section {
|
||||||
|
margin-top: 0.1em;
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
h2 a {
|
h2 a, h4 a {
|
||||||
color: black;
|
color: black;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
h2 a:hover {
|
h2 a:hover, h4 a:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
h2 em {
|
h2 em {
|
||||||
@@ -24,17 +24,28 @@ h2 strong em {
|
|||||||
}
|
}
|
||||||
h2 img {
|
h2 img {
|
||||||
float: right;
|
float: right;
|
||||||
max-width: 5em;
|
|
||||||
border: .2em solid white;
|
|
||||||
box-shadow: 0 2px 2px black;
|
|
||||||
margin-left: 1em;
|
|
||||||
}
|
|
||||||
article:first-child h2 img {
|
|
||||||
max-width: 10em;
|
max-width: 10em;
|
||||||
|
border: .1em solid white;
|
||||||
|
border-radius: 0.1em;
|
||||||
|
box-shadow: 0 2px 2px gray;
|
||||||
|
margin-left: 1em;
|
||||||
|
clear: right;
|
||||||
|
margin-bottom: 0.8em;
|
||||||
|
clear: left;
|
||||||
|
}
|
||||||
|
h4 {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: -0.6em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.subtext {
|
|
||||||
|
h2 + .subtext {
|
||||||
margin: -1.5em 0 1em 0;
|
margin: -1.5em 0 1em 0;
|
||||||
|
}
|
||||||
|
p + .subtext {
|
||||||
|
margin: -0.5em 0 1em 0;
|
||||||
|
}
|
||||||
|
.subtext {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
clear: left;
|
clear: left;
|
||||||
@@ -51,14 +62,75 @@ article:first-child h2 img {
|
|||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 50rem) {
|
.events:before {
|
||||||
h2 img {
|
height: 1px;
|
||||||
display: none;
|
width: 100%;
|
||||||
}
|
display: block;
|
||||||
.subtext {
|
content: " ";
|
||||||
margin-top: -1em;
|
background-image: -webkit-linear-gradient(left, transparent, rgba(0,0,0,.1), transparent);
|
||||||
}
|
background-image: -moz-linear-gradient(left, transparent, rgba(0,0,0,.1), transparent);
|
||||||
.subtext li {
|
background-image: -o-linear-gradient(left, transparent, rgba(0,0,0,.1), transparent);
|
||||||
display: block;
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
.events {
|
||||||
|
margin-top: -1.5em;
|
||||||
|
margin-left: 0.3em;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.events >li {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
border-left: 4px solid #35a;
|
||||||
|
margin-top: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.events li p {
|
||||||
|
text-align: left;
|
||||||
|
line-height: 1.5em;
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.events .subtext {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.events li h4 +.subtext {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 50rem) {
|
||||||
|
article:first-child h2 img {
|
||||||
|
max-width: 12em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media screen and (max-width: 50rem) {
|
||||||
|
h2 {
|
||||||
|
text-align: center;
|
||||||
|
position: relative;
|
||||||
|
border-bottom-left-radius: 0.3em;
|
||||||
|
border-bottom-right-radius: 0.3em;
|
||||||
|
max-height: 30vh;
|
||||||
|
overflow-y: hidden;
|
||||||
|
}
|
||||||
|
h2 em {
|
||||||
|
display: block;
|
||||||
|
top:0;
|
||||||
|
left: 0;
|
||||||
|
position: absolute;
|
||||||
|
|
||||||
|
}
|
||||||
|
h2 img {
|
||||||
|
border: none;
|
||||||
|
box-shadow: none;
|
||||||
|
border-radius: 0.3em;
|
||||||
|
float: none;
|
||||||
|
margin: 0;
|
||||||
|
max-width: none;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
article >.subtext {
|
||||||
|
margin-top: -1em !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|