diff options
Diffstat (limited to 'mod/tasks/start.php')
| -rw-r--r-- | mod/tasks/start.php | 433 | 
1 files changed, 433 insertions, 0 deletions
diff --git a/mod/tasks/start.php b/mod/tasks/start.php new file mode 100644 index 000000000..822aa787f --- /dev/null +++ b/mod/tasks/start.php @@ -0,0 +1,433 @@ +<?php +/** + * Elgg Tasks Management + * + * @package ElggTasks + */ + +elgg_register_event_handler('init', 'system', 'tasks_init'); + +/** + * Initialize the tasks management plugin. + * + */ +function tasks_init() { + +	// register a library of helper functions +	elgg_register_library('elgg:tasks', elgg_get_plugins_path() . 'tasks/lib/tasks.php'); + +	$item = new ElggMenuItem('tasks', elgg_echo('tasks'), 'tasks/all'); +	elgg_register_menu_item('site', $item); + +	// Register a page handler, so we can have nice URLs +	elgg_register_page_handler('tasks', 'tasks_page_handler'); + +	// Register a url handler +	elgg_register_entity_url_handler('object', 'task', 'tasks_url'); + +	// Register some actions +	$action_base = elgg_get_plugins_path() . 'tasks/actions/tasks'; +	elgg_register_action("tasks/edit", "$action_base/edit.php"); +	elgg_register_action("tasks/delete", "$action_base/delete.php"); +	elgg_register_action("tasks/comments/add", "$action_base/comments/add.php"); +	// Extend the main css and js views +	elgg_extend_view('css/elgg', 'tasks/css'); +	elgg_extend_view('js/elgg', 'tasks/js'); +	 +	// register the blog's JavaScript +	elgg_register_simplecache_view('js/tasks/tasklists'); +	elgg_register_js('elgg.tasks', elgg_get_simplecache_url('js', 'tasks/tasklists')); +	 +	elgg_register_ajax_view('object/task'); +	elgg_register_ajax_view('tasks/tasklist_graph'); + +	// Register entity type for search +	elgg_register_entity_type('object', 'task'); +	 +	// Register a different form for annotations +	elgg_register_plugin_hook_handler('comments', 'object', 'tasks_comments_hook'); + +	// Register granular notification for this type +	register_notification_object('object', 'task', elgg_echo('tasks:new')); +	elgg_register_plugin_hook_handler('notify:entity:message', 'object', 'tasks_notify_message'); + +	// add to groups +	add_group_tool_option('tasks', elgg_echo('groups:enabletasks'), true); +	elgg_extend_view('groups/tool_latest', 'tasks/group_module'); + +	//add a widget +	elgg_register_widget_type('tasks', elgg_echo('tasks:active'), elgg_echo('tasks:widget:description')); + +	// Language short codes must be of the form "tasks:key" +	// where key is the array key below +	elgg_set_config('tasks', array( +		'title' => 'text', +		'description' => 'longtext', +		'list_guid' => 'tasks/list', +		'enddate' => 'date', +		'priority' => 'tasks/priority', +		'tags' => 'tags', +		'access_id' => 'access', +	)); +	 +	elgg_register_plugin_hook_handler('register', 'menu:owner_block', 'tasks_owner_block_menu'); + +	elgg_register_event_handler('pagesetup', 'system', 'tasks_pagesetup'); + +	// write permission plugin hooks +	elgg_register_plugin_hook_handler('permissions_check', 'object', 'tasks_write_permission_check'); +	elgg_register_plugin_hook_handler('container_permissions_check', 'object', 'tasks_container_permission_check'); +	 +	// icon url override +	elgg_register_plugin_hook_handler('entity:icon:url', 'object', 'tasks_icon_url_override'); + +	// entity menu +	elgg_register_plugin_hook_handler('register', 'menu:entity', 'tasks_entity_menu_setup'); + +	// register ecml views to parse +	elgg_register_plugin_hook_handler('get_views', 'ecml', 'tasks_ecml_views_hook'); +	 +	elgg_register_plugin_hook_handler('format', 'friendly:time', 'tasks_get_friendly_time'); +        elgg_register_event_handler('upgrade', 'system', 'tasks_run_upgrades'); +} + +function tasks_run_upgrades($event, $type, $details) { +        if (include_once(elgg_get_plugins_path() . 'upgrade-tools/lib/upgrade_tools.php')) { +        	upgrade_module_run('tasks'); +	} +} + + +/** + * Dispatcher for tasks. + * URLs take the form of + *  All tasks:        tasks/all + *  User's tasks:     tasks/owner/<username> + *  Friends' tasks:   tasks/friends/<username> + *  View task:        tasks/view/<guid>/<title> + *  New task:         tasks/add/<guid> (container: user, group; list: tasklist) + *  Edit task:        tasks/edit/<guid> + *  Group tasks:      tasks/group/<guid>/all + * + * Title is ignored + * + * @param array $page + */ +function tasks_page_handler($page) { + +	elgg_load_library('elgg:tasks'); + +	if (!isset($page[0])) { +		$page[0] = 'all'; +	} + +	elgg_push_breadcrumb(elgg_echo('tasks'), 'tasks/all'); + +	$base_dir = elgg_get_plugins_path() . 'tasks/pages/tasks'; + +	$page_type = $page[0]; +	switch ($page_type) { +		case 'owner': +			include "$base_dir/owner.php"; +			break; +		case 'friends': +			include "$base_dir/friends.php"; +			break; +		case 'view': +			set_input('guid', $page[1]); +			include "$base_dir/view.php"; +			break; +		case 'add': +			set_input('guid', $page[1]); +			include "$base_dir/new_task.php"; +			break; +		case 'edit': +			set_input('guid', $page[1]); +			include "$base_dir/edit_task.php"; +			break; +		case 'group': +			include "$base_dir/owner.php"; +			break; +		case 'all': +		default: +			include "$base_dir/world.php"; +			break; +	} + +	return; +} + +/** + * Override the task url + *  + * @param ElggObject $entity task object + * @return string + */ +function tasks_url($entity) { +	$title = elgg_get_friendly_title($entity->title); +	return "tasks/view/$entity->guid/$title"; +} + +/** + * Extend permissions checking to extend can-edit for write users. + * + * @param unknown_type $hook + * @param unknown_type $entity_type + * @param unknown_type $returnvalue + * @param unknown_type $params + */ +function tasks_write_permission_check($hook, $entity_type, $returnvalue, $params) +{ +	$entity = $params['entity']; +	if ($entity->getSubtype() == 'task') { + +		$user = $params['user']; +		$container = $entity->getContainerEntity(); +		if (elgg_instanceof($container, 'group')) { +			return $container->canWriteToContainer($user->guid, 'object', $entity->getSubtype()); +		} +	} +} + +/** + * Extend container permissions checking to extend can_write_to_container for write users. + * + * @param unknown_type $hook + * @param unknown_type $entity_type + * @param unknown_type $returnvalue + * @param unknown_type $params + */ +/* +function tasks_container_permission_check($hook, $entity_type, $returnvalue, $params) { + +	if (elgg_get_context() == "tasks") { +		if (elgg_get_page_owner_guid()) { +			if (can_write_to_container(elgg_get_logged_in_user_guid(), elgg_get_page_owner_guid())) return true; +		} +		if ($page_guid = get_input('task_guid',0)) { +			$entity = get_entity($task_guid); +		} else if ($parent_guid = get_input('list_guid',0)) { +			$entity = get_entity($list_guid); +		} +		if ($entity instanceof ElggObject) { +			if ( +					can_write_to_container(elgg_get_logged_in_user_guid(), $entity->container_guid) +					|| in_array($entity->write_access_id,get_access_list()) +				) { +					return true; +			} +		} +	} + +} +*/ + +/** + * Override the default entity icon for tasks + * + * @return string Relative URL + */ +function tasks_icon_url_override($hook, $type, $returnvalue, $params) { +	$entity = $params['entity']; +	$size = $params['size']; +	if (elgg_instanceof($entity, 'object', 'task')) { +		$status = $entity->status; +		if($status == 'unassigned' || $status == 'reopened') { +			$status = 'new'; +		} +		if (in_array($size, array('tiny', 'small', 'medium', 'large')) && +			in_array($status, array('active', 'assigned', 'closed', 'done', 'new'))){ +			return "mod/tasks/graphics/task-icons/$status-$size.png"; +		} +	} +} + +/** + * Add a menu item to the user ownerblock + */ +function tasks_owner_block_menu($hook, $type, $return, $params) { +	if (elgg_instanceof($params['entity'], 'user')) { +		$url = "tasks/owner/{$params['entity']->username}"; +		$item = new ElggMenuItem('tasks', elgg_echo('tasks'), $url); +		$return[] = $item; +	} else { +		if ($params['entity']->tasks_enable != "no") { +			$url = "tasks/group/{$params['entity']->guid}/all"; +			$item = new ElggMenuItem('tasks', elgg_echo('tasks:group'), $url); +			$return[] = $item; +		} +	} + +	return $return; +} + +/** + * Tasks extra menu item + * + */ +function tasks_pagesetup() { +	if (elgg_is_logged_in()) { +		 +		$container = elgg_get_page_owner_entity(); +		if (!$container || !elgg_instanceof($container, 'group') || $container->tasks_enable != 'yes') { +			return; +		} +		 +		$address = urlencode(current_page_url()); +		 +		elgg_register_menu_item('extras', array( +			'name' => 'task', +			'text' => elgg_view_icon('checkmark'), +			'href' => "tasks/add/$container->guid?referer=$address", +			'title' => elgg_echo('tasks:this'), +			'rel' => 'nofollow', +		)); +	} +} + +/** + * Add links/info to entity menu particular to tasks plugin + */ +function tasks_entity_menu_setup($hook, $type, $return, $params) { +	if (elgg_in_context('widgets')) { +		return $return; +	} + +	$entity = $params['entity']; +	$handler = elgg_extract('handler', $params, false); +	if ($handler != 'tasks') { +		return $return; +	} + +	// remove delete if not owner or admin +	if (!elgg_is_admin_logged_in() && elgg_get_logged_in_user_guid() != $entity->getOwnerGuid()) { +		foreach ($return as $index => $item) { +			if ($item->getName() == 'delete') { +				unset($return[$index]); +				break; +			} +		} +	} +	 +	if ($entity->status == 'active') { +		$options = array( +			'name' => 'active', +			'text' => elgg_echo('tasks:active'), +			'href' => false, +			'priority' => 150, +		); +		$return[] = ElggMenuItem::factory($options); +	} +	 +	$priorities = array( +		'1' => 'low', +		'2' => 'normal', +		'3' => 'high', +	); +	 +	$priority = $priorities[$entity->priority]; +	 +	$options = array( +		'name' => 'priority', +		'text' => elgg_echo("tasks:priority:$priority"), +		'href' => false, +		'priority' => 150, +	); +	 +	$return[] = ElggMenuItem::factory($options); +	 +	return $return; +} + +function tasks_comments_hook($hook, $entity_type, $returnvalue, $params) { +	if($params['entity']->getSubtype() == 'task') { +		return elgg_view('tasks/page/elements/comments', $params); +	} +	return $returnvalue; +} + +/** +* Returns a more meaningful message +* +* @param unknown_type $hook +* @param unknown_type $entity_type +* @param unknown_type $returnvalue +* @param unknown_type $params +*/ +function tasks_notify_message($hook, $entity_type, $returnvalue, $params) { +	$entity = $params['entity']; +	if (elgg_instanceof($entity, 'object', 'task')) { +		$descr = $entity->description; +		$title = $entity->title; +		$owner = $entity->getOwnerEntity(); +		return $owner->name . ' ' . elgg_echo("tasks:via") . ': ' . $title . "\n\n" . $descr . "\n\n" . $entity->getURL(); +	} +	return null; +} + + + + +/** + * Return views to parse for tasks. + * + * @param unknown_type $hook + * @param unknown_type $entity_type + * @param unknown_type $return_value + * @param unknown_type $params + */ +function tasks_ecml_views_hook($hook, $entity_type, $return_value, $params) { +	$return_value['object/task'] = elgg_echo('item:object:task'); + +	return $return_value; +} + +function tasks_get_friendly_time($hook, $type, $return_value, $params) { +	$time = (int) $params['time']; +	if ($time > time()) { +		$diff = $time - time(); + +		$minute = 60; +		$hour = $minute * 60; +		$day = $hour * 24; + +		if ($diff < $minute) { +				return elgg_echo("friendlytime:justnow"); +		} else if ($diff < $hour) { +			$diff = round($diff / $minute); +			if ($diff == 0) { +				$diff = 1; +			} + +			if ($diff > 1) { +				return elgg_echo("friendlytime:future:minutes", array($diff)); +			} else { +				return elgg_echo("friendlytime:future:minutes:singular", array($diff)); +			} +		} else if ($diff < $day) { +			$diff = round($diff / $hour); +			if ($diff == 0) { +				$diff = 1; +			} + +			if ($diff > 1) { +				return elgg_echo("friendlytime:future:hours", array($diff)); +			} else { +				return elgg_echo("friendlytime:future:hours:singular", array($diff)); +			} +		} else { +			$diff = round($diff / $day); +			if ($diff == 0) { +				$diff = 1; +			} + +			if ($diff > 1) { +				return elgg_echo("friendlytime:future:days", array($diff)); +			} else { +				return elgg_echo("friendlytime:future:days:singular", array($diff)); +			} +		} +		$return_value = $time; +	} +	return $return_value; +}  | 
