mirror of
https://we.phorge.it/source/phorge.git
synced 2025-03-28 20:18:13 +01:00
Summary: We currently have only an "Add reviewers" action, add "Add CCs". This can also be accomplished less-discoverably with mentions. Test Plan: Added reviewers and CCs to revisions. Toggled display between reviewers and CCs. Reviewed By: jungejason Reviewers: tomo, mroch, jsp, jungejason, aran, tuomaspelkonen CC: aran, jungejason Differential Revision: 521
287 lines
8 KiB
PHP
287 lines
8 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Copyright 2011 Facebook, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
final class DifferentialRevisionCommentView extends AphrontView {
|
|
|
|
private $comment;
|
|
private $handles;
|
|
private $markupEngine;
|
|
private $preview;
|
|
private $inlines;
|
|
private $changesets;
|
|
private $target;
|
|
private $commentNumber;
|
|
private $user;
|
|
|
|
public function setComment($comment) {
|
|
$this->comment = $comment;
|
|
return $this;
|
|
}
|
|
|
|
public function setHandles(array $handles) {
|
|
$this->handles = $handles;
|
|
return $this;
|
|
}
|
|
|
|
public function setMarkupEngine($markup_engine) {
|
|
$this->markupEngine = $markup_engine;
|
|
return $this;
|
|
}
|
|
|
|
public function setPreview($preview) {
|
|
$this->preview = $preview;
|
|
return $this;
|
|
}
|
|
|
|
public function setInlineComments(array $inline_comments) {
|
|
$this->inlines = $inline_comments;
|
|
return $this;
|
|
}
|
|
|
|
public function setChangesets(array $changesets) {
|
|
// Ship these in sorted by getSortKey() and keyed by ID... or else!
|
|
$this->changesets = $changesets;
|
|
return $this;
|
|
}
|
|
|
|
public function setTargetDiff($target) {
|
|
$this->target = $target;
|
|
}
|
|
|
|
public function setCommentNumber($comment_number) {
|
|
$this->commentNumber = $comment_number;
|
|
return $this;
|
|
}
|
|
|
|
public function setUser(PhabricatorUser $user) {
|
|
$this->user = $user;
|
|
return $this;
|
|
}
|
|
|
|
public function render() {
|
|
|
|
if (!$this->user) {
|
|
throw new Exception("Call setUser() before rendering!");
|
|
}
|
|
|
|
require_celerity_resource('phabricator-remarkup-css');
|
|
require_celerity_resource('differential-revision-comment-css');
|
|
|
|
$comment = $this->comment;
|
|
|
|
$action = $comment->getAction();
|
|
|
|
$action_class = 'differential-comment-action-'.phutil_escape_html($action);
|
|
|
|
if ($this->preview) {
|
|
$date = 'COMMENT PREVIEW';
|
|
} else {
|
|
$date = phabricator_datetime($comment->getDateCreated(), $this->user);
|
|
}
|
|
|
|
$info = array($date);
|
|
|
|
$comment_anchor = null;
|
|
$num = $this->commentNumber;
|
|
if ($num && !$this->preview) {
|
|
Javelin::initBehavior('phabricator-watch-anchor');
|
|
$info[] = phutil_render_tag(
|
|
'a',
|
|
array(
|
|
'name' => 'comment-'.$num,
|
|
'href' => '#comment-'.$num,
|
|
),
|
|
'Comment D'.$comment->getRevisionID().'#'.$num);
|
|
$comment_anchor = 'anchor-comment-'.$num;
|
|
}
|
|
|
|
$info = implode(' · ', $info);
|
|
|
|
$author = $this->handles[$comment->getAuthorPHID()];
|
|
$author_link = $author->renderLink();
|
|
|
|
$verb = DifferentialAction::getActionPastTenseVerb($comment->getAction());
|
|
$verb = phutil_escape_html($verb);
|
|
|
|
$content = $comment->getContent();
|
|
$head_content = null;
|
|
if (strlen(rtrim($content))) {
|
|
$title = "{$author_link} {$verb} this revision:";
|
|
$cache = $comment->getCache();
|
|
if (strlen($cache)) {
|
|
$content = $cache;
|
|
} else {
|
|
$content = $this->markupEngine->markupText($content);
|
|
if ($comment->getID()) {
|
|
$comment->setCache($content);
|
|
$comment->save();
|
|
}
|
|
}
|
|
$content =
|
|
'<div class="phabricator-remarkup">'.
|
|
$content.
|
|
'</div>';
|
|
} else {
|
|
$title = null;
|
|
$head_content =
|
|
'<div class="differential-comment-nocontent">'.
|
|
"<p>{$author_link} {$verb} this revision.</p>".
|
|
'</div>';
|
|
$content = null;
|
|
}
|
|
|
|
if ($this->inlines) {
|
|
$inline_render = array();
|
|
$inlines = $this->inlines;
|
|
$changesets = $this->changesets;
|
|
$inlines_by_changeset = mgroup($inlines, 'getChangesetID');
|
|
$inlines_by_changeset = array_select_keys(
|
|
$inlines_by_changeset,
|
|
array_keys($this->changesets));
|
|
$inline_render[] = '<table class="differential-inline-summary">';
|
|
foreach ($inlines_by_changeset as $changeset_id => $inlines) {
|
|
$changeset = $changesets[$changeset_id];
|
|
$inlines = msort($inlines, 'getLineNumber');
|
|
$inline_render[] =
|
|
'<tr>'.
|
|
'<th colspan="2">'.
|
|
phutil_escape_html($changeset->getFileName()).
|
|
'</th>'.
|
|
'</tr>';
|
|
foreach ($inlines as $inline) {
|
|
if (!$inline->getLineLength()) {
|
|
$lines = $inline->getLineNumber();
|
|
} else {
|
|
$lines = $inline->getLineNumber()."\xE2\x80\x93".
|
|
($inline->getLineNumber() + $inline->getLineLength());
|
|
}
|
|
|
|
if (!$this->target ||
|
|
$changeset->getDiffID() === $this->target->getID()) {
|
|
$lines = phutil_render_tag(
|
|
'a',
|
|
array(
|
|
'href' => '#inline-'.$inline->getID(),
|
|
'class' => 'num',
|
|
),
|
|
$lines);
|
|
}
|
|
|
|
$inline_content = $inline->getContent();
|
|
if (strlen($inline_content)) {
|
|
$inline_cache = $inline->getCache();
|
|
if ($inline_cache) {
|
|
$inline_content = $inline_cache;
|
|
} else {
|
|
$inline_content = $this->markupEngine->markupText(
|
|
$inline_content);
|
|
if ($inline->getID()) {
|
|
$inline->setCache($inline_content);
|
|
$inline->save();
|
|
}
|
|
}
|
|
}
|
|
|
|
$inline_render[] =
|
|
'<tr>'.
|
|
'<td class="inline-line-number">'.$lines.'</td>'.
|
|
'<td>'.
|
|
'<div class="phabricator-remarkup">'.
|
|
$inline_content.
|
|
'</div>'.
|
|
'</td>'.
|
|
'</tr>';
|
|
}
|
|
}
|
|
$inline_render[] = '</table>';
|
|
$inline_render = implode("\n", $inline_render);
|
|
$inline_render =
|
|
'<div class="differential-inline-summary-section">'.
|
|
'Inline Comments'.
|
|
'</div>'.
|
|
$inline_render;
|
|
} else {
|
|
$inline_render = null;
|
|
}
|
|
|
|
$background = null;
|
|
$uri = $author->getImageURI();
|
|
if ($uri) {
|
|
$background = "background-image: url('{$uri}');";
|
|
}
|
|
|
|
$metadata_blocks = array();
|
|
$metadata = $comment->getMetadata();
|
|
$added_reviewers = idx(
|
|
$metadata,
|
|
DifferentialComment::METADATA_ADDED_REVIEWERS);
|
|
if ($added_reviewers) {
|
|
$reviewers = 'Added reviewers: '.$this->renderHandleList(
|
|
$added_reviewers);
|
|
$metadata_blocks[] = $reviewers;
|
|
}
|
|
|
|
$added_ccs = idx(
|
|
$metadata,
|
|
DifferentialComment::METADATA_ADDED_CCS);
|
|
if ($added_ccs) {
|
|
$ccs = 'Added CCs: '.$this->renderHandleList($added_ccs);
|
|
$metadata_blocks[] = $ccs;
|
|
}
|
|
|
|
if ($metadata_blocks) {
|
|
$metadata_blocks =
|
|
'<div class="differential-comment-metadata">'.
|
|
implode("\n", $metadata_blocks).
|
|
'</div>';
|
|
} else {
|
|
$metadata_blocks = null;
|
|
}
|
|
|
|
return phutil_render_tag(
|
|
'div',
|
|
array(
|
|
'class' => "differential-comment {$action_class}",
|
|
'id' => $comment_anchor,
|
|
),
|
|
'<div class="differential-comment-head">'.
|
|
'<span class="differential-comment-info">'.$info.'</span>'.
|
|
'<span class="differential-comment-title">'.$title.'</span>'.
|
|
'<div style="clear: both;"></div>'.
|
|
'</div>'.
|
|
'<div class="differential-comment-body" style="'.$background.'">'.
|
|
'<div class="differential-comment-content">'.
|
|
$head_content.
|
|
$metadata_blocks.
|
|
'<div class="differential-comment-core">'.
|
|
$content.
|
|
'</div>'.
|
|
$inline_render.
|
|
'</div>'.
|
|
'</div>');
|
|
}
|
|
|
|
private function renderHandleList(array $phids) {
|
|
$result = array();
|
|
foreach ($phids as $phid) {
|
|
$result[] = $this->handles[$phid]->renderLink();
|
|
}
|
|
return implode(', ', $result);
|
|
}
|
|
|
|
}
|