@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at upstream/main 75 lines 1.8 kB view raw
1<?php 2 3final class PhabricatorProjectHovercardEngineExtension 4 extends PhabricatorHovercardEngineExtension { 5 6 const EXTENSIONKEY = 'project.card'; 7 8 public function isExtensionEnabled() { 9 return true; 10 } 11 12 public function getExtensionName() { 13 return pht('Project Card'); 14 } 15 16 public function canRenderObjectHovercard($object) { 17 return ($object instanceof PhabricatorProject); 18 } 19 20 public function willRenderHovercards(array $objects) { 21 $viewer = $this->getViewer(); 22 $phids = mpull($objects, 'getPHID'); 23 24 $projects = id(new PhabricatorProjectQuery()) 25 ->setViewer($viewer) 26 ->withPHIDs($phids) 27 ->needImages(true) 28 ->execute(); 29 $projects = mpull($projects, null, 'getPHID'); 30 31 $custom_fields = array(); 32 foreach ($projects as $project) { 33 $field = PhabricatorCustomField::getObjectField( 34 $project, 35 PhabricatorCustomField::ROLE_VIEW, 36 'std:project:internal:description'); 37 if ($field === null) { 38 // This means the field is disabled, it would always be null. 39 break; 40 } 41 $field 42 ->setViewer($viewer) 43 ->readValueFromObject($project); 44 $custom_fields[] = $field; 45 } 46 47 id(new PhabricatorCustomFieldStorageQuery()) 48 ->addFields($custom_fields) 49 ->execute(); 50 51 return array( 52 'projects' => $projects, 53 ); 54 } 55 56 public function renderHovercard( 57 PHUIHovercardView $hovercard, 58 PhabricatorObjectHandle $handle, 59 $object, 60 $data) { 61 $viewer = $this->getViewer(); 62 63 $project = idx($data['projects'], $object->getPHID()); 64 if (!$project) { 65 return; 66 } 67 68 $project_card = id(new PhabricatorProjectCardView()) 69 ->setProject($project) 70 ->setViewer($viewer); 71 72 $hovercard->appendChild($project_card); 73 } 74 75}