array(
'name' => t('SKO Task'),
'module' => 'sko_taskmanagement',
'description' => t('Add a new task or project.'),
),
);
}
}
/**
* Implementation of hook_perm().
*/
function sko_taskmanagement_perm() {
return array('view sko tasks', 'create sko tasks', 'edit own sko tasks', 'edit sko tasks');
}
/**
* Implementation of hook_access().
*/
function sko_taskmanagement_access($op, $node) {
global $user;
//If manager return true, manager has full control over the task
if($user->uid == $node->manager && $user->uid != 0) return true;
if($op == 'create') {
if(user_access('create sko tasks')) return true;
}
if($op == 'update' || $op == 'delete') {
if(user_access('edit sko tasks') || (user_access('edit own sko tasks') && ($user->uid == $node->uid)))
return true;
}
if($op == 'view') {
if(user_access('view sko tasks')) return true;
}
return false;
}
/**
* Implementation of hook_block().
*/
function sko_taskmanagement_block($op = "list", $delta = 0) {
if($op == "list") {
$block[0]["info"] = t("SKO Taskmanagement");
return $block;
} else if(($op == "view") && (user_access('view sko tasks'))) {
global $user;
$limitnum = variable_get("sko_taskmanagement_maxdisp", 3);
$result = db_query("SELECT u.nid FROM {sko_taskmanagement_users} AS u ".
"INNER JOIN {sko_taskmanagement_tasks} AS t ON u.nid = t.nid ".
"WHERE t.status != 'finished' AND u.uid = '%d' ORDER BY deadline_ts ASC LIMIT 0, %d", $user->uid, $limitnum);
if(db_num_rows($result)) {
$content = '
';
// add a more link to our page that displays all your tasks
$content .= "".
l(t("All your tasks"), "sko_taskmanagement_your_tasks", array("title" => t("Display all your tasks."))).
"
";
} else {
$content = "".t('You don\'t have any tasks')."";
}
// add a more link to our page that displays all the tasks
$content .= "".
l(t("All tasks"), "sko_taskmanagement_all_tasks", array("title" => t("Display all the tasks."))).
"
";
$block["subject"] = t("Your tasks");
$block["content"] = $content;
return $block;
}
}
/**
* Implementation of hook_menu().
*/
function sko_taskmanagement_menu($may_cache) {
$items = array();
if($may_cache) {
/* $items[] = array(
'path' => 'node/add/sko_task',
'title' => t('SKO Task'),
'access' => user_access('create sko tasks')
); */
/* $items[] = array(
'path' => 'sko_tasks',
'title' => t('Tasks'),
'callback' => 'sko_tasks_main',
'access' => user_access('view sko tasks'),
'type' => MENU_CALLBACK
); */
$items[] = array(
'path' => 'sko_taskmanagement_your_tasks',
'title' => t('Taskmanagement - All your tasks'),
'callback' => 'sko_taskmanagement_show_tasks',
'callback arguments' => array('your'),
'access' => user_access('view sko tasks'),
'type' => MENU_CALLBACK
);
$items[] = array(
'path' => 'sko_taskmanagement_all_tasks',
'title' => t('Taskmanagement - All tasks'),
'callback' => 'sko_taskmanagement_show_tasks',
'callback arguments' => array('all'),
'access' => user_access('view sko tasks'),
'type' => MENU_CALLBACK
);
$items[] = array(
'path' => 'admin/settings/sko_taskmanagement',
'title' => t('SKO Tasks module settings'),
'description' => t('Set the max number of tasks displayed in the block'),
'callback' => 'drupal_get_form',
'callback arguments' => 'sko_taskmanagement_admin',
'access' => user_access('access administration pages'),
'type' => MENU_NORMAL_ITEM
);
}
return $items;
}
/**
* Implementation of hook_form().
*/
function sko_taskmanagement_form(&$node) {
drupal_add_css(drupal_get_path('module', 'sko_taskmanagement').'/sko_taskmanagement.css');
$editMode = isset($node->parent);
$bc = drupal_get_breadcrumb();
$bc[] = l(t('SKO taskmanagement'), 'sko_taskmanagement_all_tasks');
drupal_set_breadcrumb($bc);
//A project is an übertask (a task without parents)
if($node->parent != 0 || !$editMode) {
$tasks = _sko_taskmanagement_task_tree();
if(count($tasks)) {
$form['parent'] = array(
'#type' => 'select',
'#title' => t('Parent task / project'),
'#default_value' => $node->parent,
'#weight' => -10,
'#options' => array(t("New project") => array(t("New project")), t("Existing project or subtask") => $tasks)
);
}
}
//Task name
$form['title'] = array(
'#type' => 'textfield',
'#title' => t('Task name'),
'#required' => true,
'#default_value' => $node->title
);
//Task description
$form['body'] = array(
'#type' => 'textarea',
'#title' => t('Description'),
'#default_value' => $node->body,
'#rows' => 8
);
$form['format'] = filter_form($node->format);
//Fetch users for manager and user selection
$result = db_query("SELECT uid, name, status, created, access FROM {users} WHERE uid != 0 ORDER BY name");
$task_managers = array();
$task_users = array();
$task_managers[0] = t('-no task manager-');
while($account = db_fetch_object($result)) {
$task_managers[$account->uid] = $account->name;
$task_users[$account->uid] = $account->name;
}
//Task manager
$form['manager'] = array(
'#type' => 'select',
'#title' => t('Task manager'),
'#default_value' => $node->manager,
'#options' => $task_managers
);
//Users
$form['assign_to'] = array(
'#type' => 'select',
'#title' => t('Assign to (use ctrl to select multiple)'),
'#default_value' => $node->assign_to,
'#options' => $task_users,
'#multiple' => true,
'#size' => 12
);
//Status
$form['task_status'] = array(
'#type' => 'select',
'#title' => t('Status'),
'#default_value' => $node->status,
'#options' => array('open' => 'open', 'in-progress' => 'in-progress', /*'pending-other-task' => 'pending-other-task',*/ 'finished' => 'finished')
);
//Progress
$form['progress'] = array(
'#type' => 'select',
'#title' => t('Progress'),
'#default_value' => $node->progress,
'#options' => array('0%', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%')
);
//Deadline
$form['deadline'] = array(
'#type' => 'date',
'#title' => t('Deadline'),
'#default_value' => $node->deadline
);
return $form;
}
/**
* Implementation of hook_insert().
*/
function sko_taskmanagement_insert($node) {
//Insert into sko tasks table
db_query("INSERT INTO {sko_taskmanagement_tasks} (nid, manager, status, progress, parent, deadline_ts) ".
"VALUES ('%d', '%d', '%s', '%d', '%d', '%d')", $node->nid, $node->manager, $node->task_status, $node->progress, $node->parent, strtotime($node->deadline["year"]."-".$node->deadline["month"]."-".$node->deadline["day"]));
//Insert task users into sko users table
if(!empty($node->assign_to)) {
$query = "INSERT INTO {sko_taskmanagement_users} (nid, uid) VALUES ";
foreach($node->assign_to as $user) $query .= " (".$node->nid.", ".$user."),";
$query = substr($query, 0, -1);
db_query($query);
}
//Insert dependencies into sko dependence table
//to do
}
/**
* Implementation of hook_update().
*/
function sko_taskmanagement_update($node) {
//Update sko tasks record
db_query("UPDATE {sko_taskmanagement_tasks} SET manager = '%d', `status` = '%s', progress = '%d', parent = '%d', deadline_ts = '%d' WHERE nid = '%d'",
$node->manager, $node->task_status, $node->progress, $node->parent, strtotime($node->deadline["year"]."-".$node->deadline["month"]."-".$node->deadline["day"]), $node->nid);
//Update sko users record(s) by deleting and readding
db_query("DELETE FROM `sko_taskmanagement_users` WHERE nid = '%d'", $node->nid);
if(!empty($node->assign_to)) {
$query = "INSERT INTO `sko_taskmanagement_users` (nid, uid) VALUES ";
foreach($node->assign_to as $user) $query .= " (".$node->nid.", ".$user."),";
$query = substr($query, 0, -1);
db_query($query);
}
//Update sko dependencies record(s)
//to do
}
/**
* Implementation of hook_delete().
*/
function sko_taskmanagement_delete($node) {
db_query("DELETE FROM {sko_taskmanagement_tasks} WHERE nid = '%d'", $node->nid);
db_query("DELETE FROM {sko_taskmanagement_users} WHERE nid = '%d'", $node->nid);
db_query("DELETE FROM {sko_taskmanagement_dependence} WHERE nid = '%d'", $node->nid);
_sko_taskmanagement_delete_children($node->nid);
}
/**
* Implementation of hook_load().
*/
function sko_taskmanagement_load($node) {
$additions = db_fetch_object(db_query("SELECT t.*, u.name AS manager_name FROM {sko_taskmanagement_tasks} AS t ".
"LEFT JOIN {users} AS u ON u.uid = t.manager ".
"WHERE nid = '%d'", $node->nid));
$additions->deadline["month"] = date("m", $additions->deadline_ts);
$additions->deadline["day"] = date("d", $additions->deadline_ts);
$additions->deadline["year"] = date("Y", $additions->deadline_ts);
$additions->assign_to = array();
$additions->assign_to_names = array();
$result = db_query("SELECT tu.*, u.name FROM {sko_taskmanagement_users} AS tu ".
"LEFT JOIN {users} AS u ON u.uid = tu.uid ".
"WHERE nid = '%d'", $node->nid);
if(db_affected_rows()) {
while($user = db_fetch_object($result)) {
$additions->assign_to[] = $user->uid;
$additions->assign_to_names[] = $user->name;
}
}
return $additions;
}
/**
* Implementation of hook_view().
*/
function sko_taskmanagement_view(&$node, $teaser = false, $page = false) {
if($page) {
global $user;
drupal_add_css(drupal_get_path('module', 'sko_taskmanagement').'/sko_taskmanagement.css');
$bc = drupal_get_breadcrumb();
$bc[] = l(t('SKO taskmanagement'), 'sko_taskmanagement_all_tasks');
drupal_set_breadcrumb($bc);
$node = node_prepare($node, $teaser);
//If user enrolled display message
if($_POST["sko_taskmanagement_enroll"]) {
//First check post if user is enrolling
if($_POST["sko_taskmanagement_enroll"]) _sko_taskmanagement_enroll($_POST["sko_taskmanagement_enroll"], $node->nid);
$node->content['enroll_info'] = array(
'#value' => ''.t('You are enrolled in this task').'
',
'#weight' => -6,
);
//Add user in array
if(!in_array($user->uid, $node->assign_to)) {
$node->assign_to[] = $user->uid;
$node->assign_to_names[] = $user->name;
}
}
//Parent tasks
$parents = array_reverse(_sko_taskmanagement_parents($node->parent));
if(!empty($parents)) {
for($i = 0; $i < sizeof($parents); $i++) {
$parents[$i] = l($parents[$i]->title, 'node/'.$parents[$i]->nid);
}
//Task detail table row
$rows[] = array(
'data' => array(
array('data' => sizeof($parents) == 1 ? t('Parent project') : t('Parent tasks')),
array('data' => join(" » ", $parents))
)
);
}
//Task detail table rows
$rows[] = array(
'data' => array(
array('data' => t('Status'), 'style' => 'width: 20%'),
array('data' => t($node->status))
)
);
$rows[] = array(
'data' => array(
array('data' => t('Progress')),
array('data' => ''.
($node->progress*10).'%', 'style' => 'width: 100px;')
)
);
$rows[] = array(
'data' => array(
array('data' => sizeof($parents) == 0 ? t('Project manager') : t('Task manager')),
array('data' => $node->manager ? l($node->manager_name, 'user/'.$node->manager) : ''.t('No manager assigned to this task').'')
)
);
$rows[] = array(
'data' => array(
array('data' => t('Deadline')),
array('data' => preg_replace("/\-.*/", "", format_date($node->deadline_ts, 'small')))
)
);
$users = array();
for($i = 0; $i < sizeof($node->assign_to); $i++) $users[] = l($node->assign_to_names[$i], 'user/'.$node->assign_to[$i]);
$rows[] = array(
'data' => array(
array('data' => t('Enrolled users')),
array('data' => ($node->status == 'open' && $user->uid && !in_array($user->uid, $node->assign_to) ? '' : '').
($users ? join(', ', $users) : ''.t('No users assigned to this task').''))
)
);
//Add detail table
$node->content['sko_task_detail_table'] = array(
'#value' => theme('table', $header, $rows, array('id' => 'task-list')),
'#weight' => -2,
);
//Get subtasks
$result = db_query("SELECT n.nid, u.name AS manager_name, u.data FROM {node} AS n ".
"INNER JOIN {sko_taskmanagement_tasks} AS t ON t.nid = n.nid ".
"LEFT JOIN {users} AS u ON u.uid = t.manager ".
"WHERE t.parent = '%d'", $node->nid);
if(db_num_rows($result)) {
//Table header
$header = array(t('Task'), t('Status'), t('Progress'), t('Task manager'), t('Deadline'));
//Table data
$rows = array();
while($task = db_fetch_object($result)) {
$task_expand = node_load(array('nid' => $task->nid));
$rows[] = array(
'data' => array(
array('data' => l($task_expand->title, "node/$task->nid", array('name' => 'task'.$task->nid))),
array('data' => t($task_expand->status)),
array('data' => ''.
($task_expand->progress*10).'%', 'style' => 'width: 100px;'),
array('data' => $task->manager_name ? l($task->manager_name, 'user/'.$task_expand->manager) : '-'),
array('data' => preg_replace("/\-.*/", "", format_date($task_expand->deadline_ts, 'small'))),
)
);
}
//Subtask header
$node->content['subtask_header'] = array(
'#value' => ''.t('Subtasks').'
',
'#weight' => 1,
);
//Add table
$node->content['sko_subtask_table'] = array(
'#value' => theme('table', $header, $rows, array('id' => 'task-list')),
'#weight' => 2,
);
} else {
//No subtasks + header
$node->content['subtask_header'] = array(
'#value' => ''.t('Subtasks').'
'.t('This task has no subtasks').'
',
'#weight' => 2,
);
}
} else { //Frontpage
//Parent tasks
$parents = array_reverse(_sko_taskmanagement_parents($node->parent));
if(!empty($parents)) {
for($i = 0; $i < sizeof($parents); $i++) {
$parents[$i] = l($parents[$i]->title, 'node/'.$parents[$i]->nid);
}
$node->content['subtask_header'] = array(
'#value' => ''.(sizeof($parents) == 1 ? t('Parent project') : t('Parent tasks')).': '.join(" » ", $parents)."",
'#weight' => -1,
);
}
$node->title = '['.(sizeof($parents) != 0 ? t('Task') : t('Project')).'] '.$node->title;
$node = node_prepare($node, $teaser);
}
return $node;
}
/**
* Private functions
* Function returns an array with all tasks in a tree order. Works recursively
*/
function _sko_taskmanagement_task_tree($array = array(), $level = 0, $nid = 0) {
$result = db_query("SELECT n.title, t.parent, t.nid, COUNT(t2.parent) AS count FROM {node} AS n ".
"INNER JOIN {sko_taskmanagement_tasks} AS t ON n.nid = t.nid ".
"LEFT JOIN {sko_taskmanagement_tasks} AS t2 ON t2.parent = t.nid ".
"WHERE n.type = 'sko_task' AND t.status != 'finished' AND t.parent = '%d' ".
"GROUP BY t.nid", $nid);
while($task = db_fetch_object($result)) {
//$array[$task->nid] .= $task->parent != 0 ? "| " : "";
for($i = 0; $level > $i; $i++) $array[$task->nid] .= "--";
$array[$task->nid] .= $task->title;
if($task->count != 0)
$array = _sko_taskmanagement_task_tree($array, $level + 1, $task->nid);
//$array["Subtasks"] = _sko_taskmanagement_task_tree(array(), $level + 1, $task->nid);
}
return $array;
}
/**
* Function to fetch all parent tasks
*/
function _sko_taskmanagement_parents($nid) {
$array = array();
$row->parent = $nid;
while($row->parent != 0) {
$result = db_query("SELECT n.title, t.parent, t.nid FROM {node} AS n ".
"INNER JOIN {sko_taskmanagement_tasks} AS t ON n.nid = t.nid ".
"WHERE n.type = 'sko_task' AND t.nid = '%d' ", $row->parent);
$array[] = $row = db_fetch_object($result);
}
return $array;
}
/**
* Function for enrolling the user into a task
*/
function _sko_taskmanagement_enroll($uid, $nid) {
db_query("INSERT INTO `sko_taskmanagement_users` (nid, uid) VALUES ('%d', '%d') ON DUPLICATE KEY UPDATE nid = '%d' ", $nid, $uid, $nid);
}
/**
* Delete all subtasks for the task being deleted
*/
function _sko_taskmanagement_delete_children($nid) {
$result = db_query("SELECT nid FROM {sko_taskmanagement_tasks} WHERE parent = '%d'", $nid);
while($task = db_fetch_object($result)) {
db_query("DELETE FROM {node} WHERE nid = '%d'", $task->nid);
db_query("DELETE FROM {sko_taskmanagement_tasks} WHERE nid = '%d'", $task->nid);
db_query("DELETE FROM {sko_taskmanagement_users} WHERE nid = '%d'", $task->nid);
//db_query("DELETE FROM {sko_taskmanagement_dependence} WHERE nid = '%d'", $task->nid);
_sko_taskmanagement_delete_children($task->nid);
}
}
/**
*
*/
function sko_taskmanagement_show_tasks($type) {
drupal_add_css(drupal_get_path('module', 'sko_taskmanagement').'/sko_taskmanagement.css');
$bc = drupal_get_breadcrumb();
$bc[] = l(t('SKO taskmanagement'), 'sko_taskmanagement_all_tasks');
drupal_set_breadcrumb($bc);
global $user;
$content .= '';
if($type == 'your') {
if((!isset($_POST["sko_taskmanagement_filter"])) || ($_POST["sko_taskmanagement_filter"] == t('open and in-progress'))) {
$result = db_query("SELECT DISTINCT u.nid, t.deadline_ts, t.status, t.progress, n.title, m.name AS manager_name FROM {sko_taskmanagement_users} AS u ".
"INNER JOIN {sko_taskmanagement_tasks} AS t ON u.nid = t.nid INNER JOIN {node} AS n on u.nid = n.nid ".
"LEFT JOIN {users} AS m ON m.uid = t.manager ".
"WHERE (u.uid = '%d' OR m.uid = '%d') AND (t.status = 'open' OR t.status = 'in-progress') ORDER BY deadline_ts ASC", $user->uid, $user->uid);
} else {
$result = db_query("SELECT DISTINCT u.nid, t.deadline_ts, t.status, t.progress, n.title, m.name AS manager_name FROM {sko_taskmanagement_users} AS u ".
"INNER JOIN {sko_taskmanagement_tasks} AS t ON u.nid = t.nid INNER JOIN {node} AS n on u.nid = n.nid ".
"LEFT JOIN {users} AS m ON m.uid = t.manager ".
"WHERE (u.uid = '%d' OR m.uid = '%d') AND t.status = '%s' ORDER BY deadline_ts ASC", $user->uid, $user->uid, $_POST["sko_taskmanagement_filter"]);
}
} elseif($type == 'all') {
if((!isset($_POST["sko_taskmanagement_filter"])) || ($_POST["sko_taskmanagement_filter"] == t('open and in-progress'))) {
$result = db_query("SELECT DISTINCT u.nid, t.deadline_ts, t.status, t.progress, n.title, m.name AS manager_name FROM {sko_taskmanagement_users} AS u ".
"INNER JOIN {sko_taskmanagement_tasks} AS t ON u.nid = t.nid INNER JOIN {node} AS n on u.nid = n.nid ".
"LEFT JOIN {users} AS m ON m.uid = t.manager ".
"WHERE t.status = 'open' OR t.status = 'in-progress' ORDER BY deadline_ts ASC");
} else {
$result = db_query("SELECT DISTINCT u.nid, t.deadline_ts, t.status, t.progress, n.title, m.name AS manager_name FROM {sko_taskmanagement_users} AS u ".
"INNER JOIN {sko_taskmanagement_tasks} AS t ON u.nid = t.nid INNER JOIN {node} AS n on u.nid = n.nid ".
"LEFT JOIN {users} AS m ON m.uid = t.manager ".
"WHERE t.status = '%s' ORDER BY deadline_ts ASC", $_POST["sko_taskmanagement_filter"]);
}
}
if(db_num_rows($result)) {
//Table data
$rows = array();
//Table header
$header = array(t('Task'), t('Status'), t('Progress'), t('Task manager'), t('Deadline'));
while($task = db_fetch_object($result)) {
$task_expand = node_load(array('nid' => $task->nid));
$rows[] = array(
'data' => array(
array('data' => l($task_expand->title, "node/$task->nid", array('name' => 'task'.$task->nid))),
array('data' => t($task_expand->status)),
array('data' => ''.
($task_expand->progress*10).'%', 'style' => 'width: 100px;'),
array('data' => $task->manager_name ? l($task->manager_name, 'user/'.$task_expand->manager) : '-'),
array('data' => preg_replace("/\-.*/", "", format_date($task_expand->deadline_ts, 'small'))),
)
);
}
//Add table
$content .= theme('table', $header, $rows, array('id' => 'task-list'));
} else {
if(!isset($_POST["sko_taskmanagement_filter"]))
$content .= "".t('There are no tasks with the status open or in-progress')."";
else
$content .= "".t('There are no tasks with the status ')." ".t($_POST["sko_taskmanagement_filter"])."";
}
return $content;
}
/**
*
*/
function sko_taskmanagement_admin() {
$form['sko_taskmanagement_maxdisp'] = array(
'#type' => 'textfield',
'#title' => t('Maximum number of links'),
'#default_value' => variable_get('sko_taskmanagement_maxdisp', 3),
'#size' => 2,
'#maxlength' => 2,
'#description' => t("The maximum number of links to display in the block.")
);
return system_settings_form($form);
}
?>