2011-01-30 19:37:36 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/*
|
2012-01-06 16:36:55 +01:00
|
|
|
* Copyright 2012 Facebook, Inc.
|
2011-01-30 19:37:36 +01:00
|
|
|
*
|
|
|
|
* 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 DifferentialRevisionCommentListView extends AphrontView {
|
|
|
|
|
|
|
|
private $comments;
|
|
|
|
private $handles;
|
2011-02-03 04:38:43 +01:00
|
|
|
private $inlines;
|
|
|
|
private $changesets;
|
2011-02-05 20:06:56 +01:00
|
|
|
private $user;
|
2011-04-15 02:22:57 +02:00
|
|
|
private $target;
|
2012-01-06 16:36:55 +01:00
|
|
|
private $versusDiffID;
|
2011-01-30 19:37:36 +01:00
|
|
|
|
2011-02-03 04:38:43 +01:00
|
|
|
public function setComments(array $comments) {
|
2012-04-04 22:13:08 +02:00
|
|
|
assert_instances_of($comments, 'DifferentialComment');
|
2011-01-30 19:37:36 +01:00
|
|
|
$this->comments = $comments;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2011-02-03 04:38:43 +01:00
|
|
|
public function setInlineComments(array $inline_comments) {
|
2012-04-04 22:13:08 +02:00
|
|
|
assert_instances_of($inline_comments, 'PhabricatorInlineCommentInterface');
|
2011-02-03 04:38:43 +01:00
|
|
|
$this->inlines = $inline_comments;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2011-01-30 19:37:36 +01:00
|
|
|
public function setHandles(array $handles) {
|
2012-04-04 22:13:08 +02:00
|
|
|
assert_instances_of($handles, 'PhabricatorObjectHandle');
|
2011-01-30 19:37:36 +01:00
|
|
|
$this->handles = $handles;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2011-02-03 04:38:43 +01:00
|
|
|
public function setChangesets(array $changesets) {
|
2012-04-04 22:13:08 +02:00
|
|
|
assert_instances_of($changesets, 'DifferentialChangeset');
|
2011-02-03 04:38:43 +01:00
|
|
|
$this->changesets = $changesets;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2011-02-05 20:06:56 +01:00
|
|
|
public function setUser(PhabricatorUser $user) {
|
|
|
|
$this->user = $user;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2011-04-15 02:22:57 +02:00
|
|
|
public function setTargetDiff(DifferentialDiff $target) {
|
|
|
|
$this->target = $target;
|
2012-01-06 16:36:55 +01:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setVersusDiffID($diff_vs) {
|
|
|
|
$this->versusDiffID = $diff_vs;
|
|
|
|
return $this;
|
2011-04-15 02:22:57 +02:00
|
|
|
}
|
|
|
|
|
2011-01-30 19:37:36 +01:00
|
|
|
public function render() {
|
|
|
|
|
|
|
|
require_celerity_resource('differential-revision-comment-list-css');
|
|
|
|
|
2011-10-20 18:41:38 +02:00
|
|
|
$engine = PhabricatorMarkupEngine::newDifferentialMarkupEngine(array(
|
|
|
|
'differential.diff' => $this->target
|
|
|
|
));
|
2011-01-30 22:20:56 +01:00
|
|
|
|
2011-02-03 04:38:43 +01:00
|
|
|
$inlines = mgroup($this->inlines, 'getCommentID');
|
|
|
|
|
2011-05-31 19:23:31 +02:00
|
|
|
$num = 1;
|
2011-02-05 20:06:56 +01:00
|
|
|
$html = array();
|
2011-01-30 19:37:36 +01:00
|
|
|
foreach ($this->comments as $comment) {
|
|
|
|
$view = new DifferentialRevisionCommentView();
|
|
|
|
$view->setComment($comment);
|
Use phabricator_ time functions in more places
Summary:
Replace some more date() calls with locale-aware calls.
Also, at least on my system, the DateTimeZone / DateTime stuff didn't actually
work and always rendered in UTC. Fixed that.
Test Plan:
Viewed daemon console, differential revisions, files, and maniphest timestamps
in multiple timezones.
Reviewed By: toulouse
Reviewers: toulouse, fratrik, jungejason, aran, tuomaspelkonen
CC: aran, toulouse
Differential Revision: 530
2011-06-26 18:22:52 +02:00
|
|
|
$view->setUser($this->user);
|
2011-01-30 19:37:36 +01:00
|
|
|
$view->setHandles($this->handles);
|
2011-01-30 22:20:56 +01:00
|
|
|
$view->setMarkupEngine($engine);
|
2011-02-03 04:38:43 +01:00
|
|
|
$view->setInlineComments(idx($inlines, $comment->getID(), array()));
|
|
|
|
$view->setChangesets($this->changesets);
|
2011-04-15 02:22:57 +02:00
|
|
|
$view->setTargetDiff($this->target);
|
2012-01-06 16:36:55 +01:00
|
|
|
$view->setVersusDiffID($this->versusDiffID);
|
2012-02-07 23:36:17 +01:00
|
|
|
if ($comment->getAction() == DifferentialAction::ACTION_SUMMARIZE) {
|
|
|
|
$view->setAnchorName('summary');
|
2012-04-05 00:06:45 +02:00
|
|
|
} else if ($comment->getAction() == DifferentialAction::ACTION_TESTPLAN) {
|
2012-02-07 23:36:17 +01:00
|
|
|
$view->setAnchorName('test-plan');
|
|
|
|
} else {
|
|
|
|
$view->setAnchorName('comment-'.$num);
|
|
|
|
$num++;
|
|
|
|
}
|
2011-01-30 19:37:36 +01:00
|
|
|
|
2011-02-05 20:06:56 +01:00
|
|
|
$html[] = $view->render();
|
|
|
|
}
|
|
|
|
|
|
|
|
$objs = array_reverse(array_values($this->comments));
|
|
|
|
$html = array_reverse(array_values($html));
|
|
|
|
$user = $this->user;
|
|
|
|
|
|
|
|
$last_comment = null;
|
|
|
|
// Find the most recent comment by the viewer.
|
|
|
|
foreach ($objs as $position => $comment) {
|
|
|
|
if ($user && ($comment->getAuthorPHID() == $user->getPHID())) {
|
|
|
|
if ($last_comment === null) {
|
|
|
|
$last_comment = $position;
|
|
|
|
} else if ($last_comment == $position - 1) {
|
|
|
|
// If the viewer made several comments in a row, show them all. This
|
|
|
|
// is a spaz rule for epriestley.
|
|
|
|
$last_comment = $position;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$header = array();
|
|
|
|
$hidden = array();
|
|
|
|
if ($last_comment !== null) {
|
|
|
|
foreach ($objs as $position => $comment) {
|
|
|
|
if (!$comment->getID()) {
|
|
|
|
// These are synthetic comments with summary/test plan information.
|
|
|
|
$header[] = $html[$position];
|
|
|
|
unset($html[$position]);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if ($position <= $last_comment) {
|
|
|
|
// Always show comments after the viewer's last comment.
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if ($position < 3) {
|
|
|
|
// Always show the 3 most recent comments.
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
$hidden[] = $position;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (count($hidden) <= 3) {
|
|
|
|
// Don't hide if there's not much to hide.
|
|
|
|
$hidden = array();
|
|
|
|
}
|
|
|
|
|
|
|
|
$header = array_reverse($header);
|
|
|
|
|
|
|
|
|
|
|
|
$hidden = array_select_keys($html, $hidden);
|
|
|
|
$visible = array_diff_key($html, $hidden);
|
|
|
|
|
|
|
|
$hidden = array_reverse($hidden);
|
|
|
|
$visible = array_reverse($visible);
|
|
|
|
|
|
|
|
if ($hidden) {
|
|
|
|
Javelin::initBehavior(
|
|
|
|
'differential-show-all-comments',
|
|
|
|
array(
|
|
|
|
'markup' => implode("\n", $hidden),
|
|
|
|
));
|
|
|
|
$hidden = javelin_render_tag(
|
|
|
|
'div',
|
|
|
|
array(
|
|
|
|
'sigil' => "differential-all-comments-container",
|
|
|
|
),
|
|
|
|
'<div class="differential-older-comments-are-hidden">'.
|
|
|
|
number_format(count($hidden)).' older comments are hidden. '.
|
|
|
|
javelin_render_tag(
|
|
|
|
'a',
|
|
|
|
array(
|
|
|
|
'href' => '#',
|
|
|
|
'mustcapture' => true,
|
|
|
|
'sigil' => 'differential-show-all-comments',
|
|
|
|
),
|
|
|
|
'Show all comments.').
|
|
|
|
'</div>');
|
|
|
|
} else {
|
|
|
|
$hidden = null;
|
2011-01-30 19:37:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return
|
2011-05-31 19:23:31 +02:00
|
|
|
'<div class="differential-comment-list">'.
|
2011-02-05 20:06:56 +01:00
|
|
|
implode("\n", $header).
|
|
|
|
$hidden.
|
|
|
|
implode("\n", $visible).
|
2011-01-30 19:37:36 +01:00
|
|
|
'</div>';
|
|
|
|
}
|
|
|
|
}
|