@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 NuanceSourceViewController
4 extends NuanceSourceController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $this->getViewer();
8
9 $source = id(new NuanceSourceQuery())
10 ->setViewer($viewer)
11 ->withIDs(array($request->getURIData('id')))
12 ->executeOne();
13 if (!$source) {
14 return new Aphront404Response();
15 }
16
17 $source_id = $source->getID();
18
19 $header = $this->buildHeaderView($source);
20 $curtain = $this->buildCurtain($source);
21 $properties = $this->buildPropertyView($source);
22
23 $title = $source->getName();
24
25 $routing_list = id(new PHUIPropertyListView())
26 ->addProperty(
27 pht('Default Queue'),
28 $viewer->renderHandle($source->getDefaultQueuePHID()));
29
30 $crumbs = $this->buildApplicationCrumbs();
31 $crumbs->addTextCrumb(pht('Sources'), $this->getApplicationURI('source/'));
32 $crumbs->addTextCrumb($title);
33 $crumbs->setBorder(true);
34
35 $timeline = $this->buildTransactionTimeline(
36 $source,
37 new NuanceSourceTransactionQuery());
38 $timeline->setShouldTerminate(true);
39
40 $view = id(new PHUITwoColumnView())
41 ->setHeader($header)
42 ->setCurtain($curtain)
43 ->addPropertySection(pht('Details'), $properties)
44 ->addPropertySection(pht('Routing'), $routing_list)
45 ->setMainColumn($timeline);
46
47 return $this->newPage()
48 ->setTitle($title)
49 ->setCrumbs($crumbs)
50 ->appendChild($view);
51 }
52
53 private function buildHeaderView(NuanceSource $source) {
54 $viewer = $this->getViewer();
55
56 $header = id(new PHUIHeaderView())
57 ->setUser($viewer)
58 ->setHeader($source->getName())
59 ->setPolicyObject($source);
60
61 return $header;
62 }
63
64 private function buildCurtain(NuanceSource $source) {
65 $viewer = $this->getViewer();
66 $id = $source->getID();
67
68 $actions = id(new PhabricatorActionListView())
69 ->setUser($viewer);
70
71 $can_edit = PhabricatorPolicyFilter::hasCapability(
72 $viewer,
73 $source,
74 PhabricatorPolicyCapability::CAN_EDIT);
75
76 $curtain = $this->newCurtainView($source);
77
78 $curtain->addAction(
79 id(new PhabricatorActionView())
80 ->setName(pht('Edit Source'))
81 ->setIcon('fa-pencil')
82 ->setHref($this->getApplicationURI("source/edit/{$id}/"))
83 ->setDisabled(!$can_edit)
84 ->setWorkflow(!$can_edit));
85
86 $request = $this->getRequest();
87 $definition = $source->getDefinition();
88
89 $definition
90 ->setViewer($viewer)
91 ->setSource($source);
92
93 $source_actions = $definition->getSourceViewActions($request);
94 foreach ($source_actions as $source_action) {
95 $curtain->addAction($source_action);
96 }
97
98 return $curtain;
99 }
100
101 private function buildPropertyView(
102 NuanceSource $source) {
103 $viewer = $this->getViewer();
104
105 $properties = id(new PHUIPropertyListView())
106 ->setViewer($viewer);
107
108 $definition = $source->getDefinition();
109
110 $properties->addProperty(
111 pht('Source Type'),
112 $definition->getName());
113
114 return $properties;
115 }
116}