public function buildCurtainPanel($object) { $viewer = $this->getViewer(); $events = id(new PhrequentUserTimeQuery())->setViewer($viewer)->withObjectPHIDs(array($object->getPHID()))->needPreemptingEvents(true)->execute(); $event_groups = mgroup($events, 'getUserPHID'); if (!$events) { return; } $handles = $viewer->loadHandles(array_keys($event_groups)); $status_view = new PHUIStatusListView(); foreach ($event_groups as $user_phid => $event_group) { $item = new PHUIStatusItemView(); $item->setTarget($handles[$user_phid]->renderLink()); $state = 'stopped'; foreach ($event_group as $event) { if ($event->getDateEnded() === null) { if ($event->isPreempted()) { $state = 'suspended'; } else { $state = 'active'; break; } } } switch ($state) { case 'active': $item->setIcon(PHUIStatusItemView::ICON_CLOCK, 'green', pht('Working Now')); break; case 'suspended': $item->setIcon(PHUIStatusItemView::ICON_CLOCK, 'yellow', pht('Interrupted')); break; case 'stopped': $item->setIcon(PHUIStatusItemView::ICON_CLOCK, 'bluegrey', pht('Not Working Now')); break; } $block = new PhrequentTimeBlock($event_group); $item->setNote(phutil_format_relative_time($block->getTimeSpentOnObject($object->getPHID(), time()))); $status_view->addItem($item); } return $this->newPanel()->setHeaderText(pht('Time Spent'))->setOrder(40000)->appendChild($status_view); }
public function testSumTimeSlices() { // This block has multiple closed slices. $block = new PhrequentTimeBlock(array($this->newEvent('T1', 3456, 4456)->attachPreemptingEvents(array()), $this->newEvent('T1', 8000, 9000)->attachPreemptingEvents(array()))); $this->assertEqual(2000, $block->getTimeSpentOnObject('T1', 10000)); // This block has an open slice. $block = new PhrequentTimeBlock(array($this->newEvent('T1', 3456, 4456)->attachPreemptingEvents(array()), $this->newEvent('T1', 8000, null)->attachPreemptingEvents(array()))); $this->assertEqual(3000, $block->getTimeSpentOnObject('T1', 10000)); }
private function handlePropertyEvent($ui_event) { $user = $ui_event->getUser(); $object = $ui_event->getValue('object'); if (!$object || !$object->getPHID()) { // No object, or the object has no PHID yet.. return; } if (!$object instanceof PhrequentTrackableInterface) { // This object isn't a time trackable object. return; } if (!$this->canUseApplication($ui_event->getUser())) { return; } $events = id(new PhrequentUserTimeQuery())->setViewer($user)->withObjectPHIDs(array($object->getPHID()))->needPreemptingEvents(true)->execute(); $event_groups = mgroup($events, 'getUserPHID'); if (!$events) { return; } $handles = id(new PhabricatorHandleQuery())->setViewer($user)->withPHIDs(array_keys($event_groups))->execute(); $status_view = new PHUIStatusListView(); foreach ($event_groups as $user_phid => $event_group) { $item = new PHUIStatusItemView(); $item->setTarget($handles[$user_phid]->renderLink()); $state = 'stopped'; foreach ($event_group as $event) { if ($event->getDateEnded() === null) { if ($event->isPreempted()) { $state = 'suspended'; } else { $state = 'active'; break; } } } switch ($state) { case 'active': $item->setIcon(PHUIStatusItemView::ICON_CLOCK, 'green', pht('Working Now')); break; case 'suspended': $item->setIcon(PHUIStatusItemView::ICON_CLOCK, 'yellow', pht('Interrupted')); break; case 'stopped': $item->setIcon(PHUIStatusItemView::ICON_CLOCK, 'bluegrey', pht('Not Working Now')); break; } $block = new PhrequentTimeBlock($event_group); $item->setNote(phutil_format_relative_time($block->getTimeSpentOnObject($object->getPHID(), time()))); $status_view->addItem($item); } $view = $ui_event->getValue('view'); $view->addProperty(pht('Time Spent'), $status_view); }
protected function renderResultList(array $usertimes, PhabricatorSavedQuery $query, array $handles) { assert_instances_of($usertimes, 'PhrequentUserTime'); $viewer = $this->requireViewer(); $view = id(new PHUIObjectItemListView())->setUser($viewer); foreach ($usertimes as $usertime) { $item = new PHUIObjectItemView(); if ($usertime->getObjectPHID() === null) { $item->setHeader($usertime->getNote()); } else { $obj = $handles[$usertime->getObjectPHID()]; $item->setHeader($obj->getLinkName()); $item->setHref($obj->getURI()); } $item->setObject($usertime); $item->addByline(pht('Tracked: %s', $handles[$usertime->getUserPHID()]->renderLink())); $started_date = phabricator_date($usertime->getDateStarted(), $viewer); $item->addIcon('none', $started_date); $block = new PhrequentTimeBlock(array($usertime)); $time_spent = $block->getTimeSpentOnObject($usertime->getObjectPHID(), PhabricatorTime::getNow()); $time_spent = $time_spent == 0 ? 'none' : phutil_format_relative_time_detailed($time_spent); if ($usertime->getDateEnded() !== null) { $item->addAttribute(pht('Tracked %s', $time_spent)); $item->addAttribute(pht('Ended on %s', phabricator_datetime($usertime->getDateEnded(), $viewer))); } else { $item->addAttribute(pht('Tracked %s so far', $time_spent)); if ($usertime->getObjectPHID() !== null && $usertime->getUserPHID() === $viewer->getPHID()) { $item->addAction(id(new PHUIListItemView())->setIcon('fa-stop')->addSigil('phrequent-stop-tracking')->setWorkflow(true)->setRenderNameAsTooltip(true)->setName(pht('Stop'))->setHref('/phrequent/track/stop/' . $usertime->getObjectPHID() . '/')); } $item->setBarColor('green'); } $view->addItem($item); } return $view; }