Differential D16048 Diff 38616 src/applications/settings/controller/PhabricatorSettingsMainController.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/settings/controller/PhabricatorSettingsMainController.php
| <?php | <?php | ||||
| final class PhabricatorSettingsMainController | final class PhabricatorSettingsMainController | ||||
| extends PhabricatorController { | extends PhabricatorController { | ||||
| private $user; | private $user; | ||||
| private $builtinKey; | |||||
| private $preferences; | |||||
| private function getUser() { | private function getUser() { | ||||
| return $this->user; | return $this->user; | ||||
| } | } | ||||
| private function isSelf() { | private function isSelf() { | ||||
| $user = $this->getUser(); | $user = $this->getUser(); | ||||
| if (!$user) { | if (!$user) { | ||||
| return false; | return false; | ||||
| } | } | ||||
| $user_phid = $user->getPHID(); | $user_phid = $user->getPHID(); | ||||
| $viewer_phid = $this->getViewer()->getPHID(); | $viewer_phid = $this->getViewer()->getPHID(); | ||||
| return ($viewer_phid == $user_phid); | return ($viewer_phid == $user_phid); | ||||
| } | } | ||||
| private function isTemplate() { | |||||
| return ($this->builtinKey !== null); | |||||
| } | |||||
| public function handleRequest(AphrontRequest $request) { | public function handleRequest(AphrontRequest $request) { | ||||
| $viewer = $this->getViewer(); | $viewer = $this->getViewer(); | ||||
| $id = $request->getURIData('id'); | |||||
| $key = $request->getURIData('key'); | |||||
| if ($id) { | $username = $request->getURIData('username'); | ||||
| $builtin = $request->getURIData('builtin'); | |||||
| $key = $request->getURIData('pageKey'); | |||||
| if ($builtin) { | |||||
| $this->builtinKey = $builtin; | |||||
| $preferences = id(new PhabricatorUserPreferencesQuery()) | |||||
| ->setViewer($viewer) | |||||
| ->withBuiltinKeys(array($builtin)) | |||||
| ->requireCapabilities( | |||||
| array( | |||||
| PhabricatorPolicyCapability::CAN_VIEW, | |||||
| PhabricatorPolicyCapability::CAN_EDIT, | |||||
| )) | |||||
| ->executeOne(); | |||||
| if (!$preferences) { | |||||
| $preferences = id(new PhabricatorUserPreferences()) | |||||
| ->attachUser(null) | |||||
| ->setBuiltinKey($builtin); | |||||
| } | |||||
| } else { | |||||
| $user = id(new PhabricatorPeopleQuery()) | $user = id(new PhabricatorPeopleQuery()) | ||||
| ->setViewer($viewer) | ->setViewer($viewer) | ||||
| ->withIDs(array($id)) | ->withUsernames(array($username)) | ||||
| ->requireCapabilities( | ->requireCapabilities( | ||||
| array( | array( | ||||
| PhabricatorPolicyCapability::CAN_VIEW, | PhabricatorPolicyCapability::CAN_VIEW, | ||||
| PhabricatorPolicyCapability::CAN_EDIT, | PhabricatorPolicyCapability::CAN_EDIT, | ||||
| )) | )) | ||||
| ->executeOne(); | ->executeOne(); | ||||
| if (!$user) { | if (!$user) { | ||||
| return new Aphront404Response(); | return new Aphront404Response(); | ||||
| } | } | ||||
| $preferences = PhabricatorUserPreferences::loadUserPreferences($user); | |||||
| $this->user = $user; | $this->user = $user; | ||||
| } else { | |||||
| $this->user = $viewer; | |||||
| } | } | ||||
| $panels = $this->buildPanels(); | if (!$preferences) { | ||||
| return new Aphront404Response(); | |||||
| } | |||||
| PhabricatorPolicyFilter::requireCapability( | |||||
| $viewer, | |||||
| $preferences, | |||||
| PhabricatorPolicyCapability::CAN_EDIT); | |||||
| $this->preferences = $preferences; | |||||
| $panels = $this->buildPanels($preferences); | |||||
| $nav = $this->renderSideNav($panels); | $nav = $this->renderSideNav($panels); | ||||
| $key = $nav->selectFilter($key, head($panels)->getPanelKey()); | $key = $nav->selectFilter($key, head($panels)->getPanelKey()); | ||||
| $panel = $panels[$key] | $panel = $panels[$key] | ||||
| ->setUser($this->getUser()) | |||||
| ->setViewer($viewer) | |||||
| ->setController($this) | ->setController($this) | ||||
| ->setNavigation($nav); | ->setNavigation($nav); | ||||
| $response = $panel->processRequest($request); | $response = $panel->processRequest($request); | ||||
| if (($response instanceof AphrontResponse) || | if (($response instanceof AphrontResponse) || | ||||
| ($response instanceof AphrontResponseProducerInterface)) { | ($response instanceof AphrontResponseProducerInterface)) { | ||||
| return $response; | return $response; | ||||
| } | } | ||||
| Show All 9 Lines | public function handleRequest(AphrontRequest $request) { | ||||
| return $this->newPage() | return $this->newPage() | ||||
| ->setTitle($title) | ->setTitle($title) | ||||
| ->setCrumbs($crumbs) | ->setCrumbs($crumbs) | ||||
| ->appendChild($view); | ->appendChild($view); | ||||
| } | } | ||||
| private function buildPanels() { | private function buildPanels(PhabricatorUserPreferences $preferences) { | ||||
| $viewer = $this->getViewer(); | $viewer = $this->getViewer(); | ||||
| $panels = PhabricatorSettingsPanel::getAllDisplayPanels(); | $panels = PhabricatorSettingsPanel::getAllDisplayPanels(); | ||||
| $result = array(); | $result = array(); | ||||
| foreach ($panels as $key => $panel) { | foreach ($panels as $key => $panel) { | ||||
| $panel | $panel | ||||
| ->setViewer($viewer) | ->setPreferences($preferences) | ||||
| ->setUser($this->user); | ->setViewer($viewer); | ||||
| if ($this->user) { | |||||
| $panel->setUser($this->user); | |||||
| } | |||||
| if (!$panel->isEnabled()) { | if (!$panel->isEnabled()) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| if (!$this->isSelf()) { | if ($this->isTemplate()) { | ||||
| if (!$panel->isEditableByAdministrators()) { | if (!$panel->isTemplatePanel()) { | ||||
| continue; | |||||
| } | |||||
| } else { | |||||
| if (!$this->isSelf() && !$panel->isManagementPanel()) { | |||||
| continue; | continue; | ||||
| } | } | ||||
| } | } | ||||
| if (!empty($result[$key])) { | if (!empty($result[$key])) { | ||||
| throw new Exception(pht( | throw new Exception(pht( | ||||
| "Two settings panels share the same panel key ('%s'): %s, %s.", | "Two settings panels share the same panel key ('%s'): %s, %s.", | ||||
| $key, | $key, | ||||
| Show All 9 Lines | private function buildPanels(PhabricatorUserPreferences $preferences) { | ||||
| } | } | ||||
| return $result; | return $result; | ||||
| } | } | ||||
| private function renderSideNav(array $panels) { | private function renderSideNav(array $panels) { | ||||
| $nav = new AphrontSideNavFilterView(); | $nav = new AphrontSideNavFilterView(); | ||||
| if ($this->isSelf()) { | if ($this->isTemplate()) { | ||||
| $base_uri = 'panel/'; | $base_uri = 'builtin/'.$this->builtinKey.'/page/'; | ||||
| } else { | } else { | ||||
| $base_uri = $this->getUser()->getID().'/panel/'; | $user = $this->getUser(); | ||||
| $base_uri = 'user/'.$user->getUsername().'/page/'; | |||||
| } | } | ||||
| $nav->setBaseURI(new PhutilURI($this->getApplicationURI($base_uri))); | $nav->setBaseURI(new PhutilURI($this->getApplicationURI($base_uri))); | ||||
| $group_key = null; | $group_key = null; | ||||
| foreach ($panels as $panel) { | foreach ($panels as $panel) { | ||||
| if ($panel->getPanelGroupKey() != $group_key) { | if ($panel->getPanelGroupKey() != $group_key) { | ||||
| $group_key = $panel->getPanelGroupKey(); | $group_key = $panel->getPanelGroupKey(); | ||||
| $group = $panel->getPanelGroup(); | $group = $panel->getPanelGroup(); | ||||
| $nav->addLabel($group->getPanelGroupName()); | $nav->addLabel($group->getPanelGroupName()); | ||||
| } | } | ||||
| $nav->addFilter($panel->getPanelKey(), $panel->getPanelName()); | $nav->addFilter($panel->getPanelKey(), $panel->getPanelName()); | ||||
| } | } | ||||
| return $nav; | return $nav; | ||||
| } | } | ||||
| public function buildApplicationMenu() { | public function buildApplicationMenu() { | ||||
| $panels = $this->buildPanels(); | if ($this->preferences) { | ||||
| $panels = $this->buildPanels($this->preferences); | |||||
| return $this->renderSideNav($panels)->getMenu(); | return $this->renderSideNav($panels)->getMenu(); | ||||
| } | } | ||||
| return parent::buildApplicationMenu(); | |||||
| } | |||||
| protected function buildApplicationCrumbs() { | protected function buildApplicationCrumbs() { | ||||
| $crumbs = parent::buildApplicationCrumbs(); | $crumbs = parent::buildApplicationCrumbs(); | ||||
| $user = $this->getUser(); | $user = $this->getUser(); | ||||
| if (!$this->isSelf() && $user) { | if (!$this->isSelf() && $user) { | ||||
| $username = $user->getUsername(); | $username = $user->getUsername(); | ||||
| $crumbs->addTextCrumb($username, "/p/{$username}/"); | $crumbs->addTextCrumb($username, "/p/{$username}/"); | ||||
| } | } | ||||
| return $crumbs; | return $crumbs; | ||||
| } | } | ||||
| } | } | ||||