Index: src/__phutil_library_map__.php =================================================================== --- src/__phutil_library_map__.php +++ src/__phutil_library_map__.php @@ -636,6 +636,7 @@ 'DrydockAllocatorWorker' => 'applications/drydock/worker/DrydockAllocatorWorker.php', 'DrydockApacheWebrootInterface' => 'applications/drydock/interface/webroot/DrydockApacheWebrootInterface.php', 'DrydockBlueprint' => 'applications/drydock/storage/DrydockBlueprint.php', + 'DrydockBlueprintController' => 'applications/drydock/controller/DrydockBlueprintController.php', 'DrydockBlueprintCreateController' => 'applications/drydock/controller/DrydockBlueprintCreateController.php', 'DrydockBlueprintEditController' => 'applications/drydock/controller/DrydockBlueprintEditController.php', 'DrydockBlueprintImplementation' => 'applications/drydock/blueprint/DrydockBlueprintImplementation.php', @@ -645,12 +646,14 @@ 'DrydockBlueprintSearchEngine' => 'applications/drydock/query/DrydockBlueprintSearchEngine.php', 'DrydockBlueprintViewController' => 'applications/drydock/controller/DrydockBlueprintViewController.php', 'DrydockCommandInterface' => 'applications/drydock/interface/command/DrydockCommandInterface.php', + 'DrydockConsoleController' => 'applications/drydock/controller/DrydockConsoleController.php', 'DrydockConstants' => 'applications/drydock/constants/DrydockConstants.php', 'DrydockController' => 'applications/drydock/controller/DrydockController.php', 'DrydockDAO' => 'applications/drydock/storage/DrydockDAO.php', 'DrydockFilesystemInterface' => 'applications/drydock/interface/filesystem/DrydockFilesystemInterface.php', 'DrydockInterface' => 'applications/drydock/interface/DrydockInterface.php', 'DrydockLease' => 'applications/drydock/storage/DrydockLease.php', + 'DrydockLeaseController' => 'applications/drydock/controller/DrydockLeaseController.php', 'DrydockLeaseListController' => 'applications/drydock/controller/DrydockLeaseListController.php', 'DrydockLeaseQuery' => 'applications/drydock/query/DrydockLeaseQuery.php', 'DrydockLeaseReleaseController' => 'applications/drydock/controller/DrydockLeaseReleaseController.php', @@ -660,6 +663,7 @@ 'DrydockLocalCommandInterface' => 'applications/drydock/interface/command/DrydockLocalCommandInterface.php', 'DrydockLocalHostBlueprintImplementation' => 'applications/drydock/blueprint/DrydockLocalHostBlueprintImplementation.php', 'DrydockLog' => 'applications/drydock/storage/DrydockLog.php', + 'DrydockLogController' => 'applications/drydock/controller/DrydockLogController.php', 'DrydockLogListController' => 'applications/drydock/controller/DrydockLogListController.php', 'DrydockLogQuery' => 'applications/drydock/query/DrydockLogQuery.php', 'DrydockLogSearchEngine' => 'applications/drydock/query/DrydockLogSearchEngine.php', @@ -675,6 +679,7 @@ 'DrydockPreallocatedHostBlueprintImplementation' => 'applications/drydock/blueprint/DrydockPreallocatedHostBlueprintImplementation.php', 'DrydockResource' => 'applications/drydock/storage/DrydockResource.php', 'DrydockResourceCloseController' => 'applications/drydock/controller/DrydockResourceCloseController.php', + 'DrydockResourceController' => 'applications/drydock/controller/DrydockResourceController.php', 'DrydockResourceListController' => 'applications/drydock/controller/DrydockResourceListController.php', 'DrydockResourceQuery' => 'applications/drydock/query/DrydockResourceQuery.php', 'DrydockResourceSearchEngine' => 'applications/drydock/query/DrydockResourceSearchEngine.php', @@ -3043,17 +3048,19 @@ 0 => 'DrydockDAO', 1 => 'PhabricatorPolicyInterface', ), - 'DrydockBlueprintCreateController' => 'DrydockController', - 'DrydockBlueprintEditController' => 'DrydockController', + 'DrydockBlueprintController' => 'DrydockController', + 'DrydockBlueprintCreateController' => 'DrydockBlueprintController', + 'DrydockBlueprintEditController' => 'DrydockBlueprintController', 'DrydockBlueprintListController' => array( - 0 => 'DrydockController', + 0 => 'DrydockBlueprintController', 1 => 'PhabricatorApplicationSearchResultsControllerInterface', ), 'DrydockBlueprintQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'DrydockBlueprintSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'DrydockBlueprintViewController' => 'DrydockController', + 'DrydockBlueprintViewController' => 'DrydockBlueprintController', 'DrydockCommandInterface' => 'DrydockInterface', + 'DrydockConsoleController' => 'DrydockController', 'DrydockController' => 'PhabricatorController', 'DrydockDAO' => 'PhabricatorLiskDAO', 'DrydockFilesystemInterface' => 'DrydockInterface', @@ -3062,16 +3069,17 @@ 0 => 'DrydockDAO', 1 => 'PhabricatorPolicyInterface', ), + 'DrydockLeaseController' => 'DrydockController', 'DrydockLeaseListController' => array( - 0 => 'DrydockController', + 0 => 'DrydockLeaseController', 1 => 'PhabricatorApplicationSearchResultsControllerInterface', ), 'DrydockLeaseQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'DrydockLeaseReleaseController' => 'DrydockController', + 'DrydockLeaseReleaseController' => 'DrydockLeaseController', 'DrydockLeaseSearchEngine' => 'PhabricatorApplicationSearchEngine', 'DrydockLeaseStatus' => 'DrydockConstants', - 'DrydockLeaseViewController' => 'DrydockController', + 'DrydockLeaseViewController' => 'DrydockLeaseController', 'DrydockLocalCommandInterface' => 'DrydockCommandInterface', 'DrydockLocalHostBlueprintImplementation' => 'DrydockBlueprintImplementation', 'DrydockLog' => @@ -3079,9 +3087,10 @@ 0 => 'DrydockDAO', 1 => 'PhabricatorPolicyInterface', ), + 'DrydockLogController' => 'DrydockController', 'DrydockLogListController' => array( - 0 => 'DrydockController', + 0 => 'DrydockLogController', 1 => 'PhabricatorApplicationSearchResultsControllerInterface', ), 'DrydockLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', @@ -3101,16 +3110,17 @@ 0 => 'DrydockDAO', 1 => 'PhabricatorPolicyInterface', ), - 'DrydockResourceCloseController' => 'DrydockController', + 'DrydockResourceCloseController' => 'DrydockResourceController', + 'DrydockResourceController' => 'DrydockController', 'DrydockResourceListController' => array( - 0 => 'DrydockController', + 0 => 'DrydockResourceController', 1 => 'PhabricatorApplicationSearchResultsControllerInterface', ), 'DrydockResourceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'DrydockResourceSearchEngine' => 'PhabricatorApplicationSearchEngine', 'DrydockResourceStatus' => 'DrydockConstants', - 'DrydockResourceViewController' => 'DrydockController', + 'DrydockResourceViewController' => 'DrydockResourceController', 'DrydockSFTPFilesystemInterface' => 'DrydockFilesystemInterface', 'DrydockSSHCommandInterface' => 'DrydockCommandInterface', 'DrydockWebrootInterface' => 'DrydockInterface', Index: src/applications/drydock/application/PhabricatorApplicationDrydock.php =================================================================== --- src/applications/drydock/application/PhabricatorApplicationDrydock.php +++ src/applications/drydock/application/PhabricatorApplicationDrydock.php @@ -33,7 +33,7 @@ public function getRoutes() { return array( '/drydock/' => array( - '' => 'DrydockResourceListController', + '' => 'DrydockConsoleController', 'blueprint/' => array( '(?:query/(?P[^/]+)/)?' => 'DrydockBlueprintListController', '(?P[1-9]\d*)/' => 'DrydockBlueprintViewController', Index: src/applications/drydock/controller/DrydockBlueprintController.php =================================================================== --- /dev/null +++ src/applications/drydock/controller/DrydockBlueprintController.php @@ -0,0 +1,27 @@ +setBaseURI(new PhutilURI($this->getApplicationURI())); + + id(new DrydockBlueprintSearchEngine()) + ->setViewer($this->getRequest()->getUser()) + ->addNavigationItems($nav->getMenu()); + + $nav->selectFilter(null); + + return $nav; + } + + public function buildApplicationCrumbs() { + $crumbs = parent::buildApplicationCrumbs(); + $crumbs->addTextCrumb( + pht('Blueprints'), + $this->getApplicationURI('blueprint/')); + return $crumbs; + } + +} Index: src/applications/drydock/controller/DrydockBlueprintCreateController.php =================================================================== --- src/applications/drydock/controller/DrydockBlueprintCreateController.php +++ src/applications/drydock/controller/DrydockBlueprintCreateController.php @@ -1,10 +1,7 @@ getRequest(); Index: src/applications/drydock/controller/DrydockBlueprintEditController.php =================================================================== --- src/applications/drydock/controller/DrydockBlueprintEditController.php +++ src/applications/drydock/controller/DrydockBlueprintEditController.php @@ -1,6 +1,6 @@ setQueryKey($this->queryKey) ->setSearchEngine(new DrydockBlueprintSearchEngine()) - ->setNavigation($this->buildSideNav()); + ->setNavigation($this->buildSideNavView()); return $this->delegateToController($controller); } Index: src/applications/drydock/controller/DrydockBlueprintViewController.php =================================================================== --- src/applications/drydock/controller/DrydockBlueprintViewController.php +++ src/applications/drydock/controller/DrydockBlueprintViewController.php @@ -1,6 +1,6 @@ setBaseURI(new PhutilURI($this->getApplicationURI())); + + // These are only used on mobile. + + $nav->addFilter('blueprint', pht('Blueprints')); + $nav->addFilter('resource', pht('Resources')); + $nav->addFilter('lease', pht('Leases')); + $nav->addFilter('log', pht('Logs')); + + $nav->selectFilter(null); + + return $nav; + } + + public function processRequest() { + $request = $this->getRequest(); + $viewer = $request->getUser(); + + $menu = id(new PHUIObjectItemListView()) + ->setUser($viewer); + + $menu->addItem( + id(new PHUIObjectItemView()) + ->setHeader(pht('Blueprints')) + ->setHref($this->getApplicationURI('blueprint/')) + ->addAttribute( + pht( + 'Configure blueprints so Drydock can build resources, like '. + 'hosts and working copies.'))); + + $menu->addItem( + id(new PHUIObjectItemView()) + ->setHeader(pht('Resources')) + ->setHref($this->getApplicationURI('resource/')) + ->addAttribute( + pht( + 'View and manage resources Drydock has built, like hosts.'))); + + $menu->addItem( + id(new PHUIObjectItemView()) + ->setHeader(pht('Leases')) + ->setHref($this->getApplicationURI('lease/')) + ->addAttribute( + pht( + 'Manage leases on resources.'))); + + $menu->addItem( + id(new PHUIObjectItemView()) + ->setHeader(pht('Logs')) + ->setHref($this->getApplicationURI('log/')) + ->addAttribute( + pht( + 'View logs.'))); + + + $crumbs = $this->buildApplicationCrumbs(); + $crumbs->addTextCrumb(pht('Console')); + + return $this->buildApplicationPage( + array( + $crumbs, + $menu, + ), + array( + 'title' => pht('Drydock Console'), + 'device' => true, + )); + } + +} Index: src/applications/drydock/controller/DrydockController.php =================================================================== --- src/applications/drydock/controller/DrydockController.php +++ src/applications/drydock/controller/DrydockController.php @@ -2,33 +2,10 @@ abstract class DrydockController extends PhabricatorController { - final protected function buildSideNav($selected = null) { - $nav = new AphrontSideNavFilterView(); - $nav->setBaseURI(new PhutilURI('/drydock/')); - - id(new DrydockBlueprintSearchEngine()) - ->setViewer($this->getRequest()->getUser()) - ->addNavigationItems($nav->getMenu(), pht('Blueprints')); - - id(new DrydockLeaseSearchEngine()) - ->setViewer($this->getRequest()->getUser()) - ->addNavigationItems($nav->getMenu(), pht('Leases')); - - id(new DrydockResourceSearchEngine()) - ->setViewer($this->getRequest()->getUser()) - ->addNavigationItems($nav->getMenu(), pht('Resources')); - - id(new DrydockLogSearchEngine()) - ->setViewer($this->getRequest()->getUser()) - ->addNavigationItems($nav->getMenu(), pht('Logs')); - - $nav->selectFilter($selected, 'resource'); - - return $nav; - } + abstract function buildSideNavView(); public function buildApplicationMenu() { - return $this->buildSideNav(null)->getMenu(); + return $this->buildSideNavView()->getMenu(); } protected function buildLogTableView(array $logs) { Index: src/applications/drydock/controller/DrydockLeaseController.php =================================================================== --- /dev/null +++ src/applications/drydock/controller/DrydockLeaseController.php @@ -0,0 +1,27 @@ +setBaseURI(new PhutilURI($this->getApplicationURI())); + + id(new DrydockLeaseSearchEngine()) + ->setViewer($this->getRequest()->getUser()) + ->addNavigationItems($nav->getMenu()); + + $nav->selectFilter(null); + + return $nav; + } + + public function buildApplicationCrumbs() { + $crumbs = parent::buildApplicationCrumbs(); + $crumbs->addTextCrumb( + pht('Leases'), + $this->getApplicationURI('lease/')); + return $crumbs; + } + +} Index: src/applications/drydock/controller/DrydockLeaseListController.php =================================================================== --- src/applications/drydock/controller/DrydockLeaseListController.php +++ src/applications/drydock/controller/DrydockLeaseListController.php @@ -1,6 +1,6 @@ setQueryKey($this->queryKey) ->setSearchEngine(new DrydockLeaseSearchEngine()) - ->setNavigation($this->buildSideNav()); + ->setNavigation($this->buildSideNavView()); return $this->delegateToController($controller); } Index: src/applications/drydock/controller/DrydockLeaseReleaseController.php =================================================================== --- src/applications/drydock/controller/DrydockLeaseReleaseController.php +++ src/applications/drydock/controller/DrydockLeaseReleaseController.php @@ -1,6 +1,6 @@ setBaseURI(new PhutilURI($this->getApplicationURI())); + + id(new DrydockLogSearchEngine()) + ->setViewer($this->getRequest()->getUser()) + ->addNavigationItems($nav->getMenu()); + + $nav->selectFilter(null); + + return $nav; + } + + public function buildApplicationCrumbs() { + $crumbs = parent::buildApplicationCrumbs(); + $crumbs->addTextCrumb( + pht('Logs'), + $this->getApplicationURI('log/')); + return $crumbs; + } + +} Index: src/applications/drydock/controller/DrydockLogListController.php =================================================================== --- src/applications/drydock/controller/DrydockLogListController.php +++ src/applications/drydock/controller/DrydockLogListController.php @@ -1,6 +1,6 @@ setQueryKey($this->queryKey) ->setSearchEngine(new DrydockLogSearchEngine()) - ->setNavigation($this->buildSideNav()); + ->setNavigation($this->buildSideNavView()); return $this->delegateToController($controller); } Index: src/applications/drydock/controller/DrydockResourceCloseController.php =================================================================== --- src/applications/drydock/controller/DrydockResourceCloseController.php +++ src/applications/drydock/controller/DrydockResourceCloseController.php @@ -1,6 +1,6 @@ setBaseURI(new PhutilURI($this->getApplicationURI())); + + id(new DrydockResourceSearchEngine()) + ->setViewer($this->getRequest()->getUser()) + ->addNavigationItems($nav->getMenu()); + + $nav->selectFilter(null); + + return $nav; + } + + public function buildApplicationCrumbs() { + $crumbs = parent::buildApplicationCrumbs(); + $crumbs->addTextCrumb( + pht('Resources'), + $this->getApplicationURI('resource/')); + return $crumbs; + } + +} Index: src/applications/drydock/controller/DrydockResourceListController.php =================================================================== --- src/applications/drydock/controller/DrydockResourceListController.php +++ src/applications/drydock/controller/DrydockResourceListController.php @@ -1,6 +1,6 @@ setQueryKey($this->queryKey) ->setSearchEngine(new DrydockResourceSearchEngine()) - ->setNavigation($this->buildSideNav()); + ->setNavigation($this->buildSideNavView()); return $this->delegateToController($controller); } Index: src/applications/drydock/controller/DrydockResourceViewController.php =================================================================== --- src/applications/drydock/controller/DrydockResourceViewController.php +++ src/applications/drydock/controller/DrydockResourceViewController.php @@ -1,6 +1,6 @@ selectFilter( - $engine->getNavPrefix().'query/'.$saved_query->getQueryKey(), - $engine->getNavPrefix().'query/advanced'); + 'query/'.$saved_query->getQueryKey(), + 'query/advanced'); $form = id(new AphrontFormView()) ->setUser($user); Index: src/applications/search/engine/PhabricatorApplicationSearchEngine.php =================================================================== --- src/applications/search/engine/PhabricatorApplicationSearchEngine.php +++ src/applications/search/engine/PhabricatorApplicationSearchEngine.php @@ -107,40 +107,27 @@ ->setEngineClassName(get_class($this)); } - public function getNavPrefix() { - return get_class($this).':'; - } - - public function addNavigationItems(PHUIListView $menu, $label = null) { + public function addNavigationItems(PHUIListView $menu) { $viewer = $this->requireViewer(); - $menu->newLabel(coalesce($label, pht('Queries'))); + $menu->newLabel(pht('Queries')); $named_queries = $this->loadEnabledNamedQueries(); - $prefix = $this->getNavPrefix(); foreach ($named_queries as $query) { $key = $query->getQueryKey(); $uri = $this->getQueryResultsPageURI($key); - $menu->newLink( - $query->getQueryName(), - $uri, - $prefix.'query/'.$key); + $menu->newLink($query->getQueryName(), $uri, 'query/'.$key); } if ($viewer->isLoggedIn()) { $manage_uri = $this->getQueryManagementURI(); - $menu->newLink( - pht('Edit Queries...'), - $manage_uri, - $prefix.'query/edit'); + $menu->newLink(pht('Edit Queries...'), $manage_uri, 'query/edit'); } $menu->newLabel(pht('Search')); $advanced_uri = $this->getQueryResultsPageURI('advanced'); - $menu->newLink( - pht('Advanced Search'), - $advanced_uri, $prefix.'query/advanced'); + $menu->newLink(pht('Advanced Search'), $advanced_uri, 'query/advanced'); return $this; }