@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.

Updates to phrequent's landing page

Summary:
https://secure.phabricator.com/D5554#comment-4

Implemented the changes outlined above.

Test Plan: Go to the page, click the new nav links, try the user filter

Reviewers: epriestley, hach-que

CC: hach-que, aran, Korvin

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

authored by

Gareth Evans and committed by
epriestley
eaa43629 f53cde8f

+127 -36
+1
src/applications/phrequent/application/PhabricatorApplicationPhrequent.php
··· 36 36 return array( 37 37 '/phrequent/' => array( 38 38 '' => 'PhrequentListController', 39 + 'view/(?P<view>\w+)/' => 'PhrequentListController', 39 40 'track/(?P<verb>[a-z]+)/(?P<phid>[^/]+)/' 40 41 => 'PhrequentTrackController' 41 42 ),
+7 -2
src/applications/phrequent/controller/PhrequentController.php
··· 4 4 5 5 protected function buildNav($view) { 6 6 $nav = new AphrontSideNavFilterView(); 7 - $nav->setBaseURI(new PhutilURI('/phrequent/')); 7 + $nav->setBaseURI(new PhutilURI('/phrequent/view/')); 8 8 9 - $nav->addFilter('usertime', 'Time Tracked'); 9 + $nav->addLabel(pht('User Times')); 10 + $nav->addFilter('current', pht('Currently Tracking')); 11 + $nav->addFilter('recent', pht('Recent Activity')); 12 + $nav->addLabel('All Times'); 13 + $nav->addFilter('allcurrent', pht('Currently Tracking')); 14 + $nav->addFilter('allrecent', pht('Recent Activity')); 10 15 11 16 $nav->selectFilter($view); 12 17
+119 -34
src/applications/phrequent/controller/PhrequentListController.php
··· 2 2 3 3 final class PhrequentListController extends PhrequentController { 4 4 5 + private $view; 6 + 7 + public function willProcessRequest(array $data) { 8 + $this->view = idx($data, 'view', "current"); 9 + } 10 + 11 + private function getArrToStrList($key) { 12 + $arr = $this->getRequest()->getArr($key); 13 + $arr = implode(',', $arr); 14 + return nonempty($arr, null); 15 + } 16 + 5 17 public function processRequest() { 6 18 $request = $this->getRequest(); 7 19 $user = $request->getUser(); 8 20 9 - $nav = $this->buildNav('usertime'); 21 + if ($request->isFormPost()) { 22 + // Redirect to GET so URIs can be copy/pasted. 23 + 24 + $order = $request->getStr('o'); 25 + $order = nonempty($order, null); 26 + 27 + $ended = $request->getStr('e'); 28 + $ended = nonempty($ended, null); 10 29 11 - $form = id(new AphrontFormView()) 12 - ->setUser($user) 13 - ->setNoShading(true); 30 + $uri = $request->getRequestURI() 31 + ->alter('users', $this->getArrToStrList('set_users')) 32 + ->alter('o', $order) 33 + ->alter('e', $ended); 34 + 35 + return id(new AphrontRedirectResponse())->setURI($uri); 36 + } 14 37 15 - $form->appendChild( 16 - id(new AphrontFormToggleButtonsControl()) 17 - ->setName('o') 18 - ->setLabel(pht('Sort Order')) 19 - ->setBaseURI($request->getRequestURI(), 'o') 20 - ->setValue($request->getStr('o', 's')) 21 - ->setButtons( 22 - array( 23 - 's' => pht('Started'), 24 - 'e' => pht('Ended'), 25 - 'd' => pht('Duration'), 26 - ))); 38 + $nav = $this->buildNav($this->view); 27 39 28 - $form->appendChild( 29 - id(new AphrontFormToggleButtonsControl()) 30 - ->setName('e') 31 - ->setLabel(pht('Ended')) 32 - ->setBaseURI($request->getRequestURI(), 'e') 33 - ->setValue($request->getStr('e', 'a')) 34 - ->setButtons( 35 - array( 36 - 'y' => pht('Yes'), 37 - 'n' => pht('No'), 38 - 'a' => pht('All'), 39 - ))); 40 + $has_user_filter = array( 41 + "current" => true, 42 + "recent" => true, 43 + ); 40 44 41 - $filter = new AphrontListFilterView(); 42 - $filter->appendChild($form); 45 + $user_phids = $request->getStrList('users', array()); 46 + if (isset($has_user_filter[$this->view])) { 47 + $user_phids = array($user->getPHID()); 48 + } 43 49 44 - $query = new PhrequentUserTimeQuery(); 50 + switch ($this->view) { 51 + case "current": 52 + case "allcurrent": 53 + $order_key_default = "s"; 54 + $ended_key_default = "n"; 55 + break; 56 + case "recent": 57 + case "allrecent": 58 + $order_key_default = "s"; 59 + $ended_key_default = "y"; 60 + break; 61 + default: 62 + $order_key_default = "s"; 63 + $ended_key_default = "a"; 64 + break; 65 + } 45 66 46 - switch ($request->getStr('o', 's')) { 67 + switch ($request->getStr('o', $order_key_default)) { 47 68 case 's': 48 69 $order = PhrequentUserTimeQuery::ORDER_STARTED; 49 70 break; ··· 56 77 default: 57 78 throw new Exception("Unknown order!"); 58 79 } 59 - $query->setOrder($order); 60 80 61 - switch ($request->getStr('e', 'a')) { 81 + switch ($request->getStr('e', $ended_key_default)) { 62 82 case 'a': 63 83 $ended = PhrequentUserTimeQuery::ENDED_ALL; 64 84 break; ··· 71 91 default: 72 92 throw new Exception("Unknown ended!"); 73 93 } 94 + 95 + $filter = new AphrontListFilterView(); 96 + $filter->appendChild( 97 + $this->buildForm($user_phids, $order_key_default, $ended_key_default)); 98 + 99 + $query = new PhrequentUserTimeQuery(); 100 + $query->setOrder($order); 74 101 $query->setEnded($ended); 102 + $query->setUsers($user_phids); 75 103 76 104 $pager = new AphrontPagerView(); 77 105 $pager->setPageSize(500); ··· 97 125 id(new PhabricatorCrumbView()) 98 126 ->setName($title) 99 127 ->setHref($this->getApplicationURI('/'))); 128 + 100 129 $nav->setCrumbs($crumbs); 101 130 102 131 return $this->buildApplicationPage( ··· 106 135 'device' => true, 107 136 )); 108 137 138 + } 139 + 140 + protected function buildForm(array $user_phids, $order_key_default, 141 + $ended_key_default) { 142 + $request = $this->getRequest(); 143 + $user = $request->getUser(); 144 + 145 + $form = id(new AphrontFormView()) 146 + ->setUser($user) 147 + ->setNoShading(true) 148 + ->setAction($this->getApplicationURI("/view/custom/")); 149 + 150 + $user_handles = id(new PhabricatorObjectHandleData($user_phids)) 151 + ->setViewer($user) 152 + ->loadHandles(); 153 + $tokens = array(); 154 + foreach ($user_phids as $phid) { 155 + $tokens[$phid] = $user_handles[$phid]->getFullName(); 156 + } 157 + $form->appendChild( 158 + id(new AphrontFormTokenizerControl()) 159 + ->setDatasource('/typeahead/common/searchowner/') 160 + ->setName('set_users') 161 + ->setLabel(pht('Users')) 162 + ->setValue($tokens)); 163 + 164 + $form->appendChild( 165 + id(new AphrontFormToggleButtonsControl()) 166 + ->setName('o') 167 + ->setLabel(pht('Sort Order')) 168 + ->setBaseURI($request->getRequestURI(), 'o') 169 + ->setValue($request->getStr('o', $order_key_default)) 170 + ->setButtons( 171 + array( 172 + 's' => pht('Started'), 173 + 'e' => pht('Ended'), 174 + 'd' => pht('Duration'), 175 + ))); 176 + 177 + $form->appendChild( 178 + id(new AphrontFormToggleButtonsControl()) 179 + ->setName('e') 180 + ->setLabel(pht('Ended')) 181 + ->setBaseURI($request->getRequestURI(), 'e') 182 + ->setValue($request->getStr('e', $ended_key_default)) 183 + ->setButtons( 184 + array( 185 + 'y' => pht('Yes'), 186 + 'n' => pht('No'), 187 + 'a' => pht('All'), 188 + ))); 189 + 190 + $form->appendChild( 191 + id(new AphrontFormSubmitControl())->setValue(pht('Filter Objects'))); 192 + 193 + return $form; 109 194 } 110 195 111 196 protected function buildTableView(array $usertimes) {