From cfe2928f7b277b5224700fac2086903c6f4556c6 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Wed, 1 Feb 2017 14:28:03 +0100 Subject: [PATCH 01/58] Fixed member list --- website/public/group.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/website/public/group.php b/website/public/group.php index 72da9c8..bb393e3 100644 --- a/website/public/group.php +++ b/website/public/group.php @@ -14,12 +14,7 @@ include_once("../queries/group_page.php"); $group = selectGroupByName($_GET["groupname"]); -$members = selectGroupMembers(2); - -?> - - - Date: Wed, 1 Feb 2017 14:31:18 +0100 Subject: [PATCH 02/58] Added noposts div to group. --- website/views/group.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/website/views/group.php b/website/views/group.php index c12b552..aaec353 100644 --- a/website/views/group.php +++ b/website/views/group.php @@ -22,6 +22,10 @@ +
+

Geen posts meer!

+
+ + \ No newline at end of file -- 2.49.1 From 9d675dd897b01d2a5e4e13a124ab9944b2b63a46 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Thu, 2 Feb 2017 13:11:05 +0100 Subject: [PATCH 10/58] Fixed default image for group members. --- website/queries/group_page.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/website/queries/group_page.php b/website/queries/group_page.php index 511ff4d..b66ca54 100644 --- a/website/queries/group_page.php +++ b/website/queries/group_page.php @@ -81,7 +81,10 @@ function selectGroupMembers(int $groupID) { `username`, `fname`, `lname`, - `profilepicture` + IFNULL( + `profilepicture`, + '../img/avatar-standard.png' + ) AS profilepicture FROM `group_member` LEFT JOIN -- 2.49.1 From d4d16661dffb7ecf3c64eea28aff40aa8e4a4c4a Mon Sep 17 00:00:00 2001 From: Hendrik Date: Thu, 2 Feb 2017 13:42:59 +0100 Subject: [PATCH 11/58] added alert box when emptpy posting --- website/public/API/postPost.php | 51 ++++++++++++++++--------------- website/public/js/masonry.js | 25 ++++++++++----- website/public/js/post.js | 2 ++ website/public/styles/profile.css | 5 +++ website/views/profile.php | 4 +++ 5 files changed, 56 insertions(+), 31 deletions(-) diff --git a/website/public/API/postPost.php b/website/public/API/postPost.php index b1c6649..241bda6 100644 --- a/website/public/API/postPost.php +++ b/website/public/API/postPost.php @@ -12,36 +12,39 @@ if (isset($_SESSION["userID"]) && getRoleByID($_SESSION["userID"]) != 'frozen' && getRoleByID($_SESSION["userID"]) != 'banned') { - if (empty($_POST["title"]) or - empty($_POST["content"]) or - empty($_SESSION["userID"]) - ) { + if (empty($_SESSION["userID"])) { header('HTTP/1.1 500 Non enough arguments'); } - if (empty($_POST["group"])) { - // User Post - makePost( - $_SESSION["userID"], - null, - test_input($_POST["title"]), - test_input($_POST["content"]) - ); + if (empty(test_input($_POST["title"])) or + empty(test_input($_POST["content"])) + ) { + echo "empty"; } else { - // Group Post + if (empty($_POST["group"])) { + // User Post + makePost( + $_SESSION["userID"], + null, + test_input($_POST["title"]), + test_input($_POST["content"]) + ); + } else { + // Group Post - // Check if the user is an admin or mod of the group. - if (!in_array(selectGroupRole($_POST["group"]), array('mod', 'admin'))) { - header('HTTP/1.1 500 Non enough rights'); - return; + // Check if the user is an admin or mod of the group. + if (!in_array(selectGroupRole($_POST["group"]), array('mod', 'admin'))) { + header('HTTP/1.1 500 Non enough rights'); + return; + } + + makePost( + $_SESSION["userID"], + $_POST["group"], + test_input($_POST["title"]), + test_input($_POST["content"]) + ); } - - makePost( - $_SESSION["userID"], - $_POST["group"], - test_input($_POST["title"]), - test_input($_POST["content"]) - ); } } else { echo "frozen"; diff --git a/website/public/js/masonry.js b/website/public/js/masonry.js index 4f638c2..d0d2074 100644 --- a/website/public/js/masonry.js +++ b/website/public/js/masonry.js @@ -31,14 +31,28 @@ function postPost() { $.post("API/postPost.php", { title: title, content : content, group : groupID }) - .done(function() { - masonry(masonryMode); + .done(function(data) { + if (data == "empty") { + $('#alertbox').show(); + $('#alerttext').html("Geen titel of inhoud; vul a.u.b. in."); + window.scrollTo(0,0); + } else { + $('#alertbox').hide(); + masonry(masonryMode); + } }); } else { $.post("API/postPost.php", { title: title, content : content }) - .done(function() { - masonry(masonryMode); + .done(function(data) { + if (data == "empty") { + $('#alertbox').show(); + $('#alerttext').html("Geen titel of inhoud; vul a.u.b. in."); + window.scrollTo(0,0); + } else { + $('#alertbox').hide(); + masonry(masonryMode); + } }); } @@ -153,9 +167,6 @@ function loadMorePosts(uID, gID, offset, limit) { return; } - console.log(uID, gID, offset, limit); - - $.post("API/getPosts.php", { usr : uID, grp : gID, offset : offset, diff --git a/website/public/js/post.js b/website/public/js/post.js index f176950..7c73793 100644 --- a/website/public/js/post.js +++ b/website/public/js/post.js @@ -32,6 +32,8 @@ function deletePost(postID) { alert("Je account is bevroren, dus je kan geen posts verwijderen. Contacteer een admin als je denkt dat dit onjuist is."); } }); + noposts = false; + postAmount = 0; closeModal(); masonry(masonryMode); diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index 1bacafa..27d2bdd 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -1,5 +1,10 @@ /* New */ +.alertbox { + display: none; + background-color: firebrick; +} + .user-box { text-align: center; } diff --git a/website/views/profile.php b/website/views/profile.php index 2bb117f..120dae4 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -1,4 +1,8 @@
+
+ +
+
" src="">
-- 2.49.1 From feba1d978627948b73445a0016c1bd51e7d3bcd9 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Thu, 2 Feb 2017 13:47:41 +0100 Subject: [PATCH 12/58] fix reload after posting post --- website/public/js/masonry.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/website/public/js/masonry.js b/website/public/js/masonry.js index 7128a8a..5a4ca4c 100644 --- a/website/public/js/masonry.js +++ b/website/public/js/masonry.js @@ -38,6 +38,8 @@ function postPost() { window.scrollTo(0,0); } else { $('#alertbox').hide(); + noposts = false; + postAmount = 0; masonry(masonryMode); } }); @@ -51,6 +53,8 @@ function postPost() { window.scrollTo(0,0); } else { $('#alertbox').hide(); + noposts = false; + postAmount = 0; masonry(masonryMode); } }); -- 2.49.1 From 93e63111de4738629b0921cc5ca9882ef35a7581 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Thu, 2 Feb 2017 13:54:52 +0100 Subject: [PATCH 13/58] cleaned fix --- website/public/js/masonry.js | 8 ++++---- website/public/js/post.js | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/website/public/js/masonry.js b/website/public/js/masonry.js index 5a4ca4c..a628e96 100644 --- a/website/public/js/masonry.js +++ b/website/public/js/masonry.js @@ -38,8 +38,6 @@ function postPost() { window.scrollTo(0,0); } else { $('#alertbox').hide(); - noposts = false; - postAmount = 0; masonry(masonryMode); } }); @@ -53,8 +51,6 @@ function postPost() { window.scrollTo(0,0); } else { $('#alertbox').hide(); - noposts = false; - postAmount = 0; masonry(masonryMode); } }); @@ -116,6 +112,10 @@ function masonry(mode) { masonryMode = mode; $container.children().remove(); + // reinit posts + noposts = false; + postAmount = 0; + /* * Initialise columns. */ diff --git a/website/public/js/post.js b/website/public/js/post.js index 20da034..4009023 100644 --- a/website/public/js/post.js +++ b/website/public/js/post.js @@ -32,8 +32,6 @@ function deletePost(postID) { alert("Je account is bevroren, dus je kan geen posts verwijderen. Contacteer een admin als je denkt dat dit onjuist is."); } }); - noposts = false; - postAmount = 0; closeModal(); masonry(masonryMode); } \ No newline at end of file -- 2.49.1 From d24ed8909681d7cf9f85d5e20f41d6b6ad2d87a0 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 2 Feb 2017 14:04:59 +0100 Subject: [PATCH 14/58] BUG FIX: mobile support fix --- website/public/bits/niet_slecht.php | 7 +++++++ website/public/js/chat.js | 3 +++ website/views/head.php | 1 - 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 website/public/bits/niet_slecht.php diff --git a/website/public/bits/niet_slecht.php b/website/public/bits/niet_slecht.php new file mode 100644 index 0000000..05b981a --- /dev/null +++ b/website/public/bits/niet_slecht.php @@ -0,0 +1,7 @@ + - MyHyvesbook+ -- 2.49.1 From 417124a1fed22f85cd86615e83df488455baeb30 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 2 Feb 2017 14:13:20 +0100 Subject: [PATCH 15/58] BUG FIX: added 0 in chat time if needed --- website/public/js/chat.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/website/public/js/chat.js b/website/public/js/chat.js index 1141334..a3ff430 100644 --- a/website/public/js/chat.js +++ b/website/public/js/chat.js @@ -59,7 +59,7 @@ function addMessages(messages) { for(var i in messages) { // Initialize message variables. var thisDate = new Date(messages[i].creationdate.replace(/ /,"T")); - var thisTime = thisDate.getHours() + ":" + thisDate.getMinutes(); + var thisTime = thisDate.getHours() + ":" + ('0' + thisDate.getMinutes()).slice(-2); var type; thisDate.setHours(0,0,0,0); @@ -81,6 +81,8 @@ function addMessages(messages) {
'; } previousDate = thisDate; + previousTime = thisTime; + previousType = type; messagesText += '
'; // If it is not the first message, and has a different date/time/type then the previous message, } else if (type != previousType || thisTime != previousTime || thisDate.getTime() > previousDate.getTime()) { -- 2.49.1 From 4a7a91ecd964f1cb0827765078314d04ac6534dc Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Thu, 2 Feb 2017 14:20:17 +0100 Subject: [PATCH 16/58] Fixed bug (not showing profile when on own profile) --- website/public/profile.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/website/public/profile.php b/website/public/profile.php index d9a317c..aa4cf7c 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -21,19 +21,14 @@ include_once("../queries/calcAge.php"); if(empty($_GET["username"])) { $userID = $_SESSION["userID"]; - $showProfile = True; } else { $userID = getUserID($_GET["username"]); - $showProfile = False; } $user = selectUser($_SESSION["userID"], $userID); $profile_friends = selectAllFriends($userID); $profile_groups = selectAllUserGroups($userID); -$showProfile = $showProfile || $user["showProfile"] || ($user["status"] == 'confirmed'); -echo " friendship status: " . $user["status"]; -echo " showprofile: $showProfile"; -echo " userID: " . $user["userID"]; +$showProfile = $user["showProfile"] || ($user["status"] == 'confirmed') || $_SESSION["userID"] == $userID; if ($userID == $_SESSION["userID"]) { -- 2.49.1 From 188741ddf5ded574767a0115f06af8bd2a97487b Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 2 Feb 2017 14:22:13 +0100 Subject: [PATCH 17/58] BUG FIX: link in fancy text now opens in new tab --- website/public/js/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/public/js/main.js b/website/public/js/main.js index b6ab703..30cd3ed 100644 --- a/website/public/js/main.js +++ b/website/public/js/main.js @@ -31,7 +31,7 @@ function fancyText(text) { } // Add links else { - return "" + link + ""; + return "" + link + ""; } }); -- 2.49.1 From 1672ce6086deed96f1325a3044e9fe9c632adaf6 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 2 Feb 2017 14:23:36 +0100 Subject: [PATCH 18/58] Changed offline status to 5 minutes after inactive --- website/queries/friendship.php | 8 ++++---- website/queries/user.php | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/website/queries/friendship.php b/website/queries/friendship.php index 7edada9..3dcd53b 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -17,7 +17,7 @@ function selectLimitedFriends($userID, $limit) { `profilepicture`, '../img/avatar-standard.png' ) AS profilepicture, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus`, @@ -58,7 +58,7 @@ function selectAllFriends($userID) { `profilepicture`, '../img/avatar-standard.png' ) AS profilepicture, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus`, @@ -94,7 +94,7 @@ function selectAllFriendRequests() { `profilepicture`, '../img/avatar-standard.png' ) AS profilepicture, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus`, @@ -245,7 +245,7 @@ function searchSomeFriends($n, $m, $search) { `profilepicture`, '../img/avatar-standard.png' ) AS profilepicture, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus`, diff --git a/website/queries/user.php b/website/queries/user.php index e8bda13..7b8ef3f 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -62,7 +62,7 @@ function selectUser($me, $other) { ) AS profilepicture, `bio`, `user`.`creationdate`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus`, @@ -131,7 +131,7 @@ function select20UsersFromN($n) { `username`, `role`, `bancomment`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus` @@ -156,7 +156,7 @@ function search20UsersFromN($n, $keyword) { `username`, `role`, `bancomment`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus` @@ -184,7 +184,7 @@ function search20UsersFromNByStatus($n, $keyword, $status) { `username`, `role`, `bancomment`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus` @@ -218,7 +218,7 @@ function searchSomeUsersByStatus($n, $m, $search, $status) { `username`, `role`, `bancomment`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus` @@ -362,7 +362,7 @@ function searchSomeUsers($n, $m, $search) { '../img/avatar-standard.png' ) AS profilepicture, LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 12) as `fullname`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus` -- 2.49.1 From 6fc2f715176a34529d129a0f1a79d4d57f9ae659 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 2 Feb 2017 14:27:23 +0100 Subject: [PATCH 19/58] Added meta data in the login page --- website/views/login_head.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/website/views/login_head.php b/website/views/login_head.php index e319a9d..bb7d7cf 100644 --- a/website/views/login_head.php +++ b/website/views/login_head.php @@ -1,5 +1,8 @@ - + + + + MyHyvesbook+ Date: Thu, 2 Feb 2017 14:50:51 +0100 Subject: [PATCH 20/58] Added "add group" under group menu --- website/views/menu.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/views/menu.php b/website/views/menu.php index dab8fce..1c1cf01 100644 --- a/website/views/menu.php +++ b/website/views/menu.php @@ -12,6 +12,8 @@ + +
@@ -122,6 +122,7 @@ if (isset($_GET["groupstatus"])) { + Maak Owner"; + value=\"owner\">Maak Eigenaar"; } ?> @@ -139,9 +140,9 @@ if (isset($_GET["groupstatus"])) { onsubmit="adminUpdate(this); return false;"> - - - + + +
-- 2.49.1 From cfa7c870f08417b80d5d7c285207deb0e94db228 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Thu, 2 Feb 2017 15:13:35 +0100 Subject: [PATCH 25/58] fix profile error color --- website/public/styles/profile.css | 4 ++++ website/views/profile.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index dbb3d24..46906d2 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -5,6 +5,10 @@ background-color: firebrick; } +.alerttext { + color: white; +} + .user-box { text-align: center; } diff --git a/website/views/profile.php b/website/views/profile.php index 7348642..4139099 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -1,6 +1,6 @@
- +
-- 2.49.1 From 8a3cfebf55bbc8380034c25741f52682beb2b9aa Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Thu, 2 Feb 2017 15:34:45 +0100 Subject: [PATCH 26/58] Redirect to 404 from profile and group --- website/public/group.php | 9 ++++++++- website/public/profile.php | 7 ++++++- website/queries/group_page.php | 7 ++++++- website/queries/user.php | 4 +++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/website/public/group.php b/website/public/group.php index bb393e3..84726fa 100644 --- a/website/public/group.php +++ b/website/public/group.php @@ -13,9 +13,16 @@ include_once("../queries/group_page.php"); -$group = selectGroupByName($_GET["groupname"]); +if(!$group = selectGroupByName($_GET["groupname"])) { + header("HTTP/1.0 404 Not Found"); + header("Location: error/404.php"); + die(); +} + + $members = selectGroupMembers($group["groupID"]); + /* * This view adds the main layout over the screen. * Header, menu, footer. diff --git a/website/public/profile.php b/website/public/profile.php index aa4cf7c..126c87f 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -25,7 +25,12 @@ if(empty($_GET["username"])) { $userID = getUserID($_GET["username"]); } -$user = selectUser($_SESSION["userID"], $userID); +if(!$user = selectUser($_SESSION["userID"], $userID)) { + header("HTTP/1.0 404 Not Found"); + header("Location: error/404.php"); + die(); +} + $profile_friends = selectAllFriends($userID); $profile_groups = selectAllUserGroups($userID); $showProfile = $user["showProfile"] || ($user["status"] == 'confirmed') || $_SESSION["userID"] == $userID; diff --git a/website/queries/group_page.php b/website/queries/group_page.php index f2f028f..a6676c4 100644 --- a/website/queries/group_page.php +++ b/website/queries/group_page.php @@ -33,7 +33,12 @@ function selectGroupByName($name) { if (!$stmt->execute()) { return False; } - return $stmt->fetch(); + $row = $stmt->fetch(); + if($row["groupID"] == null) { + return False; + } + + return $row; } function selectGroupRole(int $groupID) { diff --git a/website/queries/user.php b/website/queries/user.php index 972937d..836c956 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -101,7 +101,9 @@ function selectUser($me, $other) { $stmt->bindParam(':me', $me, PDO::PARAM_INT); $stmt->bindParam(':other', $other, PDO::PARAM_INT); - $stmt->execute(); + if(!$stmt->execute() || $stmt->rowCount() == 0) { + return False; + } return $stmt->fetch(); } -- 2.49.1 From 1c53eab2fa77c02aaeb7340a38b053d38c0cf335 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Thu, 2 Feb 2017 15:50:12 +0100 Subject: [PATCH 27/58] Fixed user group list on profile page. --- website/queries/user.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/queries/user.php b/website/queries/user.php index 06487be..422edc4 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -122,7 +122,7 @@ function selectAllUserGroups($userID) { `group_page`.`groupID` = `group_member`.`groupID` WHERE `userID` = :userID AND - `role` = 'member' + `role` IN ('member', 'mod', 'admin') "); $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); -- 2.49.1 From afb45d6709c6ddf640bac34844ac4e3ac8f38055 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Thu, 2 Feb 2017 15:51:27 +0100 Subject: [PATCH 28/58] add closing of modal on escape key and clicking outside --- website/public/js/masonry.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/website/public/js/masonry.js b/website/public/js/masonry.js index a628e96..107f710 100644 --- a/website/public/js/masonry.js +++ b/website/public/js/masonry.js @@ -83,6 +83,21 @@ $(window).on("load", function() { loadMorePosts(userID, groupID, postAmount, postLimit); } }; + + $(document).keyup(function(e) { + if (e.keyCode == 27) { + closeModal(); + } + }); + + $('.modal').click(function() { + closeModal(); + }); + + $('.modal-content').click(function(event){ + event.stopPropagation(); + }); + }); function closeModal() { -- 2.49.1 From 380d8fa83a7ea8780f09fd8c1a8df7965b8f45b1 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Thu, 2 Feb 2017 16:01:45 +0100 Subject: [PATCH 29/58] Group Shit --- website/public/createGroup.php | 36 +++++++++++++++ website/public/groupAdmin.php | 46 ++++++++++++++++++++ website/queries/createGroup.php | 37 ++++++++++++++++ website/queries/groupAdmin.php | 61 ++++++++++++++++++++++++++ website/queries/picture.php | 12 ++--- website/views/createGroup.php | 42 ++++++++++++++++++ website/views/groupAdmin.php | 77 +++++++++++++++++++++++++++++++++ website/views/menu.php | 2 +- 8 files changed, 306 insertions(+), 7 deletions(-) create mode 100644 website/public/createGroup.php create mode 100644 website/public/groupAdmin.php create mode 100644 website/queries/createGroup.php create mode 100644 website/queries/groupAdmin.php create mode 100644 website/views/createGroup.php create mode 100644 website/views/groupAdmin.php diff --git a/website/public/createGroup.php b/website/public/createGroup.php new file mode 100644 index 0000000..ffeb6e3 --- /dev/null +++ b/website/public/createGroup.php @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/website/public/groupAdmin.php b/website/public/groupAdmin.php new file mode 100644 index 0000000..13ff7e0 --- /dev/null +++ b/website/public/groupAdmin.php @@ -0,0 +1,46 @@ + + + + + + + + +getClass(); + $alertMessage = $w->getMessage(); + } +} + +/* Add your view files here. */ +include("../views/groupAdmin.php"); + +/* This adds the footer. */ +include("../views/footer.php"); +?> + + diff --git a/website/queries/createGroup.php b/website/queries/createGroup.php new file mode 100644 index 0000000..20ee28b --- /dev/null +++ b/website/queries/createGroup.php @@ -0,0 +1,37 @@ +bindValue(':name', test_input($_POST["groupName"]), PDO::PARAM_STR); + $createGroup->bindValue(':description', test_input($_POST["bio"])); + $createGroup->execute(); + + $getGroupID = prepareQuery(" + SELECT + `groupID` + FROM + `group_page` + WHERE + `name` LIKE :name"); + $getGroupID->bindValue(':name', test_input($_POST["groupName"]), PDO::PARAM_STR); + $getGroupID->execute(); + $groupID = $getGroupID->fetch()["groupID"]; + + $makeUserAdmin = prepareQuery(" + INSERT INTO + `group_member` (userID, groupID, role) + VALUES (:userID, :groupID, 'admin') + "); + $makeUserAdmin->bindValue(":userID", $_SESSION["userID"]); + $makeUserAdmin->bindValue("groupID", $groupID); + $makeUserAdmin->execute(); + + updateAvatar($groupID); +} \ No newline at end of file diff --git a/website/queries/groupAdmin.php b/website/queries/groupAdmin.php new file mode 100644 index 0000000..ae2abd3 --- /dev/null +++ b/website/queries/groupAdmin.php @@ -0,0 +1,61 @@ +bindParam(":groupID", $groupID); + $stmt->execute(); + return $stmt->fetch(); +} + +function updateGroupSettings(int $groupID) +{ + if (!checkGroupAdmin($groupID, $_SESSION["userID"])) { + throw new AngryAlert("Je hebt geen rechten in deze groep"); + } + $stmt = prepareQuery(" + UPDATE + `group_page` + SET + `name` = :name, + `description` = :bio + WHERE + `groupID` = :groupID + "); + $stmt->bindValue(":bio", test_input($_POST["bio"])); + $stmt->bindValue(":name", test_input($_POST["name"])); + $stmt->bindValue(":groupID", test_input($_POST["groupID"])); + $stmt->execute(); + if ($stmt->rowCount()) { + throw new HappyAlert("Groep aangepast!"); + } else { + throw new AngryAlert("Er is iets mis gegaan"); + } +} + +function checkGroupAdmin(int $groupID, int $userID) : bool { + $stmt = prepareQuery(" + SELECT + `role` + FROM + `group_member` + WHERE + `groupID` = :groupID AND + `userID` = :userID + "); + $stmt->bindValue(":userID", $userID); + $stmt->bindValue(":groupID", $groupID); + $stmt->execute(); + if (!$stmt->rowCount()) { + return false; + } + $role = $stmt->fetch()["role"]; + return ($role == "admin"); +} \ No newline at end of file diff --git a/website/queries/picture.php b/website/queries/picture.php index 8e99d9a..ba27f72 100644 --- a/website/queries/picture.php +++ b/website/queries/picture.php @@ -6,7 +6,7 @@ * @throws AngryAlert * @throws HappyAlert */ -function updateAvatar(bool $group = false) { +function updateAvatar(int $group = 0) { $publicDir = "/var/www/html/public/"; $tmpImg = $_FILES["pp"]["tmp_name"]; $avatarDir = $group ? "uploads/groupavatar/" : "uploads/profilepictures/"; @@ -16,17 +16,17 @@ function updateAvatar(bool $group = false) { if ($_FILES["pp"]["size"] > 4000000) { throw new AngryAlert("Bestand is te groot, maximaal 4MB toegestaan."); } - $relativePath = $avatarDir . $_SESSION["userID"] . "_avatar.gif"; - $group ? removeOldGroupAvatar($_POST["groupID"]) : removeOldUserAvatar(); + $relativePath = $group ? $avatarDir . $group . "_avatar.gif" : $avatarDir . $_SESSION["userID"] . "_avatar.gif"; + $group ? removeOldGroupAvatar($group) : removeOldUserAvatar(); move_uploaded_file($tmpImg, $publicDir . $relativePath); } else { - $relativePath = $avatarDir . $_SESSION["userID"] . "_avatar.png"; + $relativePath = $group ? $avatarDir . $group . "_avatar.png": $avatarDir . $_SESSION["userID"] . "_avatar.png"; $scaledImg = scaleAvatar($tmpImg); - $group ? removeOldGroupAvatar($_POST["groupID"]) : removeOldUserAvatar(); + $group ? removeOldGroupAvatar($group) : removeOldUserAvatar(); imagepng($scaledImg, $publicDir . $relativePath); } - $group ? setGroupAvatarToDatabase("../" . $relativePath, $_POST["groupID"]) : setUserAvatarToDatabase("../" . $relativePath); + $group ? setGroupAvatarToDatabase("../" . $relativePath, $group) : setUserAvatarToDatabase("../" . $relativePath); throw new HappyAlert("Profielfoto veranderd."); } diff --git a/website/views/createGroup.php b/website/views/createGroup.php new file mode 100644 index 0000000..736fc45 --- /dev/null +++ b/website/views/createGroup.php @@ -0,0 +1,42 @@ + + +
+
+
+
Maak een groep!
+
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
+
+
+
diff --git a/website/views/groupAdmin.php b/website/views/groupAdmin.php new file mode 100644 index 0000000..66b38f5 --- /dev/null +++ b/website/views/groupAdmin.php @@ -0,0 +1,77 @@ + +
+
+ +
+ +
+ +
+
Groep Instellingen
+ "> +
    +
  • + + " + > +
  • +
  • + + + +
  • +
  • + + +
  • +
+
+
+
Verander groepsafbeelding.
+ "> +
    +
  • + + " + class="group-picture" + > +
  • +
  • + + +
  • +
  • + + +
  • +
+
+
+
\ No newline at end of file diff --git a/website/views/menu.php b/website/views/menu.php index dab8fce..03e0f56 100644 --- a/website/views/menu.php +++ b/website/views/menu.php @@ -14,7 +14,7 @@ +
+ +
\ No newline at end of file -- 2.49.1 From 74e91ed7cb18acebaabd5b6356f87aec25830977 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Thu, 2 Feb 2017 21:14:25 +0100 Subject: [PATCH 34/58] Add mods/admin to a group. --- website/public/groupAdmin.php | 27 ++++++++++++++----- website/queries/groupAdmin.php | 48 ++++++++++++++++++++++++++++++++++ website/queries/settings.php | 15 +++++++++++ website/views/groupAdmin.php | 29 ++++++++++++++++++++ 4 files changed, 113 insertions(+), 6 deletions(-) diff --git a/website/public/groupAdmin.php b/website/public/groupAdmin.php index 13ff7e0..6095149 100644 --- a/website/public/groupAdmin.php +++ b/website/public/groupAdmin.php @@ -23,12 +23,27 @@ $alertClass; $alertMessage; if ($_SERVER["REQUEST_METHOD"] == "POST") { try { - if ($_POST["form"] == "group") { - updateGroupSettings($_POST["groupID"]); - } else if ($_POST["form"] == "picture") { - if (checkGroupAdmin($_POST["groupID"], $_SESSION["userID"])) { - updateAvatar($_POST["groupID"]); - } + switch ($_POST["form"]) { + case "group": + updateGroupSettings($_POST["groupID"]); + break; + case "picture": + if (checkGroupAdmin($_POST["groupID"], $_SESSION["userID"])) { + updateAvatar($_POST["groupID"]); + } + break; + case "mod": + if (!array_key_exists("userID", $_POST)) { + throw new AngryAlert("Geen gebruiker geselecteerd."); + } + upgradeUser($_POST["groupID"], $_POST["userID"], "mod"); + break; + case "admin": + if (!array_key_exists("userID", $_POST)) { + throw new AngryAlert("Geen gebruiker geselecteerd."); + } + upgradeUser($_POST["groupID"], $_POST["userID"], "admin"); + break; } } catch (AlertMessage $w) { $alertClass = $w->getClass(); diff --git a/website/queries/groupAdmin.php b/website/queries/groupAdmin.php index ae2abd3..e3580b6 100644 --- a/website/queries/groupAdmin.php +++ b/website/queries/groupAdmin.php @@ -58,4 +58,52 @@ function checkGroupAdmin(int $groupID, int $userID) : bool { } $role = $stmt->fetch()["role"]; return ($role == "admin"); +} + +function getAllGroupMembers(int $groupID) { + $stmt = prepareQuery(" + SELECT + `username`, + `user`.`userID`, + CONCAT(`fname`, ' ', `lname`) AS `fullname`, + `group_member`.`role` + FROM + `group_member` + LEFT JOIN + `user` + ON + `group_member`.`userID` = `user`.`userID` + WHERE + `groupID` = :groupID AND `group_member`.`role` = 'member' + "); + + $stmt->bindParam(':groupID', $groupID); + if (!$stmt->execute()) { + return False; + } + return $stmt->fetchAll(); +} + +function upgradeUser(int $groupID, int $userID, string $role) { + if (!checkGroupAdmin($groupID, $_SESSION["userID"])) { + throw new AngryAlert("Geen toestemming om te wijzigen"); + } + + $stmt = prepareQuery(" + UPDATE + `group_member` + SET + `role` = :role + WHERE + `userID` = :userID AND `groupID` = :groupID + "); + $stmt->bindValue(":groupID", $groupID); + $stmt->bindValue(":userID", $userID); + $stmt->bindValue(":role", $role); + $stmt->execute(); + if ($stmt->rowCount()) { + throw new HappyAlert("Permissie aangepast!"); + } else { + throw new AngryAlert("Er is iets mis gegaan"); + } } \ No newline at end of file diff --git a/website/queries/settings.php b/website/queries/settings.php index 9b17d17..26237ec 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -148,6 +148,10 @@ function doChangePassword() { } } +/** + * Changes the users email if it is valid. + * @throws AngryAlert + */ function changeEmail() { if (test_input($_POST["email"]) == test_input($_POST["email-confirm"])) { @@ -164,6 +168,11 @@ function changeEmail() { } } +/** + * Checks if an emailadres is available in the database. + * @param $email + * @throws AngryAlert + */ function emailIsAvailableInDatabase($email) { $stmt = prepareQuery(" SELECT @@ -181,6 +190,12 @@ function emailIsAvailableInDatabase($email) { } } +/** + * Does the actual changing of an email-adress. + * @param $email + * @throws AngryAlert + * @throws HappyAlert + */ function doChangeEmail($email) { $stmt = prepareQuery(" UPDATE diff --git a/website/views/groupAdmin.php b/website/views/groupAdmin.php index a28553e..54fbee8 100644 --- a/website/views/groupAdmin.php +++ b/website/views/groupAdmin.php @@ -85,6 +85,35 @@ $groupinfo = getGroupSettings($_GET["groupID"]); +
+
Voeg een admin/mod toe
+
    + + " type="hidden"> + + + + + +
+
  • -- 2.49.1 From 7e4107ac8b357bc1335c9657293182a5ce18720c Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 3 Feb 2017 00:13:23 +0100 Subject: [PATCH 35/58] Added fancy buttons in profile --- website/public/js/friendButtons.js | 28 +++++++++++++++------------- website/public/js/groupButtons.js | 12 ++++++------ website/public/styles/post-popup.css | 12 ------------ website/public/styles/profile.css | 19 ++++++++++++------- website/views/post-view.php | 4 ++-- website/views/profile.php | 14 ++++++++++---- 6 files changed, 45 insertions(+), 44 deletions(-) diff --git a/website/public/js/friendButtons.js b/website/public/js/friendButtons.js index 47c476a..303ccf9 100644 --- a/website/public/js/friendButtons.js +++ b/website/public/js/friendButtons.js @@ -19,24 +19,24 @@ function placeFriendButtons() { case "0": value1 = "request"; class1 = "green"; - text1 = "Bevriend"; - icon1 = "fa-handshake-o"; + text1 = "Word vrienden"; + icon1 = "fa-user-plus"; break; case "1": value1 = userID; class1 = "green"; text1 = "Chat"; - icon1 = "fa-comment-o"; + icon1 = "fa-comment"; value2 = "delete"; class2 = "red"; - text2 = "Verwijder"; - icon2 = "fa-times"; + text2 = "Ontvriend"; + icon2 = "fa-user-times"; break; case "2": value1 = "delete"; class1 = "red"; text1 = "Trek verzoek in"; - icon1 = "fa-cross"; + icon1 = "fa-times"; break; case "3": value1 = "accept"; @@ -51,16 +51,18 @@ function placeFriendButtons() { } $buttonContainer.append( - ""); + "
    "); $buttonContainer.append( - ""); + "
    "); - $buttonContainer.children().click(function() { + $buttonContainer.find("button").click(function() { if (isNaN(this.value)) editFriendship(userID, this.value); else if (this.value != "") diff --git a/website/public/js/groupButtons.js b/website/public/js/groupButtons.js index 549277d..caf3ab8 100644 --- a/website/public/js/groupButtons.js +++ b/website/public/js/groupButtons.js @@ -5,23 +5,23 @@ function placeGroupButtons() { if (data == 'none') { $buttonContainer.append( - ""); } else if (data == 'request') { $buttonContainer.append( - ""); } else if (data == 'admin') { $buttonContainer.append( - "" ); } else { $buttonContainer.append( - ""); } diff --git a/website/public/styles/post-popup.css b/website/public/styles/post-popup.css index 9493b83..e82129b 100644 --- a/website/public/styles/post-popup.css +++ b/website/public/styles/post-popup.css @@ -92,16 +92,4 @@ .deleteButton { background-color: firebrick; float: right; -} - -.deleteButton i { - display: inline-block; -} - -.deleteButton:hover span { - display: inline-block; -} - -.deleteButton span { - display: none; } \ No newline at end of file diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index 18e105e..8a93d12 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -27,16 +27,21 @@ display: inline-block; } +.friend-button-container div, .status-buttons-container div { + width: 200px; + display: inline-block; +} + .friend-button-container button, .status-buttons-container button, .group-button-container button { display: block; + float: right; margin: 7px 0; font-size: 18px; } - -.friend-button-container button, .status-buttons-container button, .group-button-fixed { - width: 200px; +.status-buttons-container button { + float: left; } .group-button-container button { @@ -76,19 +81,19 @@ border: none; } -.group-button-fancy span { +.fancy-button span { display: none; } -.group-button-fancy:hover { +.fancy-button:hover { text-align: right; } -.group-button-fancy i { +.fancy-button i { display: inline-block; } -.group-button-fancy:hover span { +.fancy-button:hover span { display: inline-block; margin-right: 5px; } diff --git a/website/views/post-view.php b/website/views/post-view.php index 717e6a8..fadc791 100644 --- a/website/views/post-view.php +++ b/website/views/post-view.php @@ -13,11 +13,11 @@ $fullname = $post['fname'] . " " . $post['lname'] . " (" . $post['username'] . "
-
diff --git a/website/views/profile.php b/website/views/profile.php index 62157f4..0cb5cc2 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -7,10 +7,16 @@ <?= $user[" class="profile-picture main-picture " src="">
- - +
+ +
+
+ +

:)

-- 2.49.1 From 6d739a4480019709d6abe9addea37ade0ebbc34d Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 3 Feb 2017 00:24:38 +0100 Subject: [PATCH 36/58] Chat is now only loading the last 100 messages --- website/queries/private_message.php | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/website/queries/private_message.php b/website/queries/private_message.php index 3b88563..f2df887 100644 --- a/website/queries/private_message.php +++ b/website/queries/private_message.php @@ -6,18 +6,23 @@ function getOldChatMessages($user2ID) { if (getFriendshipStatus($user2ID) == 1) { $stmt = prepareQuery(" SELECT - * + * FROM - `private_message` - WHERE - `origin` = :user1 AND - `destination` = :user2 OR - `origin` = :user2 AND - `destination` = :user1 + (SELECT + * + FROM + `private_message` + WHERE + `origin` = :user1 AND + `destination` = :user2 OR + `origin` = :user2 AND + `destination` = :user1 + ORDER BY + `messageID` DESC + LIMIT + 100) sub ORDER BY - `creationdate` ASC - LIMIT - 100 + `messageID` ASC "); $stmt->bindParam(":user1", $user1ID); @@ -76,7 +81,7 @@ function getNewChatMessages($lastID, $destination) { `destination` = :user1) AND `messageID` > :lastID ORDER BY - `creationdate` ASC + `messageID` ASC "); $stmt->bindParam(':user1', $_SESSION["userID"]); -- 2.49.1 From 02349dbe2846597ee77772bfef19eeb454455419 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 3 Feb 2017 10:30:44 +0100 Subject: [PATCH 37/58] Changed description --- website/public/js/friendButtons.js | 4 ++-- website/views/head.php | 2 +- website/views/login_head.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/website/public/js/friendButtons.js b/website/public/js/friendButtons.js index 303ccf9..87222e9 100644 --- a/website/public/js/friendButtons.js +++ b/website/public/js/friendButtons.js @@ -53,12 +53,12 @@ function placeFriendButtons() { $buttonContainer.append( "
"); $buttonContainer.append( "
"); diff --git a/website/views/head.php b/website/views/head.php index 52bcab8..3ec8a79 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -1,5 +1,5 @@ - + MyHyvesbook+ diff --git a/website/views/login_head.php b/website/views/login_head.php index b4b2724..9e580df 100644 --- a/website/views/login_head.php +++ b/website/views/login_head.php @@ -1,6 +1,6 @@ - + MyHyvesbook+ -- 2.49.1 From fde736b8c50e49d86ca78853014746e1745d816c Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 3 Feb 2017 10:33:44 +0100 Subject: [PATCH 38/58] misc --- website/public/js/admin.js | 9 +++++++++ website/public/styles/adminpanel.css | 11 ++++++++--- website/queries/checkInput.php | 1 + website/views/adminpanel-grouptable.php | 2 +- website/views/adminpanel.php | 3 +-- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/website/public/js/admin.js b/website/public/js/admin.js index e0dc9f7..76180d9 100644 --- a/website/public/js/admin.js +++ b/website/public/js/admin.js @@ -24,12 +24,14 @@ $(window).on("load", function () { }); }); +// Toggles all checkboxes based on one. function checkAll() { $('.checkbox-list').each(function () { $(this).prop('checked', $('#checkall').prop('checked')); }); } +// Simple function that checks if checkall should stay checked. function checkCheckAll() { var checked = true; @@ -43,6 +45,7 @@ function checkCheckAll() { $('#checkall').prop('checked', checked); } +// Toggle of filter options. function changeFilter() { if ($('#pagetype').find(":selected").val() == "group") { document.getElementById('admin-filter').style.display = 'none'; @@ -59,11 +62,13 @@ function changeFilter() { } } +// Sets the search page to one, relevant when changing filter or search. function searchFromOne() { $('#currentpage').prop('value', 1); adminSearch(); } +// AJAX live search. function adminSearch() { $.post( "API/adminSearchUsers.php", @@ -74,6 +79,7 @@ function adminSearch() { }) } +// AJAX live update. function adminUpdate(form) { $.post( "API/adminChangeUser.php", @@ -83,6 +89,7 @@ function adminUpdate(form) { }) } +// AJAX pagenumber functionality. function updatePageN() { $.post( "API/adminPageNumber.php", @@ -92,11 +99,13 @@ function updatePageN() { }) } +// Intended for the edit button to show a form. function toggleBancomment(button) { $(button).siblings("div").toggle(); $(button).toggle(); } +// AJAX value editing. function editComment(form) { $.post( "API/adminChangeUser.php", diff --git a/website/public/styles/adminpanel.css b/website/public/styles/adminpanel.css index 39d823f..ec3cc80 100644 --- a/website/public/styles/adminpanel.css +++ b/website/public/styles/adminpanel.css @@ -34,9 +34,10 @@ width: 100%; } -.usertable .table-username {width: 150px} -.usertable .table-status {width: 100px} -.usertable .table-action {width: 200px} +.table-checkbox {width: 20px} +.table-username {width: 150px} +.table-status {width: 100px} +.table-action {width: 200px} .usertable th, td { border-bottom: 1px solid #ddd; @@ -51,6 +52,10 @@ background-color: #f5f5f5; } +.bancomment { + width: 80%; +} + .bancommentedit { display: none; } diff --git a/website/queries/checkInput.php b/website/queries/checkInput.php index 69274ce..d2c9aca 100644 --- a/website/queries/checkInput.php +++ b/website/queries/checkInput.php @@ -216,6 +216,7 @@ function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); + $data = trim($data); return $data; } diff --git a/website/views/adminpanel-grouptable.php b/website/views/adminpanel-grouptable.php index 2449b3d..d30e2ba 100644 --- a/website/views/adminpanel-grouptable.php +++ b/website/views/adminpanel-grouptable.php @@ -3,7 +3,7 @@ Groepsnaam Status Beschrijving - Actie + Zichtbaarheid + Date: Fri, 3 Feb 2017 10:34:07 +0100 Subject: [PATCH 39/58] Revert "Merge branch 'joey-testing' into 'master'" This reverts merge request !196 --- website/views/homeLoginRegister.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/website/views/homeLoginRegister.php b/website/views/homeLoginRegister.php index 24fa266..ad7be40 100644 --- a/website/views/homeLoginRegister.php +++ b/website/views/homeLoginRegister.php @@ -29,12 +29,13 @@ $user = $psw = $remember =""; $loginErr = $resetErr = $fbRegisterErr =""; if ($_SERVER["REQUEST_METHOD"] == "POST") { + $url = $_POST["url"]; // Checks for which button is pressed switch ($_POST["submit"]) { case "login": try { $user = ($_POST["user"]); - validateLogin($_POST["user"], $_POST["psw"], $_POST["url"];); + validateLogin($_POST["user"], $_POST["psw"], $url); } catch(loginException $e) { $loginErr = $e->getMessage(); } -- 2.49.1 From c8dbdfe70e4c8a9d8ac20e7cd504996cbf58ace7 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Fri, 3 Feb 2017 10:34:44 +0100 Subject: [PATCH 40/58] Fixed url --- website/views/homeLoginRegister.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/views/homeLoginRegister.php b/website/views/homeLoginRegister.php index 24fa266..2e00905 100644 --- a/website/views/homeLoginRegister.php +++ b/website/views/homeLoginRegister.php @@ -34,7 +34,7 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { case "login": try { $user = ($_POST["user"]); - validateLogin($_POST["user"], $_POST["psw"], $_POST["url"];); + validateLogin($_POST["user"], $_POST["psw"], $_POST["url"]); } catch(loginException $e) { $loginErr = $e->getMessage(); } -- 2.49.1 From bb352c7a7a503ff03483af6ed30a009b36f9c413 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 3 Feb 2017 10:41:29 +0100 Subject: [PATCH 41/58] merge --- website/views/head.php | 1 + 1 file changed, 1 insertion(+) diff --git a/website/views/head.php b/website/views/head.php index 3ec8a79..134cd6f 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -26,6 +26,7 @@ require_once ("../queries/user.php"); session_start(); +$_SESSION["userID"] = 11; if(!isset($_SESSION["userID"])) { header("location:login.php?url=" . "$_SERVER[REQUEST_URI]"); } else { -- 2.49.1 From 28e9269b523a6a7fb343442a2eda3469b82550e0 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Fri, 3 Feb 2017 10:44:50 +0100 Subject: [PATCH 42/58] Delete groups --- website/public/groupAdmin.php | 3 +++ website/public/settings.php | 1 - website/queries/groupAdmin.php | 21 ++++++++++++++++++++- website/queries/settings.php | 5 ++++- website/views/groupAdmin.php | 25 ++++++++++++++++++------- 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/website/public/groupAdmin.php b/website/public/groupAdmin.php index 6095149..30c44fa 100644 --- a/website/public/groupAdmin.php +++ b/website/public/groupAdmin.php @@ -44,6 +44,9 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { } upgradeUser($_POST["groupID"], $_POST["userID"], "admin"); break; + case "delete": + deleteGroup(); + break; } } catch (AlertMessage $w) { $alertClass = $w->getClass(); diff --git a/website/public/settings.php b/website/public/settings.php index 9247d26..6996f54 100644 --- a/website/public/settings.php +++ b/website/public/settings.php @@ -29,7 +29,6 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { case "picture": updateAvatar(); break; - } } catch (AlertMessage $w) { $alertClass = $w->getClass(); diff --git a/website/queries/groupAdmin.php b/website/queries/groupAdmin.php index e3580b6..3e294e5 100644 --- a/website/queries/groupAdmin.php +++ b/website/queries/groupAdmin.php @@ -60,7 +60,7 @@ function checkGroupAdmin(int $groupID, int $userID) : bool { return ($role == "admin"); } -function getAllGroupMembers(int $groupID) { +function getAllGroupUsers(int $groupID) { $stmt = prepareQuery(" SELECT `username`, @@ -106,4 +106,23 @@ function upgradeUser(int $groupID, int $userID, string $role) { } else { throw new AngryAlert("Er is iets mis gegaan"); } +} + +function deleteGroup() { + if (!checkGroupAdmin($_POST["groupID"], $_SESSION["userID"])) { + throw new AngryAlert("Geen toestemming om de groep te verwijderen!"); + } + $stmt = prepareQuery(" + DELETE FROM + `group_page` + WHERE + `groupID` = :groupID + "); + $stmt->bindValue(":groupID", $_POST["groupID"]); + $stmt->execute(); + if ($stmt->rowCount()) { + throw new HappyAlert("Group verwijderd!"); + } else { + throw new AngryAlert("Er is iets mis gegaan"); + } } \ No newline at end of file diff --git a/website/queries/settings.php b/website/queries/settings.php index 26237ec..6d6dc74 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -16,7 +16,10 @@ function getSettings() { `location`, `birthdate`, `bio`, - `profilepicture`, + IFNULL( + `profilepicture`, + '../img/avatar-standard.png' + ) AS profilepicture, `showBday`, `showEmail`, `showProfile` diff --git a/website/views/groupAdmin.php b/website/views/groupAdmin.php index 54fbee8..3d57501 100644 --- a/website/views/groupAdmin.php +++ b/website/views/groupAdmin.php @@ -16,7 +16,7 @@ $groupinfo = getGroupSettings($_GET["groupID"]);
  • "> - +
  • @@ -51,8 +51,7 @@ $groupinfo = getGroupSettings($_GET["groupID"]); + > Opslaan @@ -80,8 +79,7 @@ $groupinfo = getGroupSettings($_GET["groupID"]); + > Verander profielfoto @@ -94,7 +92,7 @@ $groupinfo = getGroupSettings($_GET["groupID"]); " type="hidden"> + + + + -- 2.49.1 From b8d6136a9dccb9eb9e7c2e5a0569547e42e82bbe Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Fri, 3 Feb 2017 10:59:10 +0100 Subject: [PATCH 43/58] Added deadmin! --- website/public/groupAdmin.php | 6 ++++++ website/queries/groupAdmin.php | 15 ++++++++++++++- website/views/groupAdmin.php | 31 +++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/website/public/groupAdmin.php b/website/public/groupAdmin.php index 30c44fa..fadaa87 100644 --- a/website/public/groupAdmin.php +++ b/website/public/groupAdmin.php @@ -44,6 +44,12 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { } upgradeUser($_POST["groupID"], $_POST["userID"], "admin"); break; + case "deadmin": + if (!array_key_exists("userID", $_POST)) { + throw new AngryAlert("Geen gebruiker geselecteerd."); + } + upgradeUser($_POST["groupID"], $_POST["userID"], "member"); + break; case "delete": deleteGroup(); break; diff --git a/website/queries/groupAdmin.php b/website/queries/groupAdmin.php index 3e294e5..c9b3af5 100644 --- a/website/queries/groupAdmin.php +++ b/website/queries/groupAdmin.php @@ -61,6 +61,18 @@ function checkGroupAdmin(int $groupID, int $userID) : bool { } function getAllGroupUsers(int $groupID) { + return getAllGroupMembers($groupID, 'member'); +} + +function getAllGroupAdmins(int $groupID) { + return getAllGroupMembers($groupID, 'admin'); +} + +function getAllGroupMods(int $groupID) { + return getAllGroupMembers($groupID, 'mod'); +} + +function getAllGroupMembers(int $groupID, string $role) { $stmt = prepareQuery(" SELECT `username`, @@ -74,10 +86,11 @@ function getAllGroupUsers(int $groupID) { ON `group_member`.`userID` = `user`.`userID` WHERE - `groupID` = :groupID AND `group_member`.`role` = 'member' + `groupID` = :groupID AND `group_member`.`role` = :role "); $stmt->bindParam(':groupID', $groupID); + $stmt->bindParam(":role", $role); if (!$stmt->execute()) { return False; } diff --git a/website/views/groupAdmin.php b/website/views/groupAdmin.php index 3d57501..d406e5c 100644 --- a/website/views/groupAdmin.php +++ b/website/views/groupAdmin.php @@ -112,6 +112,37 @@ $groupinfo = getGroupSettings($_GET["groupID"]); +
    +
    Verwijder een admin/mod
    +
      + + " type="hidden"> + + + + +
    +
      Verwijder groep
      -- 2.49.1 From c69b5d8ed359016be9f7f86ef3bd9c1dc93c5b10 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Fri, 3 Feb 2017 11:12:02 +0100 Subject: [PATCH 44/58] Comments --- website/public/groupAdmin.php | 2 ++ website/public/settings.php | 2 ++ website/queries/connect.php | 5 ++++ website/queries/createGroup.php | 4 +++ website/queries/groupAdmin.php | 51 +++++++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+) diff --git a/website/public/groupAdmin.php b/website/public/groupAdmin.php index fadaa87..ec6eee8 100644 --- a/website/public/groupAdmin.php +++ b/website/public/groupAdmin.php @@ -21,6 +21,8 @@ require_once "../queries/alerts.php"; include("../views/main.php"); $alertClass; $alertMessage; + +// Select which button has been pressed. if ($_SERVER["REQUEST_METHOD"] == "POST") { try { switch ($_POST["form"]) { diff --git a/website/public/settings.php b/website/public/settings.php index 6996f54..7208141 100644 --- a/website/public/settings.php +++ b/website/public/settings.php @@ -14,6 +14,8 @@ prepare($query); } \ No newline at end of file diff --git a/website/queries/createGroup.php b/website/queries/createGroup.php index 20ee28b..1b093fb 100644 --- a/website/queries/createGroup.php +++ b/website/queries/createGroup.php @@ -2,6 +2,10 @@ require_once "../queries/checkInput.php"; require_once "../queries/picture.php"; require_once "../queries/alerts.php"; + +/** + * Creates a group. + */ function createGroup() { $createGroup = prepareQuery(" diff --git a/website/queries/groupAdmin.php b/website/queries/groupAdmin.php index c9b3af5..8cefb9b 100644 --- a/website/queries/groupAdmin.php +++ b/website/queries/groupAdmin.php @@ -1,4 +1,9 @@ fetch(); } +/** + * Updates the settings for a group. + * @param int $groupID + * @throws AngryAlert + * @throws HappyAlert + */ function updateGroupSettings(int $groupID) { if (!checkGroupAdmin($groupID, $_SESSION["userID"])) { @@ -40,6 +51,12 @@ function updateGroupSettings(int $groupID) } } +/** + * Checks if an user is an admin for a page. + * @param int $groupID + * @param int $userID + * @return bool + */ function checkGroupAdmin(int $groupID, int $userID) : bool { $stmt = prepareQuery(" SELECT @@ -60,18 +77,39 @@ function checkGroupAdmin(int $groupID, int $userID) : bool { return ($role == "admin"); } +/** + * Returns all normal members for a group. + * @param int $groupID + * @return array|bool + */ function getAllGroupUsers(int $groupID) { return getAllGroupMembers($groupID, 'member'); } +/** + * Returns all admin for a group. + * @param int $groupID + * @return array|bool + */ function getAllGroupAdmins(int $groupID) { return getAllGroupMembers($groupID, 'admin'); } +/** + * Returns all Moderators for a group. + * @param int $groupID + * @return array|bool + */ function getAllGroupMods(int $groupID) { return getAllGroupMembers($groupID, 'mod'); } +/** + * Returns all members for a group specified by a string. + * @param int $groupID + * @param string $role + * @return array|bool + */ function getAllGroupMembers(int $groupID, string $role) { $stmt = prepareQuery(" SELECT @@ -97,6 +135,14 @@ function getAllGroupMembers(int $groupID, string $role) { return $stmt->fetchAll(); } +/** + * Upgrades or downgrades a groupmember to a different role. + * @param int $groupID + * @param int $userID + * @param string $role + * @throws AngryAlert + * @throws HappyAlert + */ function upgradeUser(int $groupID, int $userID, string $role) { if (!checkGroupAdmin($groupID, $_SESSION["userID"])) { throw new AngryAlert("Geen toestemming om te wijzigen"); @@ -121,6 +167,11 @@ function upgradeUser(int $groupID, int $userID, string $role) { } } +/** + * Removes a group form the database. + * @throws AngryAlert + * @throws HappyAlert + */ function deleteGroup() { if (!checkGroupAdmin($_POST["groupID"], $_SESSION["userID"])) { throw new AngryAlert("Geen toestemming om de groep te verwijderen!"); -- 2.49.1 From ba6f86e70e49ddbbab41264685bf76e3dd450423 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Fri, 3 Feb 2017 11:12:30 +0100 Subject: [PATCH 45/58] fixed login --- website/queries/login.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/website/queries/login.php b/website/queries/login.php index 3480991..4b8dcfa 100644 --- a/website/queries/login.php +++ b/website/queries/login.php @@ -35,8 +35,7 @@ function getUserID() { } function validateLogin($username, $password, $url){ - echo $url; - // Empty username or password field + // Empty username or password field if (empty($username) || empty($password)) { throw new loginException("Inloggegevens zijn niet ingevuld"); } -- 2.49.1 From da061de22672e611cd09fea4c22fd946bada128c Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 3 Feb 2017 11:14:03 +0100 Subject: [PATCH 46/58] validated adminpanel, added shown friends limit in profile. --- website/views/adminpanel.php | 12 +++++------- website/views/profile.php | 19 +++++++++++++++++-- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index a99914e..00e6bf5 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -126,11 +126,11 @@ if (isset($_GET["groupstatus"])) { if ($userinfo == 'owner') { echo " "; } ?> @@ -139,9 +139,9 @@ if (isset($_GET["groupstatus"])) { onsubmit="adminUpdate(this); return false;"> - - - + + +
    @@ -151,5 +151,3 @@ if (isset($_GET["groupstatus"])) {
    - - \ No newline at end of file diff --git a/website/views/profile.php b/website/views/profile.php index 0cb5cc2..e9178f4 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -55,10 +55,17 @@

    Vrienden

    fetch()) { + $friendcount = $profile_friends->rowCount(); + $frienddif = $friendcount - 7; + + for ($i = 0; $i < min($friendcount, 7); $i += 1) { + $friend = $profile_friends->fetch(); echo "${friend["username"]}"; } + if ($frienddif > 0) { + echo $frienddif === 1 ? "en nog 1 andere." : "...en nog $frienddif anderen."; + } if($profile_friends->rowCount() === 0) { echo "

    Deze gebruiker heeft nog geen vrienden gemaakt.

    "; @@ -71,10 +78,18 @@

    Groepen

    fetch()) { + $groupcount = $profile_groups->rowCount(); + $groupdif = $groupcount - 7; + + for ($i = 0; $i < min($groupcount, 7); $i += 1) { + $group = $profile_groups->fetch(); echo "${group["name"]}s logo"; } + if ($groupdif > 0) { + echo $groupdif === 1 ? "en nog 1 andere." : "...en nog $groupdif anderen."; + } + if($profile_groups->rowCount() === 0) { echo "

    Deze gebruiker is nog geen lid van een groep.

    "; } -- 2.49.1 From c29be662bcb473a178091f298dee2fe4e1cf8e54 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 3 Feb 2017 11:18:17 +0100 Subject: [PATCH 47/58] Session logout now works --- website/public/group.php | 2 +- website/public/profile.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/website/public/group.php b/website/public/group.php index 84726fa..11a2609 100644 --- a/website/public/group.php +++ b/website/public/group.php @@ -13,7 +13,7 @@ include_once("../queries/group_page.php"); -if(!$group = selectGroupByName($_GET["groupname"])) { +if(isset($_SESSION["userID"]) and !$group = selectGroupByName($_GET["groupname"])) { header("HTTP/1.0 404 Not Found"); header("Location: error/404.php"); die(); diff --git a/website/public/profile.php b/website/public/profile.php index 126c87f..899c9bd 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -25,7 +25,8 @@ if(empty($_GET["username"])) { $userID = getUserID($_GET["username"]); } -if(!$user = selectUser($_SESSION["userID"], $userID)) { + +if (isset($_SESSION["userID"]) and !$user = selectUser($_SESSION["userID"], $userID)) { header("HTTP/1.0 404 Not Found"); header("Location: error/404.php"); die(); -- 2.49.1 From 53e1d7fef3dc1e95fa684d5ae023861687e9e369 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 3 Feb 2017 11:18:32 +0100 Subject: [PATCH 48/58] Fixed admin layout --- website/public/js/chat.js | 1 + website/public/styles/adminpanel.css | 9 ++++++--- website/views/adminpanel-table.php | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/website/public/js/chat.js b/website/public/js/chat.js index f431b91..06dffa4 100644 --- a/website/public/js/chat.js +++ b/website/public/js/chat.js @@ -51,6 +51,7 @@ function sendMessage() { }); $("#newContent").val(""); + $("#newContent").focus(); } // Add messages to the chat. diff --git a/website/public/styles/adminpanel.css b/website/public/styles/adminpanel.css index 39d823f..3e97ace 100644 --- a/website/public/styles/adminpanel.css +++ b/website/public/styles/adminpanel.css @@ -1,13 +1,15 @@ -.admin-panel { - min-width: 800px; -} .admin-panel input[type="radio"], input[type="checkbox"] { vertical-align: middle; height: 28px; + width: 28px; margin: 2px; } +.table-checkbox { + width: 28px; +} + .admin-searchform { display: inline-block; width: 100%; @@ -41,6 +43,7 @@ .usertable th, td { border-bottom: 1px solid #ddd; padding: 3px; + word-wrap: break-word; } .usertable th, tr { diff --git a/website/views/adminpanel-table.php b/website/views/adminpanel-table.php index f7bc966..013a907 100644 --- a/website/views/adminpanel-table.php +++ b/website/views/adminpanel-table.php @@ -1,5 +1,5 @@ - + Gebruikersnaam Status Aantekening -- 2.49.1 From 771567660c586d7234d8b771e005c24398e4ed7d Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 3 Feb 2017 11:19:06 +0100 Subject: [PATCH 49/58] removed session id lol --- website/views/head.php | 1 - 1 file changed, 1 deletion(-) diff --git a/website/views/head.php b/website/views/head.php index 134cd6f..3ec8a79 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -26,7 +26,6 @@ require_once ("../queries/user.php"); session_start(); -$_SESSION["userID"] = 11; if(!isset($_SESSION["userID"])) { header("location:login.php?url=" . "$_SERVER[REQUEST_URI]"); } else { -- 2.49.1 From 6d5de98c1daad7b5adc41238ae4c3a282f6432ed Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Fri, 3 Feb 2017 11:31:18 +0100 Subject: [PATCH 50/58] comments --- website/queries/checkInput.php | 43 +++++++++++++++++++++++++++++--- website/queries/createGroup.php | 3 +++ website/queries/emailconfirm.php | 9 ++++++- website/queries/login.php | 5 +++- website/queries/post.php | 6 +++++ 5 files changed, 61 insertions(+), 5 deletions(-) diff --git a/website/queries/checkInput.php b/website/queries/checkInput.php index 247050b..5680de8 100644 --- a/website/queries/checkInput.php +++ b/website/queries/checkInput.php @@ -41,7 +41,11 @@ function checkInputChoice($variable, $option){ } } -/* Checks for only letters and spaces. */ +/** + * Checks for only letters and spaces. + * @param $variable + * @throws lettersAndSpacesException + */ function checkName($variable){ if (empty($variable)) { throw new lettersAndSpacesException("Verplicht!"); @@ -52,7 +56,11 @@ function checkName($variable){ } } -/* Checks for bday */ +/** + * Checks for bday + * @param $variable + * @throws bdayException + */ function validateBday($variable){ if (empty($variable)) { throw new bdayException("Verplicht!"); @@ -219,6 +227,9 @@ function test_input($data) { return $data; } +/** + * Class lettersAndSpacesException + */ class lettersAndSpacesException extends Exception { public function __construct($message = "", $code = 0, Exception $previous = null) @@ -227,7 +238,9 @@ class lettersAndSpacesException extends Exception } } - +/** + * Class bdayException + */ class bdayException extends Exception { public function __construct($message = "", $code = 0, Exception $previous = null) @@ -236,6 +249,9 @@ class bdayException extends Exception } } +/** + * Class usernameException + */ class usernameException extends Exception { public function __construct($message = "", $code = 0, Exception $previous = null) @@ -244,6 +260,9 @@ class usernameException extends Exception } } +/** + * Class passwordException + */ class passwordException extends Exception { public function __construct($message = "", $code = 0, Exception $previous = null) @@ -252,6 +271,9 @@ class passwordException extends Exception } } +/** + * Class confirmPasswordException + */ class confirmPasswordException extends Exception { public function __construct($message = "", $code = 0, Exception $previous = null) @@ -260,6 +282,9 @@ class confirmPasswordException extends Exception } } +/** + * Class fbConfirmPasswordException + */ class fbConfirmPasswordException extends Exception { public function __construct($message = "", $code = 0, Exception $previous = null) @@ -268,6 +293,9 @@ class fbConfirmPasswordException extends Exception } } +/** + * Class emailException + */ class emailException extends Exception { public function __construct($message = "", $code = 0, Exception $previous = null) @@ -276,6 +304,9 @@ class emailException extends Exception } } +/** + * Class confirmEmailException + */ class confirmEmailException extends Exception { public function __construct($message = "", $code = 0, Exception $previous = null) @@ -284,6 +315,9 @@ class confirmEmailException extends Exception } } +/** + * Class captchaException + */ class captchaException extends Exception { public function __construct($message = "", $code = 0, Exception $previous = null) @@ -292,6 +326,9 @@ class captchaException extends Exception } } +/** + * Class registerException + */ class registerException extends Exception { public function __construct($message = "", $code = 0, Exception $previous = null) diff --git a/website/queries/createGroup.php b/website/queries/createGroup.php index 1b093fb..84843d2 100644 --- a/website/queries/createGroup.php +++ b/website/queries/createGroup.php @@ -8,6 +8,7 @@ require_once "../queries/alerts.php"; */ function createGroup() { + // Creates the group. $createGroup = prepareQuery(" INSERT INTO `group_page` (`name`, `description`) @@ -17,6 +18,7 @@ function createGroup() $createGroup->bindValue(':description', test_input($_POST["bio"])); $createGroup->execute(); + // Gets the groupID just created. $getGroupID = prepareQuery(" SELECT `groupID` @@ -28,6 +30,7 @@ function createGroup() $getGroupID->execute(); $groupID = $getGroupID->fetch()["groupID"]; + // Adds the user as an admin. $makeUserAdmin = prepareQuery(" INSERT INTO `group_member` (userID, groupID, role) diff --git a/website/queries/emailconfirm.php b/website/queries/emailconfirm.php index 0e6aab1..ff9c672 100644 --- a/website/queries/emailconfirm.php +++ b/website/queries/emailconfirm.php @@ -1,5 +1,8 @@ Date: Fri, 3 Feb 2017 11:42:16 +0100 Subject: [PATCH 51/58] Favicon --- .../apple-touch-icon-114x114-precomposed.png | Bin 0 -> 5595 bytes .../apple-touch-icon-120x120-precomposed.png | Bin 0 -> 5978 bytes .../apple-touch-icon-144x144-precomposed.png | Bin 0 -> 7422 bytes .../apple-touch-icon-152x152-precomposed.png | Bin 0 -> 7879 bytes .../apple-touch-icon-180x180-precomposed.png | Bin 0 -> 9920 bytes .../apple-touch-icon-57x57-precomposed.png | Bin 0 -> 2268 bytes .../apple-touch-icon-60x60-precomposed.png | Bin 0 -> 2425 bytes .../apple-touch-icon-72x72-precomposed.png | Bin 0 -> 3064 bytes .../apple-touch-icon-76x76-precomposed.png | Bin 0 -> 3268 bytes .../public/apple-touch-icon-precomposed.png | Bin 0 -> 2290 bytes website/public/browserconfig.xml | 12 +++++ website/public/favicon-1.png | Bin 0 -> 492 bytes website/public/favicon-2.png | Bin 0 -> 782 bytes website/public/favicon-3.png | Bin 0 -> 1080 bytes website/public/favicon-4.png | Bin 0 -> 2595 bytes website/public/favicon.ico | Bin 0 -> 99678 bytes website/public/large.png | Bin 0 -> 20060 bytes website/public/launcher-icon-0-75x.png | Bin 0 -> 1301 bytes website/public/launcher-icon-1-5x.png | Bin 0 -> 3064 bytes website/public/launcher-icon-1x.png | Bin 0 -> 1842 bytes website/public/launcher-icon-2x.png | Bin 0 -> 4497 bytes website/public/launcher-icon-3x.png | Bin 0 -> 7418 bytes website/public/launcher-icon-4x.png | Bin 0 -> 10816 bytes website/public/manifest.json | 44 ++++++++++++++++++ website/public/square.png | Bin 0 -> 7838 bytes website/public/tiny.png | Bin 0 -> 2969 bytes website/public/wide.png | Bin 0 -> 12108 bytes website/views/head.php | 34 ++++++++++++++ website/views/login_head.php | 34 ++++++++++++++ 29 files changed, 124 insertions(+) create mode 100644 website/public/apple-touch-icon-114x114-precomposed.png create mode 100644 website/public/apple-touch-icon-120x120-precomposed.png create mode 100644 website/public/apple-touch-icon-144x144-precomposed.png create mode 100644 website/public/apple-touch-icon-152x152-precomposed.png create mode 100644 website/public/apple-touch-icon-180x180-precomposed.png create mode 100644 website/public/apple-touch-icon-57x57-precomposed.png create mode 100644 website/public/apple-touch-icon-60x60-precomposed.png create mode 100644 website/public/apple-touch-icon-72x72-precomposed.png create mode 100644 website/public/apple-touch-icon-76x76-precomposed.png create mode 100644 website/public/apple-touch-icon-precomposed.png create mode 100755 website/public/browserconfig.xml create mode 100644 website/public/favicon-1.png create mode 100644 website/public/favicon-2.png create mode 100644 website/public/favicon-3.png create mode 100644 website/public/favicon-4.png create mode 100644 website/public/favicon.ico create mode 100644 website/public/large.png create mode 100644 website/public/launcher-icon-0-75x.png create mode 100644 website/public/launcher-icon-1-5x.png create mode 100644 website/public/launcher-icon-1x.png create mode 100644 website/public/launcher-icon-2x.png create mode 100644 website/public/launcher-icon-3x.png create mode 100644 website/public/launcher-icon-4x.png create mode 100755 website/public/manifest.json create mode 100644 website/public/square.png create mode 100644 website/public/tiny.png create mode 100644 website/public/wide.png diff --git a/website/public/apple-touch-icon-114x114-precomposed.png b/website/public/apple-touch-icon-114x114-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..8ff3015e28b91d393a25d490543b24c739846b59 GIT binary patch literal 5595 zcmXw7Wmr@1-ye;@6h_xb1wl$lfl-qb7?RR8x)~td2qN9m-HoJ_lpx(H&2N-6=m?+l zfAPFH=Pa)Ky3hTMPkf^gY6@T?IwBAV1XfanzXP6b|GNmWfjg)h!Uf!EQE&86n$A`z zFEckJNXF9H9LcQYXl9LkhcvVFb{$4afIyV~N^lvi56ef{UV0R|^aI*;!9rY~WP+Yr zReJUEvoupQQ3djBoYz#oG7jmc4jNU9#ES*^0{AlI!~z9TA-y4BiWvODbW=f=0I9b1 zR}-+taI+;N)3sZIiKE}6*%|KZzQ5dmueR;@-(x(WDgvls>);;jN<1Cns#Npfx&M7q z5ipf$)HnSK|Nmcw(kKqI{9M&@VV!Qf%7%uk+2USMnBSkfzZXqSO*@ye%{=-|Wu2X! zjg5_!mG&2VWA0gWKWv|Jag9t&)M}Qhfl5z#gFGg3B*k_x|87sZ8F0BZ_74vacXo=r zA}<};r%Ow_BX%RVzT4Cjuy{6dzahXt!EUo9aow&p!46B&Lbz+*6t_s?Gf((43+_u>K9!^Zb*#qM<>3XZA)aJ4&tEd=>+Su&- z=zEDaQy%*Qo_g(ZptYN(_tkE$-eL%d9{Jy^|8fJlq*PES)X!9&Vjoiay|>u6Hz&G; zHh<4|ad2=5fU5WOmO$`bPie(h1J9(-9)$S>J_~ayRbhd8X2&#mIh1;nov5SJ&5jr`)O?Vi~JiGKRG@7)#)1?92`ckr%AaW`Qg;m%gf8&{_hnI zGU=HrDKr!x{C#<@)}-5ZrX+?=NWaakI5(F`m4=?)0LW-^abt|2D*mz}tr&}b( zf-G2Z&+Ft@B;quMksbnpP*9*YzvF$uT3uoqkXISac%^Uz zs$`9^-7sXRzFcQhi0uJo*)G%=P0|Jg0<8xGEICp8;qLDoTWpo2KL)i!@!WoYx;XIu zirTQv|JIWPlHdz`-`TN@*OsyX7H*oTQA44z72?2AfbIuQw-gZ_$0#1b{4d ze(G_2LR11&(kGHd4YTHZ(y6cxM3kx6JL&rRnvOQ~L5==xmS{p`A$91$SfO6T8 zxBD|KSHj!v&*^5Nd`!s6qCAw$XLlq;Q;PKW#nly$N!PbOie=^^c)C5H{#qyE(_xNW zW|pk1EVb;{;n=S3?x7(GhPdJoR!z0n9BzmCavz!Dia`(DU062Ed$r7leWB1?3VW4Z6aT9e z(Lw---xfgr3{qCh@9Hdrr((l7{93`x&!}0%fLfC9`fbQcxK=Y(cc9B`Qa@Fy&eTvW zeDb8l%BIAfx609$T+-kq($_DH9A~V9!ztK=y3Bo=jCmy)uwY)mSbwq1WD86i%Uk4}X@ z=JGigQE0S1Xer2t*8}lDv2xI;zli(WgowAXU=C5${;?H zNTDtIBao+}$3yu!gq~i-QR?m#C)ww4o(G+|G0@C%n~zr(VL~<_7eR7%bMw&;8HV$S zW`DS5zaS;VtoS5aOplUVhuwsd6Ja`%{Cs;TZlP9ol=FQ~#pIn0i9Yc*6D{o$fS@~c zoEG)6a&l&;Xf#?iQ#eYZoC`Xuz~Z(`IN#-eJ6~fI4MDGW|2x|rDn2=r%BUuKS0b5w z5=V1-agn6zC3Jlo@r=&-smp0JqqrygL{I3}&)Hcm$Z`}p2fyq{C3XT(m*oLCebQh1 zUqq1wzTsz0-6xHq7jc>?0WUp@3mQtArnuuBba5AH`ScQnMktyByf-aE&Y?!J_s;t% z%DVsCfxQC3V}>9sIM?Z@mzF-tU8|>1D zBv1*Olvr;`&m)>CWqdX-nPehsGF$?JN?13m3=0PUueen^W&QpA$;lM2nWMVoW9VQo z*emOCl!r(7>X|8IJE38eKu5X7Y3;|udcZADK0FORp#XvR3LrKtF5kbsKBG1qoqaw$H1>ZA}KClD?Iz0%V8wN zKHGi0atc?O{?j3dtBv+qy7TSzF{fq_@uNrikS=&247G(JAw?p2Z*Ey9iH0$R|p(F)v2pI7_~d;x$M zwIu*0*e(EdIV{wy0o-K^;^V9B`}hQhTQ$;^zqcC6QMD>Io%rqUYQf|%g0lCCE$dZO z*IcD;;XAV@bByR)kD2JB9zd2|A1#qLp`fc^&TUfS|K<=_di)30wz zk->O6j?+a-xDJ3?Lf&Rc1ww0sNu*6T^LlFR7ixflr0l-_y|ywu{K!#Z3v%+~%SKn# zkD?_)Zh3BA-to1yY^_)=*3eC5qS56A8JTvQbLU5tt324Kn;@d?9@F;|CkUUI=03}!lk ztRhpyIYMp|xo8T|iKs=4P~Z2au$`Q8Eb2;_QQzu3dAuVYxDUE zdAOj*!7T9V3G1YKfLf3itIscV`#cYj_mcF^G`-eGw$EUD;Uv)NCmHG7=(G~k!N-iR zgI;P8x~P5;OlYUD1&haLWxX|dMhrxr7Y2jQqO@Y4Mt}PBy>0rDC@H>3uY2&3E_T7< z;vy*iK!iObCwfB&kAfvYEobla#MC2%cw z#L!=zJP=KdQ!tq8(!$S|ZPfgBvQQz8zhuPPVuP@ul~?Ame>6gYtkYmyom3Wqi0|x_ zY^^ft(7`~b5l+&j>bbx7_N+eTA2PhbCVUq2(wGZq9%5?VFwVsuK4itYcBRgggS@}* zvyX|=aZpLc=gQY4#KfWGRuefqR<20Beq3+D<$f>A_NB#Tq8Cbn<=ry*^&8nP?K?~; z*`)?#y+IvT@AxKRz%Wdv1CWm}mkkg$x2PyhqjWnPGUL3ffmTN%v8Bb!+`QnOrVVo7 zVM|FyR`xp(tHi{_Q!+qFaqBm6;u4i862j!=$_KI-pRJ8{FgEfbsJ~B!lbWtjA0RI6>hqN-CgypjQ zS2&_tubwrw89+4$06--C{?y5a6Y=ACTI~Ethy=$ZZH;m1N3l&)AhzJPE78<^=4Rm5 zPej+c-)3cWU0hv*IniL6HehvzV^hfU&K%t1gM$%pX>qZbxH!&Xkx~-Lx$^6b3eV$Z z03)fK(jD+u8f5-$Cez}j2B~j>jXiE2o zGxPJE;fCS}B@-t9OERh9%NIYIo!6lW@f~JQxqPpWqS6VJ=QMf&al4eWld4fDZ>If9 zTT0CC?#~%e4XJw+2_?-=Yebtivmm%D;L^yx0|Ij_rSA87H0L1I$lv z8~OL|UqBwIn+XD5Dux+vskOBg5Q%_RG=a1&&I3-$PCUM8zTLxqxeswjtGwXce`TO_ zx#jQ0$H#Zc)>Zbt(W*imbO=c3B3jCZ28*HCva&LmKgPzFSrIEOGLq2l8DF(YxAFGj z)#Ve$3!Zq^)=eOV+w&W_)5R+E>_)V|kelw2GW8YM#!1{%uMDh5(^*!?M`r3BMuM<# zB0B)EWRME*1I$kYM=1JVULNz#LB~m#%5Bs__$;x@q49@Mr!ZM**mnOUhmEm_h{*ek zLk$wzYCY$MUVvqTgT|j$*99H@w>PKjD6eLAIuy%jpJGfz!I|g!k}968Iq$`<_9B;A zK<3r|1?&c?z_{{|wvf$aQ024$KjDg?-E3rK`25ZB%17p9uByVh(#>9Dw3N6H7urvi?647j3gtQ6@3i=_-{Xgyc#T`_v zYqiQDy>A*>{_LMK`JKw(Yb1#{cX%GxLDA-pw^^?}h&W0x5j535RP#Lr$g(uPy{`4M z^Gh||O=hk4Ln*AsLB>w&9UJwg(AXXmZ8yot>RDJ`;!_01w5{XyakIKs_vTKpYnt z5kg}MEV`J&-ngiy^UG}4?wDXBHeY+U-m=I=^fV(J_4H`ebT{YBjic;C{KvDzmR~{y z!*{0ZZA4n$Hs={B1%>gPtyJprG1ghBnI>?i@|ipybB#Kf$U;5^u=CdrsiQcl!n4y6 z(w~Qyf!*8N+l3ZmuW*|_)()tU7L$!bR&78)qQ0VVF;9dNIh7Oxg@>mJn_ zz}WZ4RQW-uH%oDv?%M<{4mP$ayW;{*3m`zWyu%VWG_2}`0~1Cw=Bq_hLkXTFe$9tU zbcBY6CT6mzb(B!YbYpIBlfLj10*nyc_L+z~OHqgYBC;s%SBMh8GWew9%#|<$rJI=; zqYlr6RI>;m-;b<*1R0QJF3K#n8+ZCZp-@o%sbxHcHv@IvnJ)Z)bAW+B_u!)VOZo7W zJN&9d(f3U@WP&{Ns8mW$8f@+KM@T$m#8;L_eGfsESUTTtf$H6Uhe+TtXrApIqa*g` z;o$+3m!B;F(~x9N4cT^X8b_dMN4OPMAgVu}MJoC*iT4?LUF@mOSqcR{_`$ww9EkJ1 zZwRy7U%&{lNYYnFFpL&{F$3OI2(XOK&L;qyB%!bB`a~54j+HEWbI4y*tWV;P@cA4s ze+96Wd}bz3rHLQS+>MedVpW?PqEc)-_!q$}EZhu$kXGh^02X{8v*o~LeRAwa0$Vwm zS#F9p{72mKd`4(9LfoDNQ3jP1?#DtUzYMgu3NXfPmZ;}G&ZuC^Nlq^6dL55xqV`Gk$xhdI2)R5PPU5h1 zx9mPT1>AsL2bT?nH=8B7@CyNfDN~%#Ee-fQ@jKeyB3QF}#DLSGDZWI9lb*K1tu}Eg z+#in-q+f3yeqexV*ImkY`;w(r0z1#t95i5YklhAoz5-|NgX&IlY~f%GeJL2hk`%1I z9Spdb-zzP(&B9cN(bJSgSIbQ)$e*cVVq(v8xl0LkSW>{+2$xRZo7m5v{j$66SUH`S z8s6NnM4E#&`_6aCV}iF>Fio^XsHVZ(kdTmg26LZi$Vu3bLN50B-V!id#AN+)YUQW{ zi;yP0w96}Y+=X0K*sY zGx>RF($t>vS1}5G)<$%b?F@brFfpLOy#)qijfApYK#Odwg3)$AG@53B@m8`a7ew+# zPQJ@^8-GOW+BviL@n=C^6N0U21K9%$3m;sgtAn|-XTU^7y4(6p%45gf)pc`vUlqSM z`F7|;wp{twYDSSTDYB~W3?*{X+GEeHt`&Uocscq_ubEjZleIY-nf;Y zwhqTVFH(15N79FBG9Lk>AuBso!83&PN^NsFDTW7+I@HI8D{#)bst))7E2PWCTN4#dgW^1H!`|HhOU!Uu4inn?cE}>Y1yJ zyZkcBKQ#4VgsGUvtYvy7+U8zFU(vH7XumY(IgmpB34{~OvWy-|bL I$eM=yAExcSO8@`> literal 0 HcmV?d00001 diff --git a/website/public/apple-touch-icon-120x120-precomposed.png b/website/public/apple-touch-icon-120x120-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..ef42d75f692e51682632b975a23b80be11d51091 GIT binary patch literal 5978 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 F{{Y^_r~v=~ literal 0 HcmV?d00001 diff --git a/website/public/apple-touch-icon-144x144-precomposed.png b/website/public/apple-touch-icon-144x144-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..dd01202fb2bad3b87e8d5738676b7bab4df32ce0 GIT binary patch literal 7422 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 Kbd980$o~M)KB^4> literal 0 HcmV?d00001 diff --git a/website/public/apple-touch-icon-152x152-precomposed.png b/website/public/apple-touch-icon-152x152-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a1679aa06e3dfe35e9142f55b647540707aa9d GIT binary patch literal 7879 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 NqMVv+y|j7Q{{UEbifsS@ literal 0 HcmV?d00001 diff --git a/website/public/apple-touch-icon-180x180-precomposed.png b/website/public/apple-touch-icon-180x180-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..d33355b2d5b484c6c1ded1661fab7259c6d6e451 GIT binary patch literal 9920 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 literal 0 HcmV?d00001 diff --git a/website/public/apple-touch-icon-72x72-precomposed.png b/website/public/apple-touch-icon-72x72-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..ab6b967017fd132c653ec28b6962b05626d9662c GIT binary patch literal 3064 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 M07*qoM6N<$f;u2lP5=M^ literal 0 HcmV?d00001 diff --git a/website/public/browserconfig.xml b/website/public/browserconfig.xml new file mode 100755 index 0000000..21d8570 --- /dev/null +++ b/website/public/browserconfig.xml @@ -0,0 +1,12 @@ + + + + + + + + + #000000 + + + \ No newline at end of file diff --git a/website/public/favicon-1.png b/website/public/favicon-1.png new file mode 100644 index 0000000000000000000000000000000000000000..55952961ece7dd2eff44dd06a278bc14578f0c09 GIT binary patch literal 492 zcmVL%sESeY@SJ(`h=Lwrv|T@I3z(1U=7kJRU)uNF-R6+a3;+Z{ zARfHHY&H``5t*@A477h8&gU}fC{3Ig&~$B44FqWoZwzEc5=l2jqZt zuR?nu`|SO#@2u}zYaOMHMnm!&OD6fHrT8x*o6X+b-1PVNPft((3)lF0c|4x^`S~Vt za&q$c`1mKV^e2zj*VlbMADfw(nT3S~wOW05cXxStxxKx;xVYGEMu9*;xFt+{espxS zv9a;|{M;Jyz1e$vd&0(KGKtSoIzB$`_xsy5ThOc3YKMo1Pfkv*uC9zmBNWMGva74B z1G86GSGhVoJpBCpTv=JcCMX^sALr)gtX69(m1+(7CZp5SQ>W88I5;>vJNxqTvbnig zDwQTCCJKeZ+S=Ok@-kO#WfYIcDLg5>zrQyRFD@<~9v;|mczu1{Rz@QuBOf0hZ*Ol3 zg+h2!u~tNOl1_L%>GkL*6H+Oe;LyAVZT;2gurBcD8fq?;h zAq8rWBBYU*R4VP@GeVhA0T+cwkxVA*?d`?sXf%pnt@v+-mVRMAv3zuNRD2!^h4T5l z*=&YLrBY2zO^G!s#9E+GDwVglw@?7}dcDXQ8yiE;*4Ea}&JM78z0SM$_xI6DK{1Ye zVf@O7PQyhyjWBuy75EYi1|1GZtAubkytK4btJUuB?-5QQ45gw};bLS(beK~UXDBtngNwA<}An~hIx6Tk-q z4C)|42P56QlHiDVWN=Dgsr_BTA>B-HwOSP;fr*Kvzw&nk;~xPA0QeG)eFI;e1ONa4 M07*qoM6N<$f& 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 aj75yL-K4wvTsRDMaflFNC_%b4_Uzxsqja4B literal 0 HcmV?d00001 diff --git a/website/public/launcher-icon-0-75x.png b/website/public/launcher-icon-0-75x.png new file mode 100644 index 0000000000000000000000000000000000000000..edd99eda6deb78f17c201e0ad403e45eeeae807b GIT binary patch literal 1301 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 literal 0 HcmV?d00001 diff --git a/website/public/launcher-icon-2x.png b/website/public/launcher-icon-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8663ef5af78329baad80c1df13e8bd4e53fbfc4f GIT binary patch literal 4497 zcmV;C5pM2@P)vNfa(CM z1E>z5I)Lf`sspGFpt@#X0A0Cqr8b;~V~w9dNlD3p0|)Z*@(KzHii(QL%gZlax>Q

    fdK&lHFJK~Yp5MOcyRXY+1 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 literal 0 HcmV?d00001 diff --git a/website/public/launcher-icon-3x.png b/website/public/launcher-icon-3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e07be0744672b92232726284da1f7c64a306ec GIT binary patch literal 7418 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 literal 0 HcmV?d00001 diff --git a/website/public/manifest.json b/website/public/manifest.json new file mode 100755 index 0000000..9fcd94d --- /dev/null +++ b/website/public/manifest.json @@ -0,0 +1,44 @@ +{ + "name": "Web Application Manifest Sample", + "icons": [ + { + "src": "launcher-icon-0-75x.png", + "sizes": "36x36", + "type": "image/png", + "density": "0.75" + }, + { + "src": "launcher-icon-1x.png", + "sizes": "48x48", + "type": "image/png", + "density": "1.0" + }, + { + "src": "launcher-icon-1-5x.png", + "sizes": "72x72", + "type": "image/png", + "density": "1.5" + }, + { + "src": "launcher-icon-2x.png", + "sizes": "96x96", + "type": "image/png", + "density": "2.0" + }, + { + "src": "launcher-icon-3x.png", + "sizes": "144x144", + "type": "image/png", + "density": "3.0" + }, + { + "src": "launcher-icon-4x.png", + "sizes": "192x192", + "type": "image/png", + "density": "4.0" + } + ], + "start_url": "index.html", + "display": "standalone", + "orientation": "portrait" +} \ No newline at end of file diff --git a/website/public/square.png b/website/public/square.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef27326bf3f4434dcf937eaf3af0963d848fa94 GIT binary patch literal 7838 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 literal 0 HcmV?d00001 diff --git a/website/public/tiny.png b/website/public/tiny.png new file mode 100644 index 0000000000000000000000000000000000000000..971db99f86c722846cbb9efd2686195d50c42186 GIT binary patch literal 2969 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 kpS||q%M<^8MdpP1k{HWBqPv+5*5jd+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MyHyvesbook+ diff --git a/website/views/login_head.php b/website/views/login_head.php index 9e580df..e8e3a84 100644 --- a/website/views/login_head.php +++ b/website/views/login_head.php @@ -3,6 +3,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MyHyvesbook+ Date: Fri, 3 Feb 2017 11:47:16 +0100 Subject: [PATCH 52/58] Added fbModal button --- website/public/js/loginRegisterModals.js | 5 ++++- website/views/facebookRegisterModal.php | 6 ++++++ website/views/homeLoginRegister.php | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/website/public/js/loginRegisterModals.js b/website/public/js/loginRegisterModals.js index 373fb7e..104dd02 100644 --- a/website/public/js/loginRegisterModals.js +++ b/website/public/js/loginRegisterModals.js @@ -7,7 +7,7 @@ var facebookModal = document.getElementById("fbModal"); // Get the button that opens the modal var registerBtn = document.getElementById("registerBtn"); var btn = document.getElementById("myBtn"); - +var fbBtn = document.getElementById("fbBtn"); // Get the element that closes the modal var span = document.getElementsByClassName("close")[0]; @@ -24,6 +24,9 @@ btn.onclick = function () { registerBtn.onclick = function () { registerModal.style.display = "block"; } +fbBtn.onclick = function () { + facebookModal.style.display = "block"; +} /** * WHen the user clicks on (X), close the modal diff --git a/website/views/facebookRegisterModal.php b/website/views/facebookRegisterModal.php index a38a3a3..17ce7ef 100644 --- a/website/views/facebookRegisterModal.php +++ b/website/views/facebookRegisterModal.php @@ -1,3 +1,9 @@ +Facebook registreer'; + +} +?>

    -- 2.49.1 From fb5f76c4993cab6d41ab7be8c246452a2f49a207 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 3 Feb 2017 12:32:57 +0100 Subject: [PATCH 55/58] ? --- website/public/js/profile.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 website/public/js/profile.js diff --git a/website/public/js/profile.js b/website/public/js/profile.js deleted file mode 100644 index e69de29..0000000 -- 2.49.1 From 1ac6a7da87e1637e195e596f111df74c8742d8af Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 3 Feb 2017 12:40:33 +0100 Subject: [PATCH 56/58] Changed admin checkbox buttons --- website/public/styles/adminpanel.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/public/styles/adminpanel.css b/website/public/styles/adminpanel.css index 888b4ca..d04d8fa 100644 --- a/website/public/styles/adminpanel.css +++ b/website/public/styles/adminpanel.css @@ -1,9 +1,9 @@ .admin-panel input[type="radio"], input[type="checkbox"] { vertical-align: middle; - height: 28px; - width: 28px; - margin: 2px; + height: 14px; + width: 14px; + margin: 7px; } .table-checkbox { -- 2.49.1 From 4643dfcddb4f8ef314168cb0851c811d559d57bd Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Fri, 3 Feb 2017 12:42:30 +0100 Subject: [PATCH 57/58] Fixed comments and links --- website/queries/register.php | 31 +++++++++++++++++++++++++++++ website/queries/requestpassword.php | 18 +++++++++++++++-- website/views/homeLoginRegister.php | 2 +- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/website/queries/register.php b/website/queries/register.php index 3dcbed4..7f91dfa 100644 --- a/website/queries/register.php +++ b/website/queries/register.php @@ -1,5 +1,9 @@ rowCount(); } +/** + * Registers a new account with facebook register + */ function fbRegisterAccount() { $stmt = prepareQuery(" INSERT INTO @@ -158,6 +184,11 @@ function fbRegisterAccount() { return $stmt->execute(); } +/** + * Checks which dates need to be selected when there is an invalid registration. + * @param $date + * @param $value + */ function submitselect($date, $value){ if ($date == $value){ echo "selected"; diff --git a/website/queries/requestpassword.php b/website/queries/requestpassword.php index a54bd7d..daad355 100644 --- a/website/queries/requestpassword.php +++ b/website/queries/requestpassword.php @@ -1,6 +1,10 @@ getRedirectLoginHelper(); try { -- 2.49.1 From 7cc6450e6afde743509fcc83b3e8dadf0415509e Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 3 Feb 2017 13:19:00 +0100 Subject: [PATCH 58/58] Added comments to javascript code. --- website/public/js/friendButtons.js | 8 +++++- website/public/js/groupButtons.js | 5 ++++ website/public/js/masonry.js | 44 +++++++++++++++++++----------- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/website/public/js/friendButtons.js b/website/public/js/friendButtons.js index 47c476a..440dfe5 100644 --- a/website/public/js/friendButtons.js +++ b/website/public/js/friendButtons.js @@ -1,6 +1,8 @@ +// Show the right friendship buttonsto the user. function placeFriendButtons() { $.post("API/getFriendshipStatus.php", { usr: userID }) .done(function(data) { + //save the friendship status var friendshipStatus = data; var $buttonContainer = $("div.friend-button-container"); $("#start-profile-chat").hide(); @@ -22,6 +24,7 @@ function placeFriendButtons() { text1 = "Bevriend"; icon1 = "fa-handshake-o"; break; + // Users are friends. case "1": value1 = userID; class1 = "green"; @@ -32,12 +35,14 @@ function placeFriendButtons() { text2 = "Verwijder"; icon2 = "fa-times"; break; + // This user sent request. case "2": value1 = "delete"; class1 = "red"; text1 = "Trek verzoek in"; icon1 = "fa-cross"; break; + // Other user sent request. case "3": value1 = "accept"; class1 = "green"; @@ -50,6 +55,7 @@ function placeFriendButtons() { break; } + // Append buttons to the container. $buttonContainer.append( ""); - + // Gets triggered when a friend button is triggered. $buttonContainer.children().click(function() { if (isNaN(this.value)) editFriendship(userID, this.value); diff --git a/website/public/js/groupButtons.js b/website/public/js/groupButtons.js index e6ada67..ab86e8c 100644 --- a/website/public/js/groupButtons.js +++ b/website/public/js/groupButtons.js @@ -3,16 +3,20 @@ function placeGroupButtons() { .done(function(data) { var $buttonContainer = $("div.group-button-container"); + // Append the right group button to the button container. + // When user is not a member if(data == 'none') { $buttonContainer.append( ""); + // when user sent a request to become a member. } else if(data == 'request') { $buttonContainer.append( ""); + // When user is a member of the group. } else { $buttonContainer.append( ""); } + // Gets triggered when a group button is clicked. $buttonContainer.children().click(function() { $.post("API/editMembership.php", { grp: groupID, role: this.value }) .done(function() { diff --git a/website/public/js/masonry.js b/website/public/js/masonry.js index a628e96..eeb5cf7 100644 --- a/website/public/js/masonry.js +++ b/website/public/js/masonry.js @@ -1,3 +1,4 @@ +// Vertical margin between two posts. margin = 20; // scrolling modal taken from http://stackoverflow.com/questions/10476632/how-to-scroll-the-page-when-a-modal-dialog-is-longer-than-the-screen @@ -11,9 +12,12 @@ function scrollbarMargin(width, overflow) { }); } +// Get post from the server. function requestPost(postID) { + // Make the modal view visible. $(".modal").show(); + // Send get request to the server to load the post. $.get("API/loadPost.php", { postID : postID }).done(function(data) { $('.modal-default').hide(); var scrollBarWidth = window.innerWidth - document.body.offsetWidth; @@ -23,11 +27,14 @@ function requestPost(postID) { }); } +// Create a new post. function postPost() { title = $("input.newpost[name='title']").val(); content = $("textarea.newpost[name='content']").val(); + // Masonrymode 2: when on group page and user is an admin. if (masonryMode == 2) { + // Create the new group post. $.post("API/postPost.php", { title: title, content : content, group : groupID }) @@ -42,6 +49,7 @@ function postPost() { } }); } else { + // Create the new user post. $.post("API/postPost.php", { title: title, content : content }) .done(function(data) { @@ -68,6 +76,7 @@ var postAmount = 0; var noposts = false; $(document).ready(function () { + // Initialise variables for masonry. windowWidth = $(window).width(); columnCount = Math.floor($(".posts").width() / 250); columns = new Array(columnCount); @@ -78,6 +87,7 @@ $(window).on("load", function() { $(".modal-close").click(function (){closeModal()}); // http://stackoverflow.com/questions/9439725/javascript-how-to-detect-if-browser-window-is-scrolled-to-bottom + // Infinite scroll. window.onscroll = function(ev) { if($(window).scrollTop() + $(window).height() == $(document).height() ) { loadMorePosts(userID, groupID, postAmount, postLimit); @@ -85,6 +95,7 @@ $(window).on("load", function() { }; }); +// Hide modal view from the screen. function closeModal() { $(".modal").hide(); scrollbarMargin(0, 'auto'); @@ -92,23 +103,30 @@ function closeModal() { $('.modal-default').show(); } +// Will fire when user resizes the window. $(window).resize(function() { clearTimeout(window.resizedFinished); window.resizeFinished = setTimeout(function() { + // Check if the width of the screen changed. if ($(window).width() != windowWidth) { + // Save width. windowWidth = $(window).width(); - + // Check if there fit more or less columns in the new width. if (columnCount != Math.floor($(".posts").width() / 250)) { columnCount = Math.floor($(".posts").width() / 250); + // Respawn the masonry grid. masonry(masonryMode); } } }, 250); }); +// Select the container for masonry. var $container = $(".posts"); +// Spawn the masonry grid. function masonry(mode) { + // save the masonry mode. masonryMode = mode; $container.children().remove(); @@ -116,10 +134,7 @@ function masonry(mode) { noposts = false; postAmount = 0; - /* - * Initialise columns. - */ - + // Initialise columns. for (i = 0; i < columnCount; i++) { $column = $("
    "); $column.width(100/columnCount + "%"); @@ -127,11 +142,13 @@ function masonry(mode) { columns[i] = [0, $column]; } + // Place the form for new posts. if(mode > 0) { $postInput = $("
    "); $form = $(""); $postInput.append($form); + //Add extra input for group posts. if(mode == 2) { $form.append($("")); } @@ -144,17 +161,11 @@ function masonry(mode) { columns[0][0] = $postInput.height() + margin; } - /* - * Function will find the column with the shortest height. - */ - - - /* - * Get the posts from the server. - */ + // Get the posts from the server. loadMorePosts(userID, groupID, 0, postLimit); } +// Find the column with the shortest hight. function getShortestColumn(columns) { column = columns[0]; @@ -166,17 +177,20 @@ function getShortestColumn(columns) { return column; } +// Load certain range of posts. function loadMorePosts(uID, gID, offset, limit) { if (noposts) { return; } + // Get a list of posts from the server. $.post("API/getPosts.php", { usr : uID, grp : gID, offset : offset, limit : limit}) .done(function(data) { if (!data) { + // No posts were found, show noposts bar to user. $('.noposts').show(); noposts = true; return; @@ -184,9 +198,7 @@ function loadMorePosts(uID, gID, offset, limit) { posts = JSON.parse(data); - /* - * Rearange the objects. - */ + // Rearange the objects. $.each(posts, function() { $post = $("
    "); $post.append($("

    ").html(this["title"])); -- 2.49.1