private function buildResults()
 {
     $results = array();
     $status_map = HarbormasterBuildStatus::getBuildStatusMap();
     foreach ($status_map as $value => $name) {
         $result = id(new PhabricatorTypeaheadResult())->setIcon(HarbormasterBuildStatus::getBuildStatusIcon($value))->setColor(HarbormasterBuildStatus::getBuildStatusColor($value))->setPHID($value)->setName($name)->addAttribute(pht('Status'));
         $results[$value] = $result;
     }
     return $results;
 }
 protected function renderResultList(array $builds, PhabricatorSavedQuery $query, array $handles)
 {
     assert_instances_of($builds, 'HarbormasterBuild');
     $viewer = $this->requireViewer();
     $buildables = mpull($builds, 'getBuildable');
     $object_phids = mpull($buildables, 'getBuildablePHID');
     $initiator_phids = mpull($builds, 'getInitiatorPHID');
     $phids = array_mergev(array($initiator_phids, $object_phids));
     $phids = array_unique(array_filter($phids));
     $handles = $viewer->loadHandles($phids);
     $list = new PHUIObjectItemListView();
     foreach ($builds as $build) {
         $id = $build->getID();
         $initiator = $handles[$build->getInitiatorPHID()];
         $buildable_object = $handles[$build->getBuildable()->getBuildablePHID()];
         $item = id(new PHUIObjectItemView())->setViewer($viewer)->setObject($build)->setObjectName(pht('Build %d', $build->getID()))->setHeader($build->getName())->setHref($build->getURI())->setEpoch($build->getDateCreated())->addAttribute($buildable_object->getName());
         if ($initiator) {
             $item->addHandleIcon($initiator, $initiator->getName());
         }
         $status = $build->getBuildStatus();
         $status_icon = HarbormasterBuildStatus::getBuildStatusIcon($status);
         $status_color = HarbormasterBuildStatus::getBuildStatusColor($status);
         $status_label = HarbormasterBuildStatus::getBuildStatusName($status);
         $item->setStatusIcon("{$status_icon} {$status_color}", $status_label);
         $list->addItem($item);
     }
     $result = new PhabricatorApplicationSearchResultView();
     $result->setObjectList($list);
     $result->setNoDataString(pht('No builds found.'));
     return $result;
 }
 private function getStatus(HarbormasterBuild $build)
 {
     $status_view = new PHUIStatusListView();
     $item = new PHUIStatusItemView();
     if ($build->isPausing()) {
         $status_name = pht('Pausing');
         $icon = PHUIStatusItemView::ICON_RIGHT;
         $color = 'dark';
     } else {
         $status = $build->getBuildStatus();
         $status_name = HarbormasterBuildStatus::getBuildStatusName($status);
         $icon = HarbormasterBuildStatus::getBuildStatusIcon($status);
         $color = HarbormasterBuildStatus::getBuildStatusColor($status);
     }
     $item->setTarget($status_name);
     $item->setIcon($icon, $color);
     $status_view->addItem($item);
     return $status_view;
 }
 private function handlePropertyEvent($ui_event)
 {
     $viewer = $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 HarbormasterBuildable) {
         // Although HarbormasterBuildable implements the correct interface, it
         // does not make sense to show a build's build status. In the best case
         // it is meaningless, and in the worst case it's confusing.
         return;
     }
     if ($object instanceof DifferentialRevision) {
         // TODO: This is a bit hacky and we could probably find a cleaner fix
         // eventually, but we show build status on each diff, immediately below
         // this property list, so it's redundant to show it on the revision view.
         return;
     }
     if (!$object instanceof HarbormasterBuildableInterface) {
         return;
     }
     $buildable_phid = $object->getHarbormasterBuildablePHID();
     if (!$buildable_phid) {
         return;
     }
     if (!$this->canUseApplication($ui_event->getUser())) {
         return;
     }
     $buildable = id(new HarbormasterBuildableQuery())->setViewer($viewer)->withManualBuildables(false)->withBuildablePHIDs(array($buildable_phid))->needBuilds(true)->needTargets(true)->executeOne();
     if (!$buildable) {
         return;
     }
     $builds = $buildable->getBuilds();
     $targets = array();
     foreach ($builds as $build) {
         foreach ($build->getBuildTargets() as $target) {
             $targets[] = $target;
         }
     }
     if ($targets) {
         $artifacts = id(new HarbormasterBuildArtifactQuery())->setViewer($viewer)->withBuildTargetPHIDs(mpull($targets, 'getPHID'))->withArtifactTypes(array(HarbormasterURIArtifact::ARTIFACTCONST))->execute();
         $artifacts = mgroup($artifacts, 'getBuildTargetPHID');
     } else {
         $artifacts = array();
     }
     $status_view = new PHUIStatusListView();
     $buildable_status = $buildable->getBuildableStatus();
     $buildable_icon = HarbormasterBuildable::getBuildableStatusIcon($buildable_status);
     $buildable_color = HarbormasterBuildable::getBuildableStatusColor($buildable_status);
     $buildable_name = HarbormasterBuildable::getBuildableStatusName($buildable_status);
     $target = phutil_tag('a', array('href' => '/' . $buildable->getMonogram()), pht('Buildable %d', $buildable->getID()));
     $target = phutil_tag('strong', array(), $target);
     $status_view->addItem(id(new PHUIStatusItemView())->setIcon($buildable_icon, $buildable_color, $buildable_name)->setTarget($target));
     foreach ($builds as $build) {
         $item = new PHUIStatusItemView();
         $item->setTarget($viewer->renderHandle($build->getPHID()));
         $links = array();
         foreach ($build->getBuildTargets() as $build_target) {
             $uris = idx($artifacts, $build_target->getPHID(), array());
             foreach ($uris as $uri) {
                 $impl = $uri->getArtifactImplementation();
                 if ($impl->isExternalLink()) {
                     $links[] = $impl->renderLink();
                 }
             }
         }
         if ($links) {
             $links = phutil_implode_html(" · ", $links);
             $item->setNote($links);
         }
         $status = $build->getBuildStatus();
         $status_name = HarbormasterBuildStatus::getBuildStatusName($status);
         $icon = HarbormasterBuildStatus::getBuildStatusIcon($status);
         $color = HarbormasterBuildStatus::getBuildStatusColor($status);
         $item->setIcon($icon, $color, $status_name);
         $status_view->addItem($item);
     }
     $view = $ui_event->getValue('view');
     $view->addProperty(pht('Build Status'), $status_view);
 }