@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 PhabricatorAuthMessageViewController
4 extends PhabricatorAuthMessageController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $this->getViewer();
8
9 $this->requireApplicationCapability(
10 AuthManageProvidersCapability::CAPABILITY);
11
12 // The "id" in the URI may either be an actual storage record ID (if a
13 // message has already been created) or a message type key (for a message
14 // type which does not have a record yet).
15
16 // This flow allows messages which have not been set yet to have a detail
17 // page (so users can get detailed information about the message and see
18 // any default value).
19
20 $id = $request->getURIData('id');
21 if (ctype_digit($id)) {
22 $message = id(new PhabricatorAuthMessageQuery())
23 ->setViewer($viewer)
24 ->withIDs(array($id))
25 ->executeOne();
26 if (!$message) {
27 return new Aphront404Response();
28 }
29 } else {
30 $types = PhabricatorAuthMessageType::getAllMessageTypes();
31 if (!isset($types[$id])) {
32 return new Aphront404Response();
33 }
34
35 // If this message type already has a storage record, redirect to the
36 // canonical page for the record.
37 $message = id(new PhabricatorAuthMessageQuery())
38 ->setViewer($viewer)
39 ->withMessageKeys(array($id))
40 ->executeOne();
41 if ($message) {
42 $message_uri = $message->getURI();
43 return id(new AphrontRedirectResponse())->setURI($message_uri);
44 }
45
46 // Otherwise, create an empty placeholder message object with the
47 // appropriate message type.
48 $message = PhabricatorAuthMessage::initializeNewMessage($types[$id]);
49 }
50
51 $crumbs = $this->buildApplicationCrumbs()
52 ->addTextCrumb($message->getMessageType()->getDisplayName())
53 ->setBorder(true);
54
55 $header = $this->buildHeaderView($message);
56 $properties = $this->buildPropertiesView($message);
57 $curtain = $this->buildCurtain($message);
58
59 if ($message->getID()) {
60 $timeline = $this->buildTransactionTimeline(
61 $message,
62 new PhabricatorAuthMessageTransactionQuery());
63 $timeline->setShouldTerminate(true);
64 } else {
65 $timeline = null;
66 }
67
68 $view = id(new PHUITwoColumnView())
69 ->setHeader($header)
70 ->setCurtain($curtain)
71 ->setMainColumn(
72 array(
73 $timeline,
74 ))
75 ->addPropertySection(pht('Details'), $properties);
76
77 return $this->newPage()
78 ->setTitle($message->getMessageTypeDisplayName())
79 ->setCrumbs($crumbs)
80 ->setPageObjectPHIDs(
81 array(
82 $message->getPHID(),
83 ))
84 ->appendChild($view);
85 }
86
87 private function buildHeaderView(PhabricatorAuthMessage $message) {
88 $viewer = $this->getViewer();
89
90 $view = id(new PHUIHeaderView())
91 ->setViewer($viewer)
92 ->setHeader($message->getMessageTypeDisplayName());
93
94 return $view;
95 }
96
97 private function buildPropertiesView(PhabricatorAuthMessage $message) {
98 $viewer = $this->getViewer();
99
100 $message_type = $message->getMessageType();
101
102 $view = id(new PHUIPropertyListView())
103 ->setViewer($viewer);
104
105 $full_description = $message_type->getFullDescription();
106 if (phutil_nonempty_string($full_description)) {
107 $view->addTextContent(new PHUIRemarkupView($viewer, $full_description));
108 } else {
109 $short_description = $message_type->getShortDescription();
110 $view->addProperty(pht('Description'), $short_description);
111 }
112
113 $message_text = $message->getMessageText();
114 if (phutil_nonempty_string($message_text)) {
115 $view->addSectionHeader(
116 pht('Message Preview'),
117 PHUIPropertyListView::ICON_SUMMARY);
118
119 $view->addTextContent(new PHUIRemarkupView($viewer, $message_text));
120 }
121
122 $default_text = $message_type->getDefaultMessageText();
123 if (phutil_nonempty_string($default_text)) {
124 $view->addSectionHeader(
125 pht('Default Message'),
126 PHUIPropertyListView::ICON_SUMMARY);
127
128 $view->addTextContent(new PHUIRemarkupView($viewer, $default_text));
129 }
130
131 return $view;
132 }
133
134 private function buildCurtain(PhabricatorAuthMessage $message) {
135 $viewer = $this->getViewer();
136 $id = $message->getID();
137
138 $can_edit = PhabricatorPolicyFilter::hasCapability(
139 $viewer,
140 $message,
141 PhabricatorPolicyCapability::CAN_EDIT);
142
143 if ($id) {
144 $edit_uri = urisprintf('message/edit/%s/', $id);
145 $edit_name = pht('Edit Message');
146 } else {
147 $edit_uri = urisprintf('message/edit/');
148 $params = array(
149 'messageKey' => $message->getMessageKey(),
150 );
151 $edit_uri = new PhutilURI($edit_uri, $params);
152
153 $edit_name = pht('Customize Message');
154 }
155 $edit_uri = $this->getApplicationURI($edit_uri);
156
157 $curtain = $this->newCurtainView($message);
158
159 $curtain->addAction(
160 id(new PhabricatorActionView())
161 ->setName($edit_name)
162 ->setIcon('fa-pencil')
163 ->setHref($edit_uri)
164 ->setDisabled(!$can_edit)
165 ->setWorkflow(!$can_edit));
166
167 return $curtain;
168 }
169
170}