@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
at upstream/main 203 lines 5.9 kB view raw
1<?php 2 3final class PhrequentSearchEngine extends PhabricatorApplicationSearchEngine { 4 5 public function getResultTypeDescription() { 6 return pht('Phrequent Time'); 7 } 8 9 public function getApplicationClassName() { 10 return PhabricatorPhrequentApplication::class; 11 } 12 13 public function getPageSize(PhabricatorSavedQuery $saved) { 14 return $saved->getParameter('limit', 1000); 15 } 16 17 public function buildSavedQueryFromRequest(AphrontRequest $request) { 18 $saved = new PhabricatorSavedQuery(); 19 20 $saved->setParameter( 21 'userPHIDs', 22 $this->readUsersFromRequest($request, 'users')); 23 24 $saved->setParameter('ended', $request->getStr('ended')); 25 26 $saved->setParameter('order', $request->getStr('order')); 27 28 return $saved; 29 } 30 31 public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { 32 $query = id(new PhrequentUserTimeQuery()) 33 ->needPreemptingEvents(true); 34 35 $user_phids = $saved->getParameter('userPHIDs'); 36 if ($user_phids) { 37 $query->withUserPHIDs($user_phids); 38 } 39 40 $ended = $saved->getParameter('ended'); 41 if ($ended != null) { 42 $query->withEnded($ended); 43 } 44 45 $order = $saved->getParameter('order'); 46 if ($order != null) { 47 $query->setOrder($order); 48 } 49 50 return $query; 51 } 52 53 public function buildSearchForm( 54 AphrontFormView $form, 55 PhabricatorSavedQuery $saved_query) { 56 57 $user_phids = $saved_query->getParameter('userPHIDs', array()); 58 $ended = $saved_query->getParameter( 59 'ended', PhrequentUserTimeQuery::ENDED_ALL); 60 $order = $saved_query->getParameter( 61 'order', PhrequentUserTimeQuery::ORDER_ENDED_DESC); 62 63 $form 64 ->appendControl( 65 id(new AphrontFormTokenizerControl()) 66 ->setDatasource(new PhabricatorPeopleDatasource()) 67 ->setName('users') 68 ->setLabel(pht('Users')) 69 ->setValue($user_phids)) 70 ->appendChild( 71 id(new AphrontFormSelectControl()) 72 ->setLabel(pht('Ended')) 73 ->setName('ended') 74 ->setValue($ended) 75 ->setOptions(PhrequentUserTimeQuery::getEndedSearchOptions())) 76 ->appendChild( 77 id(new AphrontFormSelectControl()) 78 ->setLabel(pht('Order')) 79 ->setName('order') 80 ->setValue($order) 81 ->setOptions(PhrequentUserTimeQuery::getOrderSearchOptions())); 82 } 83 84 protected function getURI($path) { 85 return '/phrequent/'.$path; 86 } 87 88 protected function getBuiltinQueryNames() { 89 return array( 90 'tracking' => pht('Currently Tracking'), 91 'all' => pht('All Tracked'), 92 ); 93 } 94 95 public function buildSavedQueryFromBuiltin($query_key) { 96 $query = $this->newSavedQuery(); 97 $query->setQueryKey($query_key); 98 99 switch ($query_key) { 100 case 'all': 101 return $query 102 ->setParameter('order', PhrequentUserTimeQuery::ORDER_ENDED_DESC); 103 case 'tracking': 104 return $query 105 ->setParameter('ended', PhrequentUserTimeQuery::ENDED_NO) 106 ->setParameter('order', PhrequentUserTimeQuery::ORDER_ENDED_DESC); 107 } 108 109 return parent::buildSavedQueryFromBuiltin($query_key); 110 } 111 112 protected function getRequiredHandlePHIDsForResultList( 113 array $usertimes, 114 PhabricatorSavedQuery $query) { 115 return array_mergev( 116 array( 117 mpull($usertimes, 'getUserPHID'), 118 mpull($usertimes, 'getObjectPHID'), 119 )); 120 } 121 122 /** 123 * @param array<PhrequentUserTime> $usertimes 124 * @param PhabricatorSavedQuery $query 125 * @param array<PhabricatorObjectHandle> $handles 126 */ 127 protected function renderResultList( 128 array $usertimes, 129 PhabricatorSavedQuery $query, 130 array $handles) { 131 assert_instances_of($usertimes, PhrequentUserTime::class); 132 $viewer = $this->requireViewer(); 133 134 $view = id(new PHUIObjectItemListView()) 135 ->setUser($viewer); 136 137 foreach ($usertimes as $usertime) { 138 $item = new PHUIObjectItemView(); 139 if ($usertime->getObjectPHID() === null) { 140 $item->setHeader($usertime->getNote()); 141 } else { 142 $obj = $handles[$usertime->getObjectPHID()]; 143 $item->setHeader($obj->getLinkName()); 144 $item->setHref($obj->getURI()); 145 } 146 $item->setObject($usertime); 147 148 $item->addByline( 149 pht( 150 'Tracked: %s', 151 $handles[$usertime->getUserPHID()]->renderLink())); 152 153 $started_date = phabricator_date($usertime->getDateStarted(), $viewer); 154 $item->addIcon('none', $started_date); 155 156 $block = new PhrequentTimeBlock(array($usertime)); 157 $time_spent = $block->getTimeSpentOnObject( 158 $usertime->getObjectPHID(), 159 PhabricatorTime::getNow()); 160 161 $time_spent = $time_spent == 0 ? 'none' : 162 phutil_format_relative_time_detailed($time_spent); 163 164 if ($usertime->getDateEnded() !== null) { 165 $item->addAttribute( 166 pht( 167 'Tracked %s', 168 $time_spent)); 169 $item->addAttribute( 170 pht( 171 'Ended on %s', 172 phabricator_datetime($usertime->getDateEnded(), $viewer))); 173 } else { 174 $item->addAttribute( 175 pht( 176 'Tracked %s so far', 177 $time_spent)); 178 if ($usertime->getObjectPHID() !== null && 179 $usertime->getUserPHID() === $viewer->getPHID()) { 180 $item->addAction( 181 id(new PHUIListItemView()) 182 ->setIcon('fa-stop') 183 ->addSigil('phrequent-stop-tracking') 184 ->setWorkflow(true) 185 ->setRenderNameAsTooltip(true) 186 ->setName(pht('Stop')) 187 ->setHref( 188 '/phrequent/track/stop/'. 189 $usertime->getObjectPHID().'/')); 190 } 191 $item->setStatusIcon('fa-clock-o green'); 192 } 193 194 $view->addItem($item); 195 } 196 197 $result = new PhabricatorApplicationSearchResultView(); 198 $result->setObjectList($view); 199 200 return $result; 201 } 202 203}