@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
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}