private function buildBadgesView(PhabricatorUser $user)
 {
     $viewer = $this->getViewer();
     $class = 'PhabricatorBadgesApplication';
     $box = null;
     if (PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) {
         $badge_phids = $user->getBadgePHIDs();
         if ($badge_phids) {
             $badges = id(new PhabricatorBadgesQuery())->setViewer($viewer)->withPHIDs($badge_phids)->withStatuses(array(PhabricatorBadgesBadge::STATUS_ACTIVE))->execute();
             $flex = new PHUIBadgeBoxView();
             foreach ($badges as $badge) {
                 $item = id(new PHUIBadgeView())->setIcon($badge->getIcon())->setHeader($badge->getName())->setSubhead($badge->getFlavor())->setQuality($badge->getQuality());
                 $flex->addItem($item);
             }
             $box = id(new PHUIObjectBoxView())->setHeaderText(pht('Badges'))->appendChild($flex)->setBackground(PHUIBoxView::GREY);
         }
     }
     return $box;
 }
 public function renderExample()
 {
     $badges1 = array();
     $badges1[] = id(new PHUIBadgeView())->setIcon('fa-users')->setHeader(pht('Phacility High Command'))->setHref('/')->setSource('Projects (automatic)')->addByline(pht('Dec 31, 1969'))->addByline('3 Members');
     $badges1[] = id(new PHUIBadgeView())->setIcon('fa-lock')->setHeader(pht('Blessed Committers'))->setSource('Projects (automatic)')->addByline(pht('Dec 31, 1969'))->addByline('12 Members');
     $badges1[] = id(new PHUIBadgeView())->setIcon('fa-camera-retro')->setHeader(pht('Design'))->setSource('Projects (automatic)')->addByline(pht('Dec 31, 1969'))->addByline('2 Members');
     $badges1[] = id(new PHUIBadgeView())->setIcon('fa-lock')->setHeader(pht('Blessed Reviewers'))->setSource('Projects (automatic)')->addByline(pht('Dec 31, 1969'))->addByline('3 Members');
     $badges1[] = id(new PHUIBadgeView())->setIcon('fa-umbrella')->setHeader(pht('Wikipedia'))->setSource('Projects (automatic)')->addByline(pht('Dec 31, 1969'))->addByline('22 Members');
     $badges2 = array();
     $badges2[] = id(new PHUIBadgeView())->setIcon('fa-user')->setHeader(pht('Phabricator User'))->setSubhead(pht('Confirmed your account.'))->setQuality(PHUIBadgeView::POOR)->setSource(pht('People (automatic)'))->addByline(pht('Dec 31, 1969'))->addByline('212 Issued (100%)');
     $badges2[] = id(new PHUIBadgeView())->setIcon('fa-code')->setHeader(pht('Code Contributor'))->setSubhead(pht('Wrote code that was acceptable'))->setQuality(PHUIBadgeView::COMMON)->setSource('Diffusion (automatic)')->addByline(pht('Dec 31, 1969'))->addByline('200 Awarded (98%)');
     $badges2[] = id(new PHUIBadgeView())->setIcon('fa-bug')->setHeader(pht('Task Master'))->setSubhead(pht('Closed over 100 tasks'))->setQuality(PHUIBadgeView::UNCOMMON)->setSource('Maniphest (automatic)')->addByline(pht('Dec 31, 1969'))->addByline('56 Awarded (43%)');
     $badges2[] = id(new PHUIBadgeView())->setIcon('fa-star')->setHeader(pht('Code Weaver'))->setSubhead(pht('Landed 1,000 Commits'))->setQuality(PHUIBadgeView::RARE)->setSource('Diffusion (automatic)')->addByline(pht('Dec 31, 1969'))->addByline('42 Awarded (20%)');
     $badges2[] = id(new PHUIBadgeView())->setIcon('fa-users')->setHeader(pht('Security Team'))->setSubhead(pht('<script>alert(1);</script>'))->setQuality(PHUIBadgeView::EPIC)->setSource('Projects (automatic)')->addByline(pht('Dec 31, 1969'))->addByline('21 Awarded (10%)');
     $badges2[] = id(new PHUIBadgeView())->setIcon('fa-user')->setHeader(pht('Adminstrator'))->setSubhead(pht('Drew the short stick'))->setQuality(PHUIBadgeView::LEGENDARY)->setSource(pht('People (automatic)'))->addByline(pht('Dec 31, 1969'))->addByline('3 Awarded (1.4%)');
     $badges2[] = id(new PHUIBadgeView())->setIcon('fa-compass')->setHeader(pht('Lead Developer'))->setSubhead(pht('Lead Developer of Phabricator'))->setQuality(PHUIBadgeView::HEIRLOOM)->setSource(pht('Direct Award (epriestley)'))->addByline(pht('Dec 31, 1969'))->addByline('1 Awarded (0.4%)');
     $badges3 = array();
     $badges3[] = id(new PHUIBadgeMiniView())->setIcon('fa-book')->setHeader(pht('Documenter'));
     $badges3[] = id(new PHUIBadgeMiniView())->setIcon('fa-star')->setHeader(pht('Contributor'));
     $badges3[] = id(new PHUIBadgeMiniView())->setIcon('fa-bug')->setHeader(pht('Bugmeister'));
     $badges3[] = id(new PHUIBadgeMiniView())->setIcon('fa-heart')->setHeader(pht('Funder'))->setQuality(PHUIBadgeView::UNCOMMON);
     $badges3[] = id(new PHUIBadgeMiniView())->setIcon('fa-user')->setHeader(pht('Administrator'))->setQuality(PHUIBadgeView::RARE);
     $badges3[] = id(new PHUIBadgeMiniView())->setIcon('fa-camera-retro')->setHeader(pht('Designer'))->setQuality(PHUIBadgeView::EPIC);
     $flex1 = new PHUIBadgeBoxView();
     $flex1->addItems($badges1);
     $box1 = id(new PHUIObjectBoxView())->setHeaderText(pht('Project Membership'))->appendChild($flex1);
     $flex2 = new PHUIBadgeBoxView();
     $flex2->addItems($badges2);
     $box2 = id(new PHUIObjectBoxView())->setHeaderText(pht('Achievements'))->appendChild($flex2);
     $flex3 = new PHUIBadgeBoxView();
     $flex3->addItems($badges3);
     $flex3->setCollapsed(true);
     $flex3->addClass('ml');
     $box3 = id(new PHUIObjectBoxView())->setHeaderText(pht('PHUIBadgeMiniView'))->appendChild($flex3);
     return array($box1, $box2, $box3);
 }
 private function buildBadgesView(PhabricatorUser $user)
 {
     $viewer = $this->getViewer();
     $class = 'PhabricatorBadgesApplication';
     if (!PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) {
         return null;
     }
     $badge_phids = $user->getBadgePHIDs();
     if ($badge_phids) {
         $badges = id(new PhabricatorBadgesQuery())->setViewer($viewer)->withPHIDs($badge_phids)->withStatuses(array(PhabricatorBadgesBadge::STATUS_ACTIVE))->execute();
         $flex = new PHUIBadgeBoxView();
         foreach ($badges as $badge) {
             $item = id(new PHUIBadgeView())->setIcon($badge->getIcon())->setHeader($badge->getName())->setSubhead($badge->getFlavor())->setQuality($badge->getQuality());
             $flex->addItem($item);
         }
     } else {
         $error = id(new PHUIBoxView())->addClass('mlb')->appendChild(pht('User does not have any badges.'));
         $flex = id(new PHUIInfoView())->setSeverity(PHUIInfoView::SEVERITY_NODATA)->appendChild($error);
     }
     $box = id(new PHUIObjectBoxView())->setHeaderText(pht('Badges'))->addClass('project-view-badges')->appendChild($flex)->setBackground(PHUIObjectBoxView::GREY);
     return $box;
 }
 public function render()
 {
     $events = $this->getEventGroup();
     // Move events with icons first.
     $icon_keys = array();
     foreach ($this->getEventGroup() as $key => $event) {
         if ($event->icon) {
             $icon_keys[] = $key;
         }
     }
     $events = array_select_keys($events, $icon_keys) + $events;
     $force_icon = (bool) $icon_keys;
     $menu = null;
     $items = array();
     $has_menu = false;
     if (!$this->getIsPreview() && !$this->getHideCommentOptions()) {
         foreach ($this->getEventGroup() as $event) {
             $items[] = $event->getMenuItems($this->anchor);
             if ($event->hasChildren()) {
                 $has_menu = true;
             }
         }
         $items = array_mergev($items);
     }
     if ($items || $has_menu) {
         $icon = id(new PHUIIconView())->setIcon('fa-caret-down');
         $aural = javelin_tag('span', array('aural' => true), pht('Comment Actions'));
         if ($items) {
             $sigil = 'phui-dropdown-menu';
             Javelin::initBehavior('phui-dropdown-menu');
         } else {
             $sigil = null;
         }
         $action_list = id(new PhabricatorActionListView())->setUser($this->getUser());
         foreach ($items as $item) {
             $action_list->addAction($item);
         }
         $menu = javelin_tag($items ? 'a' : 'span', array('href' => '#', 'class' => 'phui-timeline-menu', 'sigil' => $sigil, 'aria-haspopup' => 'true', 'aria-expanded' => 'false', 'meta' => $action_list->getDropdownMenuMetadata()), array($aural, $icon));
         $has_menu = true;
     }
     // Render "extra" information (timestamp, etc).
     $extra = $this->renderExtra($events);
     $show_badges = false;
     $group_titles = array();
     $group_items = array();
     $group_children = array();
     foreach ($events as $event) {
         if ($event->shouldRenderEventTitle()) {
             $group_titles[] = $event->renderEventTitle($force_icon, $has_menu, $extra);
             // Don't render this information more than once.
             $extra = null;
         }
         if ($event->hasChildren()) {
             $group_children[] = $event->renderChildren();
             $show_badges = true;
         }
     }
     $image_uri = $this->userHandle->getImageURI();
     $wedge = phutil_tag('div', array('class' => 'phui-timeline-wedge phui-timeline-border', 'style' => nonempty($image_uri) ? '' : 'display: none;'), '');
     $image = null;
     $badges = null;
     if ($image_uri) {
         $image = phutil_tag($this->userHandle->getURI() ? 'a' : 'div', array('style' => 'background-image: url(' . $image_uri . ')', 'class' => 'phui-timeline-image', 'href' => $this->userHandle->getURI()), '');
         if ($this->badges && $show_badges) {
             $flex = new PHUIBadgeBoxView();
             $flex->addItems($this->badges);
             $flex->setCollapsed(true);
             $badges = phutil_tag('div', array('class' => 'phui-timeline-badges'), $flex);
         }
     }
     $content_classes = array();
     $content_classes[] = 'phui-timeline-content';
     $classes = array();
     $classes[] = 'phui-timeline-event-view';
     if ($group_children) {
         $classes[] = 'phui-timeline-major-event';
         $content = phutil_tag('div', array('class' => 'phui-timeline-inner-content'), array($group_titles, $menu, phutil_tag('div', array('class' => 'phui-timeline-core-content'), $group_children)));
     } else {
         $classes[] = 'phui-timeline-minor-event';
         $content = $group_titles;
     }
     $content = phutil_tag('div', array('class' => 'phui-timeline-group phui-timeline-border'), $content);
     $content = phutil_tag('div', array('class' => implode(' ', $content_classes)), array($image, $badges, $wedge, $content));
     $outer_classes = $this->classes;
     $outer_classes[] = 'phui-timeline-shell';
     $color = null;
     foreach ($this->getEventGroup() as $event) {
         if ($event->color) {
             $color = $event->color;
             break;
         }
     }
     if ($color) {
         $outer_classes[] = 'phui-timeline-' . $color;
     }
     $sigil = null;
     $meta = null;
     if ($this->getTransactionPHID()) {
         $sigil = 'transaction';
         $meta = array('phid' => $this->getTransactionPHID(), 'anchor' => $this->anchor);
     }
     $major_event = null;
     if ($this->reallyMajorEvent) {
         $major_event = phutil_tag('div', array('class' => 'phui-timeline-event-view ' . 'phui-timeline-spacer ' . 'phui-timeline-spacer-bold', ''));
     }
     return array(javelin_tag('div', array('class' => implode(' ', $outer_classes), 'id' => $this->anchor ? 'anchor-' . $this->anchor : null, 'sigil' => $sigil, 'meta' => $meta), phutil_tag('div', array('class' => implode(' ', $classes)), $content)), $major_event);
 }
 protected function getTagContent()
 {
     if ($this->actionList || $this->actionListID) {
         $action_button = id(new PHUIButtonView())->setTag('a')->setText(pht('Actions'))->setHref('#')->setIcon('fa-bars')->addClass('phui-mobile-menu');
         if ($this->actionList) {
             $action_button->setDropdownMenu($this->actionList);
         } else {
             if ($this->actionListID) {
                 $action_button->setDropdownMenuID($this->actionListID);
             }
         }
         $this->addActionLink($action_button);
     }
     $image = null;
     if ($this->image) {
         $image_href = null;
         if ($this->imageURL) {
             $image_href = $this->imageURL;
         } else {
             if ($this->imageEditURL) {
                 $image_href = $this->imageEditURL;
             }
         }
         $image = phutil_tag('span', array('class' => 'phui-header-image', 'style' => 'background-image: url(' . $this->image . ')'));
         if ($image_href) {
             $edit_view = null;
             if ($this->imageEditURL) {
                 $edit_view = phutil_tag('span', array('class' => 'phui-header-image-edit'), pht('Edit'));
             }
             $image = phutil_tag('a', array('href' => $image_href, 'class' => 'phui-header-image-href'), array($image, $edit_view));
         }
     }
     $viewer = $this->getUser();
     $left = array();
     $right = array();
     $space_header = null;
     if ($viewer) {
         $space_header = id(new PHUISpacesNamespaceContextView())->setUser($viewer)->setObject($this->policyObject);
     }
     if ($this->actionLinks) {
         $actions = array();
         foreach ($this->actionLinks as $button) {
             $button->setColor(PHUIButtonView::GREY);
             $button->addClass(PHUI::MARGIN_SMALL_LEFT);
             $button->addClass('phui-header-action-link');
             $actions[] = $button;
         }
         $right[] = phutil_tag('div', array('class' => 'phui-header-action-links'), $actions);
     }
     if ($this->buttonBar) {
         $right[] = phutil_tag('div', array('class' => 'phui-header-action-links'), $this->buttonBar);
     }
     if ($this->actionItems) {
         $action_list = array();
         if ($this->actionItems) {
             foreach ($this->actionItems as $item) {
                 $action_list[] = phutil_tag('li', array('class' => 'phui-header-action-item'), $item);
             }
         }
         $right[] = phutil_tag('ul', array('class' => 'phui-header-action-list'), $action_list);
     }
     $icon = null;
     if ($this->headerIcon) {
         $icon = id(new PHUIIconView())->setIcon($this->headerIcon)->addClass('phui-header-icon');
     }
     $header_content = $this->header;
     $href = $this->getHref();
     if ($href !== null) {
         $header_content = phutil_tag('a', array('href' => $href), $header_content);
     }
     $left[] = phutil_tag('span', array('class' => 'phui-header-header'), array($space_header, $icon, $header_content));
     if ($this->subheader || $this->badges) {
         $badges = null;
         if ($this->badges) {
             $badges = new PHUIBadgeBoxView();
             $badges->addItems($this->badges);
             $badges->setCollapsed(true);
         }
         $left[] = phutil_tag('div', array('class' => 'phui-header-subheader'), array($badges, $this->subheader));
     }
     if ($this->properties || $this->policyObject || $this->tags) {
         $property_list = array();
         foreach ($this->properties as $type => $property) {
             switch ($type) {
                 case self::PROPERTY_STATUS:
                     $property_list[] = $property;
                     break;
                 default:
                     throw new Exception(pht('Incorrect Property Passed'));
                     break;
             }
         }
         if ($this->policyObject) {
             $property_list[] = $this->renderPolicyProperty($this->policyObject);
         }
         if ($this->tags) {
             $property_list[] = $this->tags;
         }
         $left[] = phutil_tag('div', array('class' => 'phui-header-subheader'), $property_list);
     }
     // We here at @phabricator
     $header_image = null;
     if ($image) {
         $header_image = phutil_tag('div', array('class' => 'phui-header-col1'), $image);
     }
     // All really love
     $header_left = phutil_tag('div', array('class' => 'phui-header-col2'), $left);
     // Tables and Pokemon.
     $header_right = phutil_tag('div', array('class' => 'phui-header-col3'), $right);
     $header_row = phutil_tag('div', array('class' => 'phui-header-row'), array($header_image, $header_left, $header_right));
     return phutil_tag('h1', array('class' => 'phui-header-view'), $header_row);
 }
 protected function getTagContent()
 {
     $image = null;
     if ($this->image) {
         $image = phutil_tag($this->imageURL ? 'a' : 'span', array('href' => $this->imageURL, 'class' => 'phui-header-image', 'style' => 'background-image: url(' . $this->image . ')'), ' ');
     }
     $viewer = $this->getUser();
     $left = array();
     $right = array();
     if ($viewer) {
         $left[] = id(new PHUISpacesNamespaceContextView())->setUser($viewer)->setObject($this->policyObject);
     }
     if ($this->objectName) {
         $left[] = array(phutil_tag('a', array('href' => '/' . $this->objectName), $this->objectName), ' ');
     }
     if ($this->actionLinks) {
         $actions = array();
         foreach ($this->actionLinks as $button) {
             $button->setColor(PHUIButtonView::SIMPLE);
             $button->addClass(PHUI::MARGIN_SMALL_LEFT);
             $button->addClass('phui-header-action-link');
             $actions[] = $button;
         }
         $right[] = phutil_tag('div', array('class' => 'phui-header-action-links'), $actions);
     }
     if ($this->buttonBar) {
         $right[] = phutil_tag('div', array('class' => 'phui-header-action-links'), $this->buttonBar);
     }
     if ($this->actionIcons || $this->tags) {
         $action_list = array();
         if ($this->actionIcons) {
             foreach ($this->actionIcons as $icon) {
                 $action_list[] = phutil_tag('li', array('class' => 'phui-header-action-icon'), $icon);
             }
         }
         if ($this->tags) {
             $action_list[] = phutil_tag('li', array('class' => 'phui-header-action-tag'), array_interleave(' ', $this->tags));
         }
         $right[] = phutil_tag('ul', array('class' => 'phui-header-action-list'), $action_list);
     }
     if ($this->headerIcon) {
         $icon = id(new PHUIIconView())->setIconFont($this->headerIcon);
         $left[] = $icon;
     }
     $left[] = phutil_tag('span', array('class' => 'phui-header-header'), $this->header);
     if ($this->subheader || $this->badges) {
         $badges = null;
         if ($this->badges) {
             $badges = new PHUIBadgeBoxView();
             $badges->addItems($this->badges);
             $badges->setCollapsed(true);
         }
         $left[] = phutil_tag('div', array('class' => 'phui-header-subheader'), array($badges, $this->subheader));
     }
     if ($this->properties || $this->policyObject) {
         $property_list = array();
         foreach ($this->properties as $type => $property) {
             switch ($type) {
                 case self::PROPERTY_STATUS:
                     $property_list[] = $property;
                     break;
                 default:
                     throw new Exception(pht('Incorrect Property Passed'));
                     break;
             }
         }
         if ($this->policyObject) {
             $property_list[] = $this->renderPolicyProperty($this->policyObject);
         }
         $left[] = phutil_tag('div', array('class' => 'phui-header-subheader'), $property_list);
     }
     // We here at @phabricator
     $header_image = null;
     if ($image) {
         $header_image = phutil_tag('div', array('class' => 'phui-header-col1'), $image);
     }
     // All really love
     $header_left = phutil_tag('div', array('class' => 'phui-header-col2'), $left);
     // Tables and Pokemon.
     $header_right = phutil_tag('div', array('class' => 'phui-header-col3'), $right);
     $header_row = phutil_tag('div', array('class' => 'phui-header-row'), array($header_image, $header_left, $header_right));
     return phutil_tag('h1', array('class' => 'phui-header-view'), $header_row);
 }
 private function buildBadgesView(PhabricatorUser $user)
 {
     $viewer = $this->getViewer();
     $class = 'PhabricatorBadgesApplication';
     if (!PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) {
         return null;
     }
     $awards = array();
     $badges = array();
     if ($user->getBadgePHIDs()) {
         $awards = id(new PhabricatorBadgesAwardQuery())->setViewer($viewer)->withRecipientPHIDs(array($user->getPHID()))->execute();
         $awards = mpull($awards, null, 'getBadgePHID');
         $badges = array();
         foreach ($awards as $award) {
             $badge = $award->getBadge();
             if ($badge->getStatus() == PhabricatorBadgesBadge::STATUS_ACTIVE) {
                 $badges[$award->getBadgePHID()] = $badge;
             }
         }
     }
     if (count($badges)) {
         $flex = new PHUIBadgeBoxView();
         foreach ($badges as $badge) {
             if ($badge) {
                 $awarder_info = array();
                 $award = idx($awards, $badge->getPHID(), null);
                 $awarder_phid = $award->getAwarderPHID();
                 $awarder_handle = $viewer->renderHandle($awarder_phid);
                 $awarder_info = pht('Awarded by %s', $awarder_handle->render());
                 $item = id(new PHUIBadgeView())->setIcon($badge->getIcon())->setHeader($badge->getName())->setSubhead($badge->getFlavor())->setQuality($badge->getQuality())->setHref($badge->getViewURI())->addByLine($awarder_info);
                 $flex->addItem($item);
             }
         }
     } else {
         $error = id(new PHUIBoxView())->addClass('mlb')->appendChild(pht('User does not have any badges.'));
         $flex = id(new PHUIInfoView())->setSeverity(PHUIInfoView::SEVERITY_NODATA)->appendChild($error);
     }
     // Best option?
     $badges = id(new PhabricatorBadgesQuery())->setViewer($viewer)->withStatuses(array(PhabricatorBadgesBadge::STATUS_ACTIVE))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->execute();
     $button = id(new PHUIButtonView())->setTag('a')->setIcon('fa-plus')->setText(pht('Award'))->setWorkflow(true)->setHref('/badges/award/' . $user->getID() . '/');
     $can_award = false;
     if (count($badges)) {
         $can_award = true;
     }
     $header = id(new PHUIHeaderView())->setHeader(pht('Badges'));
     if (count($badges)) {
         $header->addActionLink($button);
     }
     $box = id(new PHUIObjectBoxView())->setHeader($header)->addClass('project-view-badges')->appendChild($flex)->setBackground(PHUIObjectBoxView::GREY);
     return $box;
 }