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 .= '
'. t('Show tasks:'). ' '. '
'; 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); } ?>