@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 AlmanacServiceViewController
4 extends AlmanacServiceController {
5
6 public function shouldAllowPublic() {
7 return true;
8 }
9
10 public function handleRequest(AphrontRequest $request) {
11 $viewer = $request->getViewer();
12
13 $name = $request->getURIData('name');
14
15 $service = id(new AlmanacServiceQuery())
16 ->setViewer($viewer)
17 ->withNames(array($name))
18 ->needProperties(true)
19 ->executeOne();
20 if (!$service) {
21 return new Aphront404Response();
22 }
23
24 $title = pht('Service %s', $service->getName());
25
26 $curtain = $this->buildCurtain($service);
27 $details = $this->buildPropertySection($service);
28
29 $header = id(new PHUIHeaderView())
30 ->setUser($viewer)
31 ->setHeader($service->getName())
32 ->setPolicyObject($service)
33 ->setHeaderIcon('fa-plug');
34
35 $issue = null;
36 if ($service->isClusterService()) {
37 $issue = $this->addClusterMessage(
38 pht('This is a cluster service.'),
39 pht(
40 'This service is a cluster service. You do not have permission to '.
41 'edit cluster services, so you can not edit this service.'));
42 }
43
44 $bindings = $this->buildBindingList($service);
45
46 $crumbs = $this->buildApplicationCrumbs();
47 $crumbs->addTextCrumb($service->getName());
48 $crumbs->setBorder(true);
49
50 $timeline = $this->buildTransactionTimeline(
51 $service,
52 new AlmanacServiceTransactionQuery());
53 $timeline->setShouldTerminate(true);
54
55 $view = id(new PHUITwoColumnView())
56 ->setHeader($header)
57 ->setCurtain($curtain)
58 ->setMainColumn(array(
59 $issue,
60 $details,
61 $bindings,
62 $this->buildAlmanacPropertiesTable($service),
63 $timeline,
64 ));
65
66 return $this->newPage()
67 ->setTitle($title)
68 ->setCrumbs($crumbs)
69 ->appendChild($view);
70 }
71
72 private function buildPropertySection(
73 AlmanacService $service) {
74 $viewer = $this->getViewer();
75
76 $properties = id(new PHUIPropertyListView())
77 ->setUser($viewer);
78
79 $properties->addProperty(
80 pht('Service Type'),
81 $service->getServiceImplementation()->getServiceTypeShortName());
82
83 return id(new PHUIObjectBoxView())
84 ->setHeaderText(pht('Details'))
85 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
86 ->appendChild($properties);
87 }
88
89 private function buildCurtain(AlmanacService $service) {
90 $viewer = $this->getViewer();
91
92 $can_edit = PhabricatorPolicyFilter::hasCapability(
93 $viewer,
94 $service,
95 PhabricatorPolicyCapability::CAN_EDIT);
96
97 $id = $service->getID();
98 $edit_uri = $this->getApplicationURI("service/edit/{$id}/");
99
100 $curtain = $this->newCurtainView($service);
101
102 $curtain->addAction(
103 id(new PhabricatorActionView())
104 ->setIcon('fa-pencil')
105 ->setName(pht('Edit Service'))
106 ->setHref($edit_uri)
107 ->setWorkflow(!$can_edit)
108 ->setDisabled(!$can_edit));
109
110 return $curtain;
111 }
112
113 private function buildBindingList(AlmanacService $service) {
114 $viewer = $this->getViewer();
115 $id = $service->getID();
116
117 $can_edit = PhabricatorPolicyFilter::hasCapability(
118 $viewer,
119 $service,
120 PhabricatorPolicyCapability::CAN_EDIT);
121
122 $bindings = id(new AlmanacBindingQuery())
123 ->setViewer($viewer)
124 ->withServicePHIDs(array($service->getPHID()))
125 ->execute();
126
127 $table = id(new AlmanacBindingTableView())
128 ->setNoDataString(
129 pht('This service has not been bound to any device interfaces yet.'))
130 ->setUser($viewer)
131 ->setBindings($bindings)
132 ->setHideServiceColumn(true);
133
134 $header = id(new PHUIHeaderView())
135 ->setHeader(pht('Service Bindings'))
136 ->addActionLink(
137 id(new PHUIButtonView())
138 ->setTag('a')
139 ->setHref($this->getApplicationURI("binding/edit/?serviceID={$id}"))
140 ->setWorkflow(!$can_edit)
141 ->setDisabled(!$can_edit)
142 ->setText(pht('Add Binding'))
143 ->setIcon('fa-plus'));
144
145 return id(new PHUIObjectBoxView())
146 ->setHeader($header)
147 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
148 ->setTable($table);
149 }
150
151}