diff --git a/client/RoadmapClient.py b/client/RoadmapClient.py index cf9cff12e542a3689cee37b88f5455286a3ce320..3a4c3c19314c7fd320fdc90c27b88f5965ffded9 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 70aa4a0dd62b429f3fcd9c8f5706244d46055fac..249eabcd9618e25a286c7bc63c234287b5e33422 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 d32d83c3a6d7adf5f2c2d62e9189a736205a886e..9ffa15520eeff10e989a2a7f3bbf83dc908f1908 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 99320147468541df993cfeb3cdfe6f56b6fe21d2..d22ec09a909397482f8ed77bb494796e86a37e1f 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 0000000000000000000000000000000000000000..2def4aa6970edf8df7b9ab2a2923c2979d6449bd --- /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 0000000000000000000000000000000000000000..d39125560605b0a486f951d566f06ba082e3d552 --- /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 753a84b37bc4e0598ce5fb04125cbfc3e2852c66..0000000000000000000000000000000000000000 --- 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