Begin modularizing profile panel/link construction

Summary: Ref T10054. This has no product impact, but prepares us for customizable side nav on "profiles" (today, projects; probably users some day; and maybe other stuff down the road).

Test Plan: Clicked all links on a profile, everything was exactly the same as before.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10054

Differential Revision: https://secure.phabricator.com/D15007
This commit is contained in:
epriestley
2016-01-12 10:27:39 -08:00
parent 1eab16c395
commit 7bde92b9c9
21 changed files with 664 additions and 63 deletions

View File

@@ -6,7 +6,7 @@ abstract class PhabricatorProjectBoardController
public function buildIconNavView(PhabricatorProject $project) {
$id = $project->getID();
$nav = parent::buildIconNavView($project);
$nav->selectFilter("board/{$id}/");
$nav->selectFilter(PhabricatorProject::PANEL_WORKBOARD);
$nav->addClass('project-board-nav');
return $nav;
}

View File

@@ -86,6 +86,8 @@ abstract class PhabricatorProjectController extends PhabricatorController {
public function buildSideNavView($for_app = false) {
$project = $this->getProject();
$nav = new AphrontSideNavFilterView();
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
@@ -115,65 +117,13 @@ abstract class PhabricatorProjectController extends PhabricatorController {
}
public function buildIconNavView(PhabricatorProject $project) {
$this->setProject($project);
$viewer = $this->getViewer();
$id = $project->getID();
$picture = $project->getProfileImageURI();
$name = $project->getName();
$columns = id(new PhabricatorProjectColumnQuery())
$engine = id(new PhabricatorProfilePanelEngine())
->setViewer($viewer)
->withProjectPHIDs(array($project->getPHID()))
->execute();
if ($columns) {
$board_icon = 'fa-columns';
} else {
$board_icon = 'fa-columns grey';
}
->setProfileObject($project);
$nav = new AphrontSideNavFilterView();
$nav->setIconNav(true);
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
$nav->addIcon("profile/{$id}/", $name, null, $picture);
$class = 'PhabricatorManiphestApplication';
if (PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) {
$phid = $project->getPHID();
$nav->addIcon("board/{$id}/", pht('Workboard'), $board_icon);
$query_uri = urisprintf(
'/maniphest/?statuses=open()&projects=%s#R',
$phid);
$nav->addIcon(null, pht('Open Tasks'), 'fa-anchor', null, $query_uri);
}
$nav->addIcon("feed/{$id}/", pht('Feed'), 'fa-newspaper-o');
$nav->addIcon("members/{$id}/", pht('Members'), 'fa-group');
if (false && PhabricatorEnv::getEnvConfig('phabricator.show-prototypes')) {
if ($project->supportsSubprojects()) {
$subprojects_icon = 'fa-sitemap';
} else {
$subprojects_icon = 'fa-sitemap grey';
}
$key = PhabricatorProjectIconSet::getMilestoneIconKey();
$milestones_icon = PhabricatorProjectIconSet::getIconIcon($key);
if (!$project->supportsMilestones()) {
$milestones_icon = "{$milestones_icon} grey";
}
$nav->addIcon(
"subprojects/{$id}/",
pht('Subprojects'),
$subprojects_icon);
$nav->addIcon(
"milestones/{$id}/",
pht('Milestones'),
$milestones_icon);
}
return $nav;
return $engine->buildNavigation();
}
protected function buildApplicationCrumbs() {

View File

@@ -281,7 +281,7 @@ final class PhabricatorProjectEditPictureController
->setForm($upload_form);
$nav = $this->buildIconNavView($project);
$nav->selectFilter("edit/{$id}/");
$nav->selectFilter(PhabricatorProject::PANEL_PROFILE);
$nav->appendChild($form_box);
$nav->appendChild($upload_box);

View File

@@ -34,7 +34,7 @@ final class PhabricatorProjectFeedController
->appendChild($feed);
$nav = $this->buildIconNavView($project);
$nav->selectFilter("feed/{$id}/");
$nav->selectFilter('feed');
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(pht('Feed'));

View File

@@ -96,7 +96,7 @@ final class PhabricatorProjectMembersEditController
$member_list = $this->renderMemberList($project, $handles);
$nav = $this->buildIconNavView($project);
$nav->selectFilter("members/{$id}/");
$nav->selectFilter(PhabricatorProject::PANEL_MEMBERS);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(pht('Members'));

View File

@@ -77,7 +77,7 @@ final class PhabricatorProjectMilestonesController
->renderList());
$nav = $this->buildIconNavView($project);
$nav->selectFilter("milestones/{$id}/");
$nav->selectFilter(PhabricatorProject::PANEL_MILESTONES);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(pht('Milestones'));

View File

@@ -44,7 +44,7 @@ final class PhabricatorProjectProfileController
$timeline->setShouldTerminate(true);
$nav = $this->buildIconNavView($project);
$nav->selectFilter("profile/{$id}/");
$nav->selectFilter(PhabricatorProject::PANEL_PROFILE);
$crumbs = $this->buildApplicationCrumbs();

View File

@@ -76,7 +76,7 @@ final class PhabricatorProjectSubprojectsController
->renderList());
$nav = $this->buildIconNavView($project);
$nav->selectFilter("subprojects/{$id}/");
$nav->selectFilter(PhabricatorProject::PANEL_SUBPROJECTS);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(pht('Subprojects'));

View File

@@ -0,0 +1,31 @@
<?php
final class PhabricatorProjectDetailsProfilePanel
extends PhabricatorProfilePanel {
const PANELKEY = 'project.details';
protected function newNavigationMenuItems(
PhabricatorProfilePanelConfiguration $config) {
$project = $config->getProfileObject();
$id = $project->getID();
$picture = $project->getProfileImageURI();
$name = $project->getName();
$href = "/project/profile/{$id}/";
$item = id(new PHUIListItemView())
->setRenderNameAsTooltip(true)
->setType(PHUIListItemView::TYPE_ICON_NAV)
->setHref($href)
->setName($name)
->setProfileImage($picture);
return array(
$item,
);
}
}

View File

@@ -0,0 +1,31 @@
<?php
final class PhabricatorProjectMembersProfilePanel
extends PhabricatorProfilePanel {
const PANELKEY = 'project.members';
protected function newNavigationMenuItems(
PhabricatorProfilePanelConfiguration $config) {
$project = $config->getProfileObject();
$id = $project->getID();
$name = pht('Members');
$icon = 'fa-group';
$href = "/project/members/{$id}/";
$item = id(new PHUIListItemView())
->setRenderNameAsTooltip(true)
->setType(PHUIListItemView::TYPE_ICON_NAV)
->setHref($href)
->setName($name)
->setIcon($icon);
return array(
$item,
);
}
}

View File

@@ -0,0 +1,46 @@
<?php
final class PhabricatorProjectWorkboardProfilePanel
extends PhabricatorProfilePanel {
const PANELKEY = 'project.workboard';
protected function newNavigationMenuItems(
PhabricatorProfilePanelConfiguration $config) {
$viewer = $this->getViewer();
// Workboards are only available if Maniphest is installed.
$class = 'PhabricatorManiphestApplication';
if (!PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) {
return array();
}
$project = $config->getProfileObject();
$columns = id(new PhabricatorProjectColumnQuery())
->setViewer($viewer)
->withProjectPHIDs(array($project->getPHID()))
->execute();
if ($columns) {
$icon = 'fa-columns';
} else {
$icon = 'fa-columns grey';
}
$id = $project->getID();
$href = "/project/board/{$id}/";
$name = pht('Workboard');
$item = id(new PHUIListItemView())
->setRenderNameAsTooltip(true)
->setType(PHUIListItemView::TYPE_ICON_NAV)
->setHref($href)
->setName($name)
->setIcon($icon);
return array(
$item,
);
}
}

View File

@@ -10,7 +10,8 @@ final class PhabricatorProject extends PhabricatorProjectDAO
PhabricatorCustomFieldInterface,
PhabricatorDestructibleInterface,
PhabricatorFulltextInterface,
PhabricatorConduitResultInterface {
PhabricatorConduitResultInterface,
PhabricatorProfilePanelInterface {
protected $name;
protected $status = PhabricatorProjectStatus::STATUS_ACTIVE;
@@ -49,6 +50,12 @@ final class PhabricatorProject extends PhabricatorProjectDAO
const TABLE_DATASOURCE_TOKEN = 'project_datasourcetoken';
const PANEL_PROFILE = 'project.profile';
const PANEL_WORKBOARD = 'project.workboard';
const PANEL_MEMBERS = 'project.members';
const PANEL_MILESTONES = 'project.milestones';
const PANEL_SUBPROJECTS = 'project.subprojects';
public static function initializeNewProject(PhabricatorUser $actor) {
$app = id(new PhabricatorApplicationQuery())
->setViewer(PhabricatorUser::getOmnipotentUser())
@@ -644,4 +651,47 @@ final class PhabricatorProject extends PhabricatorProjectDAO
return array();
}
/* -( PhabricatorProfilePanelInterface )----------------------------------- */
public function getBuiltinProfilePanels() {
$panels = array();
$panels[] = id(new PhabricatorProfilePanelConfiguration())
->setBuiltinKey(self::PANEL_PROFILE)
->setPanelKey(PhabricatorProjectDetailsProfilePanel::PANELKEY);
$panels[] = id(new PhabricatorProfilePanelConfiguration())
->setBuiltinKey(self::PANEL_WORKBOARD)
->setPanelKey(PhabricatorProjectWorkboardProfilePanel::PANELKEY);
// TODO: This is temporary.
$href = urisprintf(
'/maniphest/?statuses=open()&projects=%s#R',
$this->getPHID());
$panels[] = id(new PhabricatorProfilePanelConfiguration())
->setBuiltinKey('tasks')
->setPanelKey(PhabricatorLinkProfilePanel::PANELKEY)
->setPanelProperty('icon', 'fa-anchor')
->setPanelProperty('name', pht('Open Tasks'))
->setPanelProperty('href', $href);
// TODO: This is temporary.
$id = $this->getID();
$panels[] = id(new PhabricatorProfilePanelConfiguration())
->setBuiltinKey('feed')
->setPanelKey(PhabricatorLinkProfilePanel::PANELKEY)
->setPanelProperty('icon', 'fa-newspaper-o')
->setPanelProperty('name', pht('Feed'))
->setPanelProperty('href', "/project/feed/{$id}/");
$panels[] = id(new PhabricatorProfilePanelConfiguration())
->setBuiltinKey(self::PANEL_MEMBERS)
->setPanelKey(PhabricatorProjectMembersProfilePanel::PANELKEY);
return $panels;
}
}