Skip to content
Snippets Groups Projects
Commit 609cbf1a authored by Robert Goldmann's avatar Robert Goldmann
Browse files

client: #24 - subtasks add, overview, edit, delete

parent e0bf4841
No related branches found
No related tags found
No related merge requests found
...@@ -7,7 +7,7 @@ from gevent.pywsgi import WSGIServer ...@@ -7,7 +7,7 @@ from gevent.pywsgi import WSGIServer
from Localization import LOCALIZATION from Localization import LOCALIZATION
from UrlBuilder import UrlBuilder from UrlBuilder import UrlBuilder
from blueprints import Roadmaps, Authentication, Milestones, Tasks from blueprints import Roadmaps, Authentication, Milestones, Tasks, SubTasks
with open('settings.json', 'r') as f: with open('settings.json', 'r') as f:
SETTINGS = json.load(f) SETTINGS = json.load(f)
...@@ -23,6 +23,7 @@ app.register_blueprint(Authentication.construct_blueprint(URL_BUILDER)) ...@@ -23,6 +23,7 @@ app.register_blueprint(Authentication.construct_blueprint(URL_BUILDER))
app.register_blueprint(Roadmaps.construct_blueprint(URL_BUILDER)) app.register_blueprint(Roadmaps.construct_blueprint(URL_BUILDER))
app.register_blueprint(Milestones.construct_blueprint(URL_BUILDER)) app.register_blueprint(Milestones.construct_blueprint(URL_BUILDER))
app.register_blueprint(Tasks.construct_blueprint(URL_BUILDER)) app.register_blueprint(Tasks.construct_blueprint(URL_BUILDER))
app.register_blueprint(SubTasks.construct_blueprint(URL_BUILDER))
@app.route('/') @app.route('/')
......
import requests
from flask import Blueprint, render_template, redirect, url_for, request
from ApiRequest import ApiRequest
from Localization import LOCALIZATION
def construct_blueprint(urlBuilder):
subtasks = Blueprint('admin_subtasks', __name__)
@subtasks.route('/admin/subtasks/overview', methods=['GET'])
def overview():
task_ID = request.args.get('task_ID')
if not task_ID or int(task_ID) < 0:
return render_template('error.html', message=LOCALIZATION['error_param_invalid'])
task = requests.get(urlBuilder.build_url('task', task_ID)).json()
subtasks = requests.get(urlBuilder.build_url('subtasks', task_ID)).json()
return render_template('admin/subtasks/overview.html', subtasks=subtasks, task=task)
@subtasks.route('/admin/subtasks/add', methods=['GET'])
def add():
return render_template('admin/subtasks/edit.html',
title='New SubTask',
task_ID=request.args.get('task_ID'),
form_url=url_for('admin_subtasks.add_post'))
@subtasks.route('/admin/subtasks/add', methods=['POST'])
def add_post():
params = dict(request.form)
params['Status'] = '1' if 'Status' in params else '0'
success, response = ApiRequest.send_api_request(urlBuilder.build_url('subtask'),
requests.post, params,
['TaskID', 'Title', 'Description', 'Status'])
if not success:
return response
return redirect(url_for('admin_subtasks.overview', task_ID=request.form.get('TaskID')))
@subtasks.route('/admin/subtasks/edit', methods=['GET'])
def edit():
ID = request.args.get('ID')
if not ID or int(ID) < 0:
return render_template('error.html', message=LOCALIZATION['error_param_invalid'])
subtask = requests.get(urlBuilder.build_url('subtask', ID)).json()
return render_template('admin/subtasks/edit.html',
title='Edit SubTask',
task_ID=request.args.get('task_ID'),
subtask=subtask,
form_url=url_for('admin_subtasks.edit_post'))
@subtasks.route('/admin/subtasks/edit', methods=['POST'])
def edit_post():
params = dict(request.form)
params['Status'] = '1' if 'Status' in params else '0'
success, response = ApiRequest.send_api_request(urlBuilder.build_url('subtask'),
requests.put, params,
['ID', 'TaskID', 'Title', 'Description', 'Status'])
if not success:
return response
return redirect(url_for('admin_subtasks.overview', task_ID=params['TaskID']))
@subtasks.route('/admin/subtasks/delete', methods=['GET'])
def delete():
ID = request.args.get('ID')
if not ID or int(ID) < 0:
return render_template('error.html', message=LOCALIZATION['error_param_invalid'])
success, response = ApiRequest.send_api_request(urlBuilder.build_url('subtask', ID), requests.delete, {}, [])
if not success:
return response
return redirect(url_for('admin_subtasks.overview', task_ID=request.args.get('task_ID')))
return subtasks
...@@ -77,10 +77,10 @@ $(document).ready(function() ...@@ -77,10 +77,10 @@ $(document).ready(function()
$('.button-delete-subtask').click(function() $('.button-delete-subtask').click(function()
{ {
var r = confirm("Do you really want to delete this subtask?"); var response = confirm("Do you really want to delete this subtask?");
if(r == true) if(response === true)
{ {
deleteSubtask(this.dataset.id, this.dataset.taskid); header("location: " + this.href);
} }
}); });
...@@ -150,82 +150,6 @@ function createTrainMap() ...@@ -150,82 +150,6 @@ function createTrainMap()
} }
} }
function editSubtask(subtask_ID, task_ID)
{
var edit = document.getElementById('edit').innerHTML;
var title = $('#title').val();
var description = $('#description').val();
;
var done = document.getElementById("checkbox-done").checked;
if(isNull(title))
{
alert("Title shouldn't be empty!");
return;
}
if(done)
{
done = 1;
}
else
{
done = 0;
}
$.post('../admin/helper/edit-subtask.php',
{
"title": title,
"description": description,
"done": done,
"edit": edit,
"ID": subtask_ID,
"task-ID": task_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 subtask with the ID ' + subtask_ID);
break;
case "error-insert":
alert('An error occurred while inserting the new task');
break;
default:
window.location.href = "../admin/admin-subtasks.php?id=" + task_ID;
break;
}
});
}
function deleteSubtask(subtask_ID, task_ID)
{
$.post('../admin/helper/delete-subtask.php',
{
"subtask_ID": subtask_ID,
"task_ID": task_ID
}, function(data, error)
{
data = data.toString().trim();
if(data != "error")
{
window.location.href = "../admin/admin-subtasks.php?id=" + task_ID;
}
else
{
alert('An error occurred while deleting the subtask with the ID ' + subtask_ID);
}
});
}
function validateLoginForm() function validateLoginForm()
{ {
var password = $('#password').val(); var password = $('#password').val();
...@@ -293,7 +217,6 @@ function validateNewMilestoneForm() ...@@ -293,7 +217,6 @@ function validateNewMilestoneForm()
return true; return true;
} }
function validateNewTaskForm() function validateNewTaskForm()
{ {
var title = $('#title').val(); var title = $('#title').val();
......
<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 validateNewTaskForm()">
<input type="hidden" name="TaskID" value="{{ task_ID }}"/>
{% if subtask %}
<input type="hidden" name="ID" value="{{ subtask["ID"] }}"/>
{% endif %}
<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 subtask %}{{ subtask["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="input-field col s12">
<input id="title" name="Description" type="text" value="{% if subtask %}{{ subtask["Description"] }}{% 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">
<input type="checkbox" id="checkbox-done" name="Status" {% if subtask and subtask["Status"] == 1 %}checked{% endif %}/>
<label for="checkbox-done">Done</label>
</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_subtasks.overview", task_ID=task_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
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">
{% import 'macros.html' as macros %}
{{ macros.headerFull("../..", "SubTasks") }}
<body class="grey lighten-3">
<a class="waves-effect waves-light btn blue darken-3" href="{{ url_for("admin_subtasks.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">{{ task["Title"] }}</h2>
<h4 class="center-align" id="headline">SubTasks</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_subtasks.add", task_ID=task["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 subtasks|length > 0 %}
{% for subtask in subtasks %}
<tr>
<td>{{ subtask["ID"] }}</td>
<td>{{ subtask["Title"] }}</td>
{% if subtask["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_subtasks.edit", ID=subtask["ID"], task_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-task no-padding tooltipped" href="{{ url_for("admin_subtasks.delete", ID=subtask["ID"], task_ID=task["ID"]) }}" data-position="bottom" data-delay="50" data-tooltip="Delete"><i class="material-icons left">delete</i></a>
</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan="2" class="center-align">No sub tasks available</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
</html>
\ No newline at end of file
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
<td class="right-align"> <td class="right-align">
<a class="btn-flat no-padding tooltipped" href="{{ url_for("admin_tasks.edit", ID=task["ID"], milestone_ID=milestone["ID"]) }}" data-position="bottom" data-delay="50" data-tooltip="Edit"><i class="material-icons left">edit</i></a> <a class="btn-flat no-padding tooltipped" href="{{ url_for("admin_tasks.edit", ID=task["ID"], milestone_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-task 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 button-delete-task 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> <a class="btn-flat no-padding tooltipped" href="{{ url_for("admin_subtasks.overview", task_ID=task["ID"]) }}" data-position="bottom" data-delay="50" data-tooltip="Edit SubTasks"><i class="material-icons left">assignment</i></a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment