Something went wrong. Try again.
@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
Something went wrong. Try again.
9.2 kB · 328 lines
PHP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329<?php
final class PhabricatorProjectProfileController extends PhabricatorProjectController {
public function shouldAllowPublic() { return true; }
public function handleRequest(AphrontRequest $request) { $response = $this->loadProject(); if ($response) { return $response; }
$viewer = $request->getUser(); $project = $this->getProject(); $id = $project->getID(); $picture = $project->getProfileImageURI(); $icon = $project->getDisplayIconIcon(); $icon_name = $project->getDisplayIconName(); $tag = id(new PHUITagView()) ->setIcon($icon) ->setName($icon_name) ->addClass('project-view-header-tag') ->setType(PHUITagView::TYPE_SHADE);
$header = id(new PHUIHeaderView()) ->setHeader(array($project->getDisplayName(), $tag)) ->setViewer($viewer) ->setPolicyObject($project) ->setProfileHeader(true);
if ($project->getStatus() == PhabricatorProjectStatus::STATUS_ACTIVE) { $header->setStatus('fa-check', 'bluegrey', pht('Active')); } else { $header->setStatus('fa-ban', 'red', pht('Archived')); }
$can_edit = PhabricatorPolicyFilter::hasCapability( $viewer, $project, PhabricatorPolicyCapability::CAN_EDIT);
if ($can_edit) { $header->setImageEditURL($this->getApplicationURI("picture/{$id}/")); }
$properties = $this->buildPropertyListView($project);
$watch_action = $this->renderWatchAction($project); $header->addActionLink($watch_action);
$subtype = $project->newSubtypeObject(); if ($subtype && $subtype->hasTagView()) { $subtype_tag = $subtype->newTagView(); $header->addTag($subtype_tag); }
$milestone_list = $this->buildMilestoneList($project); $subproject_list = $this->buildSubprojectList($project);
$member_list = id(new PhabricatorProjectMemberListView()) ->setViewer($viewer) ->setProject($project) ->setLimit(10) ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) ->setUserPHIDs($project->getMemberPHIDs());
$watcher_list = id(new PhabricatorProjectWatcherListView()) ->setViewer($viewer) ->setProject($project) ->setLimit(10) ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) ->setUserPHIDs($project->getWatcherPHIDs());
$nav = $this->newNavigation( $project, PhabricatorProject::ITEM_PROFILE);
$query = id(new PhabricatorFeedQuery()) ->setViewer($viewer) ->withFilterPHIDs(array($project->getPHID())) ->setLimit(50) ->setReturnPartialResultsOnOverheat(true);
$stories = $query->execute();
$overheated_view = null; $is_overheated = $query->getIsOverheated(); if ($is_overheated) { $overheated_message = PhabricatorApplicationSearchController::newOverheatedError( (bool)$stories);
$overheated_view = id(new PHUIInfoView()) ->setSeverity(PHUIInfoView::SEVERITY_WARNING) ->setTitle(pht('Query Overheated')) ->setErrors( array( $overheated_message, )); }
$view_all = id(new PHUIButtonView()) ->setTag('a') ->setIcon('fa-list-ul') ->setText(pht('View All')) ->setHref('/feed/?projectPHIDs='.$project->getPHID());
$feed_header = id(new PHUIHeaderView()) ->setHeader(pht('Recent Activity')) ->addActionLink($view_all);
$feed = $this->renderStories($stories); $feed = id(new PHUIObjectBoxView()) ->setHeader($feed_header) ->addClass('project-view-feed') ->appendChild( array( $overheated_view, $feed, ));
require_celerity_resource('project-view-css');
$home = id(new PHUITwoColumnView()) ->setHeader($header) ->addClass('project-view-home') ->addClass('project-view-people-home') ->setMainColumn( array( $properties, $feed, )) ->setSideColumn( array( $milestone_list, $subproject_list, $member_list, $watcher_list, ));
$crumbs = $this->buildApplicationCrumbs(); $crumbs->setBorder(true);
return $this->newPage() ->setNavigation($nav) ->setCrumbs($crumbs) ->setTitle($project->getDisplayName()) ->setPageObjectPHIDs(array($project->getPHID())) ->appendChild($home); }
private function buildPropertyListView( PhabricatorProject $project) { $request = $this->getRequest(); $viewer = $request->getUser();
$view = id(new PHUIPropertyListView()) ->setViewer($viewer) ->setObject($project);
$field_list = PhabricatorCustomField::getObjectFields( $project, PhabricatorCustomField::ROLE_VIEW); $field_list->appendFieldsToPropertyList($project, $viewer, $view);
if (!$view->hasAnyProperties()) { return null; }
$header = id(new PHUIHeaderView()) ->setHeader(pht('Details'));
$view = id(new PHUIObjectBoxView()) ->setHeader($header) ->appendChild($view) ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) ->addClass('project-view-properties');
return $view; }
/** * @param array<PhabricatorFeedStory> $stories */ private function renderStories(array $stories) { assert_instances_of($stories, PhabricatorFeedStory::class);
$builder = new PhabricatorFeedBuilder($stories); $builder->setUser($this->getRequest()->getUser()); $builder->setShowHovercards(true); $view = $builder->buildView();
return $view; }
private function renderWatchAction(PhabricatorProject $project) { $viewer = $this->getViewer(); $id = $project->getID();
if (!$viewer->isLoggedIn()) { $is_watcher = false; $is_ancestor = false; } else { $viewer_phid = $viewer->getPHID(); $is_watcher = $project->isUserWatcher($viewer_phid); $is_ancestor = $project->isUserAncestorWatcher($viewer_phid); }
if ($is_ancestor && !$is_watcher) { $watch_icon = 'fa-eye'; $watch_text = pht('Watching Ancestor'); $watch_href = "/project/watch/{$id}/?via=profile"; $watch_disabled = true; } else if (!$is_watcher) { $watch_icon = 'fa-eye'; $watch_text = pht('Watch Project'); $watch_href = "/project/watch/{$id}/?via=profile"; $watch_disabled = false; } else { $watch_icon = 'fa-eye-slash'; $watch_text = pht('Unwatch Project'); $watch_href = "/project/unwatch/{$id}/?via=profile"; $watch_disabled = false; }
return id(new PHUIButtonView()) ->setTag('a') ->setWorkflow(true) ->setIcon($watch_icon) ->setText($watch_text) ->setHref($watch_href) ->setDisabled($watch_disabled); }
private function buildMilestoneList(PhabricatorProject $project) { if (!$project->getHasMilestones()) { return null; }
$viewer = $this->getViewer(); $id = $project->getID();
$milestones = id(new PhabricatorProjectQuery()) ->setViewer($viewer) ->withParentProjectPHIDs(array($project->getPHID())) ->needImages(true) ->withIsMilestone(true) ->withStatuses( array( PhabricatorProjectStatus::STATUS_ACTIVE, )) ->setOrderVector(array('milestoneNumber', 'id')) ->execute(); if (!$milestones) { return null; }
$milestone_list = id(new PhabricatorProjectListView()) ->setViewer($viewer) ->setProjects($milestones) ->renderList();
$view_all = id(new PHUIButtonView()) ->setTag('a') ->setIcon('fa-list-ul') ->setText(pht('View All')) ->setHref("/project/subprojects/{$id}/");
$header = id(new PHUIHeaderView()) ->setHeader(pht('Milestones')) ->addActionLink($view_all);
return id(new PHUIObjectBoxView()) ->setHeader($header) ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) ->setObjectList($milestone_list); }
private function buildSubprojectList(PhabricatorProject $project) { if (!$project->getHasSubprojects()) { return null; }
$viewer = $this->getViewer(); $id = $project->getID();
$limit = 25;
$subprojects = id(new PhabricatorProjectQuery()) ->setViewer($viewer) ->withParentProjectPHIDs(array($project->getPHID())) ->needImages(true) ->withStatuses( array( PhabricatorProjectStatus::STATUS_ACTIVE, )) ->withIsMilestone(false) ->setLimit($limit) ->execute(); if (!$subprojects) { return null; }
$subproject_list = id(new PhabricatorProjectListView()) ->setUser($viewer) ->setProjects($subprojects) ->renderList();
$view_all = id(new PHUIButtonView()) ->setTag('a') ->setIcon('fa-list-ul') ->setText(pht('View All')) ->setHref("/project/subprojects/{$id}/");
$header = id(new PHUIHeaderView()) ->setHeader(pht('Subprojects')) ->addActionLink($view_all);
return id(new PHUIObjectBoxView()) ->setHeader($header) ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) ->setObjectList($subproject_list); }
}