@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 PhabricatorPackagesPackageViewController
4 extends PhabricatorPackagesPackageController {
5
6 public function shouldAllowPublic() {
7 return true;
8 }
9
10 public function handleRequest(AphrontRequest $request) {
11 $viewer = $request->getViewer();
12
13 $publisher_key = $request->getURIData('publisherKey');
14 $package_key = $request->getURIData('packageKey');
15 $full_key = $publisher_key.'/'.$package_key;
16
17 $package = id(new PhabricatorPackagesPackageQuery())
18 ->setViewer($viewer)
19 ->withFullKeys(array($full_key))
20 ->executeOne();
21 if (!$package) {
22 return new Aphront404Response();
23 }
24
25 $publisher = $package->getPublisher();
26
27 $crumbs = $this->buildApplicationCrumbs()
28 ->addTextCrumb($publisher->getName(), $publisher->getURI())
29 ->addTextCrumb($package->getName())
30 ->setBorder(true);
31
32 $header = $this->buildHeaderView($package);
33 $curtain = $this->buildCurtain($package);
34
35 $versions_view = $this->buildVersionsView($package);
36
37 $timeline = $this->buildTransactionTimeline(
38 $package,
39 new PhabricatorPackagesPackageTransactionQuery());
40 $timeline->setShouldTerminate(true);
41
42 $package_view = id(new PHUITwoColumnView())
43 ->setHeader($header)
44 ->setCurtain($curtain)
45 ->setMainColumn(
46 array(
47 $versions_view,
48 $timeline,
49 ));
50
51 return $this->newPage()
52 ->setCrumbs($crumbs)
53 ->setPageObjectPHIDs(
54 array(
55 $package->getPHID(),
56 ))
57 ->appendChild($package_view);
58 }
59
60
61 private function buildHeaderView(PhabricatorPackagesPackage $package) {
62 $viewer = $this->getViewer();
63 $name = $package->getName();
64
65 return id(new PHUIHeaderView())
66 ->setViewer($viewer)
67 ->setHeader($name)
68 ->setPolicyObject($package)
69 ->setHeaderIcon('fa-gift');
70 }
71
72 private function buildCurtain(PhabricatorPackagesPackage $package) {
73 $viewer = $this->getViewer();
74 $curtain = $this->newCurtainView($package);
75
76 $can_edit = PhabricatorPolicyFilter::hasCapability(
77 $viewer,
78 $package,
79 PhabricatorPolicyCapability::CAN_EDIT);
80
81 $id = $package->getID();
82 $edit_uri = $this->getApplicationURI("package/edit/{$id}/");
83
84 $curtain->addAction(
85 id(new PhabricatorActionView())
86 ->setName(pht('Edit Package'))
87 ->setIcon('fa-pencil')
88 ->setDisabled(!$can_edit)
89 ->setHref($edit_uri));
90
91 return $curtain;
92 }
93
94 private function buildVersionsView(PhabricatorPackagesPackage $package) {
95 $viewer = $this->getViewer();
96
97 $versions = id(new PhabricatorPackagesVersionQuery())
98 ->setViewer($viewer)
99 ->withPackagePHIDs(array($package->getPHID()))
100 ->setLimit(25)
101 ->execute();
102
103 $versions_list = id(new PhabricatorPackagesVersionListView())
104 ->setViewer($viewer)
105 ->setVersions($versions);
106
107 $all_href = urisprintf(
108 'version/?package=%s#R',
109 $package->getPHID());
110 $all_href = $this->getApplicationURI($all_href);
111
112 $view_all = id(new PHUIButtonView())
113 ->setTag('a')
114 ->setIcon('fa-search')
115 ->setText(pht('View All'))
116 ->setHref($all_href);
117
118 $header = id(new PHUIHeaderView())
119 ->setHeader(pht('Versions'))
120 ->addActionLink($view_all);
121
122 $versions_view = id(new PHUIObjectBoxView())
123 ->setHeader($header)
124 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
125 ->setObjectList($versions_list);
126
127 return $versions_view;
128 }
129}