Index: trunk/extensions/Tasks/Tasks.php |
— | — | @@ -26,7 +26,6 @@ |
27 | 27 | ) TYPE=InnoDB; |
28 | 28 | |
29 | 29 | Known bugs: |
30 | | -* setPageTitle in page_management doesn't work for some reason |
31 | 30 | * Both the "article" and "tasks" tabs are displayed as active when viewing the "tasks" tab |
32 | 31 | * sidebar task list for Monobook only? |
33 | 32 | |
— | — | @@ -45,14 +44,18 @@ |
46 | 45 | $wgExtensionFunctions[] = 'wfTasksExtension' ; |
47 | 46 | |
48 | 47 | # Misc hooks |
| 48 | +$wgHooks['SkinTemplatePreventOtherActiveTabs'][] = 'wfTasksExtensionPreventOtherActiveTabs' ; |
49 | 49 | $wgHooks['SkinTemplateTabs'][] = 'wfTasksExtensionTab' ; |
50 | 50 | $wgHooks['UnknownAction'][] = 'wfTasksExtensionAction' ; |
51 | 51 | $wgHooks['ArticleSaveComplete'][] = 'wfTasksExtensionArticleSaveComplete' ; |
52 | 52 | $wgHooks['ArticleDeleteComplete'][] = 'wfTasksExtensionArticleDeleteComplete' ; |
53 | 53 | $wgHooks['SpecialMovepageAfterMove'][] = 'wfTasksExtensionAfterMove' ; |
54 | 54 | $wgHooks['MonoBookTemplateToolboxEnd'][] = 'wfTasksExtensionAfterToolbox' ; |
| 55 | +$wgHooks['ArticleViewHeader'][] = 'wfTaskExtensionHeaderHook' ; |
| 56 | +$wgHooks['EditPage::showEditForm:initial'][] = 'wfTaskExtensionEditFormInitialHook' ; |
55 | 57 | |
56 | 58 | |
| 59 | + |
57 | 60 | # BEGIN logging functions |
58 | 61 | $wgHooks['LogPageValidTypes'][] = 'wfTasksAddLogType'; |
59 | 62 | $wgHooks['LogPageLogName'][] = 'wfTasksAddLogName'; |
— | — | @@ -94,7 +97,7 @@ |
95 | 98 | $wgMessageCache->addMessages( |
96 | 99 | array( |
97 | 100 | 'tasks_tab' => 'Tasks', |
98 | | - 'tasks_title' => "Tasks for $1", |
| 101 | + 'tasks_title' => "Tasks for \"$1\"", |
99 | 102 | 'tasks_form_new' => "Create new task", |
100 | 103 | 'tasks_form_comment' => "Comment", |
101 | 104 | 'tasks_error1' => "Task was not created: there is already such a task!<br/>", |
— | — | @@ -111,9 +114,11 @@ |
112 | 115 | 'tasks_created_by' => "Created by $1", |
113 | 116 | 'tasks_discussion_page_link' => "Task discussion page", |
114 | 117 | 'tasks_closedby' => "Closed by $1", |
| 118 | + 'tasks_assigned_myself_log' => "Self-assignment of task \"$1\"", |
| 119 | + 'tasks_discussion_page_for' => "This task is for the page \"$1\". The list of all tasks for that page is $2.", |
| 120 | + 'tasks_sidebar_title' => "Open tasks", |
| 121 | + 'tasks_here' => "here", |
115 | 122 | |
116 | | - 'tasks_sidebar_title' => "Tasks", |
117 | | - |
118 | 123 | 'tasks_task_types' => "1:cleanup:Cleanup|2:wikify:Wikify|3:rewrite:Rewrite|4:delete:Delete|5:create:Create|6:write:Write", |
119 | 124 | 'tasks_status_open' => "Open" , |
120 | 125 | 'tasks_status_assigned' => "Assigned" , |
— | — | @@ -140,6 +145,48 @@ |
141 | 146 | # Hook functions |
142 | 147 | |
143 | 148 | /** |
| 149 | +* Display header on "Task:" pages (dummy hook for edit pages) |
| 150 | +*/ |
| 151 | +function wfTaskExtensionEditFormInitialHook ( &$editPage ) { |
| 152 | + global $wgArticle ; |
| 153 | + wfTaskExtensionHeaderHook ( $wgArticle ) ; |
| 154 | +} |
| 155 | + |
| 156 | +/** |
| 157 | +* Display header on "Task:" pages |
| 158 | +*/ |
| 159 | +function wfTaskExtensionHeaderHook ( &$article ) { |
| 160 | + global $wgTasksNamespace , $wgOut , $wgUser ; |
| 161 | + $title = $article->getTitle() ; |
| 162 | + $ns = $title->getNamespace() ; |
| 163 | + if ( $ns != $wgTasksNamespace AND $ns != $wgTasksNamespace+1 ) return ; # Doesn't concern us |
| 164 | + |
| 165 | + $subtitle = "" ; |
| 166 | + $taskid = $title->getText() ; |
| 167 | + $taskid = explode ( "(" , $taskid ) ; |
| 168 | + $taskid = explode ( ")" , array_pop ( $taskid ) ) ; |
| 169 | + $taskid = array_shift ( $taskid ) ; |
| 170 | + |
| 171 | + wfTasksAddCache() ; |
| 172 | + $st = new SpecialTasks ; |
| 173 | + $task = "" ; |
| 174 | + $page_title = $st->get_title_from_task ( $taskid , &$task ) ; |
| 175 | + if ( $task == "" ) return ; # No such task |
| 176 | + |
| 177 | + $sk =& $wgUser->getSkin() ; |
| 178 | + $link1 = $sk->makeLink ( $page_title->getPrefixedText() ) ; |
| 179 | + $link2 = $sk->makeLink ( $page_title->getPrefixedText() , wfMsg('tasks_here') , "action=tasks" ) ; |
| 180 | + $subtitle .= wfMsg ( 'tasks_discussion_page_for' , $link1 , $link2 ) ; |
| 181 | + $subtitle .= "<br/><table border='1' cellspacing='1' cellpadding='2'>" . |
| 182 | + "<tr>" . wfMsg('tasks_existing_table_header') . "</tr>" ; |
| 183 | + $subtitle .= $st->get_task_table_row ( $task , $page_title , true ) ; |
| 184 | + $subtitle .= "</table>" ; |
| 185 | + |
| 186 | + $subtitle = $wgOut->getSubtitle() . "<br/>" . $subtitle ; |
| 187 | + $wgOut->setSubtitle ( $subtitle ) ; |
| 188 | +} |
| 189 | + |
| 190 | +/** |
144 | 191 | * Display in sidebar |
145 | 192 | */ |
146 | 193 | function wfTasksExtensionAfterToolbox (&$tpl) { |
— | — | @@ -219,7 +266,7 @@ |
220 | 267 | $tasks = $st->get_tasks_for_page ( $t , true ) ; |
221 | 268 | foreach ( $tasks AS $task ) { |
222 | 269 | if ( !$st->is_creation_task ( $task->task_type ) ) continue ; # Not a "create" task |
223 | | - if ( $sk->is_closed ( $task->task_status ) ) continue ; # Not open |
| 270 | + if ( $st->is_closed ( $task->task_status ) ) continue ; # Not open |
224 | 271 | $st->change_task_status ( $task->task_id , 3 ) ; # "Closed" |
225 | 272 | $t->mArticleID = $new_id ; |
226 | 273 | $st->set_new_article_id ( $t ) ; |
— | — | @@ -229,6 +276,12 @@ |
230 | 277 | return false ; |
231 | 278 | } |
232 | 279 | |
| 280 | +# Prevents other tabs shown as active |
| 281 | +function wfTasksExtensionPreventOtherActiveTabs ( &$skin , &$prevent_active_tabs ) { |
| 282 | + global $action ; |
| 283 | + $prevent_active_tabs = $action == "tasks" ; ; |
| 284 | +} |
| 285 | + |
233 | 286 | /** |
234 | 287 | * Show the tab |
235 | 288 | */ |
— | — | @@ -454,8 +507,6 @@ |
455 | 508 | |
456 | 509 | function get_task_discussion_page ( &$task ) { |
457 | 510 | global $wgExtraNamespaces , $wgTasksNamespace ; |
458 | | - #$tdp = substr ( $title->getPrefixedText() , 0 , 200 ) ; |
459 | | - #$tdp = $wgExtraNamespaces[$wgTasksNamespace] . ":" . $ttype . ' "' . $tdp . '" (' . $task->task_id . ")" ; |
460 | 511 | $ttype = $this->get_type_text ( $this->task_types[$task->task_type]) ; |
461 | 512 | $tdp = $wgExtraNamespaces[$wgTasksNamespace] . ":" . $ttype . ' (' . $task->task_id . ")" ; |
462 | 513 | return $tdp ; |
— | — | @@ -480,7 +531,7 @@ |
481 | 532 | /** |
482 | 533 | * Checks if there's a "mode" set in the URL of the current page (performs changes on tasks, like assigning or closing them) |
483 | 534 | */ |
484 | | - function check_mode ( &$title ) { |
| 535 | + function check_mode ( $title ) { |
485 | 536 | global $wgUser , $wgRequest ; |
486 | 537 | $mode = $wgRequest->getText('mode', "") ; |
487 | 538 | $taskid = $wgRequest->getText('taskid', "") ; |
— | — | @@ -499,7 +550,11 @@ |
500 | 551 | ), |
501 | 552 | $conditions, |
502 | 553 | $fname ); |
503 | | - |
| 554 | + |
| 555 | + $title = $this->get_title_from_task ( $taskid , $task ) ; |
| 556 | + $act = wfMsg ( 'tasks_assigned_myself_log' , $this->get_type_text ( $this->task_types[$task->task_type] ) ) ; |
| 557 | + $log = new LogPage( 'tasks' ); |
| 558 | + $log->addEntry( 'tasks', $title , $act ); |
504 | 559 | } else if ( $mode == 'close' || $mode == 'wontfix' || $mode == 'reopen' ) { |
505 | 560 | if ( $mode == 'reopen' ) $mode = "open" ; |
506 | 561 | if ( $mode == 'close' ) $mode = "closed" ; |
— | — | @@ -548,7 +603,7 @@ |
549 | 604 | |
550 | 605 | # Logging |
551 | 606 | $title = $this->get_title_from_task ( $taskid , $task ) ; |
552 | | - $act = wfMsg ( 'tasks_action_' . $this->status_types[$new_status] , $this->task_types[$task->task_type] ) ; |
| 607 | + $act = wfMsg ( 'tasks_action_' . $this->status_types[$new_status] , $this->get_type_text ( $this->task_types[$task->task_type] ) ) ; |
553 | 608 | $log = new LogPage( 'tasks' ); |
554 | 609 | $log->addEntry( 'tasks', $title , $act ); |
555 | 610 | } |
— | — | @@ -561,8 +616,9 @@ |
562 | 617 | $ret = array () ; |
563 | 618 | foreach ( $tasks AS $task ) { |
564 | 619 | if ( $this->is_open ( $task->task_status ) ) |
565 | | - $ret[] = $task ; |
| 620 | + $ret[$this->get_type_text($this->task_types[$task->task_type])] = $task ; |
566 | 621 | } |
| 622 | + ksort ( $ret ) ; |
567 | 623 | return $ret ; |
568 | 624 | } |
569 | 625 | |
— | — | @@ -570,6 +626,19 @@ |
571 | 627 | * Returns the title object for a task, and the task data through reference |
572 | 628 | */ |
573 | 629 | function get_title_from_task ( $task_id , &$task ) { |
| 630 | + $task = $this->get_task_from_id ( $task_id ) ; |
| 631 | + if ( $task->task_page_id == 0 ) { # Non-existing page |
| 632 | + $title = Title::newFromDBkey ( $task->task_page_title ) ; |
| 633 | + } else { # Existing page |
| 634 | + $title = Title::newFromID ( $task->task_page_id ) ; |
| 635 | + } |
| 636 | + return $title ; |
| 637 | + } |
| 638 | + |
| 639 | + /** |
| 640 | + * Returns a single task by its ID |
| 641 | + */ |
| 642 | + function get_task_from_id ( $task_id ) { |
574 | 643 | $dbr =& wfGetDB( DB_SLAVE ); |
575 | 644 | $res = $dbr->select( |
576 | 645 | /* FROM */ 'tasks', |
— | — | @@ -578,12 +647,7 @@ |
579 | 648 | ); |
580 | 649 | $task = $dbr->fetchObject( $res ) ; |
581 | 650 | $dbr->freeResult($res); |
582 | | - if ( $task->task_page_id == 0 ) { # Non-existing page |
583 | | - $title = Title::newFromDBkey ( $task->task_page_title ) ; |
584 | | - } else { # Existing page |
585 | | - $title = Title::newFromID ( $task->task_page_id ) ; |
586 | | - } |
587 | | - return $title ; |
| 651 | + return $task ; |
588 | 652 | } |
589 | 653 | |
590 | 654 | /** |
— | — | @@ -631,7 +695,7 @@ |
632 | 696 | global $wgOut , $action ; |
633 | 697 | $out = "" ; |
634 | 698 | $tasks = array() ; |
635 | | - $wgOut->setPageTitle ( wfMsg('tasks_title',$title->getPrefixedText()) ) ; # Doesn't work for some reason... |
| 699 | + $wgOut->setSubtitle ( wfMsg('tasks_title',$title->getPrefixedText()) ) ; |
636 | 700 | |
637 | 701 | # Create from form |
638 | 702 | $out .= $this->create_from_form ( $title ) ; |