diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index f9e4c5bc0..cb6bc2ede 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -1,530 +1,530 @@ array( 'uri' => '/res/056b0c12/rsrc/css/aphront/dark-console.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/dark-console.css', ), 'aphront-dialog-view-css' => array( 'uri' => '/res/a05107ae/rsrc/css/aphront/dialog-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/dialog-view.css', ), 'aphront-error-view-css' => array( 'uri' => '/res/19b27527/rsrc/css/aphront/error-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/error-view.css', ), 'aphront-form-view-css' => array( 'uri' => '/res/8aaef437/rsrc/css/aphront/form-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/form-view.css', ), 'aphront-panel-view-css' => array( 'uri' => '/res/63672373/rsrc/css/aphront/panel-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/panel-view.css', ), 'aphront-request-failure-view-css' => array( 'uri' => '/res/97b8337a/rsrc/css/aphront/request-failure-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/request-failure-view.css', ), 'aphront-side-nav-view-css' => array( - 'uri' => '/res/0fc0545c/rsrc/css/aphront/side-nav-view.css', + 'uri' => '/res/09b7eb85/rsrc/css/aphront/side-nav-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/side-nav-view.css', ), 'aphront-table-view-css' => array( 'uri' => '/res/6a70f0f0/rsrc/css/aphront/table-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/table-view.css', ), 'aphront-tokenizer-control-css' => array( 'uri' => '/res/a3d23074/rsrc/css/aphront/tokenizer.css', 'type' => 'css', 'requires' => array( 0 => 'aphront-typeahead-control-css', ), 'disk' => '/rsrc/css/aphront/tokenizer.css', ), 'aphront-typeahead-control-css' => array( 'uri' => '/res/928df9f0/rsrc/css/aphront/typeahead.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/typeahead.css', ), 'phabricator-standard-page-view' => array( 'uri' => '/res/4ebe4b10/rsrc/css/application/base/standard-page-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/base/standard-page-view.css', ), 'differential-revision-add-comment-css' => array( 'uri' => '/res/9be761de/rsrc/css/application/differential/add-comment.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/add-comment.css', ), 'differential-changeset-view-css' => array( 'uri' => '/res/8b893b8e/rsrc/css/application/differential/changeset-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/changeset-view.css', ), 'differential-core-view-css' => array( 'uri' => '/res/525d1a12/rsrc/css/application/differential/core.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/core.css', ), 'differential-revision-comment-list-css' => array( 'uri' => '/res/10b9a829/rsrc/css/application/differential/revision-comment-list.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-comment-list.css', ), 'differential-revision-comment-css' => array( 'uri' => '/res/678be39a/rsrc/css/application/differential/revision-comment.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-comment.css', ), 'differential-revision-detail-css' => array( 'uri' => '/res/230a67c6/rsrc/css/application/differential/revision-detail.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-detail.css', ), 'differential-revision-history-css' => array( 'uri' => '/res/755f3da3/rsrc/css/application/differential/revision-history.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-history.css', ), 'differential-table-of-contents-css' => array( 'uri' => '/res/e68f6f05/rsrc/css/application/differential/table-of-contents.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/table-of-contents.css', ), 'phabricator-directory-css' => array( 'uri' => '/res/6a000601/rsrc/css/application/directory/phabricator-directory.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/directory/phabricator-directory.css', ), 'mainphest-task-detail-css' => array( 'uri' => '/res/e5f3beca/rsrc/css/application/maniphest/task-detail.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/maniphest/task-detail.css', ), 'maniphest-task-summary-css' => array( - 'uri' => '/res/bed1edf0/rsrc/css/application/maniphest/task-summary.css', + 'uri' => '/res/19a3c543/rsrc/css/application/maniphest/task-summary.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/maniphest/task-summary.css', ), 'maniphest-transaction-detail-css' => array( - 'uri' => '/res/443acf25/rsrc/css/application/maniphest/transaction-detail.css', + 'uri' => '/res/658912c5/rsrc/css/application/maniphest/transaction-detail.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/maniphest/transaction-detail.css', ), 'phabricator-core-buttons-css' => array( - 'uri' => '/res/fe74ba44/rsrc/css/core/buttons.css', + 'uri' => '/res/ee35ffe1/rsrc/css/core/buttons.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/buttons.css', ), 'phabricator-core-css' => array( 'uri' => '/res/6eebb99b/rsrc/css/core/core.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/core.css', ), 'phabricator-core-dialog-css' => array( 'uri' => '/res/f66cec41/rsrc/css/core/dialog.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/dialog.css', ), 'phabricator-remarkup-css' => array( 'uri' => '/res/786989c3/rsrc/css/core/remarkup.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/remarkup.css', ), 'syntax-highlighting-css' => array( 'uri' => '/res/fb673ece/rsrc/css/core/syntax.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/syntax.css', ), 'javelin-behavior-dark-console' => array( 'uri' => '/res/020b0265/rsrc/js/application/core/behavior-dark-console.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/application/core/behavior-dark-console.js', ), 'javelin-behavior-aphront-basic-tokenizer' => array( 'uri' => '/res/8317d761/rsrc/js/application/core/behavior-tokenizer.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/core/behavior-tokenizer.js', ), 'javelin-behavior-workflow' => array( 'uri' => '/res/15446e7e/rsrc/js/application/core/behavior-workflow.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/core/behavior-workflow.js', ), 'javelin-behavior-differential-add-reviewers' => array( 'uri' => '/res/330154e4/rsrc/js/application/differential/behavior-add-reviewers.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-add-reviewers.js', ), 'javelin-behavior-differential-feedback-preview' => array( 'uri' => '/res/8695d8b8/rsrc/js/application/differential/behavior-comment-preview.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-comment-preview.js', ), 'javelin-behavior-differential-diff-radios' => array( 'uri' => '/res/fdeb3823/rsrc/js/application/differential/behavior-diff-radios.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-diff-radios.js', ), 'javelin-behavior-differential-edit-inline-comments' => array( 'uri' => '/res/74747b2e/rsrc/js/application/differential/behavior-edit-inline-comments.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-edit-inline-comments.js', ), 'javelin-behavior-differential-populate' => array( 'uri' => '/res/a13dcd7e/rsrc/js/application/differential/behavior-populate.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-populate.js', ), 'javelin-behavior-differential-show-all-comments' => array( 'uri' => '/res/2a3592b8/rsrc/js/application/differential/behavior-show-all-comments.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-show-all-comments.js', ), 'javelin-behavior-differential-show-more' => array( 'uri' => '/res/ea998002/rsrc/js/application/differential/behavior-show-more.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-show-more.js', ), 'javelin-behavior-maniphest-transaction-controls' => array( 'uri' => '/res/fc6a8722/rsrc/js/application/maniphest/behavior-transaction-controls.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/maniphest/behavior-transaction-controls.js', ), 'javelin-magical-init' => array( 'uri' => '/res/76614f84/rsrc/js/javelin/init.dev.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/init.dev.js', ), 'javelin-init-prod' => array( 'uri' => '/res/1267c868/rsrc/js/javelin/init.min.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/init.min.js', ), 'javelin-lib-dev' => array( 'uri' => '/res/a0e7a5e9/rsrc/js/javelin/javelin.dev.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/javelin.dev.js', ), 'javelin-lib-prod' => array( 'uri' => '/res/2f2b3b2e/rsrc/js/javelin/javelin.min.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/javelin.min.js', ), 'javelin-typeahead-dev' => array( 'uri' => '/res/6de6ae59/rsrc/js/javelin/typeahead.dev.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/typeahead.dev.js', ), 'javelin-typeahead-prod' => array( 'uri' => '/res/69d5fad1/rsrc/js/javelin/typeahead.min.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/typeahead.min.js', ), 'javelin-workflow-dev' => array( 'uri' => '/res/c6b17f93/rsrc/js/javelin/workflow.dev.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/workflow.dev.js', ), 'javelin-workflow-prod' => array( 'uri' => '/res/b758e0a0/rsrc/js/javelin/workflow.min.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/workflow.min.js', ), ), array ( 'packages' => array ( - '8cbb3650' => + '4f907a28' => array ( 'name' => 'core.pkg.css', 'symbols' => array ( 0 => 'phabricator-core-css', 1 => 'phabricator-core-buttons-css', 2 => 'phabricator-standard-page-view', 3 => 'aphront-dialog-view-css', 4 => 'aphront-form-view-css', 5 => 'aphront-panel-view-css', 6 => 'aphront-side-nav-view-css', 7 => 'aphront-table-view-css', 8 => 'aphront-tokenizer-control-css', 9 => 'aphront-typeahead-control-css', 10 => 'phabricator-directory-css', 11 => 'phabricator-remarkup-css', 12 => 'syntax-highlighting-css', ), - 'uri' => '/res/pkg/8cbb3650/core.pkg.css', + 'uri' => '/res/pkg/4f907a28/core.pkg.css', 'type' => 'css', ), '4b8af7b5' => array ( 'name' => 'differential.pkg.css', 'symbols' => array ( 0 => 'differential-core-view-css', 1 => 'differential-changeset-view-css', 2 => 'differential-revision-detail-css', 3 => 'differential-revision-history-css', 4 => 'differential-table-of-contents-css', 5 => 'differential-revision-comment-css', 6 => 'differential-revision-add-comment-css', 7 => 'differential-revision-comment-list-css', ), 'uri' => '/res/pkg/4b8af7b5/differential.pkg.css', 'type' => 'css', ), '30d594cf' => array ( 'name' => 'differential.pkg.js', 'symbols' => array ( 0 => 'javelin-behavior-differential-feedback-preview', 1 => 'javelin-behavior-differential-edit-inline-comments', 2 => 'javelin-behavior-differential-populate', 3 => 'javelin-behavior-differential-show-more', 4 => 'javelin-behavior-differential-diff-radios', ), 'uri' => '/res/pkg/30d594cf/differential.pkg.js', 'type' => 'js', ), ), 'reverse' => array ( - 'phabricator-core-css' => '8cbb3650', - 'phabricator-core-buttons-css' => '8cbb3650', - 'phabricator-standard-page-view' => '8cbb3650', - 'aphront-dialog-view-css' => '8cbb3650', - 'aphront-form-view-css' => '8cbb3650', - 'aphront-panel-view-css' => '8cbb3650', - 'aphront-side-nav-view-css' => '8cbb3650', - 'aphront-table-view-css' => '8cbb3650', - 'aphront-tokenizer-control-css' => '8cbb3650', - 'aphront-typeahead-control-css' => '8cbb3650', - 'phabricator-directory-css' => '8cbb3650', - 'phabricator-remarkup-css' => '8cbb3650', - 'syntax-highlighting-css' => '8cbb3650', + 'phabricator-core-css' => '4f907a28', + 'phabricator-core-buttons-css' => '4f907a28', + 'phabricator-standard-page-view' => '4f907a28', + 'aphront-dialog-view-css' => '4f907a28', + 'aphront-form-view-css' => '4f907a28', + 'aphront-panel-view-css' => '4f907a28', + 'aphront-side-nav-view-css' => '4f907a28', + 'aphront-table-view-css' => '4f907a28', + 'aphront-tokenizer-control-css' => '4f907a28', + 'aphront-typeahead-control-css' => '4f907a28', + 'phabricator-directory-css' => '4f907a28', + 'phabricator-remarkup-css' => '4f907a28', + 'syntax-highlighting-css' => '4f907a28', 'differential-core-view-css' => '4b8af7b5', 'differential-changeset-view-css' => '4b8af7b5', 'differential-revision-detail-css' => '4b8af7b5', 'differential-revision-history-css' => '4b8af7b5', 'differential-table-of-contents-css' => '4b8af7b5', 'differential-revision-comment-css' => '4b8af7b5', 'differential-revision-add-comment-css' => '4b8af7b5', 'differential-revision-comment-list-css' => '4b8af7b5', 'javelin-behavior-differential-feedback-preview' => '30d594cf', 'javelin-behavior-differential-edit-inline-comments' => '30d594cf', 'javelin-behavior-differential-populate' => '30d594cf', 'javelin-behavior-differential-show-more' => '30d594cf', 'javelin-behavior-differential-diff-radios' => '30d594cf', ), )); diff --git a/src/applications/maniphest/controller/tasklist/ManiphestTaskListController.php b/src/applications/maniphest/controller/tasklist/ManiphestTaskListController.php index 2b18343ed..18536f795 100644 --- a/src/applications/maniphest/controller/tasklist/ManiphestTaskListController.php +++ b/src/applications/maniphest/controller/tasklist/ManiphestTaskListController.php @@ -1,130 +1,421 @@ view = idx($data, 'view'); } public function processRequest() { $views = array( 'Your Tasks', - 'action' => 'Action Required', -// 'activity' => 'Recently Active', -// 'closed' => 'Recently Closed', + 'action' => 'Assigned', 'created' => 'Created', 'triage' => 'Need Triage', +// 'touched' => 'Touched', '
', - 'All Open Tasks', + 'All Tasks', 'alltriage' => 'Need Triage', 'unassigned' => 'Unassigned', - 'allopen' => 'All Open', + 'all' => 'All Tasks', ); if (empty($views[$this->view])) { $this->view = 'action'; } - $tasks = $this->loadTasks(); + $request = $this->getRequest(); + $uri = $request->getRequestURI(); $nav = new AphrontSideNavView(); foreach ($views as $view => $name) { if (is_integer($view)) { $nav->addNavItem( phutil_render_tag( 'span', array(), $name)); } else { + $uri->setPath('/maniphest/view/'.$view.'/'); $nav->addNavItem( phutil_render_tag( 'a', array( - 'href' => '/maniphest/view/'.$view.'/', + 'href' => $uri, 'class' => ($this->view == $view) ? 'aphront-side-nav-selected' : null, ), phutil_escape_html($name))); } } - $handle_phids = mpull($tasks, 'getOwnerPHID'); - $handles = id(new PhabricatorObjectHandleData($handle_phids)) - ->loadHandles(); + list($status_map, $status_links) = $this->renderStatusLinks(); + list($grouping, $group_links) = $this->renderGroupLinks(); + list($order, $order_links) = $this->renderOrderLinks(); + + list($tasks, $handles) = $this->loadTasks( + array( + 'status' => $status_map, + 'group' => $grouping, + 'order' => $order, + )); - $task_list = new ManiphestTaskListView(); - $task_list->setTasks($tasks); - $task_list->setHandles($handles); + require_celerity_resource('maniphest-task-summary-css'); $nav->appendChild( - '
'. - ''. - 'Create New Task'. - ''. + '
'. + ''. + '
'. + ''. + ''. + ''. + ''. + '
Status:'.$status_links.'
Group:'.$group_links.'
Order:'.$order_links.'
'. + '
'. + '
'. '
'); - $nav->appendChild($task_list); + + $have_tasks = false; + foreach ($tasks as $group => $list) { + if (count($list)) { + $have_tasks = true; + break; + } + } + + if (!$have_tasks) { + $nav->appendChild( + '

'. + 'No matching tasks.'. + '

'); + } else { + foreach ($tasks as $group => $list) { + $task_list = new ManiphestTaskListView(); + $task_list->setTasks($list); + $task_list->setHandles($handles); + + $nav->appendChild( + '

'. + phutil_escape_html($group). + '

'); + $nav->appendChild($task_list); + } + } return $this->buildStandardPageResponse( $nav, array( 'title' => 'Task List', )); } - private function loadTasks() { + private function loadTasks(array $dict) { $request = $this->getRequest(); $user = $request->getUser(); $phids = array($user->getPHID()); + $task = new ManiphestTask(); + + $argv = array(); + + $status = $dict['status']; + if (!empty($status['open']) && !empty($status['closed'])) { + $status_clause = '1 = 1'; + } else if (!empty($status['open'])) { + $status_clause = 'status = %d'; + $argv[] = 0; + } else { + $status_clause = 'status > %d'; + $argv[] = 0; + } + + $extra_clause = '1 = 1'; switch ($this->view) { case 'action': - return id(new ManiphestTask())->loadAllWhere( - 'ownerPHID in (%Ls) AND status = 0', - $phids); + $extra_clause = 'ownerPHID in (%Ls)'; + $argv[] = $phids; + break; case 'created': - return id(new ManiphestTask())->loadAllWhere( - 'authorPHID in (%Ls) AND status = 0', - $phids); + $extra_clause = 'authorPHID in (%Ls)'; + $argv[] = $phids; + break; case 'triage': - return id(new ManiphestTask())->loadAllWhere( - 'ownerPHID in (%Ls) and status = %d', - $phids, - ManiphestTaskPriority::PRIORITY_TRIAGE); + $extra_clause = 'ownerPHID in (%Ls) AND status = %d'; + $argv[] = $phids; + $argv[] = ManiphestTaskPriority::PRIORITY_TRIAGE; + break; case 'alltriage': - return id(new ManiphestTask())->loadAllWhere( - 'status = %d', - ManiphestTaskPriority::PRIORITY_TRIAGE); + $extra_clause = 'status = %d'; + $argv[] = ManiphestTaskPriority::PRIORITY_TRIAGE; + break; case 'unassigned': - return id(new ManiphestTask())->loadAllWhere( - 'ownerPHID IS NULL'); - case 'allopen': - return id(new ManiphestTask())->loadAllWhere( - 'status = 0'); + $extra_clause = 'ownerPHID is NULL'; + break; + case 'all': + break; + } + + switch ($dict['order']) { + case 'priority': + $order = 'priority DESC, dateModified DESC'; + break; + case 'created': + $order = 'id DESC'; + break; + default: + $order = 'dateModified DESC'; + break; + } + + $sql = "({$status_clause}) AND ({$extra_clause}) ORDER BY {$order}"; + + array_unshift($argv, $sql); + + $data = call_user_func_array(array($task, 'loadAllWhere'), $argv); + + $handle_phids = mpull($data, 'getOwnerPHID'); + $handles = id(new PhabricatorObjectHandleData($handle_phids)) + ->loadHandles(); + + switch ($dict['group']) { + case 'priority': + $data = mgroup($data, 'getPriority'); + krsort($data); + + $out = array(); + foreach ($data as $pri => $tasks) { + $out[ManiphestTaskPriority::getTaskPriorityName($pri)] = $tasks; + } + $data = $out; + + break; + case 'status': + $data = mgroup($data, 'getStatus'); + ksort($data); + + $out = array(); + foreach ($data as $status => $tasks) { + $out[ManiphestTaskStatus::getTaskStatusFullName($status)] = $tasks; + } + + $data = $out; + break; + case 'owner': + $data = mgroup($data, 'getOwnerPHID'); + + $out = array(); + foreach ($data as $phid => $tasks) { + if ($phid) { + $out[$handles[$phid]->getFullName()] = $tasks; + } else { + $out['Unassigned'] = $tasks; + } + } + if (isset($out['Unassigned'])) { + // If any tasks are unassigned, move them to the front of the list. + $data = array('Unassigned' => $out['Unassigned']) + $out; + } else { + $data = $out; + } + + ksort($data); + break; + default: + $data = array( + 'Tasks' => $data, + ); + break; + } + + return array($data, $handles); + } + + public function renderStatusLinks() { + $request = $this->getRequest(); + + $sel = array( + 'open' => false, + 'closed' => false, + ); + + $status = $request->getStr('s'); + if ($status == 'c') { + $sel['closed'] = true; + } else if ($status == 'oc') { + $sel['closed'] = true; + $sel['open'] = true; + } else { + $sel['open'] = true; + } + + $just_one = (count(array_filter($sel)) == 1); + + $flag_map = array( + 'Open' => 'open', + 'Closed' => 'closed', + ); + $button_names = array( + 'Open' => 'o', + 'Closed' => 'c', + ); + + $base_flags = array(); + foreach ($flag_map as $name => $key) { + $base_flags[$button_names[$name]] = $sel[$key]; + } + + foreach ($button_names as $name => $letter) { + $flags = $base_flags; + $flags[$letter] = !$flags[$letter]; + $button_names[$name] = implode('', array_keys(array_filter($flags))); + } + + $uri = $request->getRequestURI(); + + $links = array(); + foreach ($button_names as $name => $value) { + $selected = $sel[$flag_map[$name]]; + $fixed = ($selected && $just_one); + + $more = null; + if ($fixed) { + $href = null; + $more .= ' toggle-fixed'; + } else { + $href = $uri->alter('s', $value); + } + + if ($selected) { + $more .= ' toggle-selected'; + } + + $links[] = phutil_render_tag( + 'a', + array( + 'href' => $href, + 'class' => 'toggle'.$more, + ), + $name); + } + $status_links = implode("\n", $links); + + return array($sel, $status_links); + } + + public function renderOrderLinks() { + $request = $this->getRequest(); + + $order = $request->getStr('o'); + $orders = array( + 'u' => 'updated', + 'c' => 'created', + 'p' => 'priority', + ); + if (empty($orders[$order])) { + $order = 'u'; + } + $order_by = $orders[$order]; + + $order_names = array( + 'Updated' => 'u', + 'Created' => 'c', + 'Priority' => 'p', + ); + + $uri = $request->getRequestURI(); + + $links = array(); + foreach ($order_names as $name => $param_key) { + if ($param_key == $order) { + $more = ' toggle-selected toggle-fixed'; + $href = null; + } else { + $more = null; + $href = $uri->alter('o', $param_key); + } + $links[] = phutil_render_tag( + 'a', + array( + 'class' => 'toggle'.$more, + 'href' => $href, + ), + $name); + } + $order_links = implode("\n", $links); + + return array($order_by, $order_links); + } + + public function renderGroupLinks() { + $request = $this->getRequest(); + + $group = $request->getStr('g'); + $groups = array( + 'n' => 'none', + 'p' => 'priority', + 's' => 'status', + 'o' => 'owner', + ); + if (empty($groups[$group])) { + $group = 'n'; + } + $group_by = $groups[$group]; + + $group_names = array( + 'None' => 'n', + 'Priority' => 'p', + 'Owner' => 'o', + 'Status' => 's', + ); + + $uri = $request->getRequestURI(); + + $links = array(); + foreach ($group_names as $name => $param_key) { + if ($param_key == $group) { + $more = ' toggle-selected toggle-fixed'; + $href = null; + } else { + $more = null; + $href = $uri->alter('g', $param_key); + } + $links[] = phutil_render_tag( + 'a', + array( + 'class' => 'toggle'.$more, + 'href' => $href, + ), + $name); } + $group_links = implode("\n", $links); - return array(); + return array($group_by, $group_links); } } diff --git a/src/applications/maniphest/controller/tasklist/__init__.php b/src/applications/maniphest/controller/tasklist/__init__.php index 17b4309e1..aff31bc32 100644 --- a/src/applications/maniphest/controller/tasklist/__init__.php +++ b/src/applications/maniphest/controller/tasklist/__init__.php @@ -1,20 +1,22 @@ task = $task; return $this; } public function setHandles(array $handles) { $this->handles = $handles; return $this; } public function render() { $task = $this->task; $handles = $this->handles; require_celerity_resource('maniphest-task-summary-css'); return ''. ''. + ''. ''. ''. ''. ''. '
'. 'T'.$task->getID(). ''. + ($task->getStatus() == ManiphestTaskStatus::STATUS_OPEN + ? 'Open' + : 'Closed'). + ''. - $handles[$task->getOwnerPHID()]->renderLink(). + ($task->getOwnerPHID() + ? $handles[$task->getOwnerPHID()]->renderLink() + : 'None'). ''. phutil_render_tag( 'a', array( 'href' => '/T'.$task->getID(), ), phutil_escape_html($task->getTitle())). ''. ManiphestTaskPriority::getTaskPriorityName($task->getPriority()). ''. phabricator_format_timestamp($task->getDateModified()). '
'; } } diff --git a/src/applications/maniphest/view/tasksummary/__init__.php b/src/applications/maniphest/view/tasksummary/__init__.php index 8c6a3ec78..c2612526b 100644 --- a/src/applications/maniphest/view/tasksummary/__init__.php +++ b/src/applications/maniphest/view/tasksummary/__init__.php @@ -1,17 +1,18 @@