@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 PhabricatorAuthContactNumberViewController
4 extends PhabricatorAuthContactNumberController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $this->getViewer();
8
9 $sms_auth_factor = new PhabricatorSMSAuthFactor();
10 if ($sms_auth_factor->isSMSMailerConfigured()) {
11 $number = id(new PhabricatorAuthContactNumberQuery())
12 ->setViewer($viewer)
13 ->withIDs(array($request->getURIData('id')))
14 ->executeOne();
15 }
16 if (!isset($number) || !$number) {
17 return new Aphront404Response();
18 }
19
20 $crumbs = $this->buildApplicationCrumbs()
21 ->addTextCrumb($number->getObjectName())
22 ->setBorder(true);
23
24 $header = $this->buildHeaderView($number);
25 $properties = $this->buildPropertiesView($number);
26 $curtain = $this->buildCurtain($number);
27
28 $timeline = $this->buildTransactionTimeline(
29 $number,
30 new PhabricatorAuthContactNumberTransactionQuery());
31 $timeline->setShouldTerminate(true);
32
33 $view = id(new PHUITwoColumnView())
34 ->setHeader($header)
35 ->setCurtain($curtain)
36 ->setMainColumn(
37 array(
38 $timeline,
39 ))
40 ->addPropertySection(pht('Details'), $properties);
41
42 return $this->newPage()
43 ->setTitle($number->getDisplayName())
44 ->setCrumbs($crumbs)
45 ->setPageObjectPHIDs(
46 array(
47 $number->getPHID(),
48 ))
49 ->appendChild($view);
50 }
51
52 private function buildHeaderView(PhabricatorAuthContactNumber $number) {
53 $viewer = $this->getViewer();
54
55 $view = id(new PHUIHeaderView())
56 ->setViewer($viewer)
57 ->setHeader($number->getObjectName())
58 ->setPolicyObject($number);
59
60 if ($number->isDisabled()) {
61 $view->setStatus('fa-ban', 'red', pht('Disabled'));
62 } else if ($number->getIsPrimary()) {
63 $view->setStatus('fa-certificate', 'blue', pht('Primary'));
64 }
65
66 return $view;
67 }
68
69 private function buildPropertiesView(
70 PhabricatorAuthContactNumber $number) {
71 $viewer = $this->getViewer();
72
73 $view = id(new PHUIPropertyListView())
74 ->setViewer($viewer);
75
76 $view->addProperty(
77 pht('Owner'),
78 $viewer->renderHandle($number->getObjectPHID()));
79
80 $view->addProperty(pht('Contact Number'), $number->getDisplayName());
81
82 return $view;
83 }
84
85 private function buildCurtain(PhabricatorAuthContactNumber $number) {
86 $viewer = $this->getViewer();
87 $id = $number->getID();
88
89 $can_edit = PhabricatorPolicyFilter::hasCapability(
90 $viewer,
91 $number,
92 PhabricatorPolicyCapability::CAN_EDIT);
93
94 $curtain = $this->newCurtainView($number);
95
96 $curtain->addAction(
97 id(new PhabricatorActionView())
98 ->setName(pht('Edit Contact Number'))
99 ->setIcon('fa-pencil')
100 ->setHref($this->getApplicationURI("contact/edit/{$id}/"))
101 ->setDisabled(!$can_edit)
102 ->setWorkflow(!$can_edit));
103
104 $curtain->addAction(
105 id(new PhabricatorActionView())
106 ->setName(pht('Send Test Message'))
107 ->setIcon('fa-envelope-o')
108 ->setHref($this->getApplicationURI("contact/test/{$id}/"))
109 ->setDisabled(!$can_edit)
110 ->setWorkflow(true));
111
112 if ($number->isDisabled()) {
113 $disable_uri = $this->getApplicationURI("contact/enable/{$id}/");
114 $disable_name = pht('Enable Contact Number');
115 $disable_icon = 'fa-check';
116 $can_primary = false;
117 } else {
118 $disable_uri = $this->getApplicationURI("contact/disable/{$id}/");
119 $disable_name = pht('Disable Contact Number');
120 $disable_icon = 'fa-ban';
121 $can_primary = !$number->getIsPrimary();
122 }
123
124 $curtain->addAction(
125 id(new PhabricatorActionView())
126 ->setName(pht('Make Primary Number'))
127 ->setIcon('fa-certificate')
128 ->setHref($this->getApplicationURI("contact/primary/{$id}/"))
129 ->setDisabled(!$can_primary)
130 ->setWorkflow(true));
131
132 $curtain->addAction(
133 id(new PhabricatorActionView())
134 ->setName($disable_name)
135 ->setIcon($disable_icon)
136 ->setHref($disable_uri)
137 ->setWorkflow(true));
138
139 return $curtain;
140 }
141
142}