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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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'));
|
||||
|
||||
@@ -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'));
|
||||
|
||||
@@ -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'));
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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'));
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user