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 @@ -2654,6 +2654,11 @@ 'PhabricatorFactSimpleSpec' => 'applications/fact/spec/PhabricatorFactSimpleSpec.php', 'PhabricatorFactSpec' => 'applications/fact/spec/PhabricatorFactSpec.php', 'PhabricatorFactUpdateIterator' => 'applications/fact/extract/PhabricatorFactUpdateIterator.php', + 'PhabricatorFavoritesApplication' => 'applications/favorites/application/PhabricatorFavoritesApplication.php', + 'PhabricatorFavoritesController' => 'applications/favorites/controller/PhabricatorFavoritesController.php', + 'PhabricatorFavoritesMainController' => 'applications/favorites/controller/PhabricatorFavoritesMainController.php', + 'PhabricatorFavoritesMenuItemController' => 'applications/favorites/controller/PhabricatorFavoritesMenuItemController.php', + 'PhabricatorFavoritesProfileMenuEngine' => 'applications/favorites/engine/PhabricatorFavoritesProfileMenuEngine.php', 'PhabricatorFaxContentSource' => 'infrastructure/contentsource/PhabricatorFaxContentSource.php', 'PhabricatorFeedApplication' => 'applications/feed/application/PhabricatorFeedApplication.php', 'PhabricatorFeedBuilder' => 'applications/feed/builder/PhabricatorFeedBuilder.php', @@ -7650,6 +7655,11 @@ 'PhabricatorFactSimpleSpec' => 'PhabricatorFactSpec', 'PhabricatorFactSpec' => 'Phobject', 'PhabricatorFactUpdateIterator' => 'PhutilBufferedIterator', + 'PhabricatorFavoritesApplication' => 'PhabricatorApplication', + 'PhabricatorFavoritesController' => 'PhabricatorController', + 'PhabricatorFavoritesMainController' => 'PhabricatorFavoritesController', + 'PhabricatorFavoritesMenuItemController' => 'PhabricatorFavoritesController', + 'PhabricatorFavoritesProfileMenuEngine' => 'PhabricatorProfileMenuEngine', 'PhabricatorFaxContentSource' => 'PhabricatorContentSource', 'PhabricatorFeedApplication' => 'PhabricatorApplication', 'PhabricatorFeedBuilder' => 'Phobject', diff --git a/src/applications/favorites/application/PhabricatorFavoritesApplication.php b/src/applications/favorites/application/PhabricatorFavoritesApplication.php new file mode 100644 --- /dev/null +++ b/src/applications/favorites/application/PhabricatorFavoritesApplication.php @@ -0,0 +1,39 @@ + array( + '' => 'PhabricatorFavoritesMainController', + '(?Pglobal|personal)/item/' => $this->getProfileMenuRouting( + 'PhabricatorFavoritesMenuItemController'), + ), + ); + } + + public function isLaunchable() { + return false; + } + + public function getApplicationOrder() { + return 9; + } + +} diff --git a/src/applications/favorites/controller/PhabricatorFavoritesController.php b/src/applications/favorites/controller/PhabricatorFavoritesController.php new file mode 100644 --- /dev/null +++ b/src/applications/favorites/controller/PhabricatorFavoritesController.php @@ -0,0 +1,59 @@ +newApplicationMenu(); + + $profile_menu = $this->getProfileMenu(); + if ($profile_menu) { + $menu->setProfileMenu($profile_menu); + } + + return $menu; + } + + protected function getProfileMenu() { + if (!$this->profileMenu) { + $engine = $this->getProfileMenuEngine(); + if ($engine) { + $this->profileMenu = $engine->buildNavigation(); + } + } + + return $this->profileMenu; + } + + protected function buildApplicationCrumbs() { + return parent::buildApplicationCrumbs(); + } + + protected function getProfileMenuEngine() { + if (!$this->profileMenuEngine) { + $viewer = $this->getViewer(); + $application = 'PhabricatorFavoritesApplication'; + $favorites = id(new PhabricatorApplicationQuery()) + ->setViewer($viewer) + ->withClasses(array($application)) + ->withInstalled(true) + ->executeOne(); + $engine = id(new PhabricatorFavoritesProfileMenuEngine()) + ->setViewer($viewer) + ->setController($this) + ->setProfileObject($favorites); + $this->profileMenuEngine = $engine; + } + + return $this->profileMenuEngine; + } + + protected function setProfileMenuEngine( + PhabricatorFavoritesProfileMenuEngine $engine) { + $this->profileMenuEngine = $engine; + return $this; + } + +} diff --git a/src/applications/favorites/controller/PhabricatorFavoritesMainController.php b/src/applications/favorites/controller/PhabricatorFavoritesMainController.php new file mode 100644 --- /dev/null +++ b/src/applications/favorites/controller/PhabricatorFavoritesMainController.php @@ -0,0 +1,58 @@ +getViewer(); + + $menu = id(new PHUIObjectItemListView()) + ->setUser($viewer); + + $menu->addItem( + id(new PHUIObjectItemView()) + ->setHeader(pht('Personal Menu Items')) + ->setHref($this->getApplicationURI('personal/item/')) + ->setImageURI($viewer->getProfileImageURI()) + ->addAttribute(pht('Edit favorites for your personal account.'))); + + $icon = id(new PHUIIconView()) + ->setIcon('fa-globe') + ->setBackground('bg-blue'); + + $menu->addItem( + id(new PHUIObjectItemView()) + ->setHeader(pht('Global Menu Items')) + ->setHref($this->getApplicationURI('global/item/')) + ->setImageIcon($icon) + ->addAttribute(pht('Edit global default favorites for all users.'))); + + $crumbs = $this->buildApplicationCrumbs(); + $crumbs->addTextCrumb(pht('Manage')); + $crumbs->setBorder(true); + + $box = id(new PHUIObjectBoxView()) + ->setObjectList($menu); + + $header = id(new PHUIHeaderView()) + ->setHeader(pht('Manage Favorites')) + ->setHeaderIcon('fa-star-o'); + + $view = id(new PHUITwoColumnView()) + ->setHeader($header) + ->setFooter(array( + $box, + )); + + return $this->newPage() + ->setTitle(pht('Manage')) + ->setCrumbs($crumbs) + ->appendChild($view); + + } + +} diff --git a/src/applications/favorites/controller/PhabricatorFavoritesMenuItemController.php b/src/applications/favorites/controller/PhabricatorFavoritesMenuItemController.php new file mode 100644 --- /dev/null +++ b/src/applications/favorites/controller/PhabricatorFavoritesMenuItemController.php @@ -0,0 +1,24 @@ +getViewer(); + $application = 'PhabricatorFavoritesApplication'; + $favorites = id(new PhabricatorApplicationQuery()) + ->setViewer($viewer) + ->withClasses(array($application)) + ->withInstalled(true) + ->executeOne(); + + $engine = id(new PhabricatorFavoritesProfileMenuEngine()) + ->setProfileObject($favorites) + ->setController($this); + + $this->setProfileMenuEngine($engine); + + return $engine->buildResponse(); + } + +} diff --git a/src/applications/favorites/engine/PhabricatorFavoritesProfileMenuEngine.php b/src/applications/favorites/engine/PhabricatorFavoritesProfileMenuEngine.php new file mode 100644 --- /dev/null +++ b/src/applications/favorites/engine/PhabricatorFavoritesProfileMenuEngine.php @@ -0,0 +1,20 @@ +