diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index ec9e620e2fc6a8e3018c64edf6b1617d65bc11b1..fe0d89ad3b316bbd0100375659a87f0a7d3953f4 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -30,18 +30,15 @@ phutil_register_library_map(array( 'SprintConstants' => 'constants/SprintConstants.php', 'SprintController' => 'controller/SprintController.php', 'SprintControllerTest' => 'tests/SprintControllerTest.php', - 'SprintCreateConduitAPIMethod' => 'conduit/SprintCreateConduitAPIMethod.php', 'SprintCustomFieldTest' => 'tests/SprintCustomFieldTest.php', 'SprintDAO' => 'storage/SprintDAO.php', 'SprintDataView' => 'view/burndown/SprintDataView.php', 'SprintDataViewController' => 'controller/SprintDataViewController.php', - 'SprintDefaultViewCapability' => 'capability/SprintDefaultViewCapability.php', 'SprintEndDateField' => 'customfield/SprintEndDateField.php', 'SprintException' => 'exception/SprintException.php', 'SprintGetIsSprintConduitAPIMethod' => 'conduit/SprintGetIsSprintConduitAPIMethod.php', 'SprintGetStartEndDatesConduitAPIMethod' => 'conduit/SprintGetStartEndDatesConduitAPIMethod.php', 'SprintGetTaskProjectHistoryConduitAPIMethod' => 'conduit/SprintGetTaskProjectHistoryConduitAPIMethod.php', - 'SprintHandleIconView' => 'view/SprintHandleIconView.php', 'SprintHistoryController' => 'controller/SprintHistoryController.php', 'SprintHistoryDataProvider' => 'storage/SprintHistoryDataProvider.php', 'SprintHistoryTableView' => 'view/reports/SprintHistoryTableView.php', @@ -53,11 +50,9 @@ phutil_register_library_map(array( 'SprintManiphestConduitAPIMethod' => 'conduit/SprintManiphestConduitAPIMethod.php', 'SprintManiphestQueryConduitAPIMethod' => 'conduit/SprintManiphestQueryConduitAPIMethod.php', 'SprintPoints' => 'util/SprintPoints.php', - 'SprintProjectController' => 'controller/SprintProjectController.php', + 'SprintProjectBoardController' => 'controller/SprintProjectBoardController.php', 'SprintProjectCustomField' => 'customfield/SprintProjectCustomField.php', - 'SprintProjectProfileController' => 'controller/SprintProjectProfileController.php', 'SprintProjectProfilePanel' => 'profilepanel/SprintProjectProfilePanel.php', - 'SprintProjectProfilePanelEngine' => 'engine/SprintProjectProfilePanelEngine.php', 'SprintProjectViewController' => 'controller/SprintProjectViewController.php', 'SprintQuery' => 'query/SprintQuery.php', 'SprintQueryTest' => 'tests/SprintQueryTest.php', @@ -95,18 +90,15 @@ phutil_register_library_map(array( 'SprintConfigOptions' => 'PhabricatorApplicationConfigOptions', 'SprintController' => 'PhabricatorController', 'SprintControllerTest' => 'SprintTestCase', - 'SprintCreateConduitAPIMethod' => 'SprintConduitAPIMethod', 'SprintCustomFieldTest' => 'SprintTestCase', 'SprintDAO' => 'PhabricatorLiskDAO', 'SprintDataView' => 'SprintView', 'SprintDataViewController' => 'SprintController', - 'SprintDefaultViewCapability' => 'PhabricatorPolicyCapability', 'SprintEndDateField' => 'SprintProjectCustomField', 'SprintException' => 'AphrontException', 'SprintGetIsSprintConduitAPIMethod' => 'SprintConduitAPIMethod', 'SprintGetStartEndDatesConduitAPIMethod' => 'SprintConduitAPIMethod', 'SprintGetTaskProjectHistoryConduitAPIMethod' => 'SprintConduitAPIMethod', - 'SprintHandleIconView' => 'AphrontTagView', 'SprintHistoryController' => 'SprintController', 'SprintHistoryTableView' => 'SprintView', 'SprintInfoConduitAPIMethod' => 'SprintManiphestConduitAPIMethod', @@ -116,14 +108,12 @@ phutil_register_library_map(array( 'SprintManiphestConduitAPIMethod' => 'ConduitAPIMethod', 'SprintManiphestQueryConduitAPIMethod' => 'SprintManiphestConduitAPIMethod', 'SprintPoints' => 'Phobject', - 'SprintProjectController' => 'SprintController', + 'SprintProjectBoardController' => 'SprintController', 'SprintProjectCustomField' => array( 'PhabricatorProjectCustomField', 'PhabricatorStandardCustomFieldInterface', ), - 'SprintProjectProfileController' => 'SprintProjectController', 'SprintProjectProfilePanel' => 'PhabricatorProfilePanel', - 'SprintProjectProfilePanelEngine' => 'PhabricatorProfilePanelEngine', 'SprintProjectViewController' => 'SprintController', 'SprintQuery' => 'SprintDAO', 'SprintQueryTest' => 'SprintTestCase', diff --git a/src/application/SprintApplication.php b/src/application/SprintApplication.php index 7d429f20a268f4439c0685a0c5bd1c86917cb70e..c73518bfb6bfd2d6b5312c7dae184eae7a24e803 100644 --- a/src/application/SprintApplication.php +++ b/src/application/SprintApplication.php @@ -26,43 +26,19 @@ final class SprintApplication extends PhabricatorApplication { public function getRoutes() { return array( - // this is the default application route controller '/project/sprint/' => array( + // redirects to core projects app '' => 'SprintListController', - // these are native Sprint application controllers - 'burn/(?P<id>\d+)/' => 'SprintDataViewController', 'profile/(?P<id>[1-9]\d*)/' => 'SprintProjectProfileController', + 'board/(?P<id>\d+)/' => 'SprintProjectBoardController', + // still contained within Sprint all + 'burn/(?P<id>\d+)/' => 'SprintDataViewController', + 'view/(?P<id>\d+)/' => 'SprintDataViewController', 'report/list/' => 'SprintListController', 'report/history/' => 'SprintHistoryController', 'report/(?:(?P<view>\w+)/)?' => 'SprintReportController', - 'view/(?P<id>\d+)/' => 'SprintDataViewController', ), ); } - - protected function getCustomCapabilities() { - return array( - SprintDefaultViewCapability::CAPABILITY => array( - 'caption' => pht( - 'Default view policy for newly created sprints.'), - ), - ProjectCreateProjectsCapability::CAPABILITY => array(), - ProjectCanLockProjectsCapability::CAPABILITY => array( - 'default' => PhabricatorPolicies::POLICY_ADMIN, - ), - ManiphestDefaultViewCapability::CAPABILITY => array( - 'caption' => pht('Default view policy for newly created tasks.'), - ), - ManiphestDefaultEditCapability::CAPABILITY => array( - 'caption' => pht('Default edit policy for newly created tasks.'), - ), - ManiphestEditStatusCapability::CAPABILITY => array(), - ManiphestEditAssignCapability::CAPABILITY => array(), - ManiphestEditPoliciesCapability::CAPABILITY => array(), - ManiphestEditPriorityCapability::CAPABILITY => array(), - ManiphestEditProjectsCapability::CAPABILITY => array(), - ManiphestBulkEditCapability::CAPABILITY => array(), - ); - } } diff --git a/src/capability/SprintDefaultViewCapability.php b/src/capability/SprintDefaultViewCapability.php deleted file mode 100644 index d59d8d406afe87fdada4b9515ebd80c8cdceaf9d..0000000000000000000000000000000000000000 --- a/src/capability/SprintDefaultViewCapability.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php - -final class SprintDefaultViewCapability - extends PhabricatorPolicyCapability { - - const CAPABILITY = 'sprint.default.view'; - - public function getCapabilityName() { - return pht('Default View Policy'); - } - - public function shouldAllowPublicPolicySetting() { - return true; - } -} diff --git a/src/conduit/SprintCreateConduitAPIMethod.php b/src/conduit/SprintCreateConduitAPIMethod.php deleted file mode 100644 index 712c8fac319267ee05454803218559ce71b752af..0000000000000000000000000000000000000000 --- a/src/conduit/SprintCreateConduitAPIMethod.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php - -final class SprintCreateConduitAPIMethod extends SprintConduitAPIMethod { - - public function getAPIMethodName() { - return 'sprint.create'; - } - - public function getMethodDescription() { - return pht('Create a Sprint Project'); - } - - public function defineParamTypes() { - return array( - 'name' => 'required string ("name")', - 'members' => 'optional list ([<phid>]) - empty list enter []', - 'startdate' => 'required string ("YYYY-MM-DD H:i")', - 'enddate' => 'required string ("YYYY-MM-DD H:i")', - ); - } - - public function defineReturnType() { - return 'dict'; - } - - public function defineErrorTypes() { - return array(); - } - - protected function execute(ConduitAPIRequest $request) { - $user = $request->getUser(); - - $this->requireApplicationCapability( - ProjectCreateProjectsCapability::CAPABILITY, - $user); - - $project = PhabricatorProject::initializeNewProject($user); - $type_name = PhabricatorProjectTransaction::TYPE_NAME; - $members = $request->getValue('members'); - $xactions = array(); - - $xactions[] = id(new PhabricatorProjectTransaction()) - ->setTransactionType($type_name) - ->setNewValue($request->getValue('name')); - - $xactions[] = id(new PhabricatorProjectTransaction()) - ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) - ->setMetadataValue( - 'edge:type', - PhabricatorProjectProjectHasMemberEdgeType::EDGECONST) - ->setNewValue( - array( - '+' => array_fuse($members), - )); - - $xactions[] = id(new PhabricatorProjectTransaction()) - ->setTransactionType(PhabricatorProjectTransaction::TYPE_ICON) - ->setNewValue('fa-calendar'); - - $xactions[] = id(new PhabricatorProjectTransaction()) - ->setTransactionType(PhabricatorProjectTransaction::TYPE_COLOR) - ->setNewValue('green'); - - $xactions[] = id(new PhabricatorProjectTransaction()) - ->setTransactionType(PhabricatorTransactions::TYPE_CUSTOMFIELD) - ->setMetadataValue('customfield:key', 'isdc:sprint:issprint') - ->setOldValue(null) - ->setNewValue(1); - - $xactions[] = id(new PhabricatorProjectTransaction()) - ->setTransactionType(PhabricatorTransactions::TYPE_CUSTOMFIELD) - ->setMetadataValue('customfield:key', 'isdc:sprint:startdate') - ->setOldValue(null) - ->setNewValue(strtotime($request->getValue('startdate'))); - - $xactions[] = id(new PhabricatorProjectTransaction()) - ->setTransactionType(PhabricatorTransactions::TYPE_CUSTOMFIELD) - ->setMetadataValue('customfield:key', 'isdc:sprint:enddate') - ->setOldValue(0) - ->setNewValue(strtotime($request->getValue('enddate'))); - - $editor = id(new PhabricatorProjectTransactionEditor()) - ->setActor($user) - ->setContinueOnNoEffect(true) - ->setContentSource($request->newContentSource()); - - $editor->applyTransactions($project, $xactions); - - return $this->buildProjectInfoDictionary($project); - } - -} diff --git a/src/controller/SprintController.php b/src/controller/SprintController.php index cc07ef5a146a164a7638e5bcac61ab1746066f43..9458a862652caf3ebc1c44dd471d6b4a2d4afd97 100644 --- a/src/controller/SprintController.php +++ b/src/controller/SprintController.php @@ -12,10 +12,6 @@ abstract class SprintController extends PhabricatorController { return true; } - public function getProjectsURI() { - return '/project/'; - } - public function getUser() { return $this->getRequest()->getUser(); } @@ -24,92 +20,6 @@ abstract class SprintController extends PhabricatorController { return new PhutilURI($this->getApplicationURI()); } - public function buildApplicationMenu() { - return $this->buildSprintNavView($this->getUser(), - $this->setApplicationURI(), true)->getMenu(); - } - - public function buildNavMenu() { - $nav = id(new AphrontSideNavFilterView()) - ->setBaseURI(new PhutilURI($this->getApplicationURI().'report/')) - ->addLabel(pht('Sprint Projects')) - ->addFilter('list', pht('List')) - ->addLabel(pht('Open Tasks')) - ->addFilter('project', pht('By Project')) - ->addFilter('user', pht('By User')) - ->addLabel(pht('Burn Up')) - ->addFilter('burn', pht('Burn Up Rate')) - ->addFilter('history', pht('Task Project History')); - return $nav; - } - - /** - * @param PhutilURI $uri - */ - public function buildSprintNavView($viewer, $uri, $for_app = false) { - $request = $this->getRequest(); - $id = $request->getURIData('id'); - $slug = $request->getURIData('slug'); - if ($slug) { - $id = $this->getProjectIDfromSlug($slug, $viewer); - } - $nav = new AphrontSideNavFilterView(); - $nav->setBaseURI($uri); - - if ($for_app) { - if ($id) { - $nav->addFilter("profile/{$id}/", pht('Profile')); - $nav->addFilter("board/{$id}/", pht('Workboard')); - $nav->addFilter("members/{$id}/", pht('Members')); - $nav->addFilter("feed/{$id}/", pht('Feed')); - $nav->addFilter("details/{$id}/", pht('Edit Details')); - } - $nav->addFilter('create', pht('Create Project')); - } - - id(new PhabricatorProjectSearchEngine()) - ->setViewer($viewer) - ->addNavigationItems($nav->getMenu()); - - if ($viewer->isLoggedIn()) { - $nav->addLabel(pht('Sprints')); - $nav->addFilter('report/list', pht('Sprint List')); - } - - $nav->selectFilter(null); - - return $nav; - } - - protected function buildSprintApplicationCrumbs($can_create) { - $crumbs = $this->buildCrumbs('fa-bar-chart', $this->getApplicationURI()); - - $crumbs->addAction( - id(new PHUIListItemView()) - ->setName(pht('Create Sprint')) - ->setHref('/conduit/method/sprint.create/') - ->setIcon('fa-calendar') - ->setDisabled(!$can_create)); - - return $crumbs; - } - - protected function buildCrumbs($sprite, $uri) { - $crumbs = array(); - - $crumbs[] = id(new PHUICrumbView()) - ->setHref($uri) - ->setAural($sprite) - ->setIcon($sprite); - - $view = new PHUICrumbsView(); - foreach ($crumbs as $crumb) { - $view->addCrumb($crumb); - } - - return $view; - } - public function getProjectIDfromSlug($slug, $viewer) { $project = id(new PhabricatorProjectQuery()) ->setViewer($viewer) diff --git a/src/controller/SprintDataViewController.php b/src/controller/SprintDataViewController.php old mode 100755 new mode 100644 index 95066b2b4eb2c3e13bd3a34ceaf1df8212e1daf0..ffa6d8fa7bf33d1534171dcafc0b81994e318baf --- a/src/controller/SprintDataViewController.php +++ b/src/controller/SprintDataViewController.php @@ -13,7 +13,7 @@ final class SprintDataViewController extends SprintController { if ($project) { $viewer = $this->getViewer(); - $engine = id(new SprintProjectProfilePanelEngine()) + $engine = id(new PhabricatorProjectProfilePanelEngine()) ->setViewer($viewer) ->setProfileObject($project); @@ -41,13 +41,10 @@ final class SprintDataViewController extends SprintController { $error_box = $this->getErrorBox($e); } - $can_create = $this->hasApplicationCapability( - ProjectCreateProjectsCapability::CAPABILITY); - $crumbs = $this->getCrumbs($can_create); + $crumbs = $this->getCrumbs(); $nav = $this->getProfileMenu($this->project); return $this->newPage() ->setNavigation($nav) - ->setCrumbs($crumbs) ->setTitle($this->project->getName()) ->setPageObjectPHIDs(array($this->project->getPHID())) ->appendChild($error_box) @@ -64,9 +61,8 @@ final class SprintDataViewController extends SprintController { return $project; } - public function getCrumbs($can_create) { - - $crumbs = $this->buildSprintApplicationCrumbs($can_create); + public function getCrumbs() { + $crumbs = new PHUICrumbsView(); $crumbs->addTextCrumb( $this->project->getName(), $this->getApplicationURI().'profile/'.$this->projectID); diff --git a/src/controller/SprintHistoryController.php b/src/controller/SprintHistoryController.php deleted file mode 100644 index caaeeece47e861f481d96d4201235a9144b6f602..0000000000000000000000000000000000000000 --- a/src/controller/SprintHistoryController.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php - -final class SprintHistoryController extends SprintController { - - private $view; - private $viewer; - - public function handleRequest(AphrontRequest $request) { - $this->viewer = $request->getViewer(); - - if ($request->isFormPost()) { - $uri = $request->getRequestURI(); - - $project = head($request->getArr('set_project')); - $project = nonempty($project, null); - $uri = $uri->alter('project', $project); - - $window = $request->getStr('set_window'); - $uri = $uri->alter('window', $window); - - return id(new AphrontRedirectResponse())->setURI($uri); - } - - $error_box = null; - $sprintlist_table = null; - $history_model = id(new SprintHistoryDataProvider()) - ->setViewer($this->viewer) - ->setRequest($request) - ->execute(); - - try { - $sprintlist_table = id(new SprintHistoryTableView()) - ->setViewer($this->viewer) - ->setRequest($request) - ->setTableData($history_model) - ->render(); - } catch (Exception $e) { - $error_box = $this->getErrorBox($e); - } - - - $can_create = $this->hasApplicationCapability( - ProjectCreateProjectsCapability::CAPABILITY); - $crumbs = $this->buildSprintApplicationCrumbs($can_create); - $crumbs->addTextCrumb(pht('Task Project History')); - - $help = id(new PHUIBoxView()) - ->appendChild(phutil_tag('p', array(), - 'This is a history of tasks and logs when a project was added or removed')) - ->appendChild(phutil_tag('br', array(), '')) - ->appendChild(phutil_tag('p', array(), - 'NOTE: The tasks are selected from the current tasks in the project. Tasks previously removed - will not appear!')) - ->addMargin(PHUI::MARGIN_LARGE); - $nav = $this->buildNavMenu(); - $this->view = $nav->selectFilter($this->view, 'history'); - $nav->appendChild( - array( - $error_box, - $crumbs, - $help, - $sprintlist_table, - )); - $title = pht('Task Project History'); - return $this->newPage() - ->setTitle($title) - ->appendChild($nav); - } -} diff --git a/src/controller/SprintListController.php b/src/controller/SprintListController.php index a0830169266306ebea2c08b54c67d5f8daad0388..9dd127868590e4a778f4cd9be26914f40b946184 100644 --- a/src/controller/SprintListController.php +++ b/src/controller/SprintListController.php @@ -1,50 +1,10 @@ <?php final class SprintListController extends SprintController { - - private $view; - private $viewer; - public function handleRequest(AphrontRequest $request) { - $this->viewer = $request->getViewer(); - - $error_box = null; - $sprintlist_model = id(new SprintListDataProvider()) - ->setViewer($this->viewer) - ->setRequest($request) - ->execute(); - - try { - $sprintlist_table = id(new SprintListTableView()) - ->setTableData($sprintlist_model) - ->buildProjectsTable(); - } catch (Exception $e) { - $error_box = $this->getErrorBox($e); - } - - - $can_create = $this->hasApplicationCapability( - ProjectCreateProjectsCapability::CAPABILITY); - $crumbs = $this->buildSprintApplicationCrumbs($can_create); - $crumbs->addTextCrumb(pht('Sprint Burndown List')); + $uri = $request->getRequestURI(); + $uri->setPath('/project/'); - $help = id(new PHUIBoxView()) - ->appendChild(phutil_tag('p', array(), - 'To have a project show up in this list, make sure that the' - .'"Is Sprint" box has been checked in Project Edit Details')) - ->addMargin(PHUI::MARGIN_LARGE); - $nav = $this->buildNavMenu(); - $this->view = $nav->selectFilter($this->view, 'list'); - $nav->appendChild( - array( - $error_box, - $crumbs, - $help, - $sprintlist_table, - )); - $title = pht('Sprint List'); - return $this->newPage() - ->setTitle($title) - ->appendChild($nav); + return id(new AphrontRedirectResponse())->setURI($uri); } } diff --git a/src/controller/SprintProjectBoardController.php b/src/controller/SprintProjectBoardController.php new file mode 100644 index 0000000000000000000000000000000000000000..014cc7d2b75e7651838eee15aa932afaba14b915 --- /dev/null +++ b/src/controller/SprintProjectBoardController.php @@ -0,0 +1,17 @@ +<?php + +final class SprintProjectBoardController + extends SprintController { + + public function shouldAllowPublic() { + return true; + } + + public function handleRequest(AphrontRequest $request) { + $uri = $request->getRequestURI(); + $projectID = $request->getURIData('id'); + $uri->setPath("/project/board/{$projectID}/"); + return id(new AphrontRedirectResponse())->setURI($uri); + } + +} diff --git a/src/controller/SprintProjectController.php b/src/controller/SprintProjectController.php deleted file mode 100644 index f377774c23315496e891663220229f395095df09..0000000000000000000000000000000000000000 --- a/src/controller/SprintProjectController.php +++ /dev/null @@ -1,167 +0,0 @@ -<?php - -abstract class SprintProjectController extends SprintController { - - private $project; - private $profileMenu; - - const PANEL_BURNDOWN = 'project.sprint'; - - protected function setProject(PhabricatorProject $project) { - $this->project = $project; - return $this; - } - - protected function getProject() { - return $this->project; - } - - protected function loadProject() { - $viewer = $this->getViewer(); - $request = $this->getRequest(); - - $id = nonempty( - $request->getURIData('projectID'), - $request->getURIData('id')); - $slug = $request->getURIData('slug'); - - if ($slug) { - $normal_slug = PhabricatorSlug::normalizeProjectSlug($slug); - $is_abnormal = ($slug !== $normal_slug); - $normal_uri = "/tag/{$normal_slug}/"; - } else { - $is_abnormal = false; - } - - $query = id(new PhabricatorProjectQuery()) - ->setViewer($viewer) - ->needMembers(true) - ->needWatchers(true) - ->needImages(true) - ->needSlugs(true); - - if ($slug) { - $query->withSlugs(array($slug)); - } else { - $query->withIDs(array($id)); - } - - $policy_exception = null; - try { - $project = $query->executeOne(); - } catch (PhabricatorPolicyException $ex) { - $policy_exception = $ex; - $project = null; - } - - if (!$project) { - // This project legitimately does not exist, so just 404 the user. - if (!$policy_exception) { - return new Aphront404Response(); - } - - // Here, the project exists but the user can't see it. If they are - // using a non-canonical slug to view the project, redirect to the - // canonical slug. If they're already using the canonical slug, rethrow - // the exception to give them the policy error. - if ($is_abnormal) { - return id(new AphrontRedirectResponse())->setURI($normal_uri); - } else { - throw $policy_exception; - } - } - - // The user can view the project, but is using a noncanonical slug. - // Redirect to the canonical slug. - $primary_slug = $project->getPrimarySlug(); - if ($slug && ($slug !== $primary_slug)) { - $primary_uri = "/tag/{$primary_slug}/"; - return id(new AphrontRedirectResponse())->setURI($primary_uri); - } - - $this->setProject($project); - - return null; - } - - public function buildApplicationMenu() { - $menu = $this->newApplicationMenu(); - - $profile_menu = $this->getProfileMenu(); - if ($profile_menu) { - $menu->setProfileMenu($profile_menu); - } - - $menu->setSearchEngine(new PhabricatorProjectSearchEngine()); - - return $menu; - } - - protected function getProfileMenu() { - if (!$this->profileMenu) { - $project = $this->getProject(); - if ($project) { - $viewer = $this->getViewer(); - - $engine = id(new SprintProjectProfilePanelEngine()) - ->setViewer($viewer) - ->setProfileObject($project); - - $this->profileMenu = $engine->buildNavigation(); - } - } - - return $this->profileMenu; - } - - public function buildSideNavView($for_app = false) { - $project = $this->getProject(); - - $nav = new AphrontSideNavFilterView(); - $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); - - $viewer = $this->getViewer(); - - $id = null; - if ($for_app) { - if ($project) { - $id = $project->getID(); - $nav->addFilter("profile/{$id}/", pht('Profile')); - $nav->addFilter("board/{$id}/", pht('Workboard')); - $nav->addFilter("members/{$id}/", pht('Members')); - $nav->addFilter("feed/{$id}/", pht('Feed')); - $nav->addFilter("details/{$id}/", pht('Edit Details')); - } - $nav->addFilter('create', pht('Create Project')); - } - - if (!$id) { - id(new PhabricatorProjectSearchEngine()) - ->setViewer($viewer) - ->addNavigationItems($nav->getMenu()); - } - - $nav->selectFilter(null); - - return $nav; - } - - protected function buildApplicationCrumbs() { - $crumbs = parent::buildApplicationCrumbs(); - - $project = $this->getProject(); - if ($project) { - $ancestors = $project->getAncestorProjects(); - $ancestors = array_reverse($ancestors); - $ancestors[] = $project; - foreach ($ancestors as $ancestor) { - $crumbs->addTextCrumb( - $project->getName(), - $project->getURI()); - } - } - - return $crumbs; - } - -} diff --git a/src/controller/SprintProjectProfileController.php b/src/controller/SprintProjectProfileController.php deleted file mode 100644 index a1b2c19d7c8bce13f20f7dfecf920a2824895850..0000000000000000000000000000000000000000 --- a/src/controller/SprintProjectProfileController.php +++ /dev/null @@ -1,287 +0,0 @@ -<?php - -final class SprintProjectProfileController - extends SprintProjectController { - - public function shouldAllowPublic() { - return true; - } - - public function handleRequest(AphrontRequest $request) { - $viewer = $request->getViewer(); - - $response = $this->loadProject(); - if ($response) { - return $response; - } - - $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) - ->setImage($picture) - ->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); - - $milestone_list = $this->buildMilestoneList($project); - $subproject_list = $this->buildSubprojectList($project); - - $member_list = id(new PhabricatorProjectMemberListView()) - ->setViewer($viewer) - ->setProject($project) - ->setLimit(5) - ->setBackground(PHUIBoxView::GREY) - ->setUserPHIDs($project->getMemberPHIDs()); - - $watcher_list = id(new PhabricatorProjectWatcherListView()) - ->setViewer($viewer) - ->setProject($project) - ->setLimit(5) - ->setBackground(PHUIBoxView::GREY) - ->setUserPHIDs($project->getWatcherPHIDs()); - - $nav = $this->getProfileMenu(); - $nav->selectFilter(PhabricatorProject::PANEL_PROFILE); - - $stories = id(new PhabricatorFeedQuery()) - ->setViewer($viewer) - ->setFilterPHIDs( - array( - $project->getPHID(), - )) - ->setLimit(50) - ->execute(); - - $feed = $this->renderStories($stories); - $feed = phutil_tag_div('project-view-feed', $feed); - - $columns = id(new PHUITwoColumnView()) - ->setMainColumn( - array( - $properties, - $feed, - )) - ->setSideColumn( - array( - $milestone_list, - $subproject_list, - $member_list, - $watcher_list, - )); - - $crumbs = $this->buildApplicationCrumbs(); - $crumbs->setBorder(true); - - require_celerity_resource('project-view-css'); - $home = phutil_tag( - 'div', - array( - 'class' => 'project-view-home', - ), - array( - $header, - $columns, - )); - - return $this->newPage() - ->setNavigation($nav) - ->setCrumbs($crumbs) - ->setTitle($project->getDisplayName()) - ->setPageObjectPHIDs(array($project->getPHID())) - ->appendChild( - array( - $home, - )); - } - - private function buildPropertyListView( - PhabricatorProject $project) { - $request = $this->getRequest(); - $viewer = $request->getViewer(); - - $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; - } - - $view = id(new PHUIBoxView()) - ->setColor(PHUIBoxView::GREY) - ->appendChild($view) - ->addClass('project-view-properties'); - - return $view; - } - - private function renderStories(array $stories) { - assert_instances_of($stories, 'PhabricatorFeedStory'); - - $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(); - $viewer_phid = $viewer->getPHID(); - $id = $project->getID(); - - $is_watcher = ($viewer_phid && $project->isUserWatcher($viewer_phid)); - - if (!$is_watcher) { - $watch_icon = 'fa-eye'; - $watch_text = pht('Watch Project'); - $watch_href = "/project/watch/{$id}/?via=profile"; - } else { - $watch_icon = 'fa-eye-slash'; - $watch_text = pht('Unwatch Project'); - $watch_href = "/project/unwatch/{$id}/?via=profile"; - } - - $watch_icon = id(new PHUIIconView()) - ->setIcon($watch_icon); - - return id(new PHUIButtonView()) - ->setTag('a') - ->setWorkflow(true) - ->setIcon($watch_icon) - ->setText($watch_text) - ->setHref($watch_href); - } - - 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, - )) - ->setOrder('newest') - ->execute(); - if (!$milestones) { - return null; - } - - $milestone_list = id(new PhabricatorProjectListView()) - ->setViewer($viewer) - ->setProjects($milestones) - ->renderList(); - - $view_all = id(new PHUIButtonView()) - ->setTag('a') - ->setIcon( - id(new PHUIIconView()) - ->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(PHUIBoxView::GREY) - ->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()) - ->setViewer($viewer) - ->setProjects($subprojects) - ->renderList(); - - $view_all = id(new PHUIButtonView()) - ->setTag('a') - ->setIcon( - id(new PHUIIconView()) - ->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(PHUIBoxView::GREY) - ->setObjectList($subproject_list); - } - -} diff --git a/src/controller/SprintProjectViewController.php b/src/controller/SprintProjectViewController.php index c2d60243230f3f7a45787ce5ee95872fe51e6ad6..dd6bfa32f8136031d5c7886a1d1bd8797d0b8f80 100644 --- a/src/controller/SprintProjectViewController.php +++ b/src/controller/SprintProjectViewController.php @@ -8,49 +8,10 @@ final class SprintProjectViewController } public function handleRequest(AphrontRequest $request) { - $request = $this->getRequest(); - $viewer = $request->getViewer(); - - $query = id(new PhabricatorProjectQuery()) - ->setViewer($viewer) - ->needMembers(true) - ->needWatchers(true) - ->needImages(true) - ->needSlugs(true); - $id = $request->getURIData('id'); - $slug = $request->getURIData('slug'); - if ($slug) { - $query->withSlugs(array($slug)); - } else { - $query->withIDs(array($id)); - } - $project = $query->executeOne(); - if (!$project) { - return new Aphront404Response(); - } - - - $columns = id(new PhabricatorProjectColumnQuery()) - ->setViewer($viewer) - ->withProjectPHIDs(array($project->getPHID())) - ->execute(); - if ($columns) { - $controller = 'board'; - } else { - $controller = 'profile'; - } - - switch ($controller) { - case 'board': - $controller_object = new SprintBoardViewController(); - break; - case 'profile': - default: - $controller_object = new SprintProjectProfileController(); - break; - } - - return $this->delegateToController($controller_object); + $uri = $request->getRequestURI(); + $projectID = $request->getURIData('id'); + $uri->setPath("/project/view/{$projectID}/"); + return id(new AphrontRedirectResponse())->setURI($uri); } } diff --git a/src/engine/SprintProjectProfilePanelEngine.php b/src/engine/SprintProjectProfilePanelEngine.php deleted file mode 100644 index ecc6e9f88cc2eaeeb766c989e4b93e353758035e..0000000000000000000000000000000000000000 --- a/src/engine/SprintProjectProfilePanelEngine.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php - -final class SprintProjectProfilePanelEngine - extends PhabricatorProfilePanelEngine { - - protected function isPanelEngineConfigurable() { - return true; - } - - protected function getPanelURI($path) { - $project = $this->getProfileObject(); - $id = $project->getID(); - return "/project/{$id}/panel/{$path}"; - } - - protected function getBuiltinProfilePanels($object) { - $panels = array(); - - $panels[] = $this->newPanel() - ->setBuiltinKey(PhabricatorProject::PANEL_PROFILE) - ->setPanelKey(PhabricatorProjectDetailsProfilePanel::PANELKEY); - - $panels[] = $this->newPanel() - ->setBuiltinKey(PhabricatorProject::PANEL_POINTS) - ->setPanelKey(PhabricatorProjectPointsProfilePanel::PANELKEY); - - $panels[] = $this->newPanel() - ->setBuiltinKey(PhabricatorProject::PANEL_WORKBOARD) - ->setPanelKey(PhabricatorProjectWorkboardProfilePanel::PANELKEY); - - $panels[] = $this->newPanel() - ->setBuiltinKey(PhabricatorProject::PANEL_MEMBERS) - ->setPanelKey(PhabricatorProjectMembersProfilePanel::PANELKEY); - - $panels[] = $this->newPanel() - ->setBuiltinKey(PhabricatorProject::PANEL_SUBPROJECTS) - ->setPanelKey(PhabricatorProjectSubprojectsProfilePanel::PANELKEY); - - $panels[] = $this->newPanel() - ->setBuiltinKey(PhabricatorProject::PANEL_MANAGE) - ->setPanelKey(PhabricatorProjectManageProfilePanel::PANELKEY); - - $panels[] = $this->newPanel() - ->setBuiltinKey(SprintConstants::PANEL_BURNDOWN) - ->setPanelKey(SprintProjectProfilePanel::PANELKEY); - - $panels[] = $this->newPanel() - ->setBuiltinKey(SprintConstants::PANEL_PHRAGILE) - ->setPanelKey(PhragileProfilePanel::PANELKEY); - - return $panels; - } -} diff --git a/src/profilepanel/SprintProjectProfilePanel.php b/src/profilepanel/SprintProjectProfilePanel.php index de2fa29f56e8d1dc9a6275703a1598ddc5ed0b74..b782371d208fa14f7c4cca3f454ce1250d019403 100644 --- a/src/profilepanel/SprintProjectProfilePanel.php +++ b/src/profilepanel/SprintProjectProfilePanel.php @@ -44,19 +44,21 @@ final class SprintProjectProfilePanel $project = $config->getProfileObject(); - $has_children = ($project->getHasSubprojects()) || - ($project->getHasMilestones()); + $query = id(new SprintQuery()) + ->setViewer($this->getViewer()) + ->setPHID($project->getPHID()); + $is_sprint = $query->getIsSprint(); $id = $project->getID(); $name = $this->getDisplayName($config); - $icon = 'fa-calendar'; + $icon = 'fa-fire'; $href = "/project/sprint/view/{$id}/"; $item = $this->newItem() ->setHref($href) ->setName($name) - ->setDisabled(!$has_children) + ->setDisabled(!$is_sprint) ->setIcon($icon); return array( diff --git a/src/view/SprintHandleIconView.php b/src/view/SprintHandleIconView.php deleted file mode 100644 index 64f6af68898b9f048313b87091b3862985de808d..0000000000000000000000000000000000000000 --- a/src/view/SprintHandleIconView.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php - -final class SprintHandleIconView extends AphrontTagView { - - const SPRITE_TOKENS = 'tokens'; - const SPRITE_LOGIN = 'login'; - const SPRITE_PROJECTS = 'projects'; - - const HEAD_SMALL = 'phuihead-small'; - const HEAD_MEDIUM = 'phuihead-medium'; - - private $href = null; - private $image; - private $text; - private $headSize = null; - - private $spriteIcon; - private $spriteSheet; - private $iconFont; - private $iconColor; - private $iconStyle; - - public function setHref($href) { - $this->href = $href; - return $this; - } - - public function setIconStyle($style) { - $this->iconStyle = $style; - return $this; - } - - public function setImage($image) { - $this->image = $image; - return $this; - } - - public function setText($text) { - $this->text = $text; - return $this; - } - - public function setHeadSize($size) { - $this->headSize = $size; - return $this; - } - - public function setSpriteIcon($sprite) { - $this->spriteIcon = $sprite; - return $this; - } - - public function setSpriteSheet($sheet) { - $this->spriteSheet = $sheet; - return $this; - } - - public function setIconFont($icon, $color = null) { - $this->iconFont = $icon; - $this->iconColor = $color; - return $this; - } - - protected function getTagName() { - $tag = 'span'; - if ($this->href) { - $tag = 'a'; - } - return $tag; - } - - protected function getTagAttributes() { - $classes = array(); - $classes[] = 'phui-object-item-handle-icon'; - - return array( - 'href' => $this->href, - 'style' => $this->iconStyle, - 'aural' => false, - 'class' => $classes, - ); - } - -}