@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Make "pro" controller render results the same way the less-pro controller does

Summary: Swaps the rendering over to the current rendering. This is mostly copy/paste out of TaskListController, which is going to get nuked, with some cleanup.

Test Plan:
{F58064}

- Ran a bunch of queries.
- Viewed empty states.
- Drag-and-dropped stuff.
- (Batch editor / excel export need a tweak to run the new-style queries.)

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Differential Revision: https://secure.phabricator.com/D6961

+237 -10
+234 -9
src/applications/maniphest/controller/ManiphestTaskListControllerPro.php
··· 31 31 32 32 $viewer = $this->getRequest()->getUser(); 33 33 34 - $list = new PHUIObjectItemListView(); 35 - $list->setUser($viewer); 34 + // If we didn't match anything, just pick up the default empty state. 35 + if (!$tasks) { 36 + return id(new PHUIObjectItemListView()) 37 + ->setUser($viewer); 38 + } 39 + 40 + $group_parameter = $query->getParameter('group', 'priority'); 41 + $order_parameter = $query->getParameter('order', 'priority'); 42 + 43 + $handles = $this->loadTaskHandles($tasks); 44 + $groups = $this->groupTasks( 45 + $tasks, 46 + $group_parameter, 47 + $handles); 48 + 49 + $can_drag = ($order_parameter == 'priority') && 50 + ($group_parameter == 'none' || $group_parameter == 'priority'); 51 + 52 + $result = array(); 53 + 54 + $lists = array(); 55 + foreach ($groups as $group => $list) { 56 + $task_list = new ManiphestTaskListView(); 57 + $task_list->setShowBatchControls(true); 58 + if ($can_drag) { 59 + $task_list->setShowSubpriorityControls(true); 60 + } 61 + $task_list->setUser($viewer); 62 + $task_list->setTasks($list); 63 + $task_list->setHandles($handles); 64 + 65 + $header = javelin_tag( 66 + 'h1', 67 + array( 68 + 'class' => 'maniphest-task-group-header', 69 + 'sigil' => 'task-group', 70 + 'meta' => array( 71 + 'priority' => head($list)->getPriority(), 72 + ), 73 + ), 74 + pht('%s (%s)', $group, new PhutilNumber(count($list)))); 75 + 76 + $lists[] = phutil_tag( 77 + 'div', 78 + array( 79 + 'class' => 'maniphest-task-group' 80 + ), 81 + array( 82 + $header, 83 + $task_list, 84 + )); 85 + } 86 + 87 + Javelin::initBehavior( 88 + 'maniphest-subpriority-editor', 89 + array( 90 + 'uri' => '/maniphest/subpriority/', 91 + )); 92 + 93 + return phutil_tag( 94 + 'div', 95 + array( 96 + 'class' => 'maniphest-list-container', 97 + ), 98 + array( 99 + $lists, 100 + $this->renderBatchEditor($query), 101 + )); 102 + } 103 + 104 + private function loadTaskHandles(array $tasks) { 105 + assert_instances_of($tasks, 'ManiphestTask'); 106 + 107 + $phids = array(); 36 108 foreach ($tasks as $task) { 37 - $item = id(new PHUIObjectItemView()) 38 - ->setObjectName('T'.$task->getID()) 39 - ->setHeader($task->getTitle()) 40 - ->setHref('/T'.$task->getID()) 41 - ->setObject($task); 109 + $assigned_phid = $task->getOwnerPHID(); 110 + if ($assigned_phid) { 111 + $phids[] = $assigned_phid; 112 + } 113 + foreach ($task->getProjectPHIDs() as $project_phid) { 114 + $phids[] = $project_phid; 115 + } 116 + } 117 + 118 + if (!$phids) { 119 + return array(); 120 + } 121 + 122 + return id(new PhabricatorHandleQuery()) 123 + ->setViewer($this->getRequest()->getUser()) 124 + ->withPHIDs($phids) 125 + ->execute(); 126 + } 127 + 128 + private function groupTasks(array $tasks, $group, array $handles) { 129 + assert_instances_of($tasks, 'ManiphestTask'); 130 + assert_instances_of($handles, 'PhabricatorObjectHandle'); 131 + 132 + $groups = $this->getTaskGrouping($tasks, $group); 42 133 43 - $list->addItem($item); 134 + $results = array(); 135 + foreach ($groups as $label_key => $tasks) { 136 + $label = $this->getTaskLabelName($group, $label_key, $handles); 137 + $results[$label][] = $tasks; 138 + } 139 + foreach ($results as $label => $task_groups) { 140 + $results[$label] = array_mergev($task_groups); 141 + } 142 + 143 + return $results; 144 + } 145 + 146 + private function getTaskGrouping(array $tasks, $group) { 147 + switch ($group) { 148 + case 'priority': 149 + return mgroup($tasks, 'getPriority'); 150 + case 'status': 151 + return mgroup($tasks, 'getStatus'); 152 + case 'assigned': 153 + return mgroup($tasks, 'getOwnerPHID'); 154 + case 'project': 155 + return mgroup($tasks, 'getGroupByProjectPHID'); 156 + default: 157 + return array(pht('Tasks') => $tasks); 44 158 } 159 + } 45 160 46 - return $list; 161 + private function getTaskLabelName($group, $label_key, array $handles) { 162 + switch ($group) { 163 + case 'priority': 164 + return ManiphestTaskPriority::getTaskPriorityName($label_key); 165 + case 'status': 166 + return ManiphestTaskStatus::getTaskStatusFullName($label_key); 167 + case 'assigned': 168 + if ($label_key) { 169 + return $handles[$label_key]->getFullName(); 170 + } else { 171 + return pht('(Not Assigned)'); 172 + } 173 + case 'project': 174 + if ($label_key) { 175 + return $handles[$label_key]->getFullName(); 176 + } else { 177 + return pht('(No Project)'); 178 + } 179 + default: 180 + return pht('Tasks'); 181 + } 47 182 } 48 183 49 184 public function buildSideNavView($for_app = false) { ··· 63 198 $nav->selectFilter(null); 64 199 65 200 return $nav; 201 + } 202 + 203 + private function renderBatchEditor(PhabricatorSavedQuery $saved_query) { 204 + $user = $this->getRequest()->getUser(); 205 + 206 + Javelin::initBehavior( 207 + 'maniphest-batch-selector', 208 + array( 209 + 'selectAll' => 'batch-select-all', 210 + 'selectNone' => 'batch-select-none', 211 + 'submit' => 'batch-select-submit', 212 + 'status' => 'batch-select-status-cell', 213 + 'idContainer' => 'batch-select-id-container', 214 + 'formID' => 'batch-select-form', 215 + )); 216 + 217 + $select_all = javelin_tag( 218 + 'a', 219 + array( 220 + 'href' => '#', 221 + 'mustcapture' => true, 222 + 'class' => 'grey button', 223 + 'id' => 'batch-select-all', 224 + ), 225 + pht('Select All')); 226 + 227 + $select_none = javelin_tag( 228 + 'a', 229 + array( 230 + 'href' => '#', 231 + 'mustcapture' => true, 232 + 'class' => 'grey button', 233 + 'id' => 'batch-select-none', 234 + ), 235 + pht('Clear Selection')); 236 + 237 + $submit = phutil_tag( 238 + 'button', 239 + array( 240 + 'id' => 'batch-select-submit', 241 + 'disabled' => 'disabled', 242 + 'class' => 'disabled', 243 + ), 244 + pht("Batch Edit Selected \xC2\xBB")); 245 + 246 + $export = javelin_tag( 247 + 'a', 248 + array( 249 + 'href' => '/maniphest/export/'.$saved_query->getQueryKey().'/', 250 + 'class' => 'grey button', 251 + ), 252 + pht('Export to Excel')); 253 + 254 + $hidden = phutil_tag( 255 + 'div', 256 + array( 257 + 'id' => 'batch-select-id-container', 258 + ), 259 + ''); 260 + 261 + $editor = hsprintf( 262 + '<div class="maniphest-batch-editor">'. 263 + '<div class="batch-editor-header">%s</div>'. 264 + '<table class="maniphest-batch-editor-layout">'. 265 + '<tr>'. 266 + '<td>%s%s</td>'. 267 + '<td>%s</td>'. 268 + '<td id="batch-select-status-cell">%s</td>'. 269 + '<td class="batch-select-submit-cell">%s%s</td>'. 270 + '</tr>'. 271 + '</table>'. 272 + '</div>', 273 + pht('Batch Task Editor'), 274 + $select_all, 275 + $select_none, 276 + $export, 277 + '', 278 + $submit, 279 + $hidden); 280 + 281 + $editor = phabricator_form( 282 + $user, 283 + array( 284 + 'method' => 'POST', 285 + 'action' => '/maniphest/batch/', 286 + 'id' => 'batch-select-form', 287 + ), 288 + $editor); 289 + 290 + return $editor; 66 291 } 67 292 68 293 }
+3 -1
src/applications/maniphest/query/ManiphestTaskSearchEngine.php
··· 349 349 ->setParameter('statuses', array(ManiphestTaskStatus::STATUS_OPEN)); 350 350 case 'authored': 351 351 return $query 352 - ->setParameter('authorPHIDs', array($viewer_phid)); 352 + ->setParameter('authorPHIDs', array($viewer_phid)) 353 + ->setParameter('order', 'created') 354 + ->setParameter('group', 'none'); 353 355 } 354 356 355 357 return parent::buildSavedQueryFromBuiltin($query_key);