@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 PonderAnswerView extends AphrontTagView {
4
5 private $answer;
6 private $transactions;
7 private $timeline;
8 private $handle;
9
10 public function setAnswer($answer) {
11 $this->answer = $answer;
12 return $this;
13 }
14
15 public function setTransactions($transactions) {
16 $this->transactions = $transactions;
17 return $this;
18 }
19
20 public function setTimeline($timeline) {
21 $this->timeline = $timeline;
22 return $this;
23 }
24
25 public function setHandle($handle) {
26 $this->handle = $handle;
27 return $this;
28 }
29
30 protected function getTagAttributes() {
31 return array(
32 'class' => 'ponder-answer-view',
33 );
34 }
35
36 protected function getTagContent() {
37 require_celerity_resource('ponder-view-css');
38 $answer = $this->answer;
39 $viewer = $this->getUser();
40 $status = $answer->getStatus();
41 $author_phid = $answer->getAuthorPHID();
42 $actions = $this->buildAnswerActions();
43 $handle = $this->handle;
44 $id = $answer->getID();
45
46 if ($status == PonderAnswerStatus::ANSWER_STATUS_HIDDEN) {
47 $can_edit = PhabricatorPolicyFilter::hasCapability(
48 $viewer,
49 $answer,
50 PhabricatorPolicyCapability::CAN_EDIT);
51
52 $message = array();
53 $message[] = phutil_tag(
54 'em',
55 array(),
56 pht('This answer has been hidden.'));
57
58 if ($can_edit) {
59 $message[] = phutil_tag(
60 'a',
61 array(
62 'href' => "/ponder/answer/edit/{$id}/",
63 ),
64 pht('Edit Answer'));
65 }
66 $message = phutil_implode_html(' ', $message);
67
68 return id(new PHUIInfoView())
69 ->setSeverity(PHUIInfoView::SEVERITY_NODATA)
70 ->appendChild($message);
71 }
72
73 $action_button = id(new PHUIButtonView())
74 ->setTag('a')
75 ->setText(pht('Actions'))
76 ->setHref('#')
77 ->setIcon('fa-bars')
78 ->setDropdownMenu($actions);
79
80 $header_name = phutil_tag(
81 'a',
82 array(
83 'href' => $handle->getURI(),
84 ),
85 $handle->getName());
86
87 $header = id(new PHUIHeaderView())
88 ->setUser($viewer)
89 ->setEpoch($answer->getDateModified())
90 ->setHeader($header_name)
91 ->addActionLink($action_button)
92 ->setImage($handle->getImageURI())
93 ->setImageURL($handle->getURI());
94
95 $content = phutil_tag(
96 'div',
97 array(
98 'class' => 'phabricator-remarkup',
99 ),
100 PhabricatorMarkupEngine::renderOneObject(
101 $answer,
102 $answer->getMarkupField(),
103 $viewer));
104
105 $anchor = id(new PhabricatorAnchorView())
106 ->setAnchorName("A$id");
107
108 $content_id = celerity_generate_unique_node_id();
109 $footer = id(new PonderFooterView())
110 ->setContentID($content_id)
111 ->setCount(count($this->transactions));
112
113 $content = phutil_tag_div(
114 'ponder-answer-content', array($anchor, $content, $footer));
115
116 $answer_view = id(new PHUIObjectBoxView())
117 ->setHeader($header)
118 ->setBackground(PHUIObjectBoxView::GREY)
119 ->addClass('ponder-answer')
120 ->appendChild($content);
121
122 $comment_view = id(new PhabricatorApplicationTransactionCommentView())
123 ->setUser($viewer)
124 ->setObject($answer)
125 ->setShowPreview(false)
126 ->setHeaderText(pht('Answer Comment'))
127 ->setAction("/ponder/answer/comment/{$id}/")
128 ->setSubmitButtonName(pht('Comment'));
129
130 $hidden_view = phutil_tag(
131 'div',
132 array(
133 'id' => $content_id,
134 'style' => 'display: none;',
135 ),
136 array(
137 $this->timeline,
138 $comment_view,
139 ));
140
141 return array(
142 $answer_view,
143 $hidden_view,
144 );
145 }
146
147 private function buildAnswerActions() {
148 $viewer = $this->getUser();
149 $answer = $this->answer;
150 $id = $answer->getID();
151
152 $can_edit = PhabricatorPolicyFilter::hasCapability(
153 $viewer,
154 $answer,
155 PhabricatorPolicyCapability::CAN_EDIT);
156
157 $view = id(new PhabricatorActionListView())
158 ->setUser($viewer)
159 ->setObject($answer);
160
161 $view->addAction(
162 id(new PhabricatorActionView())
163 ->setIcon('fa-pencil')
164 ->setName(pht('Edit Answer'))
165 ->setHref("/ponder/answer/edit/{$id}/")
166 ->setDisabled(!$can_edit)
167 ->setWorkflow(!$can_edit));
168
169 $view->addAction(
170 id(new PhabricatorActionView())
171 ->setIcon('fa-list')
172 ->setName(pht('View History'))
173 ->setHref("/ponder/answer/history/{$id}/"));
174
175 return $view;
176 }
177}