mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-29 02:02:41 +01:00
250 lines
6.8 KiB
PHP
250 lines
6.8 KiB
PHP
|
<?php
|
||
|
|
||
|
final class ReleephRequestView extends AphrontView {
|
||
|
|
||
|
private $pullRequest;
|
||
|
private $customFields;
|
||
|
private $isListView;
|
||
|
|
||
|
public function setIsListView($is_list_view) {
|
||
|
$this->isListView = $is_list_view;
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
public function getIsListView() {
|
||
|
return $this->isListView;
|
||
|
}
|
||
|
|
||
|
public function setCustomFields(PhabricatorCustomFieldList $custom_fields) {
|
||
|
$this->customFields = $custom_fields;
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
public function getCustomFields() {
|
||
|
return $this->customFields;
|
||
|
}
|
||
|
|
||
|
public function setPullRequest(ReleephRequest $pull_request) {
|
||
|
$this->pullRequest = $pull_request;
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
public function getPullRequest() {
|
||
|
return $this->pullRequest;
|
||
|
}
|
||
|
|
||
|
public function render() {
|
||
|
$viewer = $this->getUser();
|
||
|
|
||
|
$field_list = $this->getCustomFields();
|
||
|
$pull = $this->getPullRequest();
|
||
|
|
||
|
$header = $this->buildHeader($pull);
|
||
|
|
||
|
$action_list = $this->buildActionList($pull);
|
||
|
|
||
|
$property_list = id(new PHUIPropertyListView())
|
||
|
->setUser($viewer)
|
||
|
->setActionList($action_list);
|
||
|
|
||
|
$field_list->appendFieldsToPropertyList(
|
||
|
$pull,
|
||
|
$viewer,
|
||
|
$property_list);
|
||
|
|
||
|
$warnings = $this->getWarnings($pull);
|
||
|
|
||
|
if ($this->getIsListView()) {
|
||
|
Javelin::initBehavior('releeph-request-state-change');
|
||
|
}
|
||
|
|
||
|
return id(new PHUIObjectBoxView())
|
||
|
->setHeader($header)
|
||
|
->setFormErrors($warnings)
|
||
|
->addSigil('releeph-request-box')
|
||
|
->setMetadata(array('uri' => '/'.$pull->getMonogram()))
|
||
|
->appendChild($property_list);
|
||
|
}
|
||
|
|
||
|
private function buildHeader(ReleephRequest $pull) {
|
||
|
$header_text = $pull->getSummaryForDisplay();
|
||
|
if ($this->getIsListView()) {
|
||
|
$header_text = phutil_tag(
|
||
|
'a',
|
||
|
array(
|
||
|
'href' => '/'.$pull->getMonogram(),
|
||
|
),
|
||
|
$header_text);
|
||
|
}
|
||
|
|
||
|
$header = id(new PHUIHeaderView())
|
||
|
->setHeader($header_text)
|
||
|
->setUser($this->getUser())
|
||
|
->setPolicyObject($pull);
|
||
|
|
||
|
switch ($pull->getStatus()) {
|
||
|
case ReleephRequestStatus::STATUS_REQUESTED:
|
||
|
$icon = 'open';
|
||
|
$color = null;
|
||
|
break;
|
||
|
case ReleephRequestStatus::STATUS_REJECTED:
|
||
|
$icon = 'reject';
|
||
|
$color = 'red';
|
||
|
break;
|
||
|
case ReleephRequestStatus::STATUS_PICKED:
|
||
|
$icon = 'accept';
|
||
|
$color = 'green';
|
||
|
break;
|
||
|
case ReleephRequestStatus::STATUS_REVERTED:
|
||
|
case ReleephRequestStatus::STATUS_ABANDONED:
|
||
|
$icon = 'reject';
|
||
|
$color = 'dark';
|
||
|
break;
|
||
|
case ReleephRequestStatus::STATUS_NEEDS_PICK:
|
||
|
$icon = 'warning';
|
||
|
$color = 'green';
|
||
|
break;
|
||
|
case ReleephRequestStatus::STATUS_NEEDS_REVERT:
|
||
|
$icon = 'warning';
|
||
|
$color = 'red';
|
||
|
break;
|
||
|
default:
|
||
|
$icon = 'question';
|
||
|
$color = null;
|
||
|
break;
|
||
|
}
|
||
|
$text = ReleephRequestStatus::getStatusDescriptionFor($pull->getStatus());
|
||
|
$header->setStatus($icon, $color, $text);
|
||
|
|
||
|
if ($this->getIsListView()) {
|
||
|
$header->setObjectName($pull->getMonogram());
|
||
|
}
|
||
|
|
||
|
return $header;
|
||
|
}
|
||
|
|
||
|
private function buildActionList(ReleephRequest $pull) {
|
||
|
$viewer = $this->getUser();
|
||
|
$id = $pull->getID();
|
||
|
|
||
|
$edit_uri = '/releeph/request/edit/'.$id.'/';
|
||
|
|
||
|
$view = id(new PhabricatorActionListView())
|
||
|
->setUser($viewer);
|
||
|
|
||
|
$product = $pull->getBranch()->getProduct();
|
||
|
$viewer_is_pusher = $product->isAuthoritativePHID($viewer->getPHID());
|
||
|
$viewer_is_requestor = ($pull->getRequestUserPHID() == $viewer->getPHID());
|
||
|
|
||
|
if ($viewer_is_pusher) {
|
||
|
$yes_text = pht('Approve Pull');
|
||
|
$no_text = pht('Reject Pull');
|
||
|
$yes_icon = 'check';
|
||
|
$no_icon = 'delete';
|
||
|
} else if ($viewer_is_requestor) {
|
||
|
$yes_text = pht('Request Pull');
|
||
|
$no_text = pht('Cancel Pull');
|
||
|
$yes_icon = 'ok';
|
||
|
$no_icon = 'delete';
|
||
|
} else {
|
||
|
$yes_text = pht('Support Pull');
|
||
|
$no_text = pht('Discourage Pull');
|
||
|
$yes_icon = 'like';
|
||
|
$no_icon = 'dislike';
|
||
|
}
|
||
|
|
||
|
$yes_href = '/releeph/request/action/want/'.$id.'/';
|
||
|
$no_href = '/releeph/request/action/pass/'.$id.'/';
|
||
|
|
||
|
$intents = $pull->getUserIntents();
|
||
|
$current_intent = idx($intents, $viewer->getPHID());
|
||
|
|
||
|
$yes_disabled = ($current_intent == ReleephRequest::INTENT_WANT);
|
||
|
$no_disabled = ($current_intent == ReleephRequest::INTENT_PASS);
|
||
|
|
||
|
$use_workflow = (!$this->getIsListView());
|
||
|
|
||
|
$view->addAction(
|
||
|
id(new PhabricatorActionView())
|
||
|
->setName($yes_text)
|
||
|
->setHref($yes_href)
|
||
|
->setWorkflow($use_workflow)
|
||
|
->setRenderAsForm($use_workflow)
|
||
|
->setDisabled($yes_disabled)
|
||
|
->addSigil('releeph-request-state-change')
|
||
|
->addSigil('want')
|
||
|
->setIcon($yes_icon));
|
||
|
|
||
|
$view->addAction(
|
||
|
id(new PhabricatorActionView())
|
||
|
->setName($no_text)
|
||
|
->setHref($no_href)
|
||
|
->setWorkflow($use_workflow)
|
||
|
->setRenderAsForm($use_workflow)
|
||
|
->setDisabled($no_disabled)
|
||
|
->addSigil('releeph-request-state-change')
|
||
|
->addSigil('pass')
|
||
|
->setIcon($no_icon));
|
||
|
|
||
|
|
||
|
if ($viewer_is_pusher || $viewer_is_requestor) {
|
||
|
|
||
|
$pulled_href = '/releeph/request/action/mark-manually-picked/'.$id.'/';
|
||
|
$revert_href = '/releeph/request/action/mark-manually-reverted/'.$id.'/';
|
||
|
|
||
|
if ($pull->getInBranch()) {
|
||
|
$view->addAction(
|
||
|
id(new PhabricatorActionView())
|
||
|
->setName(pht('Mark as Reverted'))
|
||
|
->setHref($revert_href)
|
||
|
->setWorkflow($use_workflow)
|
||
|
->setRenderAsForm($use_workflow)
|
||
|
->addSigil('releeph-request-state-change')
|
||
|
->addSigil('mark-manually-reverted')
|
||
|
->setIcon($no_icon));
|
||
|
} else {
|
||
|
$view->addAction(
|
||
|
id(new PhabricatorActionView())
|
||
|
->setName(pht('Mark as Pulled'))
|
||
|
->setHref($pulled_href)
|
||
|
->setWorkflow($use_workflow)
|
||
|
->setRenderAsForm($use_workflow)
|
||
|
->addSigil('releeph-request-state-change')
|
||
|
->addSigil('mark-manually-picked')
|
||
|
->setIcon('warning'));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if (!$this->getIsListView()) {
|
||
|
$view->addAction(
|
||
|
id(new PhabricatorActionView())
|
||
|
->setName(pht('Edit Pull Request'))
|
||
|
->setIcon('edit')
|
||
|
->setHref($edit_uri));
|
||
|
}
|
||
|
|
||
|
return $view;
|
||
|
}
|
||
|
|
||
|
private function getWarnings(ReleephRequest $pull) {
|
||
|
$warnings = array();
|
||
|
|
||
|
switch ($pull->getStatus()) {
|
||
|
case ReleephRequestStatus::STATUS_NEEDS_PICK:
|
||
|
if ($pull->getPickStatus() == ReleephRequest::PICK_FAILED) {
|
||
|
$warnings[] = pht('Last pull failed!');
|
||
|
}
|
||
|
break;
|
||
|
case ReleephRequestStatus::STATUS_NEEDS_REVERT:
|
||
|
if ($pull->getPickStatus() == ReleephRequest::REVERT_FAILED) {
|
||
|
$warnings[] = pht('Last revert failed!');
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return $warnings;
|
||
|
}
|
||
|
|
||
|
}
|