private function handleHovercardEvent($event) { $viewer = $event->getUser(); $hovercard = $event->getValue('hovercard'); $object_handle = $event->getValue('handle'); $phid = $object_handle->getPHID(); $rev = $event->getValue('object'); if (!$rev instanceof DifferentialRevision) { return; } $rev->loadRelationships(); $reviewer_phids = $rev->getReviewers(); $e_task = DifferentialRevisionHasTaskEdgeType::EDGECONST; $edge_query = id(new PhabricatorEdgeQuery())->withSourcePHIDs(array($phid))->withEdgeTypes(array($e_task)); $edge_query->execute(); $tasks = $edge_query->getDestinationPHIDs(); $phids = array_merge(array($rev->getAuthorPHID()), $reviewer_phids, $tasks); $handles = id(new PhabricatorHandleQuery())->setViewer($viewer)->withPHIDs($phids)->execute(); $hovercard->setTitle('D' . $rev->getID()); $hovercard->setDetail($rev->getTitle()); $hovercard->addField(pht('Author'), $handles[$rev->getAuthorPHID()]->renderLink()); $hovercard->addField(pht('Date'), phabricator_datetime($rev->getDateModified(), $viewer)); $hovercard->addField(pht('Reviewers'), implode_selected_handle_links(', ', $handles, $reviewer_phids)); if ($tasks) { $hovercard->addField(pht('Task(s)', count($tasks)), implode_selected_handle_links(', ', $handles, $tasks)); } if ($rev->getSummary()) { $hovercard->addField(pht('Summary'), id(new PhutilUTF8StringTruncator())->setMaximumGlyphs(120)->truncateString($rev->getSummary())); } $hovercard->addTag(DifferentialRevisionDetailView::renderTagForRevision($rev)); $event->setValue('hovercard', $hovercard); }
private function handleHovercardEvent(PhutilEvent $event) { $viewer = $event->getUser(); $hovercard = $event->getValue('hovercard'); $handle = $event->getValue('handle'); $phid = $handle->getPHID(); $task = $event->getValue('object'); if (!$task instanceof ManiphestTask) { return; } // Fun with "Unbeta Pholio", hua hua $e_dep_on = PhabricatorEdgeConfig::TYPE_TASK_DEPENDS_ON_TASK; $e_dep_by = PhabricatorEdgeConfig::TYPE_TASK_DEPENDED_ON_BY_TASK; $edge_query = id(new PhabricatorEdgeQuery())->withSourcePHIDs(array($phid))->withEdgeTypes(array($e_dep_on, $e_dep_by)); $edges = idx($edge_query->execute(), $phid); $edge_phids = $edge_query->getDestinationPHIDs(); $owner_phid = $task->getOwnerPHID(); $project_phids = $task->getProjectPHIDs(); $phids = array_filter(array_merge(array($owner_phid), $edge_phids, $project_phids)); $viewer_handles = $this->loadHandles($phids, $viewer); $hovercard->setTitle(pht('T%d', $task->getID()))->setDetail($task->getTitle()); $owner = phutil_tag('em', array(), pht('None')); if ($owner_phid) { $owner = $viewer_handles[$owner_phid]->renderLink(); } $hovercard->addField(pht('Assigned to'), $owner); if ($project_phids) { $hovercard->addField(pht('Projects'), implode_selected_handle_links(', ', $viewer_handles, $project_phids)); } if ($edge_phids) { $edge_types = array(PhabricatorEdgeConfig::TYPE_TASK_DEPENDED_ON_BY_TASK => pht('Dependent Tasks'), PhabricatorEdgeConfig::TYPE_TASK_DEPENDS_ON_TASK => pht('Depends On')); $max_count = 6; foreach ($edge_types as $edge_type => $edge_name) { if ($edges[$edge_type]) { // TODO: This can be made more sophisticated. We still load all // edges into memory. Only load the ones we need. $edge_overflow = array(); if (count($edges[$edge_type]) > $max_count) { $edges[$edge_type] = array_slice($edges[$edge_type], 0, 6, true); $edge_overflow = ', ...'; } $hovercard->addField($edge_name, implode_selected_handle_links(', ', $viewer_handles, array_keys($edges[$edge_type]))->appendHTML($edge_overflow)); } } } $hovercard->addTag(ManiphestView::renderTagForTask($task)); $event->setValue('hovercard', $hovercard); }
/** * Render a list of links to handles, identified by PHIDs. The handles must * already be loaded. * * @param list<phid> List of PHIDs to render links to. * @param string Style, one of "\n" (to put each item on its own line) * or "," (to list items inline, separated by commas). * @return string Rendered list of handle links. */ protected function renderHandlesForPHIDs(array $phids, $style = "\n") { $style_map = array("\n" => phutil_tag('br'), ',' => ', '); if (empty($style_map[$style])) { throw new Exception("Unknown handle list style '{$style}'!"); } return implode_selected_handle_links($style_map[$style], $this->getLoadedHandles(), array_filter($phids)); }