Page MenuHomePhabricator

D15683.id37791.diff
No OneTemporary

D15683.id37791.diff

diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -739,6 +739,7 @@
'DiffusionRefsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRefsQueryConduitAPIMethod.php',
'DiffusionRenameHistoryQuery' => 'applications/diffusion/query/DiffusionRenameHistoryQuery.php',
'DiffusionRepositoryByIDRemarkupRule' => 'applications/diffusion/remarkup/DiffusionRepositoryByIDRemarkupRule.php',
+ 'DiffusionRepositoryClusterManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryClusterManagementPanel.php',
'DiffusionRepositoryController' => 'applications/diffusion/controller/DiffusionRepositoryController.php',
'DiffusionRepositoryCreateController' => 'applications/diffusion/controller/DiffusionRepositoryCreateController.php',
'DiffusionRepositoryDatasource' => 'applications/diffusion/typeahead/DiffusionRepositoryDatasource.php',
@@ -759,6 +760,8 @@
'DiffusionRepositoryEditSubversionController' => 'applications/diffusion/controller/DiffusionRepositoryEditSubversionController.php',
'DiffusionRepositoryEditUpdateController' => 'applications/diffusion/controller/DiffusionRepositoryEditUpdateController.php',
'DiffusionRepositoryListController' => 'applications/diffusion/controller/DiffusionRepositoryListController.php',
+ 'DiffusionRepositoryManageController' => 'applications/diffusion/controller/DiffusionRepositoryManageController.php',
+ 'DiffusionRepositoryManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryManagementPanel.php',
'DiffusionRepositoryNewController' => 'applications/diffusion/controller/DiffusionRepositoryNewController.php',
'DiffusionRepositoryPath' => 'applications/diffusion/data/DiffusionRepositoryPath.php',
'DiffusionRepositoryRef' => 'applications/diffusion/data/DiffusionRepositoryRef.php',
@@ -4920,6 +4923,7 @@
'DiffusionRefsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
'DiffusionRenameHistoryQuery' => 'Phobject',
'DiffusionRepositoryByIDRemarkupRule' => 'PhabricatorObjectRemarkupRule',
+ 'DiffusionRepositoryClusterManagementPanel' => 'DiffusionRepositoryManagementPanel',
'DiffusionRepositoryController' => 'DiffusionController',
'DiffusionRepositoryCreateController' => 'DiffusionRepositoryEditController',
'DiffusionRepositoryDatasource' => 'PhabricatorTypeaheadDatasource',
@@ -4940,6 +4944,8 @@
'DiffusionRepositoryEditSubversionController' => 'DiffusionRepositoryEditController',
'DiffusionRepositoryEditUpdateController' => 'DiffusionRepositoryEditController',
'DiffusionRepositoryListController' => 'DiffusionController',
+ 'DiffusionRepositoryManageController' => 'DiffusionController',
+ 'DiffusionRepositoryManagementPanel' => 'Phobject',
'DiffusionRepositoryNewController' => 'DiffusionController',
'DiffusionRepositoryPath' => 'Phobject',
'DiffusionRepositoryRef' => 'Phobject',
diff --git a/src/applications/diffusion/application/PhabricatorDiffusionApplication.php b/src/applications/diffusion/application/PhabricatorDiffusionApplication.php
--- a/src/applications/diffusion/application/PhabricatorDiffusionApplication.php
+++ b/src/applications/diffusion/application/PhabricatorDiffusionApplication.php
@@ -87,6 +87,8 @@
=> 'DiffusionCommitTagsController',
'commit/(?P<commit>[a-z0-9]+)/edit/'
=> 'DiffusionCommitEditController',
+ 'manage/(?:(?P<panel>[^/]+)/)?'
+ => 'DiffusionRepositoryManageController',
'edit/' => array(
'' => 'DiffusionRepositoryEditMainController',
'basic/' => 'DiffusionRepositoryEditBasicController',
diff --git a/src/applications/diffusion/controller/DiffusionRepositoryManageController.php b/src/applications/diffusion/controller/DiffusionRepositoryManageController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/controller/DiffusionRepositoryManageController.php
@@ -0,0 +1,99 @@
+<?php
+
+final class DiffusionRepositoryManageController
+ extends DiffusionController {
+
+ private $navigation;
+
+ public function buildApplicationMenu() {
+ // TODO: This is messy for now; the mobile menu should be set automatically
+ // when the body content is a two-column view with navigation.
+ if ($this->navigation) {
+ return $this->navigation->getMenu();
+ }
+ return parent::buildApplicationMenu();
+ }
+
+
+ public function handleRequest(AphrontRequest $request) {
+ $response = $this->loadDiffusionContext();
+ if ($response) {
+ return $response;
+ }
+
+ $viewer = $this->getViewer();
+ $drequest = $this->getDiffusionRequest();
+ $repository = $drequest->getRepository();
+
+ $panels = DiffusionRepositoryManagementPanel::getAllPanels();
+
+ foreach ($panels as $panel) {
+ $panel
+ ->setViewer($viewer)
+ ->setRepository($repository);
+ }
+
+ $selected = $request->getURIData('panel');
+ if (!strlen($selected)) {
+ $selected = head_key($panels);
+ }
+
+ if (empty($panels[$selected])) {
+ return new Aphront404Response();
+ }
+
+ $nav = $this->renderSideNav($repository, $panels, $selected);
+ $this->navigation = $nav;
+
+ $panel = $panels[$selected];
+
+ $content = $panel->buildManagementPanelContent();
+
+ $title = array(
+ $panel->getManagementPanelLabel(),
+ $repository->getDisplayName(),
+ );
+
+ $crumbs = $this->buildApplicationCrumbs();
+ $crumbs->addTextCrumb(
+ $repository->getDisplayName(),
+ $repository->getURI());
+ $crumbs->addTextCrumb(
+ pht('Manage'),
+ $repository->getPathURI('manage/'));
+ $crumbs->addTextCrumb($panel->getManagementPanelLabel());
+
+ $view = id(new PHUITwoColumnView())
+ ->setNavigation($nav)
+ ->setMainColumn($content);
+
+ return $this->newPage()
+ ->setTitle($title)
+ ->setCrumbs($crumbs)
+ ->appendChild($view);
+ }
+
+ private function renderSideNav(
+ PhabricatorRepository $repository,
+ array $panels,
+ $selected) {
+
+ $base_uri = $repository->getPathURI('manage/');
+ $base_uri = new PhutilURI($base_uri);
+
+ $nav = id(new AphrontSideNavFilterView())
+ ->setBaseURI($base_uri);
+
+ foreach ($panels as $panel) {
+ $nav->addFilter(
+ $panel->getManagementPanelKey(),
+ $panel->getManagementPanelLabel());
+ }
+
+ $nav->selectFilter($selected);
+
+ return $nav;
+ }
+
+
+}
diff --git a/src/applications/diffusion/management/DiffusionRepositoryClusterManagementPanel.php b/src/applications/diffusion/management/DiffusionRepositoryClusterManagementPanel.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/management/DiffusionRepositoryClusterManagementPanel.php
@@ -0,0 +1,20 @@
+<?php
+
+final class DiffusionRepositoryClusterManagementPanel
+ extends DiffusionRepositoryManagementPanel {
+
+ const PANELKEY = 'cluster';
+
+ public function getManagementPanelLabel() {
+ return pht('Cluster Configuration');
+ }
+
+ public function getManagementPanelOrder() {
+ return 12345;
+ }
+
+ public function buildManagementPanelContent() {
+ return pht('TODO: Cluster configuration management.');
+ }
+
+}
diff --git a/src/applications/diffusion/management/DiffusionRepositoryManagementPanel.php b/src/applications/diffusion/management/DiffusionRepositoryManagementPanel.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/management/DiffusionRepositoryManagementPanel.php
@@ -0,0 +1,43 @@
+<?php
+
+abstract class DiffusionRepositoryManagementPanel
+ extends Phobject {
+
+ private $viewer;
+ private $repository;
+
+ final public function setViewer(PhabricatorUser $viewer) {
+ $this->viewer = $viewer;
+ return $this;
+ }
+
+ final public function getViewer() {
+ return $this->viewer;
+ }
+
+ final public function setRepository(PhabricatorRepository $repository) {
+ $this->repository = $repository;
+ return $this;
+ }
+
+ final public function getRepository() {
+ return $this->repository;
+ }
+
+ final public function getManagementPanelKey() {
+ return $this->getPhobjectClassConstant('PANELKEY');
+ }
+
+ abstract public function getManagementPanelLabel();
+ abstract public function getManagementPanelOrder();
+ abstract public function buildManagementPanelContent();
+
+ public static function getAllPanels() {
+ return id(new PhutilClassMapQuery())
+ ->setAncestorClass(__CLASS__)
+ ->setUniqueMethod('getManagementPanelKey')
+ ->setSortMethod('getManagementPanelOrder')
+ ->execute();
+ }
+
+}

File Metadata

Mime Type
text/plain
Expires
Sat, Mar 15, 11:42 PM (1 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7704499
Default Alt Text
D15683.id37791.diff (8 KB)

Event Timeline