diff --git a/js/main.js b/js/main.js index b606f903268fac4089e2fa85ce631f5682370958..8cc5beb5d2bac5e308156d7e7ddba0e044bb88cc 100644 --- a/js/main.js +++ b/js/main.js @@ -38,6 +38,11 @@ $(document).ready(function() editRoadmap(this.dataset.id, $('#project-name').val()); }); + $('.button-save-milestone').click(function() + { + editMilestone(this.dataset.id, this.dataset.roadmapid); + }); + $('.button-delete-roadmap').click(function() { var r = confirm("Do you really want to delete this roadmap?"); @@ -47,6 +52,39 @@ $(document).ready(function() } }); + $('.button-delete-milestone').click(function() + { + var r = confirm("Do you really want to delete this milestone?"); + if(r == true) + { + deleteMilestone(this.dataset.id, this.dataset.roadmapid); + } + }); + + $('#checkbox-done').click(function() + { + var checked = document.getElementById("checkbox-done").checked; + if(checked) + { + hideElement(document.getElementById("row-done-date"), false); + + var $input = $('#done-date').pickadate(); + var picker = $input.pickadate('picker'); + picker.set('select', new Date()); + } + else + { + hideElement(document.getElementById("row-done-date"), true); + } + }); + + $('.datepicker').pickadate({ + selectMonths: true, // Creates a dropdown to control month + selectYears: 15, // Creates a dropdown of 15 years to control year + format: 'dd.mm.yyyy', + formatSubmit: 'yyyy-mm-dd' + }); + createTrainMap(); }); @@ -179,4 +217,106 @@ function deleteRoadmap(roadmap_ID) alert('An error occurred while deleting the roadmap with the ID ' + roadmap_ID); } }); +} + +function editMilestone(milestone_ID, roadmap_ID) +{ + var edit = document.getElementById('edit').innerHTML; + var versionCode = $('#version-code').val(); + var versionName = $('#version-name').val(); + var title = $('#title').val(); + var dueDate = $('#due-date').val(); + var doneDate = $('#done-date').val(); + var done = document.getElementById("checkbox-done").checked; + + if(isNull(versionCode)) + { + alert("Version Code shouldn't be empty!"); + return; + } + + if(isNull(versionName)) + { + alert("Version Name shouldn't be empty!"); + return; + } + + if(isNull(title)) + { + alert("Title shouldn't be empty!"); + return; + } + + if(isNull(dueDate)) + { + dueDate = "01.01.2001"; + } + + if(isNull(doneDate)) + { + doneDate = "01.01.2001"; + } + + if(done) + { + done = 1; + } + else + { + done = 0; + doneDate = doneDate = "01.01.2001"; + } + + $.post('../admin/helper/edit-milestone.php', + { + "version-code": versionCode, + "version-name": versionName, + "title": title, + "due-date": dueDate, + "done-date": doneDate, + "done": done, + "edit": edit, + "ID": milestone_ID, + "roadmap-ID": roadmap_ID + + }, function(data, error) + { + data = data.toString().trim(); + switch(data) + { + case "error": + alert('An error occurred'); + break; + case "error-edit": + alert('An error occurred while editing the roadmap with the ID ' + roadmap_ID); + break; + case "error-insert": + alert('An error occurred while inserting the new milestone'); + break; + default: + window.location.href = "../admin/admin-milestones.php?id=" + roadmap_ID; + break; + } + }); +} + +function deleteMilestone(milestone_ID, roadmap_ID) +{ + $.post('../admin/helper/delete-milestone.php', + { + "milestone_ID": milestone_ID, + + }, function(data, error) + { + data = data.toString().trim(); + + if(data != "error") + { + window.location.href = "../admin/admin-milestones.php?id=" + roadmap_ID; + } + else + { + alert('An error occurred while deleting the milestone with the ID ' + milestone_ID); + } + }); } \ No newline at end of file diff --git a/php/admin/admin-edit-milestone.php b/php/admin/admin-edit-milestone.php new file mode 100644 index 0000000000000000000000000000000000000000..a1abdbcc613454e106375eedbdbfcfcd371e95cb --- /dev/null +++ b/php/admin/admin-edit-milestone.php @@ -0,0 +1,183 @@ +<!DOCTYPE html> + +<?php +include_once('../getLanguageJSON.php'); +include_once('../mysql.php'); + + +if(!isset($_GET['roadmapID'])) +{ + header('Location: ../error.php?message=error_param_missing'); + exit; +} + +$roadmapID = $_GET['roadmapID']; +if(!is_numeric($roadmapID) || $roadmapID < 1) +{ + header('Location: ../error.php?message=error_param_invalid'); + exit; +} + + +if(!isset($_GET['edit'])) +{ + $_GET['edit'] = "false"; + + $_GET['id'] = 0; + + $db = new DB(); + $db->createTables(); +} +else +{ + if(!isset($_GET['id'])) + { + header('Location: ../error.php?message=error_param_missing'); + exit; + } + + $ID = $_GET['id']; + if(!is_numeric($ID) || $ID < 1) + { + header('Location: ../error.php?message=error_param_invalid'); + exit; + } + + $db = new DB(); + $db->createTables(); + + $milestone = $db->getMilestone($ID); + if($milestone == false) + { + header('Location: ../error.php?message=error_milestone_not_existing'); + exit; + } +} +?> +<html xmlns="http://www.w3.org/1999/html"> + <head> + <meta charset="UTF-8"/> + <?php + if($_GET['edit'] == "false") + { + echo '<title>New Milestone</title>'; + } + else + { + echo '<title>Edit Milestone</title>'; + } + ?> + <!--Import Google Icon Font--> + <link href="http://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> + <!--Import materialize.css--> + <link type="text/css" rel="stylesheet" href="../../materialize/css/materialize.min.css" media="screen,projection"/> + <link type="text/css" rel="stylesheet" href="../../css/style.css"/> + + <!--Import jQuery before materialize.js--> + <script type="text/javascript" src="../../js/jquery-2.2.4.min.js"></script> + <script type="text/javascript" src="../../materialize/js/materialize.min.js"></script> + <script type="text/javascript" src="../../js/main.js"></script> + <script type="text/javascript" src="../../js/ResizeSensor.js"></script> + <script type="text/javascript" src="../../js/ElementQueries.js"></script> + + <!--Let browser know website is optimized for mobile--> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> + </head> + + <body class="grey lighten-3"> + <div class="hide" id="edit"><?php echo $_GET['edit'];?></div> + <div id="main"> + <div class="container"> + <?php + if($_GET['edit'] == "false") + { + echo '<h2 class="center-align" id="headline">New Milestone</h2>'; + } + else + { + echo '<h2 class="center-align" id="headline">Edit Milestone</h2>'; + } + ?> + + <div class="row center-align"> + <div class="col s6 m4 offset-m2 l3 offset-l3"> + <div class="input-field col s12"> + <input id="version-code" name="version-code" type="text" value="<?php if(isset($milestone)){echo $milestone["VersionCode"];}?>"> + <label for="version-code">Version Code</label> + </div> + </div> + <div class="col s6 m4 l3"> + <div class="input-field col s12"> + <input id="version-name" name="version-name" type="text" value="<?php if(isset($milestone)){ echo $milestone['VersionName'];}?>"> + <label for="version-name">Version Name</label> + </div> + </div> + </div> + <div class="row center-align"> + <div class="col s6 m8 offset-m2 l6 offset-l3"> + <div class="input-field col s12"> + <input id="title" name="title" type="text" value="<?php if(isset($milestone)){echo $milestone['Title'];}?>"> + <label for="title">Title</label> + </div> + </div> + </div> + <div class="row center-align"> + <div class="col s6 m8 offset-m2 l6 offset-l3"> + <div class="col s12 left-align"> + <label for="due-date" style="font-size: 1rem;">Due Date</label> + <input type="date" class="datepicker" id="due-date" data-value="<?php if(isset($milestone)){echo $milestone['DueDate'];}?>"> + </div> + </div> + </div> + <div class="row center-align"> + <div class="col s6 m8 offset-m2 l6 offset-l3"> + <div class="col s12 left-align"> + <input type="checkbox" id="checkbox-done" + <?php + if(isset($milestone)) + { + if($milestone['Status'] == "1") + { + echo "checked"; + } + } + ?> + /> + <label for="checkbox-done">Done</label> + </div> + </div> + </div> + + <div class="row center-align + <?php + if(isset($milestone)) + { + if($milestone['Status'] != "1") + { + echo "hide"; + } + } + else + { + echo "hide"; + } + ?> + " id="row-done-date"> + <div class="col s6 m8 offset-m2 l6 offset-l3"> + <div class="col s12 left-align"> + <label for="done-date" style="font-size: 1rem;">Completion Date</label> + <input type="date" class="datepicker" id="done-date" data-value="<?php if(isset($milestone)){echo $milestone['CompletionDate'];}?>"> + </div> + </div> + </div> + + <div class="row center-align margin-top"> + <div class="col s12 m8 offset-m2 l6 offset-l3"> + <a class="waves-effect waves-light btn blue darken-3" href="admin-milestones.php?id=<?php echo $roadmapID ;?>"><i class="material-icons left">arrow_back</i>Back</a> + <a class="waves-effect waves-light btn blue darken-3 margin-left button-save-milestone" data-id="<?php echo $ID;?>" data-roadmapid="<?php echo $roadmapID;?>"><i class="material-icons left">save</i>Save</a> + </div> + </div> + </div> + </div> + </body> +</html> \ No newline at end of file diff --git a/php/admin/admin-edit-roadmap.php b/php/admin/admin-edit-roadmap.php index 472c7835230721f8dda4cace1a0ce448b5283e3f..d1b10d08e126ed131ee9a9f66970018a491a3e5a 100644 --- a/php/admin/admin-edit-roadmap.php +++ b/php/admin/admin-edit-roadmap.php @@ -19,14 +19,14 @@ else { if(!isset($_GET['id'])) { - header('Location: error.php?message=error_param_missing'); + header('Location: ../error.php?message=error_param_missing'); exit; } $ID = $_GET['id']; if(!is_numeric($ID) || $ID < 1) { - header('Location: error.php?message=error_param_invalid'); + header('Location: ../error.php?message=error_param_invalid'); exit; } @@ -36,14 +36,11 @@ else $projectName = $db->getRoadmap($ID); if($projectName == false) { - header('Location: error.php?message=error_roadmap_not_existing'); + header('Location: ../error.php?message=error_roadmap_not_existing'); exit; } $projectName = $projectName["Projectname"]; } - - - ?> <html xmlns="http://www.w3.org/1999/html"> <head> diff --git a/php/admin/admin-milestones.php b/php/admin/admin-milestones.php new file mode 100644 index 0000000000000000000000000000000000000000..f5188bfdda4df7c5e729323815a10b66e8264c03 --- /dev/null +++ b/php/admin/admin-milestones.php @@ -0,0 +1,139 @@ +<!DOCTYPE html> + +<?php +include_once('../getLanguageJSON.php'); +include_once('../mysql.php'); + +if(!isset($_GET['id'])) +{ + header('Location: ../error.php?message=error_param_missing'); + exit; +} + +$ID = $_GET['id']; +if(!is_numeric($ID) || $ID < 1) +{ + header('Location: ../error.php?message=error_param_invalid'); + exit; +} + +$db = new DB(); +$db->createTables(); + +$projectName = $db->getRoadmap($ID); +if($projectName == false) +{ + header('Location: ../error.php?message=error_roadmap_not_existing'); + exit; +} +$projectName = $projectName["Projectname"]; + +?> +<html xmlns="http://www.w3.org/1999/html"> +<head> + <meta charset="UTF-8"/> + <title>Milestones - Adminarea</title> + <!--Import Google Icon Font--> + <link href="http://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> + <!--Import materialize.css--> + <link type="text/css" rel="stylesheet" href="../../materialize/css/materialize.min.css" media="screen,projection"/> + <link type="text/css" rel="stylesheet" href="../../css/style.css"/> + + <!--Import jQuery before materialize.js--> + <script type="text/javascript" src="../../js/jquery-2.2.4.min.js"></script> + <script type="text/javascript" src="../../materialize/js/materialize.min.js"></script> + <script type="text/javascript" src="../../js/main.js"></script> + <script type="text/javascript" src="../../js/ResizeSensor.js"></script> + <script type="text/javascript" src="../../js/ElementQueries.js"></script> + + <!--Let browser know website is optimized for mobile--> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> +</head> + +<body class="grey lighten-3"> +<div id="main"> + <div class="container"> + <h2 class="center-align" id="headline"><?php echo $projectName;?></h2> + <h4 class="center-align" id="headline">Milestones</h4> + + <div class="row"> + <div class="col s12 m8 offset-m2 l6 offset-l3 center-align"> + <a class="waves-effect waves-light btn blue darken-3" href="admin-edit-milestone.php?roadmapID=<?php echo $ID;?>"><i + class="material-icons left">add</i>New</a> + </div> + </div> + <div class="row"> + <div class="col s12 m12 l12"> + <table class="bordered"> + <thead> + <tr> + <th data-field="id">Version Code</th> + <th data-field="project-name">Version Name</th> + <th data-field="project-name">Title</th> + <th data-field="project-name">Due Date</th> + <th data-field="project-name">Completion Date</th> + <th data-field="project-name">Status</th> + </tr> + </thead> + + <tbody> + <?php + $milestones = $db->getMilestones($ID); + + if($milestones == false) + { + echo '<td colspan="6" class="center-align">No Milestones</td>'; + exit; + } + else + { + for($i = 0; $i < sizeof($milestones); $i++) + { + $status = $milestones[$i]['Status']; + $dueDate = $milestones[$i]['DueDate']; + $dueDate = date('d.m.Y', strtotime($dueDate)); + if($dueDate == "01.01.2001") + { + $dueDate = ""; + } + + $doneDate = $milestones[$i]['CompletionDate']; + $doneDate = date('d.m.Y', strtotime($doneDate)); + if($doneDate == "01.01.2001") + { + $doneDate = ""; + } + + echo '<tr>' . + '<td>' . $milestones[$i]['VersionCode'] . '</td>' . + '<td>' . $milestones[$i]['VersionName'] . '</td>' . + '<td>' . $milestones[$i]['Title'] . '</td>' . + '<td>' . $dueDate . '</td>' . + '<td>' . $doneDate . '</td>'; + + if($status == "0") + { + echo '<td><i class="material-icons red-text">build</i></td>'; + } + else + { + echo '<td><i class="material-icons green-text">check</i></td>'; + } + + echo '<td class="right-align">' . + '<a class="btn-flat no-padding tooltipped" href="admin-edit-milestone.php?id=' . $milestones[$i]['ID'] . '&roadmapID='. $ID .'&edit=true" data-position="bottom" data-delay="50" data-tooltip="Edit"><i class="material-icons left">edit</i></a><br>' . + '<a class="btn-flat button-delete-milestone no-padding tooltipped" data-id="' . $milestones[$i]['ID'] . '" data-roadmapid="' . $ID . '" data-position="bottom" data-delay="50" data-tooltip="Delete"><i class="material-icons left">delete</i></a><br>' . + '<a class="btn-flat no-padding tooltipped" href="admin-tasks.php?id=' . $milestones[$i]['ID'] . '" data-position="bottom" data-delay="50" data-tooltip="Edit Tasks"><i class="material-icons left">assignment</i></a>' . + '</td>' . + '</tr>'; + } + } + ?> + </tbody> + </table> + </div> + </div> + </div> +</div> +</body> +</html> \ No newline at end of file diff --git a/php/admin/admin-roadmaps.php b/php/admin/admin-roadmaps.php index f3e37d6deb8105a923b2966a6c70fa55c7adedc0..28173d1e77217df68628ed14b6ee79643c0cf88c 100644 --- a/php/admin/admin-roadmaps.php +++ b/php/admin/admin-roadmaps.php @@ -39,7 +39,7 @@ $db->createTables(); </div> </div> <div class="row"> - <div class="col s12 m8 offset-m2 l6 offset-l3"> + <div class="col s12 m10 offset-m1 l6 offset-l3"> <table class="bordered"> <thead> <tr> @@ -54,7 +54,7 @@ $db->createTables(); if($roadmaps == false) { - header('Location: error.php?message=error_database_connection'); + header('Location: ../error.php?message=error_database_connection'); exit; } else @@ -65,8 +65,9 @@ $db->createTables(); '<td>'.$roadmaps[$i]['ID'].'</td>'. '<td>'.$roadmaps[$i]['Projectname'].'</td>'. '<td class="right-align">'. - '<a class="btn-flat" href="admin-edit-roadmap.php?id='.$roadmaps[$i]['ID'].'&edit=true"><i class="material-icons left">edit</i></a>'. - '<a class="btn-flat button-delete-roadmap" data-id="'.$roadmaps[$i]['ID'].'"><i class="material-icons left">delete</i></a>'. + '<a class="btn-flat no-padding tooltipped" href="admin-edit-roadmap.php?id='.$roadmaps[$i]['ID'].'&edit=true" data-position="bottom" data-delay="50" data-tooltip="Rename"><i class="material-icons left">edit</i></a>'. + '<a class="btn-flat button-delete-roadmap no-padding tooltipped" data-id="'.$roadmaps[$i]['ID'].'" data-position="bottom" data-delay="50" data-tooltip="Delete"><i class="material-icons left">delete</i></a>'. + '<a class="btn-flat no-padding tooltipped" href="admin-milestones.php?id='.$roadmaps[$i]['ID'].'" data-position="bottom" data-delay="50" data-tooltip="Edit Milestones"><i class="material-icons left">assignment</i></a>'. '</td>'. '</tr>'; } diff --git a/php/admin/helper/delete-milestone.php b/php/admin/helper/delete-milestone.php new file mode 100644 index 0000000000000000000000000000000000000000..bb37078a92bae4bdd7cc3e343f922da21576cf2b --- /dev/null +++ b/php/admin/helper/delete-milestone.php @@ -0,0 +1,30 @@ +<?php +include_once('../../mysql.php'); + +if($_SERVER['REQUEST_METHOD'] == 'POST') +{ + if(!isset($_POST['milestone_ID'])) + { + echo "error"; + exit; + } + + $db = new DB(); + $db->createTables(); + + if($db->deleteMilestone($_POST['milestone_ID']) == false) + { + echo "error"; + exit; + } + else + { + echo "success"; + exit; + } +} +else +{ + echo "error"; + exit; +} \ No newline at end of file diff --git a/php/admin/helper/delete-roadmap.php b/php/admin/helper/delete-roadmap.php index 810d5ff58adcd5ddd5cfde9a743c530db6da6c39..c90ae65c4e9409b17d46be05d7d607f3c3808175 100644 --- a/php/admin/helper/delete-roadmap.php +++ b/php/admin/helper/delete-roadmap.php @@ -14,7 +14,7 @@ if($_SERVER['REQUEST_METHOD'] == 'POST') if($db->deleteRoadmap($_POST['roadmap_ID']) == false) { - echo "error2"; + echo "error"; exit; } else diff --git a/php/admin/helper/edit-milestone.php b/php/admin/helper/edit-milestone.php new file mode 100644 index 0000000000000000000000000000000000000000..7729f8d3b24d805f9cc715778d8bd61a31c1322f --- /dev/null +++ b/php/admin/helper/edit-milestone.php @@ -0,0 +1,94 @@ +<?php +include_once('../../mysql.php'); + +if($_SERVER['REQUEST_METHOD'] == 'POST') +{ + if(!isset($_POST['edit'])) + { + echo "error"; + exit; + } + + if(!isset($_POST['ID'])) + { + echo "error-edit"; + exit; + } + + if(!isset($_POST['roadmap-ID'])) + { + echo "error-edit"; + exit; + } + + if(!isset($_POST['version-name'])) + { + echo "error-edit"; + exit; + } + + if(!isset($_POST['version-code'])) + { + echo "error-edit"; + exit; + } + + if(!isset($_POST['title'])) + { + echo "error-edit"; + exit; + } + + if(!isset($_POST['due-date'])) + { + echo "error-edit"; + exit; + } + + if(!isset($_POST['done-date'])) + { + echo "error-edit"; + exit; + } + + if(!isset($_POST['done'])) + { + echo "error-edit"; + exit; + } + + $db = new DB(); + $db->createTables(); + + if($_POST['edit'] == "true") + { + if($db->updateMilestone($_POST['ID'], $_POST['version-code'], $_POST['version-name'], $_POST['title'], $_POST['due-date'], $_POST['done-date'], $_POST['done']) == false) + { + echo "error-edit"; + exit; + } + else + { + echo "success"; + exit; + } + } + else + { + if($db->insertMilestone($_POST['roadmap-ID'], $_POST['version-code'], $_POST['version-name'], $_POST['title'], $_POST['due-date'], $_POST['done-date'], $_POST['done']) == false) + { + echo "error-insert"; + exit; + } + else + { + echo "success"; + exit; + } + } +} +else +{ + echo "error"; + exit; +} \ No newline at end of file diff --git a/php/language.json b/php/language.json index 25d2f82359ef0f268366d7166428064ad0cef098..f67de0d55bcac8d69710a86579eee33f3879af08 100644 --- a/php/language.json +++ b/php/language.json @@ -6,6 +6,7 @@ "error_param_missing": "ERROR: parameter missing", "error_param_invalid": "ERROR: parameter is not numeric or less than 1", "error_roadmap_not_existing": "ERROR: no roadmap with this ID existing", + "error_milestone_not_existing": "ERROR: no milestone with this ID existing", "error_no_milestones": "ERROR: no milestones for this roadmap", "error_database_connection" : "An error occurred while getting data from the server." } \ No newline at end of file diff --git a/php/mysql.php b/php/mysql.php index 00ae4bc26ad5b92781a778e6701fb0b5a807519a..566fe0bb9c69f684dcd4b4fbd849768e6a83109c 100644 --- a/php/mysql.php +++ b/php/mysql.php @@ -73,11 +73,9 @@ class DB return $statement->execute(); } - function insertMilestone($roadmapID, $versionCode, $versionName, $title, $dueDate) + function insertMilestone($roadmapID, $versionCode, $versionName, $title, $dueDate, $completionDate, $status) { - $completionDate = "2000-01-01"; - $status = "0"; - $statement = self::$db->prepare("INSERT INTO milestones VALUES('', :roadmapID, :versionCode, :versionName, :title, :dueDate, :completionDate, :status);"); + $statement = self::$db->prepare("INSERT INTO milestones VALUES('', :roadmapID, :versionCode, :versionName, :title, STR_TO_DATE(:dueDate, '%d.%m.%Y'), STR_TO_DATE(:completionDate, '%d.%m.%Y'), :status);"); $statement->bindParam("roadmapID", $roadmapID); $statement->bindParam("versionCode", $versionCode); $statement->bindParam("versionName", $versionName); @@ -154,11 +152,10 @@ class DB return $statement->execute(); } - function updateMilestone($milestoneID, $roadmapID, $versionCode, $versionName, $title, $dueDate, $completionDate, $status) + function updateMilestone($milestoneID, $versionCode, $versionName, $title, $dueDate, $completionDate, $status) { - $statement = self::$db->prepare("UPDATE milestones SET RoadmapID = :roadmapID, VersionCode = :versionCode, VersionName = :versionName, Title = :title, DueDate = :dueDate, CompletionDate = :completionDate, Status = :status WHERE ID = :milestoneID;"); + $statement = self::$db->prepare("UPDATE milestones SET VersionCode = :versionCode, VersionName = :versionName, Title = :title, DueDate = STR_TO_DATE(:dueDate, '%d.%m.%Y'), CompletionDate = STR_TO_DATE(:completionDate, '%d.%m.%Y'), Status = :status WHERE ID = :milestoneID;"); $statement->bindParam("milestoneID", $milestoneID); - $statement->bindParam("roadmapID", $roadmapID); $statement->bindParam("versionCode", $versionCode); $statement->bindParam("versionName", $versionName); $statement->bindParam("title", $title); @@ -225,6 +222,15 @@ class DB return $statement->fetchAll(); } + function getMilestone($milestoneID) + { + $statement = self::$db->prepare("SELECT * FROM milestones WHERE milestones.ID=:milestoneID;"); + $statement->bindParam("milestoneID", $milestoneID); + $statement->execute(); + + return $statement->fetch(); + } + function getNumberOfOpenMilestones($roadmapID) { $statement = self::$db->prepare("SELECT COUNT(*) AS 'count' FROM milestones WHERE milestones.roadmapID=:roadmapID AND status = '0';");