Unify Maniphest + Differential comment styles
Summary: I want to add comments to commits, and they should obviously share code with the nearly-identical comments in Maniphest and Differential. Unify code/style as much as possible. This program made possible by a generous grant from D1513. Test Plan: - Looked at a bunch of different Differential and Maniphest comments; they appeared to render identically to how they looked before. - Tested some edge cases like anchors and "show details" on description edits in Maniphest. Reviewers: btrahan, jungejason Reviewed By: btrahan CC: aran, epriestley Maniphest Tasks: T904 Differential Revision: https://secure.phabricator.com/D1686
This commit is contained in:
@@ -213,7 +213,7 @@ celerity_register_resource_map(array(
|
||||
),
|
||||
'differential-revision-comment-css' =>
|
||||
array(
|
||||
'uri' => '/res/85efa17a/rsrc/css/application/differential/revision-comment.css',
|
||||
'uri' => '/res/7a0002f1/rsrc/css/application/differential/revision-comment.css',
|
||||
'type' => 'css',
|
||||
'requires' =>
|
||||
array(
|
||||
@@ -1325,7 +1325,7 @@ celerity_register_resource_map(array(
|
||||
),
|
||||
'maniphest-transaction-detail-css' =>
|
||||
array(
|
||||
'uri' => '/res/4083354f/rsrc/css/application/maniphest/transaction-detail.css',
|
||||
'uri' => '/res/24e5862f/rsrc/css/application/maniphest/transaction-detail.css',
|
||||
'type' => 'css',
|
||||
'requires' =>
|
||||
array(
|
||||
@@ -1466,6 +1466,24 @@ celerity_register_resource_map(array(
|
||||
),
|
||||
'disk' => '/rsrc/js/application/core/DropdownMenu.js',
|
||||
),
|
||||
'phabricator-feed-css' =>
|
||||
array(
|
||||
'uri' => '/res/e4bf27b5/rsrc/css/application/feed/feed.css',
|
||||
'type' => 'css',
|
||||
'requires' =>
|
||||
array(
|
||||
),
|
||||
'disk' => '/rsrc/css/application/feed/feed.css',
|
||||
),
|
||||
'phabricator-jump-nav' =>
|
||||
array(
|
||||
'uri' => '/res/69238d2f/rsrc/css/application/directory/phabricator-jump-nav.css',
|
||||
'type' => 'css',
|
||||
'requires' =>
|
||||
array(
|
||||
),
|
||||
'disk' => '/rsrc/css/application/directory/phabricator-jump-nav.css',
|
||||
),
|
||||
'phabricator-keyboard-shortcut' =>
|
||||
array(
|
||||
'uri' => '/res/beed38cd/rsrc/js/application/core/KeyboardShortcut.js',
|
||||
@@ -1513,47 +1531,6 @@ celerity_register_resource_map(array(
|
||||
),
|
||||
'disk' => '/rsrc/css/application/objectselector/object-selector.css',
|
||||
),
|
||||
'phabricator-prefab' =>
|
||||
array(
|
||||
'uri' => '/res/5784a112/rsrc/js/application/core/Prefab.js',
|
||||
'type' => 'js',
|
||||
'requires' =>
|
||||
array(
|
||||
0 => 'javelin-install',
|
||||
1 => 'javelin-util',
|
||||
2 => 'javelin-dom',
|
||||
),
|
||||
'disk' => '/rsrc/js/application/core/Prefab.js',
|
||||
),
|
||||
0 =>
|
||||
array(
|
||||
'uri' => '/res/b6096fdd/rsrc/js/javelin/lib/__tests__/URI.js',
|
||||
'type' => 'js',
|
||||
'requires' =>
|
||||
array(
|
||||
0 => 'javelin-uri',
|
||||
1 => 'javelin-php-serializer',
|
||||
),
|
||||
'disk' => '/rsrc/js/javelin/lib/__tests__/URI.js',
|
||||
),
|
||||
'phabricator-feed-css' =>
|
||||
array(
|
||||
'uri' => '/res/e4bf27b5/rsrc/css/application/feed/feed.css',
|
||||
'type' => 'css',
|
||||
'requires' =>
|
||||
array(
|
||||
),
|
||||
'disk' => '/rsrc/css/application/feed/feed.css',
|
||||
),
|
||||
'phabricator-jump-nav' =>
|
||||
array(
|
||||
'uri' => '/res/69238d2f/rsrc/css/application/directory/phabricator-jump-nav.css',
|
||||
'type' => 'css',
|
||||
'requires' =>
|
||||
array(
|
||||
),
|
||||
'disk' => '/rsrc/css/application/directory/phabricator-jump-nav.css',
|
||||
),
|
||||
'phabricator-paste-file-upload' =>
|
||||
array(
|
||||
'uri' => '/res/cdc939bd/rsrc/js/application/core/PasteFileUpload.js',
|
||||
@@ -1568,6 +1545,18 @@ celerity_register_resource_map(array(
|
||||
),
|
||||
'disk' => '/rsrc/js/application/core/PasteFileUpload.js',
|
||||
),
|
||||
'phabricator-prefab' =>
|
||||
array(
|
||||
'uri' => '/res/5784a112/rsrc/js/application/core/Prefab.js',
|
||||
'type' => 'js',
|
||||
'requires' =>
|
||||
array(
|
||||
0 => 'javelin-install',
|
||||
1 => 'javelin-util',
|
||||
2 => 'javelin-dom',
|
||||
),
|
||||
'disk' => '/rsrc/js/application/core/Prefab.js',
|
||||
),
|
||||
'phabricator-profile-css' =>
|
||||
array(
|
||||
'uri' => '/res/9869d10b/rsrc/css/application/profile/profile-view.css',
|
||||
@@ -1634,6 +1623,15 @@ celerity_register_resource_map(array(
|
||||
),
|
||||
'disk' => '/rsrc/css/application/base/standard-page-view.css',
|
||||
),
|
||||
'phabricator-transaction-view-css' =>
|
||||
array(
|
||||
'uri' => '/res/97f9e8f2/rsrc/css/aphront/transaction.css',
|
||||
'type' => 'css',
|
||||
'requires' =>
|
||||
array(
|
||||
),
|
||||
'disk' => '/rsrc/css/aphront/transaction.css',
|
||||
),
|
||||
'phabricator-ui-example-css' =>
|
||||
array(
|
||||
'uri' => '/res/0cef078b/rsrc/css/application/uiexample/example.css',
|
||||
@@ -1839,6 +1837,17 @@ celerity_register_resource_map(array(
|
||||
),
|
||||
'disk' => '/rsrc/css/core/syntax.css',
|
||||
),
|
||||
0 =>
|
||||
array(
|
||||
'uri' => '/res/b6096fdd/rsrc/js/javelin/lib/__tests__/URI.js',
|
||||
'type' => 'js',
|
||||
'requires' =>
|
||||
array(
|
||||
0 => 'javelin-uri',
|
||||
1 => 'javelin-php-serializer',
|
||||
),
|
||||
'disk' => '/rsrc/js/javelin/lib/__tests__/URI.js',
|
||||
),
|
||||
), array(
|
||||
'packages' =>
|
||||
array(
|
||||
@@ -1886,27 +1895,6 @@ celerity_register_resource_map(array(
|
||||
'uri' => '/res/pkg/46547a92/core.pkg.js',
|
||||
'type' => 'js',
|
||||
),
|
||||
'4c3b1b11' =>
|
||||
array(
|
||||
'name' => 'differential.pkg.css',
|
||||
'symbols' =>
|
||||
array(
|
||||
0 => 'differential-core-view-css',
|
||||
1 => 'differential-changeset-view-css',
|
||||
2 => 'differential-revision-detail-css',
|
||||
3 => 'differential-revision-history-css',
|
||||
4 => 'differential-table-of-contents-css',
|
||||
5 => 'differential-revision-comment-css',
|
||||
6 => 'differential-revision-add-comment-css',
|
||||
7 => 'differential-revision-comment-list-css',
|
||||
8 => 'phabricator-object-selector-css',
|
||||
9 => 'aphront-headsup-action-list-view-css',
|
||||
10 => 'phabricator-content-source-view-css',
|
||||
11 => 'differential-local-commits-view-css',
|
||||
),
|
||||
'uri' => '/res/pkg/4c3b1b11/differential.pkg.css',
|
||||
'type' => 'css',
|
||||
),
|
||||
'4fbae2af' =>
|
||||
array(
|
||||
'name' => 'javelin.pkg.js',
|
||||
@@ -1950,6 +1938,27 @@ celerity_register_resource_map(array(
|
||||
'uri' => '/res/pkg/6a6def05/core.pkg.css',
|
||||
'type' => 'css',
|
||||
),
|
||||
'8152415f' =>
|
||||
array(
|
||||
'name' => 'differential.pkg.css',
|
||||
'symbols' =>
|
||||
array(
|
||||
0 => 'differential-core-view-css',
|
||||
1 => 'differential-changeset-view-css',
|
||||
2 => 'differential-revision-detail-css',
|
||||
3 => 'differential-revision-history-css',
|
||||
4 => 'differential-table-of-contents-css',
|
||||
5 => 'differential-revision-comment-css',
|
||||
6 => 'differential-revision-add-comment-css',
|
||||
7 => 'differential-revision-comment-list-css',
|
||||
8 => 'phabricator-object-selector-css',
|
||||
9 => 'aphront-headsup-action-list-view-css',
|
||||
10 => 'phabricator-content-source-view-css',
|
||||
11 => 'differential-local-commits-view-css',
|
||||
),
|
||||
'uri' => '/res/pkg/8152415f/differential.pkg.css',
|
||||
'type' => 'css',
|
||||
),
|
||||
'c8aaade8' =>
|
||||
array(
|
||||
'name' => 'differential.pkg.js',
|
||||
@@ -1980,23 +1989,23 @@ celerity_register_resource_map(array(
|
||||
'aphront-crumbs-view-css' => '6a6def05',
|
||||
'aphront-dialog-view-css' => '6a6def05',
|
||||
'aphront-form-view-css' => '6a6def05',
|
||||
'aphront-headsup-action-list-view-css' => '4c3b1b11',
|
||||
'aphront-headsup-action-list-view-css' => '8152415f',
|
||||
'aphront-list-filter-view-css' => '6a6def05',
|
||||
'aphront-panel-view-css' => '6a6def05',
|
||||
'aphront-side-nav-view-css' => '6a6def05',
|
||||
'aphront-table-view-css' => '6a6def05',
|
||||
'aphront-tokenizer-control-css' => '6a6def05',
|
||||
'aphront-typeahead-control-css' => '6a6def05',
|
||||
'differential-changeset-view-css' => '4c3b1b11',
|
||||
'differential-core-view-css' => '4c3b1b11',
|
||||
'differential-changeset-view-css' => '8152415f',
|
||||
'differential-core-view-css' => '8152415f',
|
||||
'differential-inline-comment-editor' => 'c8aaade8',
|
||||
'differential-local-commits-view-css' => '4c3b1b11',
|
||||
'differential-revision-add-comment-css' => '4c3b1b11',
|
||||
'differential-revision-comment-css' => '4c3b1b11',
|
||||
'differential-revision-comment-list-css' => '4c3b1b11',
|
||||
'differential-revision-detail-css' => '4c3b1b11',
|
||||
'differential-revision-history-css' => '4c3b1b11',
|
||||
'differential-table-of-contents-css' => '4c3b1b11',
|
||||
'differential-local-commits-view-css' => '8152415f',
|
||||
'differential-revision-add-comment-css' => '8152415f',
|
||||
'differential-revision-comment-css' => '8152415f',
|
||||
'differential-revision-comment-list-css' => '8152415f',
|
||||
'differential-revision-detail-css' => '8152415f',
|
||||
'differential-revision-history-css' => '8152415f',
|
||||
'differential-table-of-contents-css' => '8152415f',
|
||||
'diffusion-commit-view-css' => '03ef179e',
|
||||
'javelin-behavior' => '4fbae2af',
|
||||
'javelin-behavior-aphront-basic-tokenizer' => '080edee4',
|
||||
@@ -2034,14 +2043,14 @@ celerity_register_resource_map(array(
|
||||
'javelin-util' => '4fbae2af',
|
||||
'javelin-vector' => '4fbae2af',
|
||||
'javelin-workflow' => '46547a92',
|
||||
'phabricator-content-source-view-css' => '4c3b1b11',
|
||||
'phabricator-content-source-view-css' => '8152415f',
|
||||
'phabricator-core-buttons-css' => '6a6def05',
|
||||
'phabricator-core-css' => '6a6def05',
|
||||
'phabricator-directory-css' => '6a6def05',
|
||||
'phabricator-drag-and-drop-file-upload' => 'c8aaade8',
|
||||
'phabricator-keyboard-shortcut' => '46547a92',
|
||||
'phabricator-keyboard-shortcut-manager' => '46547a92',
|
||||
'phabricator-object-selector-css' => '4c3b1b11',
|
||||
'phabricator-object-selector-css' => '8152415f',
|
||||
'phabricator-remarkup-css' => '6a6def05',
|
||||
'phabricator-shaped-request' => 'c8aaade8',
|
||||
'phabricator-standard-page-view' => '6a6def05',
|
||||
|
||||
@@ -784,6 +784,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorTimelineEventData' => 'infrastructure/daemon/timeline/storage/eventdata',
|
||||
'PhabricatorTimelineIterator' => 'infrastructure/daemon/timeline/cursor/iterator',
|
||||
'PhabricatorTimer' => 'applications/countdown/storage/timer',
|
||||
'PhabricatorTransactionView' => 'view/layout/transaction',
|
||||
'PhabricatorTransformedFile' => 'applications/files/storage/transformed',
|
||||
'PhabricatorTrivialTestCase' => 'infrastructure/testing/testcase/__tests__',
|
||||
'PhabricatorTypeaheadCommonDatasourceController' => 'applications/typeahead/controller/common',
|
||||
@@ -1503,6 +1504,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorTimelineEvent' => 'PhabricatorTimelineDAO',
|
||||
'PhabricatorTimelineEventData' => 'PhabricatorTimelineDAO',
|
||||
'PhabricatorTimer' => 'PhabricatorCountdownDAO',
|
||||
'PhabricatorTransactionView' => 'AphrontView',
|
||||
'PhabricatorTransformedFile' => 'PhabricatorFileDAO',
|
||||
'PhabricatorTrivialTestCase' => 'PhabricatorTestCase',
|
||||
'PhabricatorTypeaheadCommonDatasourceController' => 'PhabricatorTypeaheadDatasourceController',
|
||||
|
||||
@@ -95,40 +95,9 @@ final class DifferentialRevisionCommentView extends AphrontView {
|
||||
|
||||
$action_class = 'differential-comment-action-'.$action;
|
||||
|
||||
if ($this->preview) {
|
||||
$date = 'COMMENT PREVIEW';
|
||||
} else {
|
||||
$date = phabricator_datetime($comment->getDateCreated(), $this->user);
|
||||
}
|
||||
|
||||
$info = array();
|
||||
|
||||
$content_source = new PhabricatorContentSourceView();
|
||||
$content_source->setContentSource($comment->getContentSource());
|
||||
$content_source->setUser($this->user);
|
||||
$info[] = $content_source->render();
|
||||
|
||||
$info[] = $date;
|
||||
|
||||
$comment_anchor = null;
|
||||
$anchor_name = $this->anchorName;
|
||||
if ($anchor_name != '' && !$this->preview) {
|
||||
Javelin::initBehavior('phabricator-watch-anchor');
|
||||
$info[] = phutil_render_tag(
|
||||
'a',
|
||||
array(
|
||||
'name' => $anchor_name,
|
||||
'id' => $anchor_name,
|
||||
'href' => '#'.$anchor_name,
|
||||
),
|
||||
'D'.$comment->getRevisionID().'#'.$anchor_name);
|
||||
$comment_anchor = 'anchor-'.$anchor_name;
|
||||
}
|
||||
|
||||
$info = implode(' · ', array_filter($info));
|
||||
|
||||
$content = $comment->getContent();
|
||||
$head_content = null;
|
||||
$hide_comments = true;
|
||||
if (strlen(rtrim($content))) {
|
||||
$hide_comments = false;
|
||||
@@ -277,12 +246,6 @@ final class DifferentialRevisionCommentView extends AphrontView {
|
||||
$author = $this->handles[$comment->getAuthorPHID()];
|
||||
$author_link = $author->renderLink();
|
||||
|
||||
$background = null;
|
||||
$uri = $author->getImageURI();
|
||||
if ($uri) {
|
||||
$background = "background-image: url('{$uri}');";
|
||||
}
|
||||
|
||||
$metadata = $comment->getMetadata();
|
||||
$added_reviewers = idx(
|
||||
$metadata,
|
||||
@@ -335,29 +298,38 @@ final class DifferentialRevisionCommentView extends AphrontView {
|
||||
$this->renderHandleList($added_ccs).".";
|
||||
}
|
||||
|
||||
$hide_comments_class = ($hide_comments ? 'hide' : '');
|
||||
return phutil_render_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => "differential-comment",
|
||||
'id' => $comment_anchor,
|
||||
'style' => $background,
|
||||
),
|
||||
'<div class="differential-comment-detail '.$action_class.'">'.
|
||||
'<div class="differential-comment-header">'.
|
||||
'<span class="differential-comment-info">'.$info.'</span>'.
|
||||
'<span class="differential-comment-title">'.
|
||||
implode('<br />', $actions).
|
||||
'</span>'.
|
||||
foreach ($actions as $key => $action) {
|
||||
$actions[$key] = '<div>'.$action.'</div>';
|
||||
}
|
||||
|
||||
$xaction_view = id(new PhabricatorTransactionView())
|
||||
->setUser($this->user)
|
||||
->setImageURI($author->getImageURI())
|
||||
->setContentSource($comment->getContentSource())
|
||||
->addClass($action_class)
|
||||
->setActions($actions);
|
||||
|
||||
if ($this->preview) {
|
||||
$xaction_view->setIsPreview($this->preview);
|
||||
} else {
|
||||
$xaction_view->setEpoch($comment->getDateCreated());
|
||||
if ($this->anchorName) {
|
||||
$anchor_name = $this->anchorName;
|
||||
$anchor_text = 'D'.$comment->getRevisionID().'#'.$anchor_name;
|
||||
|
||||
$xaction_view->setAnchor($anchor_name, $anchor_text);
|
||||
}
|
||||
}
|
||||
|
||||
if (!$hide_comments) {
|
||||
$xaction_view->appendChild(
|
||||
'<div class="differential-comment-core">'.
|
||||
$content.
|
||||
'</div>'.
|
||||
'<div class="differential-comment-content '.$hide_comments_class.'">'.
|
||||
$head_content.
|
||||
'<div class="differential-comment-core">'.
|
||||
$content.
|
||||
'</div>'.
|
||||
$inline_render.
|
||||
'</div>'.
|
||||
'</div>');
|
||||
$inline_render);
|
||||
}
|
||||
|
||||
return $xaction_view->render();
|
||||
}
|
||||
|
||||
private function renderHandleList(array $phids) {
|
||||
|
||||
@@ -9,11 +9,9 @@
|
||||
phutil_require_module('phabricator', 'aphront/writeguard');
|
||||
phutil_require_module('phabricator', 'applications/differential/constants/action');
|
||||
phutil_require_module('phabricator', 'applications/differential/storage/comment');
|
||||
phutil_require_module('phabricator', 'applications/metamta/contentsource/view');
|
||||
phutil_require_module('phabricator', 'infrastructure/celerity/api');
|
||||
phutil_require_module('phabricator', 'infrastructure/javelin/api');
|
||||
phutil_require_module('phabricator', 'view/base');
|
||||
phutil_require_module('phabricator', 'view/utils');
|
||||
phutil_require_module('phabricator', 'view/layout/transaction');
|
||||
|
||||
phutil_require_module('phutil', 'markup');
|
||||
phutil_require_module('phutil', 'utils');
|
||||
|
||||
@@ -173,14 +173,11 @@ class ManiphestTransactionDetailView extends ManiphestView {
|
||||
),
|
||||
$author->renderLink().' '.$desc.'.'.$full_summary);
|
||||
}
|
||||
$descs = implode("\n", $descs);
|
||||
|
||||
if ($this->getRenderSummaryOnly()) {
|
||||
return $descs;
|
||||
return implode("\n", $descs);
|
||||
}
|
||||
|
||||
$more_classes = implode(' ', $more_classes);
|
||||
|
||||
if ($comment_transaction && $comment_transaction->hasComments()) {
|
||||
$comments = $comment_transaction->getCache();
|
||||
if (!strlen($comments)) {
|
||||
@@ -203,58 +200,33 @@ class ManiphestTransactionDetailView extends ManiphestView {
|
||||
$comment_block = null;
|
||||
}
|
||||
|
||||
if ($this->preview) {
|
||||
$timestamp = 'COMMENT PREVIEW';
|
||||
} else {
|
||||
$timestamp = phabricator_datetime(
|
||||
$transaction->getDateCreated(),
|
||||
$this->user);
|
||||
}
|
||||
|
||||
$info = array();
|
||||
|
||||
$source_transaction = nonempty($comment_transaction, $any_transaction);
|
||||
$content_source = new PhabricatorContentSourceView();
|
||||
$content_source->setContentSource($source_transaction->getContentSource());
|
||||
$content_source->setUser($this->user);
|
||||
$info[] = $content_source->render();
|
||||
|
||||
$info[] = $timestamp;
|
||||
$xaction_view = id(new PhabricatorTransactionView())
|
||||
->setUser($this->user)
|
||||
->setImageURI($author->getImageURI())
|
||||
->setContentSource($source_transaction->getContentSource())
|
||||
->setActions($descs);
|
||||
|
||||
$comment_anchor = null;
|
||||
$num = $this->commentNumber;
|
||||
if ($num && !$this->preview) {
|
||||
Javelin::initBehavior('phabricator-watch-anchor');
|
||||
$anchor_name = 'comment-'.$num;
|
||||
$info[] = javelin_render_tag(
|
||||
'a',
|
||||
array(
|
||||
'name' => $anchor_name,
|
||||
'id' => $anchor_name,
|
||||
'href' => '#'.$anchor_name,
|
||||
),
|
||||
'T'.$any_transaction->getTaskID().'#'.$anchor_name);
|
||||
$comment_anchor = 'anchor-'.$anchor_name;
|
||||
foreach ($more_classes as $class) {
|
||||
$xaction_view->addClass($class);
|
||||
}
|
||||
|
||||
$info = implode(' · ', array_filter($info));
|
||||
if ($this->preview) {
|
||||
$xaction_view->setIsPreview($this->preview);
|
||||
} else {
|
||||
$xaction_view->setEpoch($any_transaction->getDateCreated());
|
||||
if ($this->commentNumber) {
|
||||
$anchor_name = 'comment-'.$this->commentNumber;
|
||||
$anchor_text = 'T'.$any_transaction->getTaskID().'#'.$anchor_name;
|
||||
|
||||
return phutil_render_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => "maniphest-transaction-detail-container",
|
||||
'style' => "background-image: url('".$author->getImageURI()."')",
|
||||
'id' => $comment_anchor,
|
||||
),
|
||||
'<div class="maniphest-transaction-detail-view '.$more_classes.'">'.
|
||||
'<div class="maniphest-transaction-header">'.
|
||||
'<div class="maniphest-transaction-timestamp">'.
|
||||
$info.
|
||||
'</div>'.
|
||||
$descs.
|
||||
'</div>'.
|
||||
$comment_block.
|
||||
'</div>');
|
||||
$xaction_view->setAnchor($anchor_name, $anchor_text);
|
||||
}
|
||||
}
|
||||
|
||||
$xaction_view->appendChild($comment_block);
|
||||
|
||||
return $xaction_view->render();
|
||||
}
|
||||
|
||||
private function renderSupplementalInfoForEmail($transaction) {
|
||||
|
||||
@@ -12,14 +12,13 @@ phutil_require_module('phabricator', 'applications/maniphest/constants/priority'
|
||||
phutil_require_module('phabricator', 'applications/maniphest/constants/status');
|
||||
phutil_require_module('phabricator', 'applications/maniphest/constants/transactiontype');
|
||||
phutil_require_module('phabricator', 'applications/maniphest/view/base');
|
||||
phutil_require_module('phabricator', 'applications/metamta/contentsource/view');
|
||||
phutil_require_module('phabricator', 'applications/phid/constants');
|
||||
phutil_require_module('phabricator', 'infrastructure/celerity/api');
|
||||
phutil_require_module('phabricator', 'infrastructure/diff/engine');
|
||||
phutil_require_module('phabricator', 'infrastructure/env');
|
||||
phutil_require_module('phabricator', 'infrastructure/javelin/api');
|
||||
phutil_require_module('phabricator', 'infrastructure/javelin/markup');
|
||||
phutil_require_module('phabricator', 'view/utils');
|
||||
phutil_require_module('phabricator', 'view/layout/transaction');
|
||||
|
||||
phutil_require_module('phutil', 'markup');
|
||||
phutil_require_module('phutil', 'utils');
|
||||
|
||||
170
src/view/layout/transaction/PhabricatorTransactionView.php
Normal file
170
src/view/layout/transaction/PhabricatorTransactionView.php
Normal file
@@ -0,0 +1,170 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2012 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 PhabricatorTransactionView extends AphrontView {
|
||||
|
||||
private $user;
|
||||
private $imageURI;
|
||||
private $actions = array();
|
||||
private $epoch;
|
||||
private $contentSource;
|
||||
private $anchorName;
|
||||
private $anchorText;
|
||||
private $isPreview;
|
||||
private $classes = array();
|
||||
|
||||
public function setUser(PhabricatorUser $user) {
|
||||
$this->user = $user;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setImageURI($uri) {
|
||||
$this->imageURI = $uri;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setActions(array $actions) {
|
||||
$this->actions = $actions;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setEpoch($epoch) {
|
||||
$this->epoch = $epoch;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setContentSource(PhabricatorContentSource $source) {
|
||||
$this->contentSource = $source;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setAnchor($anchor_name, $anchor_text) {
|
||||
$this->anchorName = $anchor_name;
|
||||
$this->anchorText = $anchor_text;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function addClass($class) {
|
||||
$this->classes[] = $class;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setIsPreview($preview) {
|
||||
$this->isPreview = $preview;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function render() {
|
||||
if (!$this->user) {
|
||||
throw new Exception("Call setUser() before render()!");
|
||||
}
|
||||
|
||||
require_celerity_resource('phabricator-transaction-view-css');
|
||||
|
||||
$info = $this->renderTransactionInfo();
|
||||
$actions = $this->renderTransactionActions();
|
||||
$style = $this->renderTransactionStyle();
|
||||
$content = $this->renderTransactionContent();
|
||||
$classes = phutil_escape_html(implode(' ', $this->classes));
|
||||
|
||||
$transaction_id = $this->anchorName ? 'anchor-'.$this->anchorName : null;
|
||||
|
||||
return phutil_render_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => 'phabricator-transaction-view',
|
||||
'id' => $transaction_id,
|
||||
'style' => $style,
|
||||
),
|
||||
'<div class="phabricator-transaction-detail '.$classes.'">'.
|
||||
'<div class="phabricator-transaction-header">'.
|
||||
$info.
|
||||
$actions.
|
||||
'</div>'.
|
||||
$content.
|
||||
'</div>');
|
||||
|
||||
}
|
||||
|
||||
private function renderTransactionInfo() {
|
||||
$info = array();
|
||||
|
||||
if ($this->contentSource) {
|
||||
$content_source = new PhabricatorContentSourceView();
|
||||
$content_source->setContentSource($this->contentSource);
|
||||
$content_source->setUser($this->user);
|
||||
$source = $content_source->render();
|
||||
if ($source) {
|
||||
$info[] = $source;
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->isPreview) {
|
||||
$info[] = 'PREVIEW';
|
||||
} else if ($this->epoch) {
|
||||
$info[] = phabricator_datetime($this->epoch, $this->user);
|
||||
}
|
||||
|
||||
if ($this->anchorName) {
|
||||
Javelin::initBehavior('phabricator-watch-anchor');
|
||||
$info[] = phutil_render_tag(
|
||||
'a',
|
||||
array(
|
||||
'name' => $this->anchorName,
|
||||
'id' => $this->anchorName,
|
||||
'href' => '#'.$this->anchorName,
|
||||
),
|
||||
phutil_escape_html($this->anchorText));
|
||||
}
|
||||
|
||||
$info = implode(' · ', $info);
|
||||
|
||||
return
|
||||
'<span class="phabricator-transaction-info">'.
|
||||
$info.
|
||||
'</span>';
|
||||
}
|
||||
|
||||
private function renderTransactionActions() {
|
||||
$actions = implode('', $this->actions);
|
||||
return
|
||||
'<span class="phabricator-transaction-actions">'.
|
||||
$actions.
|
||||
'</span>';
|
||||
}
|
||||
|
||||
private function renderTransactionStyle() {
|
||||
if ($this->imageURI) {
|
||||
return 'background-image: url('.$this->imageURI.');';
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private function renderTransactionContent() {
|
||||
$content = $this->renderChildren();
|
||||
if (!$content) {
|
||||
return null;
|
||||
}
|
||||
return
|
||||
'<div class="phabricator-transaction-content">'.
|
||||
$content.
|
||||
'</div>';
|
||||
}
|
||||
|
||||
}
|
||||
18
src/view/layout/transaction/__init__.php
Normal file
18
src/view/layout/transaction/__init__.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
/**
|
||||
* This file is automatically generated. Lint this module to rebuild it.
|
||||
* @generated
|
||||
*/
|
||||
|
||||
|
||||
|
||||
phutil_require_module('phabricator', 'applications/metamta/contentsource/view');
|
||||
phutil_require_module('phabricator', 'infrastructure/celerity/api');
|
||||
phutil_require_module('phabricator', 'infrastructure/javelin/api');
|
||||
phutil_require_module('phabricator', 'view/base');
|
||||
phutil_require_module('phabricator', 'view/utils');
|
||||
|
||||
phutil_require_module('phutil', 'markup');
|
||||
|
||||
|
||||
phutil_require_source('PhabricatorTransactionView.php');
|
||||
Reference in New Issue
Block a user