From 221f2e0ced8240fe21b7f603f11f6838c482a024 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Mon, 29 Jul 2019 20:47:47 +0200
Subject: [PATCH] client: #24 - tasks overview page and delete task
 functionality

---
 client/RoadmapClient.py                       |   3 +-
 client/blueprints/Tasks.py                    |  17 ++-
 client/static/js/main.js                      |  21 ---
 .../templates/admin/milestones/overview.html  |   2 +-
 client/templates/admin/tasks/edit.html        |  76 ++++++++++
 client/templates/admin/tasks/overview.html    |  62 +++++++++
 php/admin/admin-tasks.php                     | 131 ------------------
 7 files changed, 151 insertions(+), 161 deletions(-)
 create mode 100644 client/templates/admin/tasks/edit.html
 create mode 100644 client/templates/admin/tasks/overview.html
 delete mode 100644 php/admin/admin-tasks.php

diff --git a/client/RoadmapClient.py b/client/RoadmapClient.py
index cf9cff1..3a4c3c1 100644
--- a/client/RoadmapClient.py
+++ b/client/RoadmapClient.py
@@ -7,7 +7,7 @@ from gevent.pywsgi import WSGIServer
 
 from Localization import LOCALIZATION
 from UrlBuilder import UrlBuilder
-from blueprints import Roadmaps, Authentication, Milestones
+from blueprints import Roadmaps, Authentication, Milestones, Tasks
 
 with open('settings.json', 'r') as f:
     SETTINGS = json.load(f)
@@ -22,6 +22,7 @@ URL_BUILDER = UrlBuilder(SETTINGS['apiURL'])
 app.register_blueprint(Authentication.construct_blueprint(URL_BUILDER))
 app.register_blueprint(Roadmaps.construct_blueprint(URL_BUILDER))
 app.register_blueprint(Milestones.construct_blueprint(URL_BUILDER))
+app.register_blueprint(Tasks.construct_blueprint(URL_BUILDER))
 
 
 @app.route('/')
diff --git a/client/blueprints/Tasks.py b/client/blueprints/Tasks.py
index 70aa4a0..249eabc 100644
--- a/client/blueprints/Tasks.py
+++ b/client/blueprints/Tasks.py
@@ -10,12 +10,13 @@ def construct_blueprint(urlBuilder):
 
     @tasks.route('/admin/tasks/overview', methods=['GET'])
     def overview():
-        roadmap_ID = request.args.get('milestone_ID')
-        if not roadmap_ID or int(roadmap_ID) < 0:
+        milestone_ID = request.args.get('milestone_ID')
+        if not milestone_ID or int(milestone_ID) < 0:
             return render_template('error.html', message=LOCALIZATION['error_param_invalid'])
 
-        tasks = requests.get(urlBuilder.build_url('tasks', roadmap_ID)).json()
-        return render_template('admin/tasks/overview.html', tasks=tasks, roadmap_ID=roadmap_ID)
+        milestone = requests.get(urlBuilder.build_url('milestone', milestone_ID)).json()
+        tasks = requests.get(urlBuilder.build_url('tasks', milestone_ID)).json()
+        return render_template('admin/tasks/overview.html', tasks=tasks, milestone=milestone)
 
     @tasks.route('/admin/tasks/add', methods=['GET'])
     def add():
@@ -51,10 +52,11 @@ def construct_blueprint(urlBuilder):
         success, response = ApiRequest.send_api_request(urlBuilder.build_url('task'),
                                                         requests.put, request.form,
                                                         ['ID', 'MilestoneID', 'Title', 'Description', 'Status'])
-
         if not success:
             return response
-        return redirect(url_for('admin_tasks.overview', roadmap_ID=request.args.get('milestone_ID')))
+
+        milestone = requests.get(urlBuilder.build_url('milestone', request.args['milestone_ID'])).json()
+        return redirect(url_for('admin_tasks.overview', milestone=milestone))
 
     @tasks.route('/admin/tasks/delete', methods=['GET'])
     def delete():
@@ -65,6 +67,7 @@ def construct_blueprint(urlBuilder):
         success, response = ApiRequest.send_api_request(urlBuilder.build_url('task', ID), requests.delete, {}, [])
         if not success:
             return response
-        return redirect(url_for('admin_tasks.overview', roadmap_ID=request.args.get('milestone_ID')))
+
+        return redirect(url_for('admin_tasks.overview', milestone_ID=request.args['milestone_ID']))
 
     return tasks
diff --git a/client/static/js/main.js b/client/static/js/main.js
index d32d83c..9ffa155 100644
--- a/client/static/js/main.js
+++ b/client/static/js/main.js
@@ -203,27 +203,6 @@ function editTask(task_ID, milestone_ID)
         });
 }
 
