@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
at upstream/main 191 lines 5.2 kB view raw
1<?php 2 3final class DifferentialRevisionInlinesController 4 extends DifferentialController { 5 6 public function shouldAllowPublic() { 7 return true; 8 } 9 10 public function handleRequest(AphrontRequest $request) { 11 $viewer = $this->getViewer(); 12 $id = $request->getURIData('id'); 13 14 $revision = id(new DifferentialRevisionQuery()) 15 ->withIDs(array($id)) 16 ->setViewer($viewer) 17 ->needDiffIDs(true) 18 ->executeOne(); 19 if (!$revision) { 20 return new Aphront404Response(); 21 } 22 23 $revision_monogram = $revision->getMonogram(); 24 $revision_uri = $revision->getURI(); 25 $revision_title = $revision->getTitle(); 26 27 $inlines = id(new DifferentialDiffInlineCommentQuery()) 28 ->setViewer($viewer) 29 ->withRevisionPHIDs(array($revision->getPHID())) 30 ->withPublishedComments(true) 31 ->execute(); 32 $inlines = mpull($inlines, 'newInlineCommentObject'); 33 34 $crumbs = $this->buildApplicationCrumbs(); 35 $crumbs->addTextCrumb($revision_monogram, $revision_uri); 36 $crumbs->addTextCrumb(pht('Inline Comments')); 37 $crumbs->setBorder(true); 38 39 $content = $this->renderInlineTable($revision, $inlines); 40 $header = $this->buildHeader($revision); 41 42 $view = id(new PHUITwoColumnView()) 43 ->setHeader($header) 44 ->setFooter($content); 45 46 return $this->newPage() 47 ->setTitle( 48 array( 49 "{$revision_monogram} {$revision_title}", 50 pht('Inlines'), 51 )) 52 ->setCrumbs($crumbs) 53 ->appendChild($view); 54 } 55 56 private function buildHeader(DifferentialRevision $revision) { 57 $viewer = $this->getViewer(); 58 59 $button = id(new PHUIButtonView()) 60 ->setTag('a') 61 ->setIcon('fa-chevron-left') 62 ->setHref($revision->getURI()) 63 ->setText(pht('Back to Revision')); 64 65 return id(new PHUIHeaderView()) 66 ->setHeader($revision->getTitle()) 67 ->setUser($viewer) 68 ->setHeaderIcon('fa-cog') 69 ->addActionLink($button); 70 } 71 72 private function renderInlineTable( 73 DifferentialRevision $revision, 74 array $inlines) { 75 76 $viewer = $this->getViewer(); 77 $inlines = id(new PHUIDiffInlineThreader()) 78 ->reorderAndThreadCommments($inlines); 79 80 $handle_phids = array(); 81 $changeset_ids = array(); 82 foreach ($inlines as $inline) { 83 $handle_phids[] = $inline->getAuthorPHID(); 84 $changeset_ids[] = $inline->getChangesetID(); 85 } 86 $handles = $viewer->loadHandles($handle_phids); 87 $handles = iterator_to_array($handles); 88 89 if ($changeset_ids) { 90 $changesets = id(new DifferentialChangesetQuery()) 91 ->setViewer($viewer) 92 ->withIDs($changeset_ids) 93 ->execute(); 94 $changesets = mpull($changesets, null, 'getID'); 95 } else { 96 $changesets = array(); 97 } 98 99 $current_changeset = head($revision->getDiffIDs()); 100 101 $rows = array(); 102 foreach ($inlines as $inline) { 103 $status_icons = array(); 104 105 $c_id = $inline->getChangesetID(); 106 $d_id = $changesets[$c_id]->getDiffID(); 107 108 if ($d_id == $current_changeset) { 109 $diff_id = phutil_tag('strong', array(), pht('Current')); 110 } else { 111 $diff_id = pht('Diff %d', $d_id); 112 } 113 114 $reviewer = $handles[$inline->getAuthorPHID()]->renderLink(); 115 $now = PhabricatorTime::getNow(); 116 $then = $inline->getDateModified(); 117 $datetime = phutil_format_relative_time($now - $then); 118 119 $comment_href = $revision->getURI().'#inline-'.$inline->getID(); 120 $comment = phutil_tag( 121 'a', 122 array( 123 'href' => $comment_href, 124 ), 125 $inline->getContent()); 126 127 $state = $inline->getFixedState(); 128 if ($state == PhabricatorInlineComment::STATE_DONE) { 129 $status_icons[] = id(new PHUIIconView()) 130 ->setIcon('fa-check green') 131 ->addClass('mmr'); 132 } else if ($inline->getReplyToCommentPHID() && 133 $inline->getAuthorPHID() == $revision->getAuthorPHID()) { 134 $status_icons[] = id(new PHUIIconView()) 135 ->setIcon('fa-commenting-o blue') 136 ->addClass('mmr'); 137 } else { 138 $status_icons[] = id(new PHUIIconView()) 139 ->setIcon('fa-circle-o grey') 140 ->addClass('mmr'); 141 } 142 143 144 if ($inline->getReplyToCommentPHID()) { 145 $reply_icon = id(new PHUIIconView()) 146 ->setIcon('fa-reply mmr darkgrey'); 147 $comment = array($reply_icon, $comment); 148 } 149 150 $rows[] = array( 151 $diff_id, 152 $status_icons, 153 $reviewer, 154 AphrontTableView::renderSingleDisplayLine($comment), 155 $datetime, 156 ); 157 } 158 159 $table = new AphrontTableView($rows); 160 $table->setHeaders( 161 array( 162 pht('Diff'), 163 pht('Status'), 164 pht('Reviewer'), 165 pht('Comment'), 166 pht('Created'), 167 )); 168 $table->setColumnClasses( 169 array( 170 '', 171 '', 172 '', 173 'wide', 174 'right', 175 )); 176 $table->setColumnVisibility( 177 array( 178 true, 179 true, 180 true, 181 true, 182 true, 183 )); 184 185 return id(new PHUIObjectBoxView()) 186 ->setHeaderText(pht('Inline Comments')) 187 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 188 ->setTable($table); 189 } 190 191}