2011-02-08 10:53:59 -08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
abstract class ManiphestController extends PhabricatorController {
|
|
|
|
|
|
2013-10-24 00:14:02 +02:00
|
|
|
protected $projectKey;
|
2013-10-24 16:28:59 +02:00
|
|
|
protected $taskTypeKey;
|
2013-11-06 16:03:53 +06:00
|
|
|
protected $alwaysVisibleProjects = array('BF Blender', 'Addons', 'Game Engine');
|
2013-10-24 00:14:02 +02:00
|
|
|
|
|
|
|
|
public function willProcessRequest(array $data) {
|
|
|
|
|
$this->projectKey = idx($data, 'projectKey');
|
2013-10-24 16:28:59 +02:00
|
|
|
$this->taskTypeKey = idx($data, 'taskTypeKey');
|
2013-10-24 00:14:02 +02:00
|
|
|
}
|
|
|
|
|
|
2013-09-13 11:29:08 -07:00
|
|
|
public function buildApplicationMenu() {
|
|
|
|
|
return $this->buildSideNavView(true)->getMenu();
|
2011-02-08 10:53:59 -08:00
|
|
|
}
|
|
|
|
|
|
2013-10-24 16:28:59 +02:00
|
|
|
private function getBlenderTaskTypeField() {
|
|
|
|
|
$config = PhabricatorEnv::getEnvConfig(
|
|
|
|
|
'maniphest.custom-field-definitions',
|
|
|
|
|
array());
|
|
|
|
|
$task_type = idx($config, 'blender:task-type');
|
|
|
|
|
if (!$task_type) {
|
|
|
|
|
throw new Exception(
|
|
|
|
|
'Custom definition for blender:task-type ' .
|
|
|
|
|
'is not found in maniphest settings.');
|
|
|
|
|
}
|
|
|
|
|
return $task_type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function getBlenderTaskTypes() {
|
|
|
|
|
$task_types = $this->getBlenderTaskTypeField();
|
|
|
|
|
$options = idx($task_types, 'options');
|
|
|
|
|
if (!$options) {
|
|
|
|
|
throw new Exception(
|
|
|
|
|
'Custom definition for blender:task-type ' .
|
|
|
|
|
'doesn\'t have options field.');
|
|
|
|
|
}
|
|
|
|
|
return $options;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function buildProjectsNavigation($nav) {
|
|
|
|
|
$user = $this->getRequest()->getUser();
|
|
|
|
|
if (!$this->projectKey) {
|
|
|
|
|
$nav->addLabel(pht('Projects'));
|
2013-10-24 17:11:31 +02:00
|
|
|
|
|
|
|
|
$show_item_id = celerity_generate_unique_node_id();
|
|
|
|
|
$hide_item_id = celerity_generate_unique_node_id();
|
|
|
|
|
|
|
|
|
|
$show_item = id(new PHUIListItemView())
|
|
|
|
|
->setName(pht('Show all projects'))
|
|
|
|
|
->setHref('#')
|
|
|
|
|
->addSigil('reveal-content')
|
|
|
|
|
->setID($show_item_id);
|
|
|
|
|
|
|
|
|
|
$hide_item = id(new PHUIListItemView())
|
|
|
|
|
->setName(pht('Hide inactive Projects'))
|
|
|
|
|
->setHref('#')
|
|
|
|
|
->setStyle('display: none')
|
|
|
|
|
->setID($hide_item_id)
|
|
|
|
|
->addSigil('reveal-content');
|
|
|
|
|
|
|
|
|
|
$nav->addMenuItem($show_item);
|
|
|
|
|
$nav->addMenuItem($hide_item);
|
|
|
|
|
|
2013-10-24 16:28:59 +02:00
|
|
|
$projects = id(new PhabricatorProjectQuery())
|
|
|
|
|
->setViewer($user)
|
|
|
|
|
->execute();
|
2013-10-24 17:11:31 +02:00
|
|
|
$project_ids = array($hide_item_id);
|
2013-10-24 16:28:59 +02:00
|
|
|
|
|
|
|
|
foreach ($projects as $project) {
|
2014-06-06 14:34:38 +06:00
|
|
|
if ($project->isArchived()) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2013-10-24 17:11:31 +02:00
|
|
|
$url = 'project/' . $project->getID();
|
|
|
|
|
$name = $project->getName();
|
2013-11-06 16:03:53 +06:00
|
|
|
$is_hide = !in_array($name, $this->alwaysVisibleProjects);
|
2013-10-24 17:11:31 +02:00
|
|
|
if ($is_hide) {
|
|
|
|
|
$label_id = celerity_generate_unique_node_id();
|
|
|
|
|
$project_ids[] = $label_id;
|
|
|
|
|
$nav->addMenuItem(
|
|
|
|
|
id(new PHUIListItemView())
|
|
|
|
|
->setName(pht($name))
|
|
|
|
|
->setType(PHUIListItemView::TYPE_LINK)
|
|
|
|
|
->setHref($url)
|
|
|
|
|
->setStyle('display: none;')
|
|
|
|
|
->setID($label_id));
|
|
|
|
|
} else {
|
|
|
|
|
$nav->addFilter($url, pht($name));
|
|
|
|
|
}
|
2013-10-24 16:28:59 +02:00
|
|
|
}
|
2013-10-24 17:11:31 +02:00
|
|
|
|
|
|
|
|
Javelin::initBehavior('phabricator-reveal-content');
|
|
|
|
|
|
|
|
|
|
$show_item->setMetadata(
|
|
|
|
|
array(
|
|
|
|
|
'showIDs' => $project_ids,
|
|
|
|
|
'hideIDs' => array($show_item_id),
|
|
|
|
|
));
|
|
|
|
|
$hide_item->setMetadata(
|
|
|
|
|
array(
|
|
|
|
|
'showIDs' => array($show_item_id),
|
|
|
|
|
'hideIDs' => $project_ids,
|
|
|
|
|
));
|
2013-11-04 21:12:43 +06:00
|
|
|
} else {
|
2013-10-24 16:28:59 +02:00
|
|
|
$project = id(new PhabricatorProjectQuery())
|
|
|
|
|
->setViewer($user)
|
|
|
|
|
->withIDs(array($this->projectKey))
|
|
|
|
|
->executeOne();
|
|
|
|
|
if ($project) {
|
|
|
|
|
$nav->addLabel(pht($project->getName()));
|
2013-11-04 21:12:43 +06:00
|
|
|
$menu = $nav->getMenu();
|
2013-11-04 21:34:47 +06:00
|
|
|
|
|
|
|
|
$url = $nav->getBaseURI() . 'project/' . $this->projectKey;
|
|
|
|
|
$link = $menu->newLink(pht('All Types'), $url, '');
|
|
|
|
|
if (!$this->taskTypeKey) {
|
|
|
|
|
$link->addClass('phui-list-item-selected');
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-24 16:28:59 +02:00
|
|
|
$task_types = $this->getBlenderTaskTypes();
|
|
|
|
|
foreach ($task_types as $id => $name) {
|
2013-11-04 21:12:43 +06:00
|
|
|
$url = $nav->getBaseURI() . 'project/' . $this->projectKey . '/type/' . $id;
|
|
|
|
|
$link = $menu->newLink(pht($name), $url, $id);
|
|
|
|
|
if ($id == $this->taskTypeKey) {
|
|
|
|
|
$link->addClass('phui-list-item-selected');
|
|
|
|
|
}
|
2013-10-24 16:28:59 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-13 11:29:08 -07:00
|
|
|
public function buildSideNavView($for_app = false) {
|
|
|
|
|
$user = $this->getRequest()->getUser();
|
|
|
|
|
|
2012-03-01 14:19:11 -08:00
|
|
|
$nav = new AphrontSideNavFilterView();
|
2013-09-13 11:29:08 -07:00
|
|
|
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
|
2012-04-10 09:46:04 -07:00
|
|
|
|
2013-03-12 23:30:03 -07:00
|
|
|
if ($for_app) {
|
2013-09-13 11:29:08 -07:00
|
|
|
$nav->addFilter('create', pht('Create Task'));
|
2013-03-12 23:30:03 -07:00
|
|
|
}
|
|
|
|
|
|
2013-10-24 16:28:59 +02:00
|
|
|
$this->buildProjectsNavigation($nav);
|
2013-10-24 00:14:02 +02:00
|
|
|
|
2013-09-13 11:29:08 -07:00
|
|
|
id(new ManiphestTaskSearchEngine())
|
|
|
|
|
->setViewer($user)
|
2013-10-24 00:14:02 +02:00
|
|
|
->setProjectKey($this->projectKey)
|
2013-10-24 16:28:59 +02:00
|
|
|
->setTaskTypeKey($this->taskTypeKey)
|
2013-09-13 11:29:08 -07:00
|
|
|
->addNavigationItems($nav->getMenu());
|
|
|
|
|
|
2013-09-25 13:45:04 -07:00
|
|
|
if ($user->isLoggedIn()) {
|
|
|
|
|
// For now, don't give logged-out users access to reports.
|
|
|
|
|
$nav->addLabel(pht('Reports'));
|
|
|
|
|
$nav->addFilter('report', pht('Reports'));
|
|
|
|
|
}
|
2013-09-13 11:29:08 -07:00
|
|
|
|
|
|
|
|
$nav->selectFilter(null);
|
2012-03-01 14:19:11 -08:00
|
|
|
|
|
|
|
|
return $nav;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-13 11:29:08 -07:00
|
|
|
protected function buildApplicationCrumbs() {
|
|
|
|
|
$crumbs = parent::buildApplicationCrumbs();
|
|
|
|
|
|
2013-10-24 00:14:02 +02:00
|
|
|
if ($this->projectKey) {
|
|
|
|
|
$user = $this->getRequest()->getUser();
|
|
|
|
|
$project = id(new PhabricatorProjectQuery())
|
|
|
|
|
->setViewer($user)
|
|
|
|
|
->withIDs(array($this->projectKey))
|
|
|
|
|
->executeOne();
|
|
|
|
|
if ($project) {
|
2013-10-24 16:28:59 +02:00
|
|
|
$crumb = id(new PhabricatorCrumbView())
|
|
|
|
|
->setName(pht($project->getName()));
|
|
|
|
|
if ($this->taskTypeKey)
|
|
|
|
|
$crumb->setHref('/maniphest/project/'.$this->projectKey);
|
|
|
|
|
$crumbs->addCrumb($crumb);
|
2013-11-06 16:03:53 +06:00
|
|
|
|
|
|
|
|
$crumbs->addAction(
|
|
|
|
|
id(new PHUIListItemView())
|
|
|
|
|
->setName(pht('Report Bug'))
|
|
|
|
|
->setHref($this->getApplicationURI('task/create/?project='.
|
|
|
|
|
$project->getID().'&type=Bug'))
|
|
|
|
|
->setIcon('create'));
|
2013-10-24 16:28:59 +02:00
|
|
|
} else {
|
|
|
|
|
throw new Exception('Unknown project was passed via the url');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($this->taskTypeKey) {
|
|
|
|
|
$task_types = $this->getBlenderTaskTypes();
|
|
|
|
|
$type = idx($task_types, $this->taskTypeKey);
|
|
|
|
|
if ($type) {
|
2013-11-08 21:01:07 +01:00
|
|
|
if($type == "To Do") {
|
|
|
|
|
$crumbs->addAction(
|
|
|
|
|
id(new PHUIListItemView())
|
|
|
|
|
->setName(pht('Create To Do Task'))
|
|
|
|
|
->setHref($this->getApplicationURI('task/create/?project='.
|
|
|
|
|
$project->getID().'&type=To%20Do'))
|
|
|
|
|
->setIcon('create'));
|
|
|
|
|
}
|
|
|
|
|
else if($type == "Patch") {
|
|
|
|
|
$crumbs->addAction(
|
|
|
|
|
id(new PHUIListItemView())
|
|
|
|
|
->setName(pht('Submit Patch'))
|
|
|
|
|
->setHref($this->getApplicationURI('task/create/?project='.
|
|
|
|
|
$project->getID().'&type=Patch'))
|
|
|
|
|
->setIcon('create'));
|
|
|
|
|
}
|
|
|
|
|
else if($type == "Design") {
|
|
|
|
|
$crumbs->addAction(
|
|
|
|
|
id(new PHUIListItemView())
|
|
|
|
|
->setName(pht('Create Design Task'))
|
|
|
|
|
->setHref($this->getApplicationURI('task/create/?project='.
|
|
|
|
|
$project->getID().'&type=Design'))
|
|
|
|
|
->setIcon('create'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2013-10-24 00:14:02 +02:00
|
|
|
$crumbs->addCrumb(
|
|
|
|
|
id(new PhabricatorCrumbView())
|
2013-10-24 16:28:59 +02:00
|
|
|
->setName(pht($type)));
|
|
|
|
|
} else {
|
|
|
|
|
throw new Exception('Unknown task type was passed via the url');
|
2013-10-24 00:14:02 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-13 11:29:08 -07:00
|
|
|
return $crumbs;
|
2012-04-10 09:46:04 -07:00
|
|
|
}
|
|
|
|
|
|
2013-05-30 18:55:25 -07:00
|
|
|
protected function renderSingleTask(ManiphestTask $task) {
|
|
|
|
|
$user = $this->getRequest()->getUser();
|
|
|
|
|
|
|
|
|
|
$phids = $task->getProjectPHIDs();
|
|
|
|
|
if ($task->getOwnerPHID()) {
|
|
|
|
|
$phids[] = $task->getOwnerPHID();
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-11 12:27:28 -07:00
|
|
|
$handles = id(new PhabricatorHandleQuery())
|
2013-05-30 18:55:25 -07:00
|
|
|
->setViewer($user)
|
2013-09-11 12:27:28 -07:00
|
|
|
->withPHIDs($phids)
|
|
|
|
|
->execute();
|
2013-05-30 18:55:25 -07:00
|
|
|
|
|
|
|
|
$view = id(new ManiphestTaskListView())
|
|
|
|
|
->setUser($user)
|
|
|
|
|
->setShowSubpriorityControls(true)
|
|
|
|
|
->setShowBatchControls(true)
|
|
|
|
|
->setHandles($handles)
|
|
|
|
|
->setTasks(array($task));
|
|
|
|
|
|
|
|
|
|
return $view;
|
|
|
|
|
}
|
|
|
|
|
|
2011-02-08 10:53:59 -08:00
|
|
|
}
|