-function deleteTask(task_ID, milestone_ID)
-{
-    $.post('../admin/helper/delete-task.php',
-        {
-            "task_ID": task_ID,
-
-        }, function(data, error)
-        {
-            data = data.toString().trim();
-
-            if(data != "error")
-            {
-                window.location.href = "../admin/admin-tasks.php?id=" + milestone_ID;
-            }
-            else
-            {
-                alert('An error occurred while deleting the task with the ID ' + task_ID);
-            }
-        });
-}
-
 function editSubtask(subtask_ID, task_ID)
 {
     var edit = document.getElementById('edit').innerHTML;
diff --git a/client/templates/admin/milestones/overview.html b/client/templates/admin/milestones/overview.html
index 9932014..d22ec09 100644
--- a/client/templates/admin/milestones/overview.html
+++ b/client/templates/admin/milestones/overview.html
@@ -49,7 +49,7 @@
                                             <td class="right-align">
                                                 <a class="btn-flat no-padding tooltipped" href="{{ url_for("admin_milestones.edit", ID=milestone["ID"]) }}" data-position="bottom" data-delay="50" data-tooltip="Edit"><i class="material-icons left">edit</i></a>
                                                 <a class="btn-flat button-delete-milestone no-padding tooltipped" href="{{ url_for("admin_milestones.delete", ID=milestone["ID"], roadmap_ID=roadmap_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="{{ url_for("admin_milestones.overview", roadmap_ID=roadmap_ID) }}" data-position="bottom" data-delay="50" data-tooltip="Edit Tasks"><i class="material-icons left">assignment</i></a>
+                                                <a class="btn-flat no-padding tooltipped" href="{{ url_for("admin_tasks.overview", milestone_ID=milestone["ID"]) }}" data-position="bottom" data-delay="50" data-tooltip="Edit Tasks"><i class="material-icons left">assignment</i></a>
                                             </td>
                                         </tr>
                                     {% endfor %}
diff --git a/client/templates/admin/tasks/edit.html b/client/templates/admin/tasks/edit.html
new file mode 100644
index 0000000..2def4aa
--- /dev/null
+++ b/client/templates/admin/tasks/edit.html
@@ -0,0 +1,76 @@
+<html xmlns="http://www.w3.org/1999/html">
+    {% import 'macros.html' as macros %}
+    {{ macros.headerFull("../..", title) }}
+
+	<body class="grey lighten-3">
+		<div id="main">
+			<div class="container">
+                <h2 class="center-align" id="headline">{{ title }}</h2>
+
+                <form action="{{ form_url }}" method="post" onsubmit="return validateNewMilestoneForm()">
+                    <input type="hidden" name="RoadmapID" value="{{ roadmap_ID }}"/>
+                    {% if milestone %}
+                        <input type="hidden" name="ID" value="{{ milestone["ID"] }}"/>
+                    {% endif %}
+
+                    <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="VersionCode" type="text" value="{% if milestone %}{{ milestone["VersionCode"] }}{% endif %}">
+                                <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="VersionName" type="text" value="{% if milestone %}{{ milestone["VersionName"] }}{% endif %}">
+                                <label for="version-name">Version Name</label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row center-align">
+                        <div class="col s12 m8 offset-m2 l6 offset-l3">
+                            <div class="input-field col s12">
+                                <input id="title" name="Title" type="text" value="{% if milestone %}{{ milestone["Title"] }}{% endif %}">
+                                <label for="title">Title</label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row center-align">
+                        <div class="col s12 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" name="DueDate" value="{% if milestone %}{{ milestone["DueDate"] }}{% endif %}">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row center-align">
+                        <div class="col s12 m8 offset-m2 l6 offset-l3">
+                            <div class="col s12 left-align">
+                                <input type="checkbox" id="checkbox-done" name="Status" {% if milestone and milestone["Status"] == 1 %}checked{% endif %}/>
+                                <label for="checkbox-done">Done</label>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="row center-align {% if not milestone or milestone["Status"] == 0 %}hide{% endif %}" id="row-done-date">
+                        <div class="col s12 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" name="CompletionDate" value="{% if milestone %}{{ milestone["CompletionDate"] }}{% endif %}"/>
+                            </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="{{ url_for("admin_milestones.overview", roadmap_ID=roadmap_ID) }}"><i class="material-icons left">arrow_back</i>Back</a>
+                            <button class="bwaves-effect waves-light btn blue darken-3 margin-left" type="submit" name="action">
+                                <i class="material-icons left">save</i>Save
+                            </button>
+                        </div>
+                    </div>
+                </form>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file
diff --git a/client/templates/admin/tasks/overview.html b/client/templates/admin/tasks/overview.html
new file mode 100644
index 0000000..d391255
--- /dev/null
+++ b/client/templates/admin/tasks/overview.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/html">
+    {% import 'macros.html' as macros %}
+    {{ macros.headerFull("../..", "Tasks") }}
+
+    <body class="grey lighten-3">
+        <a class="waves-effect waves-light btn blue darken-3" href="{{ url_for("admin_tasks.overview") }}"><i class="material-icons left">arrow_back</i>Back</a>
+        {{ macros.adminLogout() }}
+        <div id="main">
+            <div class="container">
+                <h2 class="center-align truncate" id="headline">{{ milestone["Title"] }}</h2>
+                <h4 class="center-align" id="headline">Tasks</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="{{ url_for("admin_tasks.add", milestone_ID=milestone["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">ID</th>
+                                <th data-field="project-name">Title</th>
+                                <th data-field="project-name">Status</th>
+                            </tr>
+                            </thead>
+
+                            <tbody>
+                                {% if tasks|length > 0 %}
+                                    {% for task in tasks %}
+                                        <tr>
+                                            <td>{{ task["ID"] }}</td>
+                                            <td>{{ task["Title"] }}</td>
+
+                                            {% if task["Status"] == 0 %}
+                                                <td><i class="material-icons red-text">build</i></td>
+                                            {% else %}
+                                                <td><i class="material-icons green-text">check</i></td>
+                                            {% endif %}
+
+                                            <td class="right-align">
+                                                <a class="btn-flat no-padding tooltipped" href="{{ url_for("admin_tasks.edit", ID=task["ID"]) }}" data-position="bottom" data-delay="50" data-tooltip="Edit"><i class="material-icons left">edit</i></a>
+                                                <a class="btn-flat button-delete-milestone no-padding tooltipped" href="{{ url_for("admin_tasks.delete", ID=task["ID"], milestone_ID=milestone["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="{{ url_for("admin_tasks.overview", milestone_ID=milestone["ID"]) }}" data-position="bottom" data-delay="50" data-tooltip="Edit SubTasks"><i class="material-icons left">assignment</i></a>
+                                            </td>
+                                        </tr>
+                                    {% endfor %}
+                                {% else %}
+                                    <tr>
+                                        <td colspan="2" class="center-align">No tasks available</td>
+                                    </tr>
+                                {% endif %}
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </body>
+</html>
\ No newline at end of file
diff --git a/php/admin/admin-tasks.php b/php/admin/admin-tasks.php
deleted file mode 100644
index 753a84b..0000000
--- a/php/admin/admin-tasks.php
+++ /dev/null
@@ -1,131 +0,0 @@
-<!DOCTYPE html>
-
-<?php
-if(!isset($_SESSION))
-{
-	session_start();
-}
-if(!isset($_SESSION['loggedIn']))
-{
-	header('Location: login.php');
-}
-
-include_once('../getLanguageJSON.php');
-include_once('../database.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();
-
-$milestone = $db->getMilestone($ID);
-if($milestone == false)
-{
-	header('Location: ../error.php?message=error_task_not_existing');
-	exit;
-}
-
-?>
-<html xmlns="http://www.w3.org/1999/html">
-<head>
-	<meta charset="UTF-8"/>
-	<title>Tasks - Adminarea</title>
-	<!--Import Google Icon Font-->
-	<link href="https://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">
-<a class="waves-effect waves-light btn blue darken-3" href="admin-milestones.php?id=<?php echo $milestone['RoadmapID'];?>"><i class="material-icons left">arrow_back</i>Back</a>
-<a class="waves-effect waves-light btn blue darken-3 right" href="logout.php"><i class="material-icons left">lock</i>Logout</a>
-<div id="main">
-	<div class="container">
-		<h2 class="center-align truncate" id="headline"><?php echo $milestone['Title'];?></h2>
-		<h4 class="center-align" id="headline">Tasks</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-task.php?milestoneID=<?php echo $ID;?>"><i
-						class="material-icons left">add</i>New</a>
-                <a class="waves-effect waves-light btn blue darken-3" id="button-mark-all-as-done" data-milestoneid="<?php echo $ID;?>"><i
-                            class="material-icons left">check</i>Mark all as done</a>
-			</div>
-		</div>
-		<div class="row">
-			<div class="col s12 m10 offset-m1 l8 offset-l2">
-				<table class="bordered">
-					<thead>
-					<tr>
-						<th data-field="id">ID</th>
-						<th data-field="project-name">Title</th>
-						<th data-field="project-name">Status</th>
-					</tr>
-					</thead>
-
-					<tbody>
-					<?php
-					$tasks = $db->getTasks($ID);
-
-					if($tasks == false)
-					{
-						echo '<td colspan="6" class="center-align">No Tasks</td>';
-						exit;
-					}
-					else
-					{
-						for($i = 0; $i < sizeof($tasks); $i++)
-						{
-							$status = $tasks[$i]['Status'];
-							echo '<tr>' .
-								'<td>' . $tasks[$i]['ID'] . '</td>' .
-								'<td>' . $tasks[$i]['Title'] . '</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-task.php?id=' . $tasks[$i]['ID'] . '&milestoneID='. $ID .'&edit=true" data-position="bottom" data-delay="50" data-tooltip="Edit"><i class="material-icons left">edit</i></a>' .
-								'<a class="btn-flat button-delete-task no-padding tooltipped" data-id="' . $tasks[$i]['ID'] . '" data-milestoneid="' . $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-subtasks.php?id=' . $tasks[$i]['ID'] . '" data-position="bottom" data-delay="50" data-tooltip="Edit Subtasks"><i class="material-icons left">assignment</i></a>' .
-								'</td>' .
-								'</tr>';
-						}
-					}
-					?>
-					</tbody>
-				</table>
-			</div>
-		</div>
-	</div>
-</div>
-</body>
-</html>
\ No newline at end of file
-- 
GitLab