diff options
Diffstat (limited to 'lib/tasks.php')
-rw-r--r-- | lib/tasks.php | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/lib/tasks.php b/lib/tasks.php new file mode 100644 index 000000000..190935102 --- /dev/null +++ b/lib/tasks.php @@ -0,0 +1,304 @@ +<?php + +/** + * Prepare the add/edit form variables + * + * @param ElggObject $tasklist + * @return array + */ +function tasklist_prepare_form_vars($tasklist = null, $list_guid = 0) { + + // input names => defaults + $values = array( + 'title' => '', + 'description' => '', + 'enddate' => '', + 'access_id' => ACCESS_DEFAULT, + 'write_access_id' => ACCESS_DEFAULT, + 'tags' => '', + 'container_guid' => elgg_get_page_owner_guid(), + 'guid' => null, + 'entity' => $tasklist, + 'list_guid' => $list_guid, + ); + + if ($tasklist) { + foreach (array_keys($values) as $field) { + if (isset($tasklist->$field)) { + $values[$field] = $tasklist->$field; + } + } + } + + if (elgg_is_sticky_form('tasklist')) { + $sticky_values = elgg_get_sticky_values('tasklist'); + foreach ($sticky_values as $key => $value) { + $values[$key] = $value; + } + } + + elgg_clear_sticky_form('tasklist'); + + return $values; +} + +/** + * Prepare the add/edit form variables + * + * @param ElggObject $task + * @return array + */ +function task_prepare_form_vars($task = null, $list_guid = 0) { + + // input names => defaults + $values = array( + 'title' => get_input('title', ''), + 'description' => '', + 'priority' => '', + 'access_id' => ACCESS_DEFAULT, + 'write_access_id' => ACCESS_DEFAULT, + 'tags' => '', + 'container_guid' => elgg_get_page_owner_guid(), + 'guid' => null, + 'entity' => $task, + 'list_guid' => $list_guid, + 'referer_guid' => get_input('referer_guid', ''), + ); + + if ($task) { + foreach (array_keys($values) as $field) { + if (isset($task->$field)) { + $values[$field] = $task->$field; + } + } + } + + if (elgg_is_sticky_form('task')) { + $sticky_values = elgg_get_sticky_values('task'); + foreach ($sticky_values as $key => $value) { + $values[$key] = $value; + } + } + + elgg_clear_sticky_form('task'); + + if ($referer = get_input('referer')) { + $link = elgg_view('output/url', array( + 'href' => $referer, + 'text' => elgg_echo('tasks:this:moreinfo:here'), + )); + $values['description'] .= "<p>" . elgg_echo('tasks:this:moreinfo', array($link)) . "</p>"; + } + + return $values; +} + + +function tasks_get_entities($options) { + $default = array( + 'type' => 'object', + 'subtype' => 'task', + ); + if (!isset($options['metadata_name_value_pairs']) || !is_array($options['metadata_name_value_pairs'])) { + $options['metadata_name_value_pairs'] = array(); + } + if (isset($options['list_guid'])) { + $options['metadata_name_value_pairs'][] = array( + 'name' => 'list_guid', + 'value' => $options['list_guid'], + ); + unset($options['parent_guid']); + } + if (isset($options['status'])) { + $options['metadata_name_value_pairs'][] = array( + 'name' => 'status', + 'value' => $options['status'], + ); + unset($options['status']); + } + + $options = array_merge($default, $options); + return elgg_get_entities_from_metadata($options); +} + +function tasks_get_actions_from_state($state){ + switch($state) { + + case 'new': + case 'unassigned': + case 'reopened': + $actions = array( + 'assign', + 'assign_and_activate', + 'mark_as_done', + 'close', + ); + break; + + case 'assigned': + $actions = array( + 'activate', + 'leave', + 'mark_as_done', + 'close', + ); + break; + + case 'active': + $actions = array( + 'deactivate', + 'leave', + 'mark_as_done', + 'close', + ); + break; + + case 'done': + case 'closed': + $actions = array( + 'reopen', + ); + break; + + } + + return $actions; +} + +function tasks_get_possible_actions($task, $user_guid = 0) { + + if(!$user_guid) { + $user_guid = elgg_get_logged_in_user_guid(); + } + + $is_doing = check_entity_relationship($user_guid, 'is_doing', $task->guid); + $subscribes = check_entity_relationship($user_guid, 'subscribes', $task->guid); + + if ($task->status == 'active' && $is_doing) { + $status = 'active'; + } elseif ($task->status == 'assigned' && $subscribes) { + $status = 'assigned'; + } elseif ($task->status == 'active' || $task->status == 'assigned') { + $status = 'unassigned'; + } else { + $status = $task->status; + } + + return tasks_get_actions_from_state($status); +} + +function tasks_prepare_radio_options($task) { + + $actions = tasks_get_possible_actions($task); + + $actions_labels = array( + elgg_echo("tasks:state:action:noaction", array($task->status)) => '', + ); + + foreach($actions as $action) { + $actions_labels[elgg_echo("tasks:state:action:$action")] = $action; + } + + return $actions_labels; +} + +function tasks_register_actions_menu($task) { + + foreach (tasks_get_possible_actions($task) as $action) { + $action_url = "action/tasks/comments/add?" . http_build_query(array( + 'entity_guid' => $task->guid, + 'state_action' => $action, + ), '', '&'); + $action_url = elgg_add_action_tokens_to_url($action_url); + $item = new ElggMenuItem($action, elgg_echo("tasks:state:action:$action"), $action_url); + elgg_register_menu_item('tasks_hover', $item); + } +} + +function tasks_reset_actions_menu() { + global $CONFIG; + if (isset($CONFIG->menus['tasks_hover'])) { + unset($CONFIG->menus['tasks_hover']); + } +} + +function tasks_get_state_from_action($action){ + $actions_states = array( + 'assign' => 'assigned', + 'leave' => 'unassigned', + 'activate' => 'active', + 'deactivate' => 'assigned', + 'assign_and_activate' => 'active', + 'mark_as_done' => 'done', + 'close' => 'closed', + 'reopen' => 'reopened', + ); + return $actions_states[$action]; +} + +function tasks_get_user_active_task ($user_guid) { + return array_shift(elgg_get_entities_from_metadata(array( + 'metadata_name' => 'status', + 'metadata_value' => 'active', + 'owner_guid' => $user_guid, + ))); +} + +/** + * Register the navigation menu + * + * @param ElggEntity $container Container entity for the tasks + */ +function tasks_register_navigation_tree($container) { + if (!$container) { + return; + } + + $tasklists_top = elgg_get_entities_from_metadata(array( + 'type' => 'object', + 'subtype' => 'task', + 'container_guid' => $container->getGUID(), + 'metadata_name' => 'list_guid', + 'metadata_value' => 0, + 'limit' => 0, + )); + + if (!$tasklists_top) { + return; + } + + foreach ($tasklists_top as $tasklist) { + elgg_register_menu_item('tasks_nav', array( + 'name' => $tasklist->getGUID(), + 'text' => $tasklist->title, + 'href' => $tasklist->getURL(), + )); + + $stack = array(); + array_push($stack, $tasklist); + while (count($stack) > 0) { + $list = array_pop($stack); + $tasklists = elgg_get_entities_from_metadata(array( + 'type' => 'object', + 'subtype' => 'task', + 'metadata_name' => 'list_guid', + 'metadata_value' => $list->guid, + 'container_guid' => $container->getGUID(), + 'limit' => 0, + )); + + if ($tasklists) { + foreach ($tasklists as $tasklist) { + elgg_register_menu_item('tasks_nav', array( + 'name' => $tasklist->getGUID(), + 'text' => $tasklist->title, + 'href' => $tasklist->getURL(), + 'parent_name' => $list->getGUID(), + )); + array_push($stack, $tasklist); + } + } + } + } +} + |