Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Task_Data.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"4":{"TaskId":false,"TaskName":"Eish son","TaskDescription":"goo"},"5":{"TaskId":false,"TaskName":"Hmmm","TaskDescription":"new"},"6":{"TaskId":false,"TaskName":"Stratu","TaskDescription":"solve"},"7":{"TaskId":false,"TaskName":"sss","TaskDescription":"dddd"},"8":{"TaskId":false,"TaskName":"Buy Eggs","TaskDescription":"eggs are from chickens"}}
82 changes: 65 additions & 17 deletions index.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button id="deleteTask" type="button" class="btn btn-danger">Delete Task</button>
<button id="saveTask" type="button" class="btn btn-primary">Save changes</button>
<button id="saveTask" type="button" value="saveTask" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
Expand All @@ -60,18 +60,6 @@
</button>
<div id="TaskList" class="list-group">
<!-- Assignment: These are simply dummy tasks to show how it should look and work. You need to dynamically update this list with actual tasks -->
<a id="1" href="#" class="list-group-item" data-toggle="modal" data-target="#myModal">
<h4 class="list-group-item-heading">Task Name</h4>
<p class="list-group-item-text">Task Description</p>
</a>
<a id="2" href="#" class="list-group-item" data-toggle="modal" data-target="#myModal">
<h4 class="list-group-item-heading">Task Name</h4>
<p class="list-group-item-text">Task Description</p>
</a>
<a id="3" href="#" class="list-group-item" data-toggle="modal" data-target="#myModal">
<h4 class="list-group-item-heading">Task Name</h4>
<p class="list-group-item-text">Task Description</p>
</a>
</div>
</div>
<div class="col-md-3">
Expand All @@ -83,27 +71,87 @@
<script type="text/javascript" src="assets/js/jquery-1.12.3.min.js"></script>
<script type="text/javascript" src="assets/js/bootstrap.min.js"></script>
<script type="text/javascript">
var currentTaskId = -1;
$('#myModal').on('show.bs.modal', function (event) {
var triggerElement = $(event.relatedTarget); // Element that triggered the modal
var modal = $(this);
if (triggerElement.attr("id") == 'newTask') {
modal.find('.modal-title').text('New Task');
$('#deleteTask').hide();
currentTaskId = -1;
} else {
modal.find('.modal-title').text('Task details');
$('#deleteTask').show();
currentTaskId = triggerElement.attr("id");
console.log('Task ID: '+triggerElement.attr("id"));
}
});

$('#saveTask').click(function() {
//Assignment: Implement this functionality
alert('You clicked save! Now implement this functionality.');
$('#myModal').modal('hide');
//alert('Save... Id:'+currentTaskId);

var taskName = $("#InputTaskName").val();
var taskDescription = $("#InputTaskDescription").val();

var data = {task_id:currentTaskId, task_name:taskName, task_description:taskDescription, action:'save'};


$.post('update_task.php', data, function (feedback) {
var message = feedback.message;
var messageClass = 'alert alert-danger';
if (feedback.success) {
messageClass = 'alert alert-success';
updateTaskList();
}

var messageBox = $('<div id="feedback-message" class="' + messageClass + '">' + message + '</div>');

$(".modal-body form").prepend(messageBox);
setTimeout(function() {
$("#feedback-message").remove();
$("#InputTaskName").val('');
$("#InputTaskDescription").val('');
$('#myModal').modal('hide');
}, 3000);

}, 'json');

});

$('#deleteTask').click(function() {
//Assignment: Implement this functionality
alert('You clicked delete! Now implement this functionality.');
$('#myModal').modal('hide');
//alert('Delete... Id:'+currentTaskId);

var data = {task_id:currentTaskId, action:'delete'};

$.post('update_task.php', data, function (feedback) {

var message = feedback.message;
var messageClass = 'alert alert-danger';
if (feedback.success) {
messageClass = 'alert alert-success';
updateTaskList();
}

var messageBox = $('<div id="feedback-message" class="' + messageClass + '">' + message + '</div>');

$(".modal-body form").prepend(messageBox);
setTimeout(function() {
$("#feedback-message").remove();
$('#myModal').modal('hide');
}, 3000);

}, 'json');

});

function updateTaskList() {
$.post("list_tasks.php", function( data ) {
$( "#TaskList" ).html( data );
});
}

