Changeset View
Changeset View
Standalone View
Standalone View
src/applications/phrequent/event/PhrequentUIEventListener.php
Show First 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | if (!$user->isLoggedIn()) { | ||||
$track_action->setDisabled(true); | $track_action->setDisabled(true); | ||||
} | } | ||||
$actions = $event->getValue('actions'); | $actions = $event->getValue('actions'); | ||||
$actions[] = $track_action; | $actions[] = $track_action; | ||||
$event->setValue('actions', $actions); | $event->setValue('actions', $actions); | ||||
} | } | ||||
private function handlePropertyEvent($event) { | private function handlePropertyEvent($ui_event) { | ||||
$user = $event->getUser(); | $user = $ui_event->getUser(); | ||||
$object = $event->getValue('object'); | $object = $ui_event->getValue('object'); | ||||
if (!$object || !$object->getPHID()) { | if (!$object || !$object->getPHID()) { | ||||
// No object, or the object has no PHID yet.. | // No object, or the object has no PHID yet.. | ||||
return; | return; | ||||
} | } | ||||
if (!($object instanceof PhrequentTrackableInterface)) { | if (!($object instanceof PhrequentTrackableInterface)) { | ||||
// This object isn't a time trackable object. | // This object isn't a time trackable object. | ||||
return; | return; | ||||
} | } | ||||
$depth = false; | $events = id(new PhrequentUserTimeQuery()) | ||||
->setViewer($user) | |||||
->withObjectPHIDs(array($object->getPHID())) | |||||
->needPreemptingEvents(true) | |||||
->execute(); | |||||
$event_groups = mgroup($events, 'getUserPHID'); | |||||
$stack = PhrequentUserTimeQuery::loadUserStack($user); | if (!$events) { | ||||
if ($stack) { | return; | ||||
$stack = array_values($stack); | } | ||||
for ($ii = 0; $ii < count($stack); $ii++) { | |||||
if ($stack[$ii]->getObjectPHID() == $object->getPHID()) { | $handles = id(new PhabricatorHandleQuery()) | ||||
$depth = ($ii + 1); | ->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; | break; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
$time_spent = PhrequentUserTimeQuery::getTotalTimeSpentOnObject( | switch ($state) { | ||||
$object->getPHID()); | case 'active': | ||||
$item->setIcon('time-green', pht('Working Now')); | |||||
if (!$depth && !$time_spent) { | break; | ||||
return; | case 'suspended': | ||||
$item->setIcon('time-yellow', pht('Interrupted')); | |||||
break; | |||||
case 'stopped': | |||||
$item->setIcon('time-orange', pht('Not Working Now')); | |||||
break; | |||||
} | } | ||||
require_celerity_resource('phrequent-css'); | $block = new PhrequentTimeBlock($event_group); | ||||
$item->setNote( | |||||
$property = array(); | phabricator_format_relative_time( | ||||
if ($depth == 1) { | $block->getTimeSpentOnObject( | ||||
$property[] = phutil_tag( | $object->getPHID(), | ||||
'div', | time()))); | ||||
array( | |||||
'class' => 'phrequent-tracking-property phrequent-active', | |||||
), | |||||
pht('Currently Tracking')); | |||||
} else if ($depth > 1) { | |||||
$property[] = phutil_tag( | |||||
'div', | |||||
array( | |||||
'class' => 'phrequent-tracking-property phrequent-on-stack', | |||||
), | |||||
pht('On Stack')); | |||||
} | |||||
if ($time_spent) { | $status_view->addItem($item); | ||||
$property[] = phabricator_format_relative_time_detailed($time_spent); | |||||
} | } | ||||
$view = $event->getValue('view'); | $view = $ui_event->getValue('view'); | ||||
$view->addProperty(pht('Time Spent'), $property); | $view->addProperty(pht('Time Spent'), $status_view); | ||||
} | } | ||||
} | } |