Compare commits

...

329 Commits
css ... master

Author SHA1 Message Date
Felix Albrigtsen e7b66b4bc6 Revert "Calendar: Remove recurring events for summer break 2024"
This reverts commit ce99b309f8.
2024-09-01 19:45:59 +02:00
Oystein Kristoffer Tveit c62f4d4705 www/tjenester: update wiki link for hjemmesider 2024-08-21 10:46:43 +02:00
Oystein Kristoffer Tveit 814e5bc6c7 www/tjenester: move nettsiden from github to gitea 2024-08-21 10:46:43 +02:00
Oystein Kristoffer Tveit f57edf60c1
flake.nix: remove abundant todos
One had already been fixed, the other one has been converted to a proper
issue on gitea
2024-08-21 07:37:08 +02:00
Felix Albrigtsen a29d3fe803 Err, try again 2024-08-17 23:59:17 +02:00
Felix Albrigtsen 8bcadd1d2d Merge pull request 'Replace deprecated functions to support php 8.3' (#68) from php83-fixes-fr-fr into master
Reviewed-on: #68
Reviewed-by: Oystein Kristoffer Tveit <oysteikt@pvv.ntnu.no>
2024-08-17 20:45:08 +02:00
Felix Albrigtsen 8a82e2795c Various: Replace deprecated functions to support php 8.3 2024-08-17 18:31:43 +02:00
Felix Albrigtsen 4ee8b73044 nix/shell: create slideshow dir 2024-08-17 01:35:14 +02:00
Oystein Kristoffer Tveit 6580cfe546 Merge pull request 'treewide: flip arg order for `implode()`' (#63) from i-am-imploding into master
Reviewed-on: #63
Reviewed-by: Felix Albrigtsen <felixalb@pvv.ntnu.no>
2024-08-04 00:08:52 +02:00
Oystein Kristoffer Tveit a0f9e71d46
treewide: flip arg order for `implode()` 2024-08-04 00:01:34 +02:00
Oystein Kristoffer Tveit 6e4a79ed3d Merge pull request 'Calendar: Remove recurring events for summer break 2024' (#61) from calendar-disable-events into master
Reviewed-on: #61
2024-06-15 00:36:32 +02:00
Felix Albrigtsen ce99b309f8 Calendar: Remove recurring events for summer break 2024 2024-06-11 17:09:35 +02:00
Felix Albrigtsen 37445f42b5 Merge pull request 'Oppdater Matrix-server til Matrix Space™' (#50) from info-updates into master
Reviewed-on: #50
2024-05-30 21:19:42 +02:00
Eirik Witterso 9717c11af5 Fix discord-server og matrix space 2024-05-30 21:19:29 +02:00
Adrian Gunnar Lauterer 2cab4df4b1 Merge pull request 'fix: updated spaceapi coords' (#60) from adriangl-patch-spaceapi-coords into master
Reviewed-on: #60
2024-05-19 22:25:52 +02:00
Adrian Gunnar Lauterer 18c8426246 fix: updated spaceapi coords 2024-05-19 22:09:37 +02:00
Oystein Kristoffer Tveit 4890a0af04
nix/module: fix spaceapi endpoint 2024-05-19 20:06:22 +02:00
Felix Albrigtsen 7bf2c31db3 feat: adds spaceapi endpoint (#57)
A basic implementation of the https://spaceapi.io/ specification.
Tested working door sensor status. Added basic info about us, our website, git forge and wiki.

Co-authored with @sindos and @oysteikt.

Reviewed-on: #57
Co-authored-by: Felix Albrigtsen <felix@albrigtsen.it>
Co-committed-by: Felix Albrigtsen <felix@albrigtsen.it>
2024-05-18 20:05:13 +02:00
Adrian Gunnar Lauterer 13a6df92ce Merge pull request 'Gitea istedenfor gogs på tjenester-siden' (#56) from gitea-i-tjenester into master
Reviewed-on: #56
2024-05-11 22:55:36 +02:00
Adrian Gunnar Lauterer f87c6820d7
services: move gitea above github and remove trac 2024-05-07 21:31:42 +02:00
Adrian Gunnar Lauterer 592c6d46c4
services: replaced gogs with gitea 2024-05-07 21:31:20 +02:00
Felix Albrigtsen 9d9d99e6ba gallery: sort by timestamp. slideshow: fix transition bug on firefox 2024-04-14 01:59:12 +02:00
Oystein Kristoffer Tveit 216e153f89 nix/module: correct some nginx locations directives 2024-04-11 13:19:59 +02:00
Felix Albrigtsen d528df5f99 Merge pull request 'Fix links after moving from spikkje to bekka' (#55) from www2-www-fixes into master
Reviewed-on: #55
2024-04-11 00:43:32 +02:00
Felix Albrigtsen faf93cc45a Fix links after moving from spikkje to bekka 2024-04-11 00:42:12 +02:00
Felix Albrigtsen 1aa4f4fc8a Merge pull request 'Mega PR: Update deps, consolidate config, build with nix, gallery fixes, etc.' (#53) from nixify-ng into master
Reviewed-on: #53
2024-04-10 21:45:10 +02:00
Felix Albrigtsen f1958d9afc galleri: Support .thumbnails 2024-04-10 21:44:58 +02:00
Felix Albrigtsen 7f269f05d6 gallery: Fix usernames/paths in the gallery 2024-04-10 21:44:58 +02:00
Oystein Kristoffer Tveit 7e158c9fc3 Update dependencies 2024-04-10 21:44:58 +02:00
Oystein Kristoffer Tveit d79cd3ad37 dist/pvv.sql: fix failing parts 2024-04-10 21:44:58 +02:00
Felix Albrigtsen f5a6868301 Build new nix {module,package,flake}. Adapt to new config variables
Co-authored-by: h7x4 <h7x4@nani.wtf>
2024-04-10 21:44:58 +02:00
Felix Albrigtsen 310246dd20 Update global config variables 2024-04-10 21:44:58 +02:00
Felix Albrigtsen 151a0d44f6 move gallery/slideshow directories 2024-04-10 21:44:58 +02:00
Felix Albrigtsen 10c70e89f6 Remove 'ticker', deprecated since 1da1785e46 2024-04-10 21:44:58 +02:00
Felix Albrigtsen 318e9cfe6b Update dependencies, fix broken flake 2024-04-10 21:44:58 +02:00
Felix Albrigtsen 1f60b80b98 move sql_config.php to config.php 2024-04-10 21:44:58 +02:00
Felix Albrigtsen 517f39eee9 Update SimpleSamlPHP 2024-04-10 21:44:58 +02:00
Felix Albrigtsen 2f6553225a remove deprecated options and dependencies for dataporten/oauth 2024-04-10 21:44:58 +02:00
Felix Albrigtsen 1eb84eaec8 Merge pull request 'Fix navbar links' (#54) from fix-navbar-links into master
Reviewed-on: #54
2024-04-10 21:38:58 +02:00
Oystein Kristoffer Tveit 3e1a21741f navbar: redirect webmail to modern roundcube 2024-04-08 23:46:28 +02:00
Oystein Kristoffer Tveit da6c1963f8 navbar: redirect wiki to wiki.pvv.ntnu.no 2024-04-08 23:43:06 +02:00
Felix Albrigtsen 0da5d44ea1
Manually cast door state to int (#49) 2023-09-12 20:31:14 +02:00
Felix Albrigtsen 133c4e269d
Re-enable recurring events for Fall 2023 (#48) 2023-09-02 21:25:07 +02:00
Felix Albrigtsen 850c8da95a
Initial nix flake, automate devshell (#47) 2023-09-02 19:55:24 +02:00
Eirik Witterso 1ae6356aa5
Update contact information (#46)
* Update contact information

* Minor fixes to contact page

---------

Co-authored-by: Felix Albrigtsen <felix@albrigtsen.it>
2023-08-20 01:31:53 +02:00
Felix Albrigtsen fa4fa9ad7d
Stop bots scraping mediawiki special pages/diffs/history (#45) 2023-06-14 23:26:28 +02:00
Felix Albrigtsen d43e5faf3c
Summer break; Disable recurring events (#44) 2023-06-11 22:19:14 +02:00
Felix Albrigtsen 57055c9c6f
Fix previous merge (#43)
The previous merge contained a commit and a revert, but the original change remained on master.
2023-04-27 16:05:14 +02:00
Felix Albrigtsen 5fbc1dbc00
Re-enable brettspillkveld (#42)
* Re-add brettspillkveld

Plz fix #40
2023-04-27 16:01:40 +02:00
Felix Albrigtsen e364a5fee0
Stop including BrettspillActivity (#41)
Temporary until april 23
2023-04-17 01:21:15 +02:00
Oystein Kristoffer Tveit a4a6553329
Merge pull request #39 from Programvareverkstedet/add-thunderbird-autoconfig
Add thunderbird autoconfig to .well-known
2023-02-25 23:28:10 +01:00
Oystein Kristoffer Tveit ae81d269fa
Add thunderbird autoconfig to .well-known
This file will make it easier for people to set up thunderbird with a
pvv mail.

Relevant links:
- https://wiki.mozilla.org/Thunderbird:Autoconfiguration
- https://wiki.mozilla.org/Thunderbird:Autoconfiguration:ConfigFileFormat
2023-02-25 23:10:34 +01:00
Felix Albrigtsen 31d9a955df
Merge pull request #37 from Programvareverkstedet/patch
Various patches; Fix admin groups, update deps
2023-01-19 13:58:10 +01:00
Felix Albrigtsen 6bd3ce7731 Add notice on empty image gallery 2023-01-19 13:46:39 +01:00
Felix Albrigtsen 9f45271b18 Update deprecated template syntax 2023-01-19 11:28:29 +01:00
Felix Albrigtsen 567962c947 Fix admins addGroup and removeGroup, missing parameter 2023-01-19 11:27:48 +01:00
Felix Albrigtsen 7defd8b388 Update minor dependency changes 2023-01-19 11:26:56 +01:00
Felix Albrigtsen a7f2c4f2d3
Merge pull request #36 from Programvareverkstedet/linkdash 2023-01-16 16:27:28 +01:00
Felix Albrigtsen 847fe67534
Merge pull request #35 from Programvareverkstedet/2023events 2023-01-16 16:26:01 +01:00
Felix Albrigtsen 79854aee6f Improved linkdash-minecraft-map 2023-01-16 16:22:53 +01:00
Felix Albrigtsen 699876405c Inverted week offset on recurring events 2023-01-16 16:20:54 +01:00
Felix Albrigtsen a734fe6bd3 Add brettspill, drift and hack activities 2023-01-16 14:18:30 +01:00
Felix Albrigtsen c33736a501 Fix minecraft map link 2023-01-16 14:09:09 +01:00
Bjornar Orjansen Kaarevik 3a39ca0f73
Merge pull request #34 from Programvareverkstedet/linkdash
Add wrapper to services page, fix css and favicon
2022-11-29 17:56:29 +01:00
Felix Albrigtsen d8f8aafdd9 Add wrapper to services page, fix css and favicon 2022-11-29 17:52:39 +01:00
Bjornar Orjansen Kaarevik 79ffb1fff5
Merge pull request #33 from Programvareverkstedet/linkdash
Fix top margin on services
2022-11-29 17:35:56 +01:00
Felix Albrigtsen 29c4c67645 Fix top margin on services 2022-11-29 17:31:22 +01:00
Bjornar Orjansen Kaarevik 98da6ada23
Merge pull request #32 from Programvareverkstedet/linkdash
Added linkdash - list of our services
2022-11-29 17:26:10 +01:00
Felix Albrigtsen 1c1656c3bc Added photo gallery to services list 2022-11-29 17:14:03 +01:00
Felix Albrigtsen c489f303ea Add services, fix column styling 2022-11-29 17:07:36 +01:00
Amalie Erdal Mansaker fc0286c277
Merge pull request #31 from Programvareverkstedet/calenderFix
Disabled brettspillkveld and hackekveld
2022-11-27 10:14:21 +01:00
Amalie Erdal Mansaker f4407fde4a Disabled brettspillkveld and hackekveld 2022-11-19 21:23:41 +01:00
Felix Albrigtsen 9f11d442fe
Merge pull request #30 from Programvareverkstedet/video-til-karusell
Replace promo video with slideshow
2022-11-05 20:51:12 +01:00
Aleksander Knutsen 1bc41124c0 Replace promo video with slideshow 2022-11-05 19:06:22 +01:00
Bjornar Orjansen Kaarevik 72fb9e9915
Merge pull request #28 from Programvareverkstedet/brettspillkveld
Added brettspillkveld
2022-09-24 22:05:21 +02:00
Bjornar Orjansen Kaarevik b555f915a0 Added brettspillkveld 2022-09-24 21:58:28 +02:00
Felix Albrigtsen 4b9957e9c5 Add more services, make two columns 2022-09-18 01:24:57 +02:00
Felix Albrigtsen b42214b404 Establish layout for /tjenester 2022-09-17 17:09:35 +02:00
Felix Albrigtsen fcef05d439
Merge pull request #27 from Programvareverkstedet/calendar-changes
Add driftkveld and hackekveld
2022-09-04 00:56:41 +02:00
Felix Albrigtsen 0f8b15715b Add driftkveld and hackekveld 2022-09-04 00:53:30 +02:00
Felix Albrigtsen 8a79d9d016
Merge pull request #26 from Programvareverkstedet/video-embed
Replace old promo-video in /om/
2022-08-09 21:17:18 +02:00
Felix Albrigtsen f507b0cddd Replace old promo-video in /om/ 2022-08-09 20:53:24 +02:00
Felix Albrigtsen 0b25f8d54a
Merge pull request #25 from Programvareverkstedet/video-embed
Front page: Fix missing closing tag
2022-08-08 19:55:44 +02:00
Felix Albrigtsen 4f504e9456 Fix missing closing tag 2022-08-08 19:53:37 +02:00
Felix Albrigtsen 1f32c03d86
Merge pull request #23 from Programvareverkstedet/video-embed
Replace slideshow with promo video
2022-08-08 17:24:53 +02:00
Felix Albrigtsen fc6d5d5f8e Update CSS to preserve video aspect ratio 2022-08-08 16:36:58 +02:00
Felix Albrigtsen 1cde0a2a93 Replace slideshow with promo video 2022-08-08 15:43:23 +02:00
Torstein Nordgård-Hansen 65c0bad9b0
Merge pull request #21 from Programvareverkstedet/calendarChanges
Removed driftskveld
2022-05-26 16:16:52 +02:00
Felix Albrigtsen 9fa6066724 Removed driftskveld temporarily 2022-05-26 14:08:41 +02:00
Felix Albrigtsen a506dc44cc
Merge pull request #20 from Programvareverkstedet/origin/calendarChanges
Removed hackekveld temporarily
2022-03-26 20:39:46 +01:00
Felix Albrigtsen a80114be7a Removed hackekveld temporarily 2022-03-26 20:34:05 +01:00
Felix Albrigtsen ab6edd92e1
Merge pull request #19 from Programvareverkstedet/calendarChanges
Lagt til hackekveld fjerdehver uke
2022-03-15 13:11:13 +01:00
Felix Albrigtsen 6070cf4bd3 Lagt til hackekveld fjerdehver uke 2022-02-17 16:04:42 +01:00
Peder Bergebakken Sundt fdd1d12e9e allow uppercase file extensions 2022-01-31 12:32:33 +01:00
Peder Bergebakken Sundt 6cae4cb0e2 :) 2022-01-29 22:54:52 +01:00
Peder Bergebakken Sundt 15c9431c10 remove nerdepitsa
no-one whent there
2022-01-29 19:34:13 +01:00
Felix Albrigtsen 500ea63c77
Merge pull request #17 from Programvareverkstedet/AddDriftkveld
Added biweekly driftkveld
2022-01-29 19:33:54 +01:00
Torstein Nordgård-Hansen bbe51e702b Added biweekly driftkveld 2022-01-29 19:21:16 +01:00
Felix Albrigtsen ab1bbdd3df Forgot login 2022-01-25 16:23:14 +01:00
Felix Albrigtsen 893f57c9b7 Forgot to remove line 2022-01-25 15:08:37 +01:00
Felix Albrigtsen 184d40266b Clarify dependencies 2022-01-25 15:06:27 +01:00
Felix Albrigtsen 516287ee85 redo css, adaptive scaling 2022-01-25 15:04:00 +01:00
Felix Albrigtsen 3335f5958e Fix typos and missing gitignore 2022-01-25 10:06:59 +01:00
Felix Albrigtsen a7d7ce4da0 Fix typos and missing gitignore 2022-01-25 09:28:42 +01:00
Felix Albrigtsen 1711ce2e5d Fix typo and missing gitignore 2022-01-25 09:22:50 +01:00
Felix Albrigtsen 31e104a150
Merge pull request #16 from Programvareverkstedet/gallery
Gallery of user images on the home page
2022-01-25 09:07:29 +01:00
Felix Albrigtsen c57276b779 Performance, input sanitization, cleanup 2022-01-25 09:05:34 +01:00
Felix Albrigtsen 9e7436684c Modal view, navbar, js folder structure 2022-01-24 16:12:31 +01:00
Felix Albrigtsen a500b5eecc Started visual gallery, expanded fetch-script 2022-01-24 00:22:14 +01:00
Felix Albrigtsen fb5b66f12b Script for fetching pictures from home folders 2022-01-23 01:34:48 +01:00
Peder Bergebakken Sundt e7f9799285 PIIIIIITSAAAAA 2021-11-19 22:44:24 +01:00
Felix Albrigtsen 25212940dd lib/OAuth2-Client: Update submodule 2021-10-25 23:09:21 +02:00
Charlie Root a1d56570b1 Merge branch 'master' of https://github.com/programvareverkstedet/nettsiden 2021-10-17 05:57:17 +02:00
Felix Albrigtsen 15f2154f6a gitignore gallery photos 2021-10-17 05:54:47 +02:00
Charlie Root 6b81b0785f Cleaned gitignore, gallery photos 2021-10-17 05:52:43 +02:00
Felix Albrigtsen 6b243ad91b Added matrix serverfile 2021-10-17 05:43:25 +02:00
Felix Albrigtsen 63e49417a7 UU fix for door sensor 2021-10-13 22:15:35 +02:00
Felix Albrigtsen 6c891b3f79 New door-graph, Improved slideshow, moved video 2021-10-13 10:10:17 +02:00
Felix Albrigtsen a4ce890a36 Testing door sensor graphing 2021-10-11 16:23:18 +02:00
Felix Albrigtsen 2ba0266fca Fix folder structure pt3 2021-10-10 22:11:44 +02:00
Felix Albrigtsen 9f3812b8a5 Fix folder structure pt2 2021-10-10 22:03:36 +02:00
Felix Albrigtsen a9ee7cd6f7 Fix folder structure pt1 2021-10-10 22:02:50 +02:00
Felix Albrigtsen 1c4eb5cfe4 Replaced video with slideshow 2021-10-10 22:01:27 +02:00
Felix Albrigtsen 9162ee70a7 Outdated banner on nerdepitsa 2021-10-05 18:08:19 +02:00
Felix Albrigtsen bdbab5be9e Mobile friendly styling 2021-09-28 00:48:27 +02:00
Felix Albrigtsen 0d87d37c72 Oppdatert romnummer og kontaktinformasjon 2021-09-27 23:37:10 +02:00
Peder Bergebakken Sundt 728f8a6179 Woa, testing a PR on windows was fun 2021-09-08 22:38:17 +02:00
Peder Bergebakken Sundt 8fd03c9824
Merge pull request #15 from Programvareverkstedet/doorsensor
Uploaded door sensor
2021-09-08 22:23:37 +02:00
Felix Albrigtsen fdbbaee175 Handled suggestions -pullrequestreview-749376540 2021-09-08 21:29:36 +02:00
Felix Albrigtsen 9dad49738c Uploaded door sensor 2021-09-04 14:56:48 +02:00
Eirik Witterso 0336236fda Removed recurring events for now 2021-08-17 18:38:31 +02:00
Peder Bergebakken Sundt 9a5e444041 mobile layout 2021-08-13 14:15:54 +02:00
Eirik Witterso cfeba9f8da fixed cache issue 2021-08-12 22:35:50 +02:00
Eirik Witterso 9691433917 Put video on homepage 2021-08-12 22:33:09 +02:00
Peder Bergebakken Sundt db6af95063 Bugfix 2021-08-12 13:44:47 +02:00
Peder Bergebakken Sundt cd1792c130 Add instructions for adding yourself as admin 2021-08-12 13:44:22 +02:00
Peder Bergebakken Sundt dc99df21c2 add .gitattributes 2021-08-12 12:50:01 +02:00
Peder Bergebakken Sundt ecf40334e4 Update dependencies 2021-08-11 22:29:06 +02:00
Peder Bergebakken Sundt e1686cd8c5 Add dockerfile for local development 2021-08-11 22:28:48 +02:00
dependabot[bot] 06bfa81d6e Bump phpmailer/phpmailer from 6.1.6 to 6.5.0
Bumps phpmailer/phpmailer from 6.1.6 to 6.5.0.

---
updated-dependencies:
- dependency-name: phpmailer/phpmailer
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-24 15:37:53 +02:00
Torstein Nordgård-Hansen 5ade47f6dd
Merge pull request #13 from Programvareverkstedet/driftkveld
Fast driftkveld i kalender
2021-03-16 21:13:42 +01:00
Torstein Nordgård-Hansen 7b237f1656 WIP: Fikset typo i include 2021-03-16 21:09:28 +01:00
Peder Bergebakken Sundt 80198d0d98 Make dev.sh download gitmodules
Untested, it'll probably work
2021-03-16 20:49:36 +01:00
Torstein Nordgård-Hansen 3c24435688 WIP: driftkveld i kalenderen 2021-03-16 20:26:38 +01:00
Peder Bergebakken Sundt b50a4a7ad4 Improve readme even more 2021-03-16 20:07:56 +01:00
Peder Bergebakken Sundt 523b30d6f5 Fix dev.sh 2021-03-16 20:00:47 +01:00
Peder Bergebakken Sundt 06e530061d Update readme 2021-03-16 20:00:02 +01:00
Peder Bergebakken Sundt c0c324217c
Merge pull request #12 from Programvareverkstedet/dependabot/composer/symfony/http-kernel-4.4.13
Bump symfony/http-kernel from 4.4.7 to 4.4.13
2020-09-04 23:59:08 +02:00
Sondre Haugen Elgaaen 9b3735ea75 edit "veibeskrivelse" link 2020-09-03 21:25:43 +02:00
Sondre Haugen Elgaaen 9997b8fca9 Merge branch 'master' of https://github.com/Programvareverkstedet/nettsiden 2020-09-03 20:39:58 +02:00
Sondre Haugen Elgaaen 27986e0b1d Update room location and animekveld information 2020-09-03 20:37:55 +02:00
Emma Lu Eikemo fe129fe1b0 updated veibeskrivelse to new location at oppredning/gruvedrift 2020-09-03 20:01:01 +02:00
Emma Lu Eikemo e08b23be05 updated veibeskrivelse to new location at oppredning/gruvedrift 2020-09-03 19:46:34 +02:00
dependabot[bot] 089b34833b
Bump symfony/http-kernel from 4.4.7 to 4.4.13
Bumps [symfony/http-kernel](https://github.com/symfony/http-kernel) from 4.4.7 to 4.4.13.
- [Release notes](https://github.com/symfony/http-kernel/releases)
- [Changelog](https://github.com/symfony/http-kernel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/symfony/http-kernel/compare/v4.4.7...v4.4.13)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-03 09:11:16 +00:00
dependabot[bot] 995b8d7ae7 Bump phpmailer/phpmailer from 6.1.5 to 6.1.6
Bumps [phpmailer/phpmailer](https://github.com/PHPMailer/PHPMailer) from 6.1.5 to 6.1.6.
- [Release notes](https://github.com/PHPMailer/PHPMailer/releases)
- [Changelog](https://github.com/PHPMailer/PHPMailer/blob/master/changelog.md)
- [Commits](https://github.com/PHPMailer/PHPMailer/compare/v6.1.5...v6.1.6)

Signed-off-by: dependabot[bot] <support@github.com>
2020-05-28 16:07:46 +02:00
Peder Bergebakken Sundt d248c94a3d
Merge pull request #10 from Programvareverkstedet/dependabot/composer/simplesamlphp/simplesamlphp-1.18.6
Bump simplesamlphp/simplesamlphp from 1.18.4 to 1.18.6
2020-04-24 18:47:29 +02:00
dependabot[bot] d3584dae44
Bump simplesamlphp/simplesamlphp from 1.18.4 to 1.18.6
Bumps [simplesamlphp/simplesamlphp](https://github.com/simplesamlphp/simplesamlphp) from 1.18.4 to 1.18.6.
- [Release notes](https://github.com/simplesamlphp/simplesamlphp/releases)
- [Changelog](https://github.com/simplesamlphp/simplesamlphp/blob/v1.18.6/docs/simplesamlphp-changelog.md)
- [Commits](https://github.com/simplesamlphp/simplesamlphp/compare/v1.18.4...v1.18.6)

Signed-off-by: dependabot[bot] <support@github.com>
2020-04-22 21:01:55 +00:00
Peder Bergebakken Sundt a45eaab050
Merge pull request #9 from Programvareverkstedet/dependabot/composer/symfony/http-foundation-4.4.7
Bump symfony/http-foundation from 4.4.3 to 4.4.7
2020-04-03 13:35:19 +02:00
dependabot[bot] c6795dc1bf
Bump symfony/http-foundation from 4.4.3 to 4.4.7
Bumps [symfony/http-foundation](https://github.com/symfony/http-foundation) from 4.4.3 to 4.4.7.
- [Release notes](https://github.com/symfony/http-foundation/releases)
- [Changelog](https://github.com/symfony/http-foundation/blob/master/CHANGELOG.md)
- [Commits](https://github.com/symfony/http-foundation/compare/v4.4.3...v4.4.7)

Signed-off-by: dependabot[bot] <support@github.com>
2020-03-31 15:09:04 +00:00
Peder Bergebakken Sundt d1734e8762 Broen er oppe 2020-02-28 16:26:57 +01:00
dependabot[bot] 69582db88f Bump simplesamlphp/simplesamlphp from 1.15.4 to 1.18.4
Bumps [simplesamlphp/simplesamlphp](https://github.com/simplesamlphp/simplesamlphp) from 1.15.4 to 1.18.4.
- [Release notes](https://github.com/simplesamlphp/simplesamlphp/releases)
- [Changelog](https://github.com/simplesamlphp/simplesamlphp/blob/master/docs/simplesamlphp-changelog.md)
- [Commits](https://github.com/simplesamlphp/simplesamlphp/compare/v1.15.4...v1.18.4)

Signed-off-by: dependabot[bot] <support@github.com>
2020-01-29 15:54:39 +01:00
dependabot[bot] 66eb6f0907 Bump robrichards/xmlseclibs from 3.0.1 to 3.0.4
Bumps [robrichards/xmlseclibs](https://github.com/robrichards/xmlseclibs) from 3.0.1 to 3.0.4.
- [Release notes](https://github.com/robrichards/xmlseclibs/releases)
- [Changelog](https://github.com/robrichards/xmlseclibs/blob/master/CHANGELOG.txt)
- [Commits](https://github.com/robrichards/xmlseclibs/compare/3.0.1...3.0.4)

Signed-off-by: dependabot[bot] <support@github.com>
2019-11-19 11:19:09 +01:00
Peder Bergebakken Sundt 74e86ded33 Add Afterlogic Lite mail 2019-09-02 17:42:24 +02:00
Peder Bergebakken Sundt ea7c33cb8e Add git.pvv.ntnu.no to the website 2019-04-08 19:34:31 +02:00
Peder Bergebakken Sundt 5ad772fc26 Add white rasterized logo 2019-04-01 19:36:19 +02:00
Peder Bergebakken Sundt 39126936b0 Fix bug with single digit dates 2018-10-25 00:32:04 +02:00
Peder Bergebakken Sundt c549890b7e Add info on Aktive, and some links pointing to the wiki 2018-09-21 19:39:54 +02:00
Peder Bergebakken Sundt 09d5ebc249 Update kontaktinformasjon to point towards the wiki 2018-09-09 17:46:09 +02:00
Peder Bergebakken Sundt ead8f3a19c Add payment info to /paamelding/ 2018-09-06 13:31:54 +02:00
Peder Bergebakken Sundt c3ada63c69 Whoops
I really feel like doing a commit ammend with force push...
2018-08-29 19:18:22 +02:00
Peder Bergebakken Sundt eb39821f20 Fix some cases of overflowing hendelse text breaking styles here and there 2018-08-29 19:12:39 +02:00
Peder Bergebakken Sundt 59463ebdfb Fix bug where days with string length 1 would break mysql 2018-08-29 19:03:05 +02:00
Peder Bergebakken Sundt d1612e2804 Fix utf8 and JSON issues resulting from MYSQL being weird 2018-08-24 13:53:18 +02:00
Peder Bergebakken Sundt 07c1a90845 Whoops again 2018-08-24 13:24:42 +02:00
Peder Bergebakken Sundt d0613a8734 Whoops 2018-08-24 12:41:28 +02:00
Peder Bergebakken Sundt dd2ca22bba Add door sensor REST api
We have yet to add the door states to the frontpage or something
2018-08-24 12:28:06 +02:00
Peder Bergebakken Sundt 69ed1df0d1 Change casing on frontpage activities 2018-08-23 19:09:58 +02:00
Peder Bergebakken Sundt 386b0bfcbf Fix spacing on project info pages on smaller mobiles 2018-08-23 16:05:35 +02:00
Markus Wang Halvorsen 2b3d6d7026 Add info pages for individual events 2018-08-19 15:33:10 +02:00
Markus Wang Halvorsen b29106bcbe Touch up project info member list
Small stuff like not showing the members title when there are no members, hiding leave/join buttons to the owner, etc.
2018-08-19 14:51:08 +02:00
Markus Wang Halvorsen 6cc8e5e0da Don't show projects you don't own in my projects 2018-08-19 14:44:44 +02:00
Peder Bergebakken Sundt 221f61c496 Fix kalender button overlaying with header on hendelser on mobile 2018-08-14 22:55:36 +02:00
Peder Bergebakken Sundt f37919c850 Fix subtext on hendelser page on mobile 2018-08-14 22:53:30 +02:00
Peder Bergebakken Sundt d3234d0204 Fix hendelses page on mobile 2018-08-14 22:47:25 +02:00
Peder Bergebakken Sundt 6d13f47815 Set theme-color to #024 2018-08-14 03:29:10 +02:00
Peder Bergebakken Sundt e54142021a Tweak project edit page, making it use the available space better and react better 2018-08-14 03:25:24 +02:00
Peder Bergebakken Sundt cc2241f71a Make the project info page mobile friendly 2018-08-14 02:53:11 +02:00
Peder Bergebakken Sundt cb9283be16 Move rainloop to the left, making it the first choice on mobile
The rainloop mobile interface is actually pretty good.
2018-08-14 02:26:22 +02:00
Peder Bergebakken Sundt 22a08bfb04 Make the awesome carrier pidgin respect my phone 2018-08-14 02:24:07 +02:00
Peder Bergebakken Sundt 2f22451fa6 Make labels in list of webmail clients have larger text 2018-08-14 02:10:21 +02:00
Peder Bergebakken Sundt 7dc892b757 Ensure all pages react to mobile browsers
In addition: add <header> to all pages
2018-08-14 02:09:57 +02:00
Peder Bergebakken Sundt 7b08ea6a22 Remove old PR and trikom project pages 2018-08-14 02:02:28 +02:00
Peder Bergebakken Sundt fc35b804e4 Make the buttons on the landing page a little less intrusive 2018-08-13 19:07:08 +02:00
Peder Bergebakken Sundt 376c7ad890 Fix markdown header formatting in motd 2018-08-13 18:57:26 +02:00
Peder Bergebakken Sundt 9f7ef8bdb1 Remove debug statement from motd editor 2018-08-13 18:57:07 +02:00
Peder Bergebakken Sundt d4bdad8d5e Fix /hendelser styling for events with no body 2018-08-13 18:48:03 +02:00
Peder Bergebakken Sundt 7669566f81 Expand agenda->getNextDays() to include events on current day which have passed. 2018-08-13 18:47:17 +02:00
Peder Bergebakken Sundt 023b53fa95 Remove old admin interface logo 2018-08-13 18:33:37 +02:00
Peder Bergebakken Sundt 17ef9288ef Replace the awesome carrier pidgin with something a little less watermarked 2018-08-12 03:57:31 +02:00
Peder Bergebakken Sundt a600f8170a Fix webmail title 2018-08-12 03:57:22 +02:00
Peder Bergebakken Sundt 1540292458 Delete two unnused pages 2018-08-12 03:56:58 +02:00
Peder Bergebakken Sundt 3dc3b37044 Minor styling tweaks 2018-08-12 03:56:45 +02:00
Peder Bergebakken Sundt 52a50017c6 Hide unnused <header>s for now 2018-08-12 03:56:18 +02:00
Peder Bergebakken Sundt fbcae7b67d Fix pagination buttons and mobile view of kalender 2018-08-12 03:55:41 +02:00
Peder Bergebakken Sundt 69dcc15bea Fix navbar in brettspill 2018-08-12 03:55:04 +02:00
Peder Bergebakken Sundt 31a7470b37 Fix aktiviter in mobile mode 2018-08-12 03:54:39 +02:00
Peder Bergebakken Sundt 79e413d194 Switch to useing markdown for user formatted text 2018-08-12 03:52:55 +02:00
Peder Bergebakken Sundt 307eba4218 Disallow visiting unexisting project pages 2018-08-12 03:43:50 +02:00
Peder Bergebakken Sundt 5ef3bc68a0 Revert pagesize test value commited in 5205a3f0 2018-08-12 00:59:28 +02:00
Peder Bergebakken Sundt 5205a3f095 Fix filter and pagination combo on admin event page 2018-08-12 00:52:34 +02:00
Peder Bergebakken Sundt 309e308518 My solution is better 2018-08-10 23:51:34 +02:00
Yorin Anne De Jong 90297af982 Change design for project cards 2018-08-10 23:30:36 +02:00
Yorin Anne De Jong e1e053af27 Make image borders sharper 2018-08-10 23:24:08 +02:00
Yorin Anne De Jong e72bd066be Prevent wrong aligning of calendar items on the homepage 2018-08-10 23:20:32 +02:00
Yorin Anne De Jong 474895c2a3 Make shadow behind user menu semi-transparent 2018-08-10 23:13:52 +02:00
Yorin Anne De Jong 1066f42861 User menu on hover 2018-08-10 22:37:26 +02:00
Yorin Anne De Jong 928647e6cc Move user button before user menu, for later CSS changes 2018-08-10 22:30:01 +02:00
Yorin Anne De Jong 47c8ac90cb Larger line height for events to make it look less compressed 2018-08-10 22:22:04 +02:00
Yorin Anne De Jong 618c7c3eef Make image borders sharper 2018-08-10 22:19:25 +02:00
Yorin Anne De Jong 2c2d1ab446 Replace Raleway with Lato 2018-08-10 22:19:14 +02:00
Peder Bergebakken Sundt 88e258a0fb Add some HTML5 doctypes 2018-08-10 00:20:03 +02:00
Peder Bergebakken Sundt 29a41f5ad8 Fix admin event editor
The date field was a lot of work, but it's a lot easier to use now.
2018-08-10 00:19:16 +02:00
Peder Bergebakken Sundt 13518f7fff Fix admin event list style 2018-08-10 00:18:28 +02:00
Peder Bergebakken Sundt 90ece46dd7 Minor tweaks to design, labels and navbar 2018-08-09 22:28:34 +02:00
Peder Bergebakken Sundt d92e53f0b7 Disallow invalid event dates.
this froze the simpleevent class
2018-08-09 22:27:28 +02:00
Peder Bergebakken Sundt b965da0a6c Add ability to join and leave groups, get row id in a way supported by both mysql and sqlite 2018-08-09 00:50:31 +02:00
Peder Bergebakken Sundt a63bc3e6a9 Fix the project editor and a delete feature 2018-08-09 00:48:53 +02:00
Peder Bergebakken Sundt 1147c1a7af Fix the filter in Mine Projekter to seach description and pagination
I also expanded the page size from 4 to 8
2018-08-09 00:46:36 +02:00
Peder Bergebakken Sundt 34668cb0ea Make it possible to view projects in more detail 2018-08-09 00:45:06 +02:00
Peder Bergebakken Sundt adab82964d Update animekveld and nerdepitsa sales pitches 2018-08-09 00:43:22 +02:00
Peder Bergebakken Sundt 21390d8ce8 Fix /mail navbar 2018-08-09 00:42:36 +02:00
Peder Bergebakken Sundt 6601ec041e Make list of projects look nice. Added Drift and Styret on the top 2018-08-09 00:41:54 +02:00
Peder Bergebakken Sundt 4445f659a7 Fix ugly form submit buttons
Chrome, and maybe other browsers, for some reason add a border to these
2018-08-09 00:34:41 +02:00
Peder Bergebakken Sundt 202f2ce12a Disable annoying navbar behaviour
Navbar would link to the url "#" if the buttons is "active". Being nested inside some menu is annoying when you want to return to the toplevel
2018-08-09 00:33:14 +02:00
Peder Bergebakken Sundt 734a3b023f Add an awesome carrier pidgin to the Kontakt page 2018-08-09 00:32:44 +02:00
Peder Bergebakken Sundt be5b1d7b81 Fix webpages being larger than the viewport despite being empty 2018-08-07 00:30:34 +02:00
Peder Bergebakken Sundt cb3949f6e8 Fix changing user permissions. usernames with _ in them would be split into multiple users
This page is utterly broken and deserves a rewrite.
delimiting fields with "_" is a bad idea.
But i'm too lazy to be bothered. Don't call me when the db breaks
2018-08-06 23:33:04 +02:00
Peder Bergebakken Sundt f5c088fdc1 Remove kalender and aktiviteter from navbar, add Hendelser. Change webmail to /mail
Finally
2018-08-06 23:34:54 +02:00
Peder Bergebakken Sundt 6c7241a2ac Add /mail
This page will replace the current webmail subdomain
2018-08-06 23:34:52 +02:00
Peder Bergebakken Sundt 8dcc899c34 Add "Kalender" button to /hendelser
Makes navigation a bit more intuitive. The label is subject to change.
It might even be changed from a button style link to a normal link.
2018-08-06 23:34:09 +02:00
Peder Bergebakken Sundt 32cc4ec27f Fix MOTD
It now won't require there to be at least one entry in the motd table.
I also tidied up the motd class
2018-08-06 23:33:32 +02:00
Peder Bergebakken Sundt 29ac0ece7e Add /PNG and /pvv.svg
This page was not checked into the git repository. Untracked files in the git repo on the server makes my head hurt
2018-08-06 23:33:04 +02:00
Peder Bergebakken Sundt 3117f466b5 Update dependencies and dist files 2018-03-05 19:20:22 +01:00
Markus Wang Halvorsen 9fec2d56f4 Don't allow people who don't own a project to update it 2018-02-26 16:26:10 +01:00
Markus Wang Halvorsen e60195d431 Migrate project owners to the project member table
... to keep project membership tidy and centralized
This puts organizer fitlers out of commission for now
2018-02-26 16:24:50 +01:00
Markus Wang Halvorsen 54467ab9b9 Small project member related fixes 2018-02-24 21:09:31 +01:00
Markus Wang Halvorsen 30c8aa2032 Groundwork for project members
Tools for adding/removing members are coming soon (tm)
2018-02-24 21:09:15 +01:00
Markus Wang Halvorsen d984dfb89c Begin work on project pages
Also store project owners' emails as contact info
2018-02-24 19:41:57 +01:00
Markus Wang Halvorsen 63200f863b Fix login button font when not active 2018-02-24 19:23:27 +01:00
Markus Wang Halvorsen 2a3f0d7be7 Add MOTD table to SQL schema 2018-02-24 19:20:34 +01:00
Markus Wang Halvorsen 5412414ce1 Assimilate hendelser into the new standard 2018-02-24 17:56:42 +01:00
Markus Wang Halvorsen ebe3ce0e1e Better text breaking on hendelser 2018-02-24 17:49:17 +01:00
Markus Wang Halvorsen 43fb843b17 Fix missing p tag without violating the purity of plaintext 2018-02-24 17:45:51 +01:00
Markus Wang Halvorsen 3ccaf69549 Fix påmelding
screwed this up during merge prep, it ended up with basically the same content twice
2018-02-24 17:30:56 +01:00
Markus Wang Halvorsen ec69d5f724
Merge pull request #2 from halworsen/redesign
New design
2018-02-24 17:15:31 +01:00
Markus Wang Halvorsen 6777048dac Fix login button on all pages
By passing PDO to the login bar so admins get their link
2018-02-24 17:02:00 +01:00
Markus Wang Halvorsen 3832d3fde0 Fix project description error in my projects page 2018-02-24 16:57:38 +01:00
Markus Wang Halvorsen 32f9653a6d Prepare for merge 2018-02-24 16:53:17 +01:00
Peder Bergebakken Sundt 48d79f2635 Design tweaks 2018-02-20 20:45:03 +01:00
Peder Bergebakken Sundt 54428c2bab Tweak calendar design 2018-02-20 20:31:28 +01:00
Peder Bergebakken Sundt 4ca408b8fe Add colors to events and day-numbers in calendar 2018-02-20 20:07:32 +01:00
Peder Bergebakken Sundt 550161bba2 Add colors to each event in hendelse 2018-02-20 19:36:06 +01:00
Peder Bergebakken Sundt f6174706f8 Started work on /hendelser/
This may replace /aktiviteter/ and /kalender/ in the navbar, and further link to those two
2018-02-20 18:57:38 +01:00
Peder Bergebakken Sundt c2374d999d Fix bug with simpleevents where the description didn't start with <p> tags 2018-02-20 18:56:02 +01:00
Peder Bergebakken Sundt 66504057b2 Fix bug in /aktiviteter/ when viewing a spesific date 2018-02-20 16:18:43 +01:00
Peder Bergebakken Sundt f3b95fe641 Fix bug with webmail link in navbar not working
the webmail link in the  navbar didn't work properly on other pages than the frontpage, due to prepending a "../" to the external link
2018-02-19 15:48:51 +01:00
Peder Bergebakken Sundt b016d27adb Fix /nerdepitsa and /anime navbar 2018-02-17 17:25:30 +01:00
Markus Wang Halvorsen d44cf95736 Create MOTD table in SQL setup 2018-02-17 13:58:57 +01:00
Markus Wang Halvorsen cf058dc7a9 Project cards 2018-02-14 17:56:19 +01:00
Markus Wang Halvorsen 9f935cd810 Implode with <br> 2018-02-14 17:55:41 +01:00
Yorin Anne De Jong e88411eea4 Make the top menu as wide as possible 2018-02-13 23:15:51 +01:00
Yorin Anne De Jong 0bce2053cf Fix missing namespace 2018-02-13 19:19:32 +01:00
Yorin Anne De Jong 1d65cab11d Add hover effect for user menu 2018-02-13 19:17:09 +01:00
Yorin Anne De Jong 8f2299cee5 Fix regression where login button was not enabled when menu is open 2018-02-13 19:14:41 +01:00
Yorin Anne De Jong ba0fe09d06 Workaround for PHP 5 2018-02-13 19:10:47 +01:00
Yorin Anne De Jong 73efba625b Add a central include file 2018-02-13 19:08:41 +01:00
Yorin Anne De Jong f2b75c81c1 Make sure that the user menu appears over the login button 2018-02-13 18:52:38 +01:00
Yorin Anne De Jong 060d37c040 Better styling of the user menu 2018-02-13 18:44:36 +01:00
Yorin Anne De Jong 24b6af1799 Add admin button to user menu, if admin 2018-02-13 18:30:49 +01:00
Yorin Anne De Jong edde8b6927 Prevent strange jumping when opening menu, and add hover effects 2018-02-13 18:17:41 +01:00
Yorin Anne De Jong 528ea62f38 Set link to anchor for current page, to easily dismiss menu 2018-02-13 17:24:08 +01:00
Markus Wang Halvorsen 87c6523f35 Responsive design for landing page content 2018-02-13 17:23:21 +01:00
Yorin Anne De Jong a4b01d1259 Add link to favicon 2018-02-13 17:11:39 +01:00
Yorin Anne De Jong f811286e52 Align login menu 2018-02-13 17:11:11 +01:00
Yorin Anne De Jong c38932046a Small alignment fix 2018-02-13 17:05:09 +01:00
Markus Wang Halvorsen f2a14f3791 Only show MOTD title if it is set 2018-02-13 17:02:03 +01:00
Yorin Anne De Jong 53af8dae44 Fix a regression where it is hard to close the menu on mobile 2018-02-13 17:00:01 +01:00
Markus Wang Halvorsen 1db31b9e56 Add MOTD 2018-02-13 16:58:54 +01:00
Markus Wang Halvorsen af97383e01 last one of these i promise 2018-02-13 16:54:39 +01:00
Yorin Anne De Jong c12f38f133 No user menu when not logged in 2018-02-13 16:51:43 +01:00
Yorin Anne De Jong e7f11aee54 Improve login/logout buttons 2018-02-13 16:48:00 +01:00
Markus Wang Halvorsen 98f882233c Implode project description everywhere else
Forgot these
2018-02-13 16:41:03 +01:00
Markus Wang Halvorsen 5e10d53c36 Fix newlines in project descriptions 2018-02-13 16:28:59 +01:00
Yorin Anne De Jong fe1e012db3 Add login icon 2018-02-13 16:24:16 +01:00
Yorin Anne De Jong e93b07f890 Strange hack when using position:absolute 2018-02-13 16:11:14 +01:00
Yorin Anne De Jong 46eed1c223 Make navbar absolute positioned, so it scrolls 2018-02-13 16:07:28 +01:00
Yorin Anne De Jong 1e973c31b2 Concentrate position statement in one rule 2018-02-13 16:06:54 +01:00
Yorin Anne De Jong 84b6b60a37 Use CSS tables for the navbar 2018-02-13 16:01:19 +01:00
Markus Wang Halvorsen 774f2754a0 Remove rogue header tag 2018-02-13 15:51:57 +01:00
Markus Wang Halvorsen 89ce6773a8 Redo landing page main body
MOTD is WIP
2018-02-13 15:50:45 +01:00
Yorin Anne De Jong 1f2de139eb Add McDonalds menu 2018-02-13 15:24:27 +01:00
Yorin Anne De Jong 4efe0aaefa Capitalize menu items 2018-02-13 15:23:38 +01:00
Markus Wang Halvorsen 05dee57ded Remove gender inequality
Got a complaint that the admin tools title wasn't very inclusive towards the fairer sex. The title has been edited to be gender neutral
2018-02-13 15:00:14 +01:00
Yorin Anne De Jong 2d850c719d Make navbar darker and have fancy underline hover-effect 2018-02-13 14:53:51 +01:00
Yorin Anne De Jong 0d0305cf04 Fix bug that prevented the active page from being marked in nav 2018-02-13 14:53:33 +01:00
Yorin Anne De Jong 02f54c4458 Fix indentation for font CSS 2018-02-13 14:46:48 +01:00
Yorin Anne De Jong 39dfafd538 Revert "Add 32x32 favicon"
Some browsers take the 32x32 and scale it down to 16x16,
instead of taking the 16x16 sprite.

This reverts commit 6162e2662c.
2018-02-12 00:08:51 +01:00
Yorin Anne De Jong 6162e2662c Add 32x32 favicon 2018-02-11 02:48:55 +01:00
Peder Bergebakken Sundt 8a47ad96de Fix sendmail bounce 2018-02-11 01:18:43 +01:00
Peder Bergebakken Sundt 61e7c73901 Fix db activities on frontpage without url 2018-02-11 01:01:05 +01:00
Peder Bergebakken Sundt e98084aaf4 Remove /kurs 2018-02-10 18:38:09 +01:00
Peder Bergebakken Sundt 9f38e2af1a Move agenda creation to single include
This is to minimize problems arizing from adding and removing recurring events
2018-02-10 18:37:02 +01:00
Yorin Anne De Jong 8b148fe0e3 Add 16x16 favicon 2018-02-10 18:34:09 +01:00
Yorin Anne De Jong ebedc31fb6 Norwegian localisation fixes 2018-02-10 18:08:53 +01:00
Peder Bergebakken Sundt 25da4a80f2 Fix navbar on some pages 2018-02-10 18:05:38 +01:00
Peder Bergebakken Sundt b914590ea8 Reduce the use of Raleways to headers and list items 2018-02-10 18:05:01 +01:00
Peder Bergebakken Sundt 5dd2260948 Fix dbactivity queries, missing a required column 2018-02-10 18:01:53 +01:00
Peder Bergebakken Sundt 6f2ab1ac00 Add mysql schemes and add test admin user for sqlite 2018-02-10 18:00:32 +01:00
Markus Wang Halvorsen 689428241c Fix html for project pages 2018-02-10 16:39:30 +01:00
Markus Wang Halvorsen 0b0707eafe Fix html for the rest of the main pages 2018-02-10 16:23:17 +01:00
Markus Wang Halvorsen c4c5389fe8 Fix admin css 2018-02-10 16:13:18 +01:00
Markus Wang Halvorsen 32aa9e077c Show admin page link to admins 2018-02-10 15:42:01 +01:00
Markus Wang Halvorsen 56e6766520 Move navbar CSS to its own file 2018-02-10 15:04:57 +01:00
Markus Wang Halvorsen b1623f9da1 Minor navbar adjustments 2017-11-14 11:40:28 +01:00
Markus Wang Halvorsen 1ea96f5c0d New navbar
mobile still wip
2017-11-13 23:13:24 +01:00
Markus Wang Halvorsen 2ee9a98277 white logos 2017-11-13 22:01:33 +01:00
Markus Wang Halvorsen 1f47b3849e Landing changes i forgot to stage
im smart :)
2017-11-13 14:20:07 +01:00
Markus Wang Halvorsen ede224c2f2 Move general info to landing header 2017-11-13 14:18:08 +01:00
Markus Wang Halvorsen c6cd02486d Redesign navbar and landing page 2017-11-13 13:21:51 +01:00
158 changed files with 15561 additions and 1828 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
*.sh text eol=lf
*.bat text eol=crlf

4
.gitignore vendored
View File

@ -1,5 +1,5 @@
/sql_config.php /result
/dataporten_config.php /config.php
*.sqlite *.sqlite
/test.sql /test.sql
/vendor/ /vendor/

7
Dockerfile Normal file
View 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

View File

@ -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

View File

@ -1,8 +1,15 @@
{ {
"require": { "name": "programvareverkstedet/nettsiden",
"simplesamlphp/simplesamlphp": "~1" "description": "Programvareverkstedets nettside",
"license": "proprietary",
"config": {
"allow-plugins": {
"simplesamlphp/composer-module-installer": true
}
}, },
"require-dev": { "require": {
"ext-pdo_sqlite": "*" "simplesamlphp/simplesamlphp": "^2.2",
"erusev/parsedown": "^1.7"
} }
} }

3527
composer.lock generated

File diff suppressed because it is too large Load Diff

11
dev.bat
View File

@ -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
View File

@ -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/

24
dist/config.local.php vendored Normal file
View File

@ -0,0 +1,24 @@
<?php
$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 = array("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
View File

@ -0,0 +1,6 @@
<?php
$configFile = getenv('PVV_CONFIG_FILE');
require_once($configFile);
?>

View File

@ -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' => "",
];

31
dist/pvv.sql vendored
View File

@ -11,13 +11,40 @@ CREATE TABLE "events" (
CREATE TABLE "projects" ( CREATE TABLE "projects" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT, "id" INTEGER PRIMARY KEY AUTOINCREMENT,
"name" TEXT, "name" TEXT,
"owner" TEXT,
"owneruname" TEXT,
"description" TEXT, "description" TEXT,
"active" BOOLEAN "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" ( CREATE TABLE "users" (
"uname" TEXT, "uname" TEXT,
"groups" INT DEFAULT 0 "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);

47
dist/pvv_mysql.sql vendored Normal file
View File

@ -0,0 +1,47 @@
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);

View File

@ -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',
);

View File

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

1301
dist/simplesamlphp-config.php vendored Normal file

File diff suppressed because it is too large Load Diff

23
dist/simplesamlphp-idp.php vendored Normal file
View File

@ -0,0 +1,23 @@
<?php
$metadata['https://idp.pvv.ntnu.no/'] = array (
'metadata-set' => 'saml20-idp-remote',
'entityid' => 'https://idp.pvv.ntnu.no/',
'SingleSignOnService' =>
array (
0 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://idp.pvv.ntnu.no/simplesaml/saml2/idp/SSOService.php',
),
),
'SingleLogoutService' =>
array (
0 =>
array (
'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',
);

View File

@ -1,5 +0,0 @@
<?php
$dbDsn = 'sqlite:'.__DIR__.DIRECTORY_SEPARATOR.'pvv.sqlite';
$dbUser = null;
$dbPass = null;

21
docker-compose.yaml Normal file
View 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 Normal file
View File

@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1707939175,
"narHash": "sha256-D1xan0lgxbmXDyzVqXTiSYHLmAMrMRdD+alKzEO/p3w=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "f7e8132daca31b1e3859ac0fb49741754375ac3d",
"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
View 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.php82; };
});
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; };
});
};
}

11
inc/agenda.php Normal file
View File

@ -0,0 +1,11 @@
<?php
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),
]);

33
inc/include.php Normal file
View File

@ -0,0 +1,33 @@
<?php
// 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 \pvv\side\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'];

View File

@ -1,20 +1,28 @@
<?php <?php
function navbar($depth, $active = NULL) { function navbar($depth, $active = NULL) {
$result = "\n\t<ul>\n"; $result = "\n\t<ul id=\"menu\">\n";
$menuItems = [ $menuItems = [
'hjem' => '', 'Hjem' => '',
'kalender' => 'kalender', 'Hendelser' => 'hendelser',
'aktiviteter' => 'aktiviteter', //'Kalender' => 'kalender',
'prosjekter' => 'prosjekt', //'Aktiviteter' => 'aktiviteter',
'kontakt' => 'kontakt', 'Prosjekter' => 'prosjekt',
'webmail' => 'https://webmail.pvv.ntnu.no/', 'Kontakt' => 'kontakt',
'wiki' => 'pvv', 'Webmail' => 'https://webmail.pvv.ntnu.no/roundcube/',
'Galleri' => 'galleri',
'Wiki' => 'https://wiki.pvv.ntnu.no/',
'Git' => 'https://git.pvv.ntnu.no/',
'Tjenester' => 'tjenester',
]; ];
foreach($menuItems as $caption => $link) { foreach($menuItems as $caption => $link) {
if ($caption !== 'webmail') { $isActive = $active === $link;
if (substr( $link, 0, 4 ) != "http") {
$link = rtrim(str_repeat('../', $depth) . $link, '/') . '/'; $link = rtrim(str_repeat('../', $depth) . $link, '/') . '/';
} }
$result .= "\t\t<li" . ($active === $link ? ' class="active"' : '') . '>'
//if ($isActive) $link = '#';
$result .= "\t\t<li" . ($isActive ? ' class="active"' : '') . '>'
. '<a href="' . $link . '">' . '<a href="' . $link . '">'
. $caption . $caption
. "</a></li>\n" . "</a></li>\n"
@ -23,18 +31,40 @@ function navbar($depth, $active = NULL) {
return $result . "\t</ul>\n"; return $result . "\t</ul>\n";
} }
function loginBar($sp = 'default-sp') { function loginBar($sp = null, $pdo = null) {
if (is_null($sp)) $sp = 'default-sp';
$result = "\n"; $result = "\n";
require_once(__DIR__ . '/../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php'); require_once(__DIR__ . '/../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new SimpleSAML_Auth_Simple($sp); $as = new \SimpleSAML\Auth\Simple($sp);
$svg = '<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 64 64">
<circle cx="32" cy="27" r="14" stroke-width="0" />
<ellipse cx="32" cy="66" rx="24" ry="28" stroke-width="0" />
</svg>
';
$attr = $as->getAttributes(); $attr = $as->getAttributes();
if($attr) { if($attr) {
$uname = $attr['uid'][0]; $uname = $attr['uid'][0];
$result .= "\t<p class=\"login\">logget inn som: " . htmlspecialchars($uname) . "</p>\n"; $isAdmin = false;
} else { if (isset($pdo)) {
$result .= "\t<a class=\"login\" href=\"" . htmlspecialchars($as->getLoginURL()) . "\">logg inn</a>\n"; $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>&#9776;&nbsp;</big>MENU</a>\n";
return $result; return $result;
} }

View File

@ -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;">,&nbsp;</i>';
} else{
echo '<i style="opacity:0.7;">&nbsp;og&nbsp;</i>';
}
echo '<a href="' . $event->getURL() . '">' . $event->getName() . '</a>';
$i = $i + 1;
}
break;
}
}
?>
</ul>

@ -1 +0,0 @@
Subproject commit 7b2dc91100becd0c3d15de8764ad279ded0d3a58

254
nix/module.nix Normal file
View 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
View File

@ -0,0 +1,28 @@
{ lib
, php
, extra_files ? { }
}:
php.buildComposerProject rec {
src = ./..;
pname = "pvv-nettsiden";
version = "0.0.1";
vendorHash = "sha256-sWC5E60toa95re2NugvHVPT+vKYXc1I6Z3rSqXxTUu0=";
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
View 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;
};
}

39
nix/shell.nix Normal file
View File

@ -0,0 +1,39 @@
{ pkgs }:
let
phpEnv = pkgs.php82.buildEnv {
extensions = { enabled, all }: enabled ++ (with all; [ iconv mbstring pdo_mysql pdo_sqlite ]);
};
in
pkgs.mkShellNoCC {
buildInputs = with pkgs; [
phpEnv
php82Packages.composer
sqlite
git
];
shellHook = ''
alias runDev='php -S localhost:1080 -d error_reporting=E_ALL -d display_errors=1 -t www/'
# Prepare dev environment with sqlite and config files
test -e pvv.sqlite || sqlite3 pvv.sqlite < dist/pvv.sql
test -e config.php || cp -v dist/config.local.php config.php
if [ ! -d www/galleri/bilder/slideshow ] ; then
mkdir -p www/galleri/bilder/slideshow
fi
if [ ! -d vendor ] ; then
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/www/ www/simplesaml
fi
'';
}

23
pvv.sql
View File

@ -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
);

View File

@ -32,7 +32,7 @@ class UserManager{
} }
public function addGroup($uname, $group){ public function addGroup($uname, $group){
$userFlags = $this->getUsergroups(); $userFlags = $this->getUsergroups($uname);
if($userFlags){ if($userFlags){
$newFlags = ($group | $userFlags); $newFlags = ($group | $userFlags);
@ -41,7 +41,7 @@ class UserManager{
} }
public function removeGroup($uname, $group){ public function removeGroup($uname, $group){
$userFlags = $this->getUsergroups(); $userFlags = $this->getUsergroups($uname);
if($userFlags){ if($userFlags){
$newFlags = ($userFlags & (~ $group)); $newFlags = ($userFlags & (~ $group));
@ -96,7 +96,9 @@ class UserManager{
$statement->bindParam(':uname', $uname, PDO::PARAM_STR); $statement->bindParam(':uname', $uname, PDO::PARAM_STR);
$statement->execute(); $statement->execute();
return $statement->fetch()[0]; $row = $statement->fetch();
if ($row == false) return 0;
return $row[0];
} }
public function getUsergroupNames($uname){ public function getUsergroupNames($uname){

View File

@ -6,6 +6,8 @@ use \DateInterval;
class Agenda { class Agenda {
private $activities;
const TODAY = 0; const TODAY = 0;
const TOMORROW = 1; const TOMORROW = 1;
const THIS_WEEK = 2; const THIS_WEEK = 2;
@ -18,7 +20,7 @@ class Agenda {
} }
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) { public function getEventsBetween(DateTimeImmutable $from, DateTimeImmutable $to) {
@ -51,8 +53,8 @@ class Agenda {
public function getNextDays() { public function getNextDays() {
$result = [[], [], [], [], [], []]; $result = [[], [], [], [], [], []];
$events = $this->getEventsBetween( $events = $this->getEventsBetween(
(new DateTimeImmutable)->sub(new DateInterval('PT1H')), (new DateTimeImmutable)->setTime(0, 0),
(new DateTimeImmutable)->add(new DateInterval('P1M')) (new DateTimeImmutable)->setTime(23, 59)->add(new DateInterval('P1M'))
); );
foreach ($events as $event) { foreach ($events as $event) {
$index = self::NEXT_MONTH; $index = self::NEXT_MONTH;

View File

@ -5,13 +5,14 @@ use \DateTimeImmutable;
use \PDO; 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();
@ -54,12 +55,12 @@ class DBActivity implements Activity {
public function getNextEventFrom(DateTimeImmutable $date) { public function getNextEventFrom(DateTimeImmutable $date) {
$query = 'SELECT name,start,stop,organiser,location,description FROM events WHERE start > :date ORDER BY start ASC LIMIT 1'; $query = 'SELECT id,name,start,stop,organiser,location,description FROM events WHERE start > :date ORDER BY start ASC LIMIT 1';
return $this->retrieve($date, $query); 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); return $this->retrieve($date, $query);
} }

74
src/pvv/side/door.php Normal file
View File

@ -0,0 +1,74 @@
<?php
namespace pvv\side;
use \PDO;
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() {
$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) {
$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();
}
}

View File

@ -24,7 +24,7 @@ abstract class Event {
return 'i morgen'; return 'i morgen';
} }
if (Agenda::isThisWeek($this->getStart()) || $this->getStart()->sub(new DateInterval('P4D'))->getTimestamp() < time()) { if (Agenda::isThisWeek($this->getStart()) || $this->getStart()->sub(new DateInterval('P4D'))->getTimestamp() < time()) {
return strftime('%A', $this->getStart()->getTimestamp()); return $this->getStart()->format("l");
} }
if (Agenda::isNextWeek($this->getStart())) { if (Agenda::isNextWeek($this->getStart())) {
return 'neste uke'; return 'neste uke';
@ -32,7 +32,7 @@ abstract class Event {
if (Agenda::isThisMonth($this->getStart())) { if (Agenda::isThisMonth($this->getStart())) {
return 'denne måneden'; return 'denne måneden';
} }
return trim(strftime('%e. %B', $this->getStart()->getTimestamp())); return $this->getStart()->format("j. F");
} }
public abstract function getStop(); /* : DateTimeImmutable */ public abstract function getStop(); /* : DateTimeImmutable */
@ -49,4 +49,5 @@ abstract class Event {
public abstract function getDescription(); /* : string */ public abstract function getDescription(); /* : string */
public abstract function getColor(); /* : string */
} }

49
src/pvv/side/motd.php Normal file
View File

@ -0,0 +1,49 @@
<?php
namespace pvv\side;
use \PDO;
class MOTD{
private $pdo;
public function __construct($pdo){
$this->pdo = $pdo;
}
public function setMOTD($title, $content) {
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();
$motd = array("title" => $data[0], "content" => explode("\n", $data[1]));
return $motd;
}
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();
$motd = array("title" => $data[0], "content" => explode("\n", $data[1]));
return $motd;
}
}

View File

@ -2,14 +2,12 @@
namespace pvv\side; namespace pvv\side;
class Project{ class Project{
private $id, $name, $owner, $owneruname, $descr, $active; private $id, $name, $descr, $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->owneruname = $owneruname;
$this->active = $active; $this->active = $active;
} }
@ -25,14 +23,6 @@ class Project{
return $this->descr; return $this->descr;
} }
public function getOwner(){
return $this->owner;
}
public function getOwnerUName(){
return $this->owneruname;
}
public function getActive(){ public function getActive(){
return $this->active; return $this->active;
} }

View File

@ -21,8 +21,6 @@ class ProjectManager{
$dbProj['id'], $dbProj['id'],
$dbProj['name'], $dbProj['name'],
$dbProj['description'], $dbProj['description'],
$dbProj['owner'],
$dbProj['owneruname'],
$dbProj['active'] $dbProj['active']
); );
$projects[] = $project; $projects[] = $project;
@ -38,37 +36,86 @@ class ProjectManager{
$statement->execute(); $statement->execute();
$dbProj = $statement->fetch(); $dbProj = $statement->fetch();
if (!$dbProj) {
return false;
}
$project = new Project( $project = new Project(
$dbProj['id'], $dbProj['id'],
$dbProj['name'], $dbProj['name'],
$dbProj['description'], $dbProj['description'],
$dbProj['owner'],
$dbProj['owneruname'],
$dbProj['active'] $dbProj['active']
); );
return $project; return $project;
} }
public function getByUName($uname){ public function getByOwner($uname){
$query = 'SELECT * FROM projects WHERE owneruname=:uname'; $query = 'SELECT projectid FROM projectmembers WHERE uname=:uname';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR); $statement->bindParam(':uname', $uname, PDO::PARAM_STR);
$statement->execute(); $statement->execute();
$projectIDs = $statement->fetchAll();
$projects = []; $projects = [];
foreach($projectIDs as $id){
$id = $id['projectid'];
$query = 'SELECT * FROM projects WHERE id=:id';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_INT);
$statement->execute();
foreach($statement->fetchAll() as $dbProj){ foreach($statement->fetchAll() as $dbProj){
$project = new Project( $project = new Project(
$dbProj['id'], $dbProj['id'],
$dbProj['name'], $dbProj['name'],
$dbProj['description'], $dbProj['description'],
$dbProj['owner'],
$dbProj['owneruname'],
$dbProj['active'] $dbProj['active']
); );
$projects[] = $project; $projects[] = $project;
} }
}
return $projects; 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();
$owner = [
'name' => $dbOwner['name'],
'uname' => $dbOwner['uname'],
'mail' => $dbOwner['mail'],
'role' => $dbOwner['role'],
'lead' => $dbOwner['lead'],
'owner' => $dbOwner['owner']
];
return $owner;
}
} }

View File

@ -5,7 +5,7 @@ class SimpleEvent extends Event {
private $id, $name, $descr, $start, $end, $org, $loc; private $id, $name, $descr, $start, $end, $org, $loc;
public function __construct($id, $name,\DateTimeImmutable $start,\DateTimeImmutable $end,$org, $loc, $descr, $isDBEvent = false){ public function __construct($id, $name,\DateTimeImmutable $start,\DateTimeImmutable $end,$org, $loc, $descr, $_isDBEvent = false){
$this->id = $id; $this->id = $id;
$this->name = $name; $this->name = $name;
$this->start = $start; $this->start = $start;
@ -13,7 +13,6 @@ class SimpleEvent extends Event {
$this->org = $org; $this->org = $org;
$this->loc = $loc; $this->loc = $loc;
$this->descr = explode("\n", $descr); $this->descr = explode("\n", $descr);
$this->isDBEvent = $isDBEvent;
} }
public function getID(){ public function getID(){
@ -41,7 +40,7 @@ class SimpleEvent extends Event {
} }
public function getURL() { public function getURL() {
return ''; return ('/hendelser/info.php?id=' . $this->id);
} }
public function getImageURL() { public function getImageURL() {
@ -52,8 +51,8 @@ class SimpleEvent extends Event {
return $this->descr; return $this->descr;
} }
public function isDBEvent() { public function getColor() {
return $this->isDBEvent; return "#3b7";
} }
} }

View File

@ -20,7 +20,7 @@ class AnimekveldEvent extends Event {
} }
public function getOrganiser() /* : User */ { public function getOrganiser() /* : User */ {
return "Liang Zhu"; return "Christoffer Viken";
} }
public function getURL() /* : string */ { public function getURL() /* : string */ {
@ -33,12 +33,16 @@ class AnimekveldEvent extends Event {
public function getDescription() { public function getDescription() {
return [ return [
'<p>Er du glad i japansk tegnefilm eller er du bare nysgjerrige på hva anime er?' . "\n" . 'Er du glad i japanske tegneserier eller bare nysgjerrig på hva anime er?',
'Bli med oss! Hver fredag finner vi de nyeste episodene for sesongen.' . "\n" . 'Bli med oss hver fredag, der vi finner frem de nyeste episodene for sesongen!',
'Vi viser denne senongens nye animeer.', '',
'Alle kan være med på å anbefale eller veto serier.',
'<p>Alle kan være med på å anbefale eller veto serier.' '',
]; ];
} }
public function getColor() {
return "#35a";
}
} }

View File

@ -8,20 +8,25 @@ use \DateInterval;
class BrettspillActivity implements Activity { class BrettspillActivity implements Activity {
public function nextDate(DateTimeImmutable $date) { public function nextDate(DateTimeImmutable $date) {
if ($date->format('H') > 20 || $date->format('H') == 19 && $date->format('i') > 30) if ($date->format('H') > 17 || $date->format('H') == 16 && $date->format('i') > 15)
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(19, 30, 0)); return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(16, 15, 0));
$date = $date->setTime(19, 30, 0); $date = $date->setTime(16, 15, 0);
if ($date->format('N') != 4) if ($date->format('N') != 7)
return $this->nextDate($date->add(new DateInterval('P1D'))); return $this->nextDate($date->add(new DateInterval('P1D')));
if ($date->format('W') % 2 - 1)
return $this->nextDate($date->add(new DateInterval('P7D')));
return $date; 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 ($date->format('H') < 16 || $date->format('H') == 17 && $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); $date = $date->setTime(16, 15, 0);
if ($date->format('N') != 4) if ($date->format('N') != 7)
return $this->prevDate($date->sub(new DateInterval('P1D'))); return $this->prevDate($date->sub(new DateInterval('P1D')));
if ($date->format('W') % 2 - 1)
return $this->prevDate($date->sub(new DateInterval('P7D')));
return $date; return $date;
} }

View File

@ -16,11 +16,11 @@ class BrettspillEvent extends Event {
} }
public function getLocation() /* : Location */ { public function getLocation() /* : Location */ {
return "Koserommet"; return "Programvareverkstedet";
} }
public function getOrganiser() /* : User */ { public function getOrganiser() /* : User */ {
return "Robert Maikher"; return "Programvareverkstedet";
} }
public function getURL() /* : string */ { public function getURL() /* : string */ {
@ -33,31 +33,33 @@ class BrettspillEvent extends Event {
public function getDescription() { public function getDescription() {
return [ return [
'<p>Er du en hardcore brettspillentusiast eller en nybegynner som har så vidt spilt ludo?' . "\n" . 'Er du en hardcore brettspillentusiast eller en nybegynner som har så vidt spilt ludo? '.
'Da er vår brettspillkveld noe for deg!' . "\n" . 'Da er vår brettspillkveld noe for deg! ' .
'Vi tar ut et par spill fra vårt samling of spiller så mye vi orker. Kom innom!', 'Vi tar ut et par spill fra vårt samling of spiller så mye vi orker. Kom innom!',
'',
'<p><a class="btn" href="#b_spill">Vår samling</a>', '## Vår samling',
'',
'<div id="b_spill" class="collapsable">' . "\n" . '* Dominion\*',
'<ul>' . "\n" . '* Three cheers for master',
'<li>Dominion*' . "\n" . '* Avalon',
'<li>Three cheers for master' . "\n" . '* Hanabi',
'<li>Avalon' . "\n" . '* Cards aginst humanity\*',
'<li>Hanabi' . "\n" . '* Citadels',
'<li>Cards aginst humanity*' . "\n" . '* Munchkin\*\*',
'<li>Citadels' . "\n" . '* Exploding kittens\*\*',
'<li>Munchkin**' . "\n" . '* Aye dark overlord',
'<li>Exploding kittens**' . "\n" . '* Settlers of catan\*',
'<li>Aye dark overlord' . "\n" . '* Risk\*\*',
'<li>Settlers of catan*' . "\n" . '* og mange flere...',
'<li>Risk**' . "\n" . '',
'<li>og mange flere...' . "\n" . '\* Vi har flere ekspansjoner til spillet',
'</ul>', '',
'<p>* Vi har flere ekspansjoner til spillet', '\*\* Vi har flere varianter av spillet',
'<p>** Vi har flere varianter av spillet',
'</div>'
]; ];
} }
public function getColor() {
return "#000";
}
} }

View File

@ -0,0 +1,40 @@
<?php //declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
class DriftkveldActivity implements Activity {
public function nextDate(DateTimeImmutable $date) {
if ($date->format('H') > 18 || $date->format('H') == 17 && $date->format('i') > 30)
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(18, 15, 0));
$date = $date->setTime(18, 15, 0);
if ($date->format('N') != 6)
return $this->nextDate($date->add(new DateInterval('P1D')));
if ($date->format('W') % 2 - 1)
return $this->nextDate($date->add(new DateInterval('P7D')));
return $date;
}
public function prevDate(DateTimeImmutable $date) {
if ($date->format('H') < 17 || $date->format('H') == 18 && $date->format('i') < 30)
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(18, 15, 0));
$date = $date->setTime(18, 15, 0);
if ($date->format('N') != 6)
return $this->prevDate($date->sub(new DateInterval('P1D')));
if ($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));
}
}

View File

@ -0,0 +1,49 @@
<?php //declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Event;
use \DateInterval;
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";
}
}

View File

@ -0,0 +1,40 @@
<?php //declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
class HackekveldActivity implements Activity {
public function nextDate(DateTimeImmutable $date) {
if ($date->format('H') > 18 || $date->format('H') == 17 && $date->format('i') > 30)
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(18, 15, 0));
$date = $date->setTime(16, 15, 0);
if ($date->format('N') != 6)
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) {
if ($date->format('H') < 17 || $date->format('H') == 18 && $date->format('i') < 30)
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(18, 15, 0));
$date = $date->setTime(18, 15, 0);
if ($date->format('N') != 6)
return $this->prevDate($date->sub(new DateInterval('P1D')));
if ($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));
}
}

View File

@ -0,0 +1,45 @@
<?php //declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Event;
use \DateInterval;
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";
}
}

View File

@ -33,14 +33,18 @@ class NerdepitsaEvent extends Event {
public function getDescription() { public function getDescription() {
return [ return [
'<p>Hei, har du lyst til å bli med på pizzaspising på Peppes i Kjøpmannsgata annenhver fredag klokken 19.00?', '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!',
'',
'<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 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.',
'',
'<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 ...)', '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>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. ' '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!'
]; ];
} }
public function getColor() {
return "#c35";
}
} }

View 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>

View File

@ -0,0 +1,3 @@
{
"m.server": "matrix.pvv.ntnu.no:443"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
www/PNG/PVV-logo-big.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
www/PNG/PVV-logo-white.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

141
www/PNG/PVV-logo-white.svg Normal file
View 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

Width:  |  Height:  |  Size: 6.0 KiB

BIN
www/PNG/PVV-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
www/PNG/PVV-logo2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
www/PNG/PVV-logo3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
www/PNG/old/PVV-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
www/PNG/old/PVV-logo2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
www/PNG/old/PVV-logo3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
www/PNG/old/pvv-header.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

BIN
www/PNG/pvv-header.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -1,12 +1,12 @@
<?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];

View File

@ -1,19 +1,20 @@
<?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!!!';
@ -36,65 +37,101 @@ if(isset($_GET['id'])){
} }
$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( $event;
0,
'Kul Hendelse',
$today,
$inOneHour,
'PVV',
'Norge et sted',
'her skjer det noe altså'
);
if($new == 0){ if($new == 0){
$event = $customActivity->getEventByID($eventID); $event = $customActivity->getEventByID($eventID);
} }
?> else {
$event = new \pvv\side\SimpleEvent(
0,
'',
$today,
$inTwoHours,
'',
'',
''
);
}
?>
<!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&shy;administrasjon</header> <header>Admin&shy;verk&shy;stedet</header>
<main>
<article> <body>
<nav>
<?php echo navbar(3, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<h2>Aktivietsadministrasjon</h2>
<hr class="ruler">
<h2><?= ($new == 1 ? "Ny hendelse" : "Rediger hendelse"); ?></h2> <h2><?= ($new == 1 ? "Ny hendelse" : "Rediger hendelse"); ?></h2>
<form action="update.php", method="post" class="gridsplit5050"> <form action="update.php", method="post" class="gridsplit fullwidth_inputs">
<div class="gridl"> <div class="gridl">
<p class="subtitle">Tittel</p> <p class="subtitle">Tittel</p>
<?= '<input type="text" name="title" value="' . $event->getName(). '" class="boxinput">' ?><br> <input type="text" name="title" value="<?= $event->getName() ?>" class="boxinput" required placeholder="En kul hendelse"><br>
<p class="subtitle">Beskrivelse</p> <div class="gridsplit5050">
<textarea name="desc" cols="40" rows="5" class="boxinput"><?= implode($event->getDescription(), "\n"); ?></textarea> <div class="gridl">
<p class="subtitle">Arrangør</p>
<input type="text" name="organiser" value="<?= $event->getOrganiser() ?>" class="boxinput" required placeholder="<?= $name ?>"><br>
</div> </div>
<div class="gridr noborder"> <div class="gridr noborder">
<p class="subtitle">Starttid (YYYY-MM-DD HH:MM:SS)</p> <p class="subtitle">Sted</p>
<?= '<input name="start" type="text" class="boxinput" value="' . $event->getStart()->format('Y-m-d H:00:00') . '"><br>' ?> <input type="text" name="location" value="<?= $event->getLocation() ?>" class="boxinput" required placeholder="Terminalrommet"><br>
</div>
<p class="subtitle">Sluttid (YYYY-MM-DD HH:MM:SS)</p>
<?= '<input name="end" type="text" class="boxinput" value="' . $event->getStop()->format('Y-m-d H:00:00') . '"><br>' ?>
<p class="subtitle">Organisert av</p>
<?= '<input type="text" name="organiser" value="' . $event->getOrganiser(). '" class="boxinput">' ?><br>
<p class="subtitle">Hvor?</p>
<?= '<input type="text" name="location" value="' . $event->getLocation(). '" class="boxinput">' ?><br>
</div> </div>
<?= '<input type="hidden" name="id" value="' . $event->getID() . '" />' ?> <p class="subtitle">Beskrivelse (<i>markdown</i>)</p>
<textarea name="desc" rows="8" class="boxinput" placeholder="Beskrivelse" required><?= implode("\n", $event->getDescription()); ?></textarea>
</div>
<div class="gridr" style="line-height: 1.3em;">
<h4>Starttid</h4><br>
<i>Måned:</i><br>
<input name="start_mon" type="month" class="boxinput" required value="<?= $event->getStart()->format('Y-m') ?>"><br>
<i>Dag:</i><br>
<input name="start_day" type="number" min="1" max="31" required class="boxinput" value="<?= $event->getStart()->format('d') ?>"><br>
<i>Klokkeslett:</i><br>
<input name="start_time" type="time" class="boxinput" required value="<?= $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="<?= $diff->h ?>"><br>
<i>Minutter:</i><br>
<input name="lasts_minutes" type="number" min="0" max="59" class="boxinput" required value="<?= $diff->i ?>"><br>
</div>
<input type="hidden" name="id" value="<?= $event->getID() ?>" />
<div class="allgrids" style="margin-top: 2em;"> <div class="allgrids" style="margin-top: 2em;">
<hr class="ruler"> <hr class="ruler">
<input type="submit" class="btn" value="Lagre"></a> <input type="submit" class="btn" value="Lagre"></a>
</div> </div>
</form> </form>
@ -102,11 +139,5 @@ if($new == 0){
<p> <p>
</article> </main>
</body>
</main>
<nav>
<?= navbar(2); ?>
<?= loginbar(); ?>
</nav>

View File

@ -1,16 +1,16 @@
<?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];
@ -29,13 +29,13 @@ if(isset($_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
@ -46,18 +46,33 @@ $events = array_values(array_filter(
} }
)); ));
?> ?>
<!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&shy;administrasjon</header> <header>Aktivitets&shy;administrasjons&shy;verk&shy;stedet</header>
<main> <body>
<article class="gridsplit"> <nav>
<?php echo navbar(2, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<h2>Aktivitetsadministrasjon</h2>
<hr class="ruler">
<div class="gridsplit">
<div class="gridl"> <div class="gridl">
<h2 class="no-chin">Aktive aktiviteter</h2> <h2 class="no-chin">Aktive aktiviteter</h2>
<p class="subnote">Gjentagende aktiviteter vises ikke</p> <p class="subnote">Gjentagende aktiviteter vises ikke</p>
@ -65,7 +80,7 @@ $events = array_values(array_filter(
<ul class="event-list"> <ul class="event-list">
<?php <?php
$counter = 0; $counter = 0;
$pageLimit = 4; $pageLimit = 10;
for($i = ($pageLimit * ($page - 1)); $i < count($events) ;$i++){ for($i = ($pageLimit * ($page - 1)); $i < count($events) ;$i++){
if($counter == $pageLimit){ if($counter == $pageLimit){
@ -83,13 +98,15 @@ $events = array_values(array_filter(
<p class="subnote"> <p class="subnote">
<?= $event->getStart()->format("(Y-m-d H:i:s)") . " - " . $event->getStop()->format("(Y-m-d H:i:s)"); ?> <?= $event->getStart()->format("(Y-m-d H:i:s)") . " - " . $event->getStop()->format("(Y-m-d H:i:s)"); ?>
</p> </p>
<p><?= implode($event->getDescription(), "</p>\n<p>"); ?></p> <?php
$Parsedown = new \Parsedown();
echo $Parsedown->text(implode("\n", $event->getDescription()));
?>
</div> </div>
<div class="event-actions"> <div class="event-actions">
<!-- emojis are for big boys --> <a class="btn" href="edit.php?id=<?= $eventID ?>">Rediger</a><br>
<?= '<a href="edit.php?id=' . $eventID . '">🖊</a>'; ?> <a class="btn" href="delete.php?id=<?= $eventID ?>" onclick="return confirm('Knallsikker? (ID: <?= $eventID ?>)');">Slett</a>
<?= '<a href="delete.php?id=' . $eventID . '" onclick="return confirm(\'Knallsikker? (ID: ' . $eventID . ')\');">🗑</a>'; ?>
</div> </div>
</div> </div>
</li> </li>
@ -102,11 +119,11 @@ $events = array_values(array_filter(
<?php <?php
if($page != 1){ if($page != 1){
echo '<a class="btn float-left" href="?page=' . ($page - 1) . '">Forrige side</a>'; echo '<a class="btn float-left" href="?page=' . ($page - 1) . '&title=' . urlencode($filterTitle) . '&organiser=' . urlencode($filterOrganiser) . '">Forrige side</a>';
} }
if(($counter == $pageLimit) and (($pageLimit * $page) < count($events))){ if(($counter == $pageLimit) and (($pageLimit * $page) < count($events))){
echo '<a class="btn float-right" href="?page=' . ($page + 1) . '">Neste side</a>'; echo '<a class="btn float-right" href="?page=' . ($page + 1) . '&title=' . urlencode($filterTitle) . '&organiser=' . urlencode($filterOrganiser) . '">Neste side</a>';
} }
?> ?>
</div> </div>
@ -115,7 +132,7 @@ $events = array_values(array_filter(
<h2>Verktøy</h2> <h2>Verktøy</h2>
<a class="btn adminbtn" href="edit.php?new=1">Legg inn ny aktivitet</a> <a class="btn adminbtn" href="edit.php?new=1">Legg inn ny aktivitet</a>
<h2>Filter</h2> <h2>Filter</h2>
<form action="." method="post"> <form action="." method="get">
<p class="no-chin">Navn</p> <p class="no-chin">Navn</p>
<?= '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">' ?><br> <?= '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">' ?><br>
<p class="no-chin">Organisator</p> <p class="no-chin">Organisator</p>
@ -126,11 +143,6 @@ $events = array_values(array_filter(
</div> </div>
</form> </form>
</div> </div>
</article> </div>
</main>
</main> </body>
<nav>
<?= navbar(2); ?>
<?= loginbar(); ?>
</nav>

View File

@ -1,14 +1,14 @@
<?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];
@ -18,7 +18,15 @@ if(!$userManager->hasGroup($uname, 'aktiviteter')){
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']))
or (!isset($_POST['desc']))
or (!isset($_POST['organiser']))
or (!isset($_POST['location']))
or (!isset($_POST['start_mon']))
or (!isset($_POST['start_day']))
or (!isset($_POST['start_time']))
or (!isset($_POST['lasts_hours']))
or (!isset($_POST['lasts_minutes']))) {
header('Location: ' . $_SERVER['HTTP_REFERER']); header('Location: ' . $_SERVER['HTTP_REFERER']);
exit(); exit();
} }
@ -30,11 +38,36 @@ if(isset($_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'];
$date_part_start_mon = $_POST['start_mon'];
$date_part_start_day = $_POST['start_day'];
$date_part_start_time = $_POST['start_time'];
$date_part_lasts_hours = $_POST['lasts_hours'];
$date_part_lasts_minutes = $_POST['lasts_minutes'];
while (strlen($date_part_start_day) < 2) {
$date_part_start_day = "0" . $date_part_start_day;
}
$start = ($date_part_start_mon . "-" . $date_part_start_day . " " . $date_part_start_time);
if (sizeof(explode(":", $date_part_start_time))==2) {
$start .= ":00";
}
$start_date = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $start);
$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();
}
$statement; $statement;
if($id == 0){ if($id == 0){
$query = 'INSERT INTO events (name, start, stop, organiser, location, description) VALUES (:title, :start, :stop, :organiser, :loc, :desc)'; $query = 'INSERT INTO events (name, start, stop, organiser, location, description) VALUES (:title, :start, :stop, :organiser, :loc, :desc)';

View File

@ -1,20 +1,21 @@
<?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];
@ -26,53 +27,44 @@ if(!$userManager->isAdmin($uname)){
$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&shy;administrasjons&shy;verk&shy;stedet</header>
<ul>
<li class="active"><a href="index.php">hjem</a></li> <body>
<li><a href="aktiviteter/">aktiviteter</a></li> <nav>
<li><a href="../prosjekt/">prosjekter</a></li> <?php echo navbar(2, 'admin'); ?>
<li><a href="kontakt">kontakt</a></li> <?php echo loginbar(null, $pdo); ?>
<li><a href="pvv/">wiki</a></li> </nav>
</ul>
<main>
<h2>Brukeradministrasjon</h2>
<hr class="ruler">
<form action="./update.php" method="post">
<table class="userlist">
<tr>
<th>Brukernavn</th>
<th>Brukergrupper</th>
</tr>
<?php <?php
$attr = $as->getAttributes(); $users_to_update = array();
if($attr){
$uname = $attr["uid"][0];
echo '<p class="login">logget inn som: ' . $uname . '</p>';
}else{
echo '<a class="login" href="' . $as->getLoginURL() . '">logg inn</a>';
}
?>
</nav>
<header class="admin">Bruker&shy;administrasjon</header>
<main>
<article>
<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){ foreach($users as $i => $data){
$uname = $data['name']; $uname = $data['name'];
$groupFlag = $userManager->getUsergroups($uname); $groupFlag = $userManager->getUsergroups($uname);
if(!$users_value){ array_push($users_to_update, $uname);
$users_value = $uname;
}else{
$users_value = $users_value . '_' . $uname;
}
?> ?>
<tr> <tr>
@ -86,7 +78,10 @@ $users = $userManager->getAllUserData();
<?php <?php
} }
echo '<input type="hidden" name="users" value="' . $users_value . '" />'; foreach($users_to_update as $uname) {
echo '<input type="hidden" name="user_to_update" value="' . $uname . '" />';
}
?> ?>
<tr class="newuserrow"> <tr class="newuserrow">
@ -97,9 +92,8 @@ $users = $userManager->getAllUserData();
} }
?> ?>
</tr> </tr>
</table> </table>
<input type="submit" class="btn" value="Lagre"> <input type="submit" class="btn" value="Lagre">
</form> </form>
</main>
</article> </body>
</main>

View File

@ -1,16 +1,16 @@
<?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];
@ -26,8 +26,13 @@ if(isset($_POST['newuser'])){
unset($_POST['newuser']); unset($_POST['newuser']);
} }
$updatingUsers = explode('_', $_POST['users']); //$updatingUsers = explode('_', $_POST['users']);
unset($_POST['users']); $updatingUsers = array();
foreach ($_POST as $key => $value) { if ($key === "user_to_update") {
array_push($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 = [];
@ -37,22 +42,24 @@ if($newUser){
foreach($_POST as $namegroup => $info){ foreach($_POST as $namegroup => $info){
$data = explode('_', $namegroup); $data = explode('_', $namegroup);
if($data[0] == 'newuser'){ $group = array_pop($data);
$uname = implode("_", $data);
if($uname == 'newuser'){
if(!$newUser){ if(!$newUser){
continue; 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;
} }

View File

@ -1,14 +1,11 @@
<?php <?php
require __DIR__ . '/../../inc/navbar.php'; require_once dirname(dirname(__DIR__)) . 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];
@ -18,41 +15,52 @@ $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);
echo "Her har du ikke lov't'å'værra!!!\r\n";
exit(); 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-&shy;gutt-&shy;leketøy</header> <header>Administrasjons&shy;verk&shy;stedet</header>
<main>
<article> <body>
<h2>Verktøy</h2> <nav id="navbar">
<?php echo navbar(1, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<h2>Administrasjon</h2>
<ul class="tools">
<?php <?php
if($isAdmin | $activityGroup){ if($isAdmin | $activityGroup){
echo '<a class="btn adminbtn" href="aktiviteter/?page=1">Aktiviteter/Hendelser</a>'; echo '<li><a class="btn" href="aktiviteter/?page=1">Aktiviteter/Hendelser</a></li>';
} }
if($isAdmin | $projectGroup){ if($isAdmin | $projectGroup){
echo '<a class="btn adminbtn" href="prosjekter/">Prosjekter</a>'; echo '<li><a class="btn" href="prosjekter/">Prosjekter</a></li>';
}
if($isAdmin) {
echo '<li><a class="btn" href="motd/">Dagens melding</a></li>';
} }
if($isAdmin){ if($isAdmin){
echo '<a class="btn adminbtn" href="brukere/">Brukere</a>'; echo '<li><a class="btn" href="brukere/">Brukerrettigheter</a></li>';
} }
?> ?>
</article> <ul>
</main>
</main> </body>
<nav>
<?= navbar(1); ?>
<?= loginbar(); ?>
</nav>

71
www/admin/motd/index.php Normal file
View 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&shy;administrasjons&shy;verk&shy;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="<?= $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"><?= implode("\n", $motd["content"]) ?></textarea>
<div style="margin-top: 2em;">
<hr class="ruler">
<?= '<input type="submit" class="btn" value="Lagre endringer"></a>'; ?>
</div>
</form>
</main>
</body>

35
www/admin/motd/update.php Normal file
View 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']) or !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>

View File

@ -1,12 +1,12 @@
<?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];

View File

@ -1,16 +1,16 @@
<?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];
@ -42,24 +42,49 @@ $project = new \pvv\side\Project(
'', '',
'kåre knoll', 'kåre knoll',
'pvvadmin', 'pvvadmin',
'drift@pvv.ntnu.no',
0 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&shy;administrasjon</header> <header>Prosjekt&shy;administrasjons&shy;verk&shy;stedet</header>
<main> <body>
<nav>
<?php echo navbar(3, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<h2>Prosjektadministrasjon</h2>
<hr class="ruler">
<article>
<h2><?= ($new == 1 ? "Nytt prosjekt" : "Rediger prosjekt"); ?></h2> <h2><?= ($new == 1 ? "Nytt prosjekt" : "Rediger prosjekt"); ?></h2>
<form action="update.php", method="post" class="gridsplit5050"> <form action="update.php", method="post" class="gridsplit5050">
@ -67,16 +92,19 @@ if($new == 0){
<p class="subtitle">Tittel</p> <p class="subtitle">Tittel</p>
<?= '<input type="text" name="title" value="' . $project->getName() . '" class="boxinput">' ?><br> <?= '<input type="text" name="title" value="' . $project->getName() . '" class="boxinput">' ?><br>
<p class="subtitle">Beskrivelse</p> <p class="subtitle">Beskrivelse (<i>markdown</i>)</p>
<textarea name="desc" cols="40" rows="5" class="boxinput"><?= $project->getDescription(); ?></textarea> <textarea name="desc" cols="40" rows="5" class="boxinput"><?= implode("\n", $project->getDescription()); ?></textarea>
</div> </div>
<div class="gridr noborder"> <div class="gridr noborder">
<p class="subtitle">Prosjekteier (Brukernavn)</p> <p class="subtitle">Prosjektleder (Brukernavn)</p>
<?= '<input type="text" name="organiser" value="' . $project->getOwnerUName(). '" class="boxinput">' ?><br> <?= '<input type="text" name="organiser" value="' . $owner['uname'] . '" class="boxinput">' ?><br>
<p class="subtitle">Prosjekteier (Navn)</p> <p class="subtitle">Prosjektleder (Navn)</p>
<?= '<input type="text" name="organisername" value="' . $project->getOwner(). '" class="boxinput">' ?> <?= '<input type="text" name="organisername" value="' . $owner['name'] . '" class="boxinput">' ?>
<p class="subtitle">Prosjektleder E-post</p>
<?= '<input type="text" name="organiseremail" value="' . $owner['mail'] . '" class="boxinput">' ?><br>
<p class="subtitle">Aktiv</p> <p class="subtitle">Aktiv</p>
<?= '<input type="checkbox" '. ($project->getActive() ? 'checked' : '') . ' name="active"/>' ?> <?= '<input type="checkbox" '. ($project->getActive() ? 'checked' : '') . ' name="active"/>' ?>
@ -84,6 +112,31 @@ if($new == 0){
<?= '<input type="hidden" name="id" value="' . $project->getID() . '" />' ?> <?= '<input type="hidden" name="id" value="' . $project->getID() . '" />' ?>
<?php if(!$new){ ?>
<div style="grid-column: span 2;">
<hr class="ruler">
</div>
<h2 style="grid-column: span 2">Prosjektmedlemmer</h2>
<table class="userlist" style="grid-column: span 2;">
<tr><th>Brukernavn</th><th>Navn</th><th>Rolle</th></tr>
<?php foreach($members as $i => $data) { ?>
<tr>
<td><?= $data['uname']; ?></td>
<td><?= $data['name']; ?></td>
<td><?= $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;"> <div class="allgrids" style="margin-top: 2em;">
<hr class="ruler"> <hr class="ruler">
@ -91,11 +144,5 @@ if($new == 0){
</div> </div>
</form> </form>
<p> <p>
</article> </main>
</body>
</main>
<nav>
<?= navbar(2); ?>
<?= loginbar(); ?>
</nav>

View File

@ -1,16 +1,16 @@
<?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];
@ -33,31 +33,47 @@ 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){ function($project) use ($filterTitle){
return (preg_match('/.*'.$filterTitle.'.*/i', $project->getName()) and preg_match('/.*'.$filterOrganiser.'.*/i', $project->getOwner())); return (preg_match('/.*'.$filterTitle.'.*/i', $project->getName()));
} }
)); ));
?> ?>
<!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&shy;administrasjon</header> <header>Prosjekt&shy;administrasjons&shy;verk&shy;stedet</header>
<main> <body>
<nav>
<?php echo navbar(2, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<article class="gridsplit"> <main>
<h2>Prosjektadministrasjon</h2>
<hr class="ruler">
<div class="gridsplit">
<div class="gridl"> <div class="gridl">
<h2 class="no-chin">Prosjekter</h2> <h2 class="no-chin">Prosjekter</h2>
@ -73,14 +89,18 @@ $projects = array_values(array_filter(
$project = $projects[$i]; $project = $projects[$i];
$projectID = $project->getID(); $projectID = $project->getID();
$owner = $projectManager->getProjectOwner($projectID);
?> ?>
<li> <li>
<div class="event admin"> <div class="event admin">
<div class="event-info"> <div class="event-info">
<h3 class="no-chin"><?= $project->getName() . " (ID: " . $projectID . ")"; ?></h3> <h3 class="no-chin"><?= $project->getName() . " (ID: " . $projectID . ")"; ?></h3>
<p class="subnote"><?= 'Organisert av: ' . $project->getOwner(); ?></p> <p class="subnote"><?= 'Organisert av: ' . $owner['name']; ?></p>
<p><?= $project->getDescription(); ?></p> <?php
$Parsedown = new \Parsedown();
echo $Parsedown->text(implode("\n", $project->getDescription()));
?>
</div> </div>
<div class="event-actions"> <div class="event-actions">
@ -112,21 +132,17 @@ $projects = array_values(array_filter(
<a class="btn adminbtn" href="edit.php?new=1">Legg inn nytt prosjekt</a> <a class="btn adminbtn" href="edit.php?new=1">Legg inn nytt prosjekt</a>
<h2>Filter</h2> <h2>Filter</h2>
<form action="." method="post"> <form action="." method="post">
<p class="no-chin">Navn</p> <p class="no-chin">Prosjektnavn</p>
<?= '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">' ?><br> <?= '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">' ?><br>
<p class="no-chin">Organisator</p> <p class="no-chin">Leders brukernavn</p>
<?= '<input type="text" name="organiser" class="boxinput" value="' . $filterOrganiser . '">' ?><br> <?= '<input type="text" name="organiser" class="boxinput" value="">' ?><br>
<div style="margin-top: 2em;"> <div style="margin-top: 2em;">
<input type="submit" class="btn" value="Filtrer"></input> <input type="submit" class="btn" value="Filtrer"></input>
</div> </div>
</form> </form>
</div> </div>
</article> </div>
</main>
</main> </body>
<nav>
<?= navbar(2); ?>
<?= loginbar(); ?>
</nav>

View File

@ -1,14 +1,14 @@
<?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];
@ -30,33 +30,49 @@ if(isset($_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'];
$mail = $_POST['organiseremail'];
$active = (isset($_POST['active']) ? $_POST['active'] : 0); $active = (isset($_POST['active']) ? $_POST['active'] : 0);
$statement; $statement;
if($id == 0){ if($id == 0){
$query = 'INSERT INTO projects (name, owner, owneruname, description, active) VALUES (:title, :owner, :uname, :desc, :active)'; $query = 'INSERT INTO projects (name, description, active) VALUES (:title, :desc, :active)';
$statement = $pdo->prepare($query); $statement = $pdo->prepare($query);
$statement->bindParam(':title', $title, PDO::PARAM_STR); $statement->bindParam(':title', $title, PDO::PARAM_STR);
$statement->bindParam(':desc', $desc, PDO::PARAM_STR); $statement->bindParam(':desc', $desc, PDO::PARAM_STR);
$statement->bindParam(':owner', $owner, PDO::PARAM_STR);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
$statement->bindParam(':active', $active, PDO::PARAM_INT); $statement->bindParam(':active', $active, PDO::PARAM_INT);
$statement->execute();
$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{ }else{
$query = 'UPDATE projects SET name=:title, owner=:owner, owneruname=:uname, description=:desc, active=:active WHERE id=:id'; $query = 'UPDATE projects SET name=:title, description=:desc, active=:active WHERE id=:id';
$statement = $pdo->prepare($query); $statement = $pdo->prepare($query);
$statement->bindParam(':title', $title, PDO::PARAM_STR); $statement->bindParam(':title', $title, PDO::PARAM_STR);
$statement->bindParam(':desc', $desc, PDO::PARAM_STR); $statement->bindParam(':desc', $desc, PDO::PARAM_STR);
$statement->bindParam(':owner', $owner, PDO::PARAM_STR);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
$statement->bindParam(':active', $active, PDO::PARAM_INT); $statement->bindParam(':active', $active, PDO::PARAM_INT);
$statement->bindParam(':id', $id, PDO::PARAM_INT); $statement->bindParam(':id', $id, PDO::PARAM_INT);
}
$statement->execute(); $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();
}
header('Location: .'); header('Location: .');
?> ?>

View File

@ -1,18 +1,5 @@
<?php <?php namespace pvv\side;
date_default_timezone_set('Europe/Oslo'); require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
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);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
use \pvv\side\Agenda;
$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']
@ -27,32 +14,38 @@ $day = (isset($_GET['day']))
?> ?>
<!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&shy;verk&shy;stedet</header> <header>Aktivitets&shy;verk&shy;stedet</header>
<main>
<?php <body>
$events = ($day==-1) <nav>
<?php echo navbar(1, 'aktiviteter'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<?php
use \DateTimeImmutable;
$events = ($day==-1)
? $agenda->getNextOfEach(new \DateTimeImmutable) ? $agenda->getNextOfEach(new \DateTimeImmutable)
: $agenda->getEventsBetween( : $agenda->getEventsBetween(
new DateTimeImmutable("$year-$month-$day 00:00:00"), new DateTimeImmutable("$year-$month-$day 00:00:00"),
new DateTimeImmutable("$year-$month-$day 23:59:59")); new DateTimeImmutable("$year-$month-$day 23:59:59"));
$limit = 0; $limit = 0;
foreach($events as $event) { foreach($events as $event) {
?> ?>
<article> <article>
<h2> <h2>
<?php if ($event->getImageURL()) { ?>
<img src="<?= $event->getImageURL() ?>">
<?php } ?>
<?php if (\pvv\side\Agenda::isToday($event->getStart())) { ?><strong><?php } ?> <?php if (\pvv\side\Agenda::isToday($event->getStart())) { ?><strong><?php } ?>
<em><?= $event->getRelativeDate() ?></em> <em><?= $event->getRelativeDate() ?></em>
<?php if (\pvv\side\Agenda::isToday($event->getStart())) { ?></strong><?php } ?> <?php if (\pvv\side\Agenda::isToday($event->getStart())) { ?></strong><?php } ?>
@ -61,24 +54,25 @@ foreach($events as $event) {
<?php } else { ?> <?php } else { ?>
<?= $event->getName() ?> <?= $event->getName() ?>
<?php } ?> <?php } ?>
<?php if ($event->getImageURL()) { ?>
<img src="<?= $event->getImageURL() ?>">
<?php } ?>
</h2> </h2>
<ul class="subtext"> <ul class="subtext">
<li>Tid: <strong><?= Agenda::getFormattedDate($event->getStart()) ?></strong> <li>Tid: <strong><?= Agenda::getFormattedDate($event->getStart()) ?></strong></li>
<li>Sted: <strong><?= $event->getLocation() ?></strong> <li>Sted: <strong><?= $event->getLocation() ?></strong></li>
<li>Arrangør: <strong><?= $event->getOrganiser() ?></strong> <li>Arrangør: <strong><?= $event->getOrganiser() ?></strong></li>
</ul> </ul>
<?php $description = $event->getDescription(); ?> <?php $description = $event->getDescription(); ?>
<?php if ($limit) array_splice($description, $limit); ?> <?php if ($limit) array_splice($description, $limit); ?>
<?= implode($description, "</p>\n<p>") ?> <?php
</article> $Parsedown = new \Parsedown();
echo $Parsedown->text(implode("\n", $description));
?>
</article>
<?php if (!$limit || $limit > 4) {$limit = 4;} else $limit = 2; ?> <?php } ?>
<?php } ?> </main>
</main> </body>
<nav>
<?= navbar(1, 'aktiviteter'); ?>
<?= loginbar(); ?>
</nav>

View File

@ -1,21 +1,22 @@
<!DOCTYPE html>
<?php <?php
date_default_timezone_set('Europe/Oslo'); require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
setlocale(LC_ALL, 'no_NO');
require __DIR__ . '/../../src/_autoload.php';
require __DIR__ . '/../../sql_config.php';
use \pvv\side\Agenda; 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&shy;verk&shy;stedet</header> <header>Sosial&shy;verk&shy;stedet</header>
<main> <main>
<?php <?php
@ -24,7 +25,11 @@ $nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
?> ?>
<article> <article>
<h2><img src="../sosiale/animekveld.jpg"><em><?= $nextEvent->getRelativeDate()?></em> Animekveld</h2> <h2><em><?= $nextEvent->getRelativeDate()?></em> Animekveld
<?php if ($nextEvent->getImageURL()) { ?>
<img src="<?= $nextEvent->getImageURL() ?>">
<?php } ?>
</h2>
<ul class="subtext"> <ul class="subtext">
<li>Tid: <li>Tid:
<strong> <strong>
@ -40,17 +45,15 @@ $nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
</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> <?= navbar(1, 'aktiviteter'); ?>
<!--<li><a href="../prosjekt/">prosjekter</a></li>--> <?= 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>

View File

@ -1,21 +1,22 @@
<!DOCTYPE html>
<?php <?php
date_default_timezone_set('Europe/Oslo'); require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
setlocale(LC_ALL, 'no_NO');
require __DIR__ . '/../../src/_autoload.php';
require __DIR__ . '/../../sql_config.php';
use \pvv\side\Agenda; 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&shy;verk&shy;stedet</header> <header>Sosial&shy;verk&shy;stedet</header>
<main> <main>
<?php <?php
@ -25,11 +26,11 @@ $nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
<article> <article>
<h2><em><?= $nextEvent->getRelativeDate()?></em> Brettspillkveld <h2><em><?= $nextEvent->getRelativeDate()?></em> Brettspillkveld
<?php if ($nextEvent->getImageURL()) { ?> <?php if ($nextEvent->getImageURL()) { ?>
<img src="<?= $nextEvent->getImageURL() ?>"> <img src="<?= $nextEvent->getImageURL() ?>">
<?php } ?> <?php } ?>
</h2> </h2>
<ul class="subtext"> <ul class="subtext">
<li>Tid: <li>Tid:
<strong> <strong>
@ -45,17 +46,15 @@ $nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
</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> <?= navbar(1, 'aktiviteter'); ?>
<!--<li><a href="../prosjekt/">prosjekter</a></li>--> <?= 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>

View File

@ -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%;

1
www/css/afterlogic.svg Normal file
View 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

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -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;
} }

View File

@ -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%;
}
.subtext {
margin-top: -1em;
}
.subtext li {
display: block; display: block;
content: " ";
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);
background-image: -o-linear-gradient(left, transparent, rgba(0,0,0,.1), transparent);
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;
} }
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

145
www/css/gallery.css Normal file
View File

@ -0,0 +1,145 @@
body, main, html {
width: 100%;
margin: 0;
padding: 0;
}
main {
background-color: #ddd;
margin-top: 3em;
margin-left: 0 !important; /* Override style.css */
margin-right: 0 !important;
padding: 4em;
}
.gallery-container {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));;
width: 100%;
grid-gap: 20px;
}
.card {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
border-radius: 1.5em;
background-color: #f1f1f1;
width: 100%;
}
.card-image-div {
margin: auto 0;
max-height: 45vh;
overflow: hidden;
border-radius: 1.5em;
}
.card-image {
max-width: 100%;
object-fit: cover;
object-position: center;
vertical-align: center;
}
.card-body, .card-footer {
font-family: monospace;
text-align: left;
width: 90%;
margin: 0;
word-wrap: break-word;
}
.card-body {
font-size: 1.5em;
}
.modal-target:hover {opacity: 0.7;}
/* Modal Background */
.modal {
display: none; /* Hidden by default */
position: fixed; /* Stay in place */
z-index: 1; /* Sit on top */
padding-top: 5vh;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto; /* Enable scroll if needed */
background-color: rgb(0,0,0); /* Fallback color */
background-color: rgba(0,0,0,0.8); /* Black w/ opacity */
}
.modal-content {
margin: auto;
display: block;
object-fit: scale-down;
overflow: visible;
min-width: 60vw;
max-width: 90vw !important;
min-height: 60vh;
max-height: 80vh !important;
width: auto;
height: auto;
opacity: 1 !important;
}
.modal-caption {
margin: auto;
display: block;
width: 80%;
max-width: 90vw;
text-align: center;
color: white;
font-weight: 700;
font-size: 1em;
margin-top: 32px;
}
.modal-content, .modal-caption {
-webkit-animation-name: zoom;
-webkit-animation-duration: 0.6s;
animation-name: zoom;
animation-duration: 0.6s;
}
@-webkit-keyframes zoom {
from {-webkit-atransform:scale(0)}
to {-webkit-transform:scale(1)}
}
@keyframes zoom {
from {transform:scale(0)}
to {transform:scale(1)}
}
.modal-close {
position: absolute;
top: 15px;
right: 35px;
color: #f1f1f1;
font-size: 4em;
font-weight: bold;
transition: 0.3s;
}
.modal-close:hover, .modal-close:focus {
color: #bbb;
text-decoration: none;
cursor: pointer;
}
@media only screen and (min-width:320px) {
.gallery-container { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; }
main { padding: 1em; }
}
@media only screen and (min-width: 641px) {
.gallery-container { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
main { padding: 1em; }
}
@media only screen and (min-width: 961px) {
.gallery-container { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; }
}
@media only screen and (min-width: 1281px) {
.gallery-container { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; }
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

131
www/css/landing.css Normal file
View File

@ -0,0 +1,131 @@
header.landing {
display: block;
margin: 0;
margin-top: 3em;
padding: 3vh 15vw;
width: 70vw;
background-color: #002244;
color: #fff;
}
header.landing .logo {
display: block;
width: 24vh;
height: 24vh;
margin: auto;
}
main {
margin-top: 0;
}
.info {
text-align: center;
width: 100%;
padding: 0;
margin: 0;
overflow-y: hidden;
}
.essentials {
width: 100%;
margin: 1em 0;
padding: 0;
list-style: none;
display: flex;
align-items: center;
justify-content: center;
}
.essentials li {
display: inline-block;
}
.essentials a {
margin: 0 2em;
height: 100%;
}
.essentials .focus {
padding: 0.8em;
font-size: 1.2em;
}
img.float-right {
float: right;
max-width: 12em;
max-height: 12em;
vertical-align: baseline;
}
.calendar-events {
padding: 0;
margin-bottom: 1.5em;
list-style: none;
}
.calendar-events ul {
list-style: none;
padding: 0;
}
.calendar-events a {
color: rgba(0,0,0, 0.85);
}
.calendar-events ul .datetime {
color: rgba(0, 0, 0, 0.5);
float: right;
margin-left: 0.2em;
}
.calendar-events ul li {
margin-bottom: 0.4em;
}
main.contentsplit {
padding-top: 1em;
}
.contentsplit {
display: grid;
grid-template-columns: 2.5fr 2fr;
}
.gridr {
border-left: 0;
}
@media screen and (max-width: 50rem) {
.essentials {
flex-direction: column;
}
.essentials a {
margin: 0.2em 0;
}
}
@media screen and (max-width: 65rem) {
.contentsplit {
display: block;
}
.gridr {
height: auto;
padding: 0;
margin-left: 0;
margin-bottom: 3em;
}
.gridr br {
margin: 0;
height: 0px;
}
.gridl {
margin-top: 0;
padding: 0;
}
}

BIN
www/css/logo-disk-white.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
www/css/logo-white.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

73
www/css/mail.css Normal file
View File

@ -0,0 +1,73 @@
ul#webmail {
margin-top: 0;
margin-left: auto;
margin-right: auto;
table-layout: fixed;
display: table;
width: 100%;
padding: 0;
}
ul#webmail li {
display: table-cell;
text-align: center;
}
ul#webmail li .mailname {
font-size: 1.2em;
}
@media all and (min-width: 980px) {
ul#webmail {
max-width: 1280px;
}
ul#webmail li {
display: table-cell;
text-align: center;
}
}
@media all and (max-width: 980px) {
ul#webmail {
max-width: 650px;
}
ul#webmail li {
display: table-row;
text-align: center;
}
}
ul#webmail li div {
position: relative;
background: white;
margin: 1em 1em;
box-shadow: rgba(0,0,0,.3) 0 .1em .17em;
border-radius: .5rem;
cursor: pointer;
}
ul#webmail li:hover div {
box-shadow: rgba(0,0,0,.5) 0 .15em .2em;
}
ul#webmail li div a {
padding-top: 10em;
display: block;
text-decoration: none;
color: black;
}
ul#webmail li#afterlogic div {
background: white url('afterlogic.png') no-repeat;
background: white url('afterlogic.svg') no-repeat;
background-size: auto 8em;
background-position: 50% 60%;
}
ul#webmail li#squirrelmail div {
background: white url('squirrelmail.png') no-repeat;
background-size: auto 10em;
background-position: 50% 0;
}
ul#webmail li#roundcube div {
background: white url('roundcube.png') no-repeat;
background-size: auto 10em;
background-position: 50% 0;
}
ul#webmail li#rainloop div {
background: white url('rainloop.png') no-repeat;
background-size: auto 10em;
background-position: 50% 0;
}

173
www/css/projects.css Normal file
View File

@ -0,0 +1,173 @@
a.nostyle {
text-decoration: none;
color:inherit;
cursor: pointer;
}
.project-card {
position: relative;
box-sizing: border-box;
border-radius: .15em;
border: 0 solid #048;
border-left-width: .3em;
box-shadow: 0 .1em .3em -.1em rgba(0,0,0,0.5);
overflow: hidden;
top: 0;
min-height: 6em;
margin: 0;
height: 100%;
}
.project-card:hover {
box-shadow: 0.1em 0.2em 0.5em 0em rgba(0,0,0,0.5);
}
.project-title {
padding-bottom: .1em;
margin: 0;
text-overflow: ellipsis;
}
.card-content {
display: block;
margin: .6em;
margin-bottom: 0;
}
.card-content p {
line-height: 1.25em;
}
.card-content * {
margin-top: 0;
}
.project-organizer {
position: absolute;
bottom: 0;
right: 0;
margin: 0;
font-size: .8em;
text-align: right;
font-style: italic;
opacity: 0.5;
padding: 0.1em 0.4em;
}
.projects-container {
margin-top: 2em;
margin-bottom: 3em;
display: grid;
grid-template-columns: 1fr;
grid-column-gap: 0.5em;
grid-row-gap: 1.3em;
}
@media screen and (min-width: 60em) {
.projects-container {
grid-template-columns: 1fr 1fr;
}
}
@media screen and (min-width: 50rem) {
.contentsplit {
display: grid;
grid-template-columns: 17em 2.7fr;
grid-template-areas: "left right";
grid-column-gap: 0.9em;
}
}
@media screen and (max-width: 50rem) {
.contentsplit {
display: grid;
grid-template-rows: auto auto;
grid-template-areas: "right"
"left";
}
}
@media screen and (min-width: 33rem) and (max-width: 50rem) {
.projectmember-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: auto auto;
grid-template-areas: "organizers members"
"join join";
}
}
.gridl {
grid-area: left;
}
.projectmember-container {
padding: 0.1em 1em;
box-shadow: 0 2px 10px 0 rgba(0,0,0,0.2);
}
.projectmember-container h2 {
text-align: center;
}
.projectmember-container >form {
text-align: center;
grid-area: join;
}
.gridr {
border-left: 0;
grid-area: right;
padding:0;
margin:0;
}
.projectmember {
margin-bottom: 1em;
padding: 0 .5em 0 .5em;
overflow: hidden;
border-left: 4px solid #35a;
}
.projectmember p {
margin: 0;
}
.projectmember p {
font-size: .8em;
}
.projectmember p:first-child {
font-size: 1em;
margin-bottom: .2em;
}
.memberuname, .memberemail {
display: inline-block;
color: #888;
}
.memberuname {
float: left;
}
.memberemail {
float: right;
}
@media screen and (max-width: 50rem) {
.projects {
display: inline-block;
}
}
/* edit */
form .wide {
min-width: 66%;
}
form .tall {
min-height: calc(100vh - 28em);
}
@media screen and (max-width: 50rem) {
form .wide {
width: calc(100% - 2em);
margin: 0 1em;
}
}

Some files were not shown because too many files have changed in this diff Show More