updateTaskList();
</script>
</html>
105 changes: 93 additions & 12 deletions task.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,114 @@ class Task {
public $TaskId;
public $TaskName;
public $TaskDescription;
protected $TaskDataSource;

public function __construct($Id = null) {
if ($Id) {
// This is an existing task
$this->LoadFromId($Id);
} else {
// This is a new task
$this->TaskDataSource = file_get_contents('Task_Data.txt');
if (strlen($this->TaskDataSource) > 0)
$this->TaskDataSource = json_decode($this->TaskDataSource, true); // Should decode to an array of Task objects
else
$this->TaskDataSource = array(); // If it does not, then the data source is assumed to be empty and we create an empty array

if (!$this->TaskDataSource)
$this->TaskDataSource = array(); // If it does not, then the data source is assumed to be empty and we create an empty array
if (!$this->LoadFromId($Id))
$this->Create();
}
}

protected function Create() {
// This function needs to generate a new unique ID for the task
// Assignment: Generate unique id for the new task
$this->TaskName = '';
$this->TaskDescription = '';
$this->TaskId = $this->getUniqueId();
$this->TaskName = 'New Task';
$this->TaskDescription = 'New Description';
}

protected function getUniqueId() {
// Assignment: Code to get new unique ID
//unique id code taken from http://php.net/manual/en/function.uniqid.php (44 )by hackan at gmail dot com
if (!empty($this->TaskDataSource)) {
// Assignment: Code to get new unique ID
// uniqid gives 13 chars, but you could adjust it to your needs.
$length = 0;
if (function_exists("random_bytes")) {
$bytes = random_bytes(ceil($length / 2));
} elseif (function_exists("openssl_random_pseudo_bytes")) {
$bytes = openssl_random_pseudo_bytes(ceil($length / 2));
} else {
throw new Exception("no cryptographically secure random function available");
}
return substr(bin2hex($bytes), 0, $length);
}
return -1; // Placeholder return for now
}

protected function LoadFromId($Id = null) {
if ($Id) {
// Assignment: Code to load details here...
} else
return null;
$Id = (int) $Id;
if ($Id && !empty($this->TaskDataSource)) {
foreach($this->TaskDataSource as $dataSource) {
if ($Id == $dataSource['TaskId']) {
$this->TaskId = $dataSource['TaskId'];
$this->TaskName = $dataSource['TaskName'];
$this->TaskDescription = $dataSource['TaskDescription'];

return true;
}
}
}

return null;
}

public function Save() {
//Assignment: Code to save task here
$display_message = ['message' => 'Nothing was found', 'success' => false];
if (isset($_POST)) {

$this->TaskId = filter_input(INPUT_POST, 'task_id', FILTER_SANITIZE_NUMBER_INT);
$this->TaskName = filter_input(INPUT_POST, 'task_name', FILTER_SANITIZE_STRING);
$this->TaskDescription = filter_input(INPUT_POST, 'task_description', FILTER_SANITIZE_STRING);
$updated = false;

if ($this->TaskId > 0 && !empty($this->TaskDataSource)) {
foreach ($this->TaskDataSource as $key=>$dataSource) {
if ($this->TaskId == $dataSource['TaskId']) {
$this->TaskDataSource[$key] = ['TaskId'=>$this->TaskId, 'TaskName' =>$this->TaskName, 'TaskDescription' => $this->TaskDescription];
$updated = true;
$display_message = ['message' => 'Task has been successfully updated', 'success' => true];
break;
}
}
}

if (!$updated) {
$this->TaskId = $this->getUniqueId();
$this->TaskDataSource[] = ['TaskId'=>$this->TaskId, 'TaskName' =>$this->TaskName, 'TaskDescription' => $this->TaskDescription];
$display_message = ['message' => 'Task has been successfully added', 'success' => true];
}

file_put_contents('Task_Data.txt', json_encode($this->TaskDataSource));
}
echo json_encode($display_message);
exit();
}

public function Delete() {
//Assignment: Code to delete task here
$display_message = ['message' => 'Entered task not found', 'success' => false, 'task Id'=>$this->TaskId];
if (!is_null($this->TaskId) && $this->TaskId > 0) {
foreach ($this->TaskDataSource as $key=>$dataSource) {
if ($this->TaskId == $dataSource['TaskId']) {
unset($this->TaskDataSource[$key]);
file_put_contents('Task_Data.txt', json_encode($this->TaskDataSource));
$display_message = ['message' => 'Tasks successfully deleted', 'success' => true];
}
}
}

echo json_encode($display_message);
exit;

}
}
?>
20 changes: 19 additions & 1 deletion update_task.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,24 @@
/**
* This script is to be used to receive a POST with the object information and then either updates, creates or deletes the task object
*/
require('Task.class.php');
require_once('task.class.php');
// Assignment: Implement this script

if (isset($_POST) ) {
$action = filter_input(INPUT_POST, 'action', FILTER_SANITIZE_STRING);
$taskId = filter_input(INPUT_POST, 'task_id', FILTER_SANITIZE_NUMBER_INT);

$taskClass = new Task($taskId);

if ($action == 'save') {
$taskClass->Save();
}

if ($action == 'delete') {
$taskClass->Delete();
}
}

echo json_encode(['message' => 'You either tried accessing this directly or submitted an invalid action. Please trying saving the form again', 'success'=>false]);
exit;
?>