Page MenuHomePhabricator

D17003.id40911.diff
No OneTemporary

D17003.id40911.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
@@ -1787,6 +1787,7 @@
'PhabricatorApplicationEmailCommandsController' => 'applications/meta/controller/PhabricatorApplicationEmailCommandsController.php',
'PhabricatorApplicationLaunchView' => 'applications/meta/view/PhabricatorApplicationLaunchView.php',
'PhabricatorApplicationPanelController' => 'applications/meta/controller/PhabricatorApplicationPanelController.php',
+ 'PhabricatorApplicationProfilePanel' => 'applications/search/profilepanel/PhabricatorApplicationProfilePanel.php',
'PhabricatorApplicationQuery' => 'applications/meta/query/PhabricatorApplicationQuery.php',
'PhabricatorApplicationSearchController' => 'applications/search/controller/PhabricatorApplicationSearchController.php',
'PhabricatorApplicationSearchEngine' => 'applications/search/engine/PhabricatorApplicationSearchEngine.php',
@@ -2430,6 +2431,7 @@
'PhabricatorDashboardLayoutConfig' => 'applications/dashboard/layoutconfig/PhabricatorDashboardLayoutConfig.php',
'PhabricatorDashboardListController' => 'applications/dashboard/controller/PhabricatorDashboardListController.php',
'PhabricatorDashboardManageController' => 'applications/dashboard/controller/PhabricatorDashboardManageController.php',
+ 'PhabricatorDashboardManagePanel' => 'applications/dashboard/profilepanel/PhabricatorDashboardManagePanel.php',
'PhabricatorDashboardMovePanelController' => 'applications/dashboard/controller/PhabricatorDashboardMovePanelController.php',
'PhabricatorDashboardPanel' => 'applications/dashboard/storage/PhabricatorDashboardPanel.php',
'PhabricatorDashboardPanelArchiveController' => 'applications/dashboard/controller/PhabricatorDashboardPanelArchiveController.php',
@@ -2439,6 +2441,8 @@
'PhabricatorDashboardPanelEditController' => 'applications/dashboard/controller/PhabricatorDashboardPanelEditController.php',
'PhabricatorDashboardPanelEditEngine' => 'applications/dashboard/editor/PhabricatorDashboardPanelEditEngine.php',
'PhabricatorDashboardPanelEditproController' => 'applications/dashboard/controller/PhabricatorDashboardPanelEditproController.php',
+ 'PhabricatorDashboardPanelEngine' => 'applications/dashboard/engine/PhabricatorDashboardPanelEngine.php',
+ 'PhabricatorDashboardPanelEngineController' => 'applications/dashboard/controller/PhabricatorDashboardPanelEngineController.php',
'PhabricatorDashboardPanelHasDashboardEdgeType' => 'applications/dashboard/edge/PhabricatorDashboardPanelHasDashboardEdgeType.php',
'PhabricatorDashboardPanelListController' => 'applications/dashboard/controller/PhabricatorDashboardPanelListController.php',
'PhabricatorDashboardPanelPHIDType' => 'applications/dashboard/phid/PhabricatorDashboardPanelPHIDType.php',
@@ -6608,6 +6612,7 @@
'PhabricatorApplicationEmailCommandsController' => 'PhabricatorApplicationsController',
'PhabricatorApplicationLaunchView' => 'AphrontTagView',
'PhabricatorApplicationPanelController' => 'PhabricatorApplicationsController',
+ 'PhabricatorApplicationProfilePanel' => 'PhabricatorProfilePanel',
'PhabricatorApplicationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorApplicationSearchController' => 'PhabricatorSearchBaseController',
'PhabricatorApplicationSearchEngine' => 'Phobject',
@@ -7366,6 +7371,7 @@
'PhabricatorDashboardLayoutConfig' => 'Phobject',
'PhabricatorDashboardListController' => 'PhabricatorDashboardController',
'PhabricatorDashboardManageController' => 'PhabricatorDashboardController',
+ 'PhabricatorDashboardManagePanel' => 'PhabricatorProfilePanel',
'PhabricatorDashboardMovePanelController' => 'PhabricatorDashboardController',
'PhabricatorDashboardPanel' => array(
'PhabricatorDashboardDAO',
@@ -7385,6 +7391,8 @@
'PhabricatorDashboardPanelEditController' => 'PhabricatorDashboardController',
'PhabricatorDashboardPanelEditEngine' => 'PhabricatorEditEngine',
'PhabricatorDashboardPanelEditproController' => 'PhabricatorDashboardController',
+ 'PhabricatorDashboardPanelEngine' => 'PhabricatorProfilePanelEngine',
+ 'PhabricatorDashboardPanelEngineController' => 'PhabricatorDashboardController',
'PhabricatorDashboardPanelHasDashboardEdgeType' => 'PhabricatorEdgeType',
'PhabricatorDashboardPanelListController' => 'PhabricatorDashboardController',
'PhabricatorDashboardPanelPHIDType' => 'PhabricatorPHIDType',
diff --git a/src/applications/dashboard/application/PhabricatorDashboardApplication.php b/src/applications/dashboard/application/PhabricatorDashboardApplication.php
--- a/src/applications/dashboard/application/PhabricatorDashboardApplication.php
+++ b/src/applications/dashboard/application/PhabricatorDashboardApplication.php
@@ -32,6 +32,9 @@
'edit/(?:(?P<id>\d+)/)?' => 'PhabricatorDashboardEditController',
'install/(?P<id>\d+)/' => 'PhabricatorDashboardInstallController',
'uninstall/(?P<id>\d+)/' => 'PhabricatorDashboardUninstallController',
+ '(?P<dashboardID>[1-9]\d*)/panel/'
+ => $this->getPanelRouting(
+ 'PhabricatorDashboardPanelEngineController'),
'addpanel/(?P<id>\d+)/' => 'PhabricatorDashboardAddPanelController',
'movepanel/(?P<id>\d+)/' => 'PhabricatorDashboardMovePanelController',
'removepanel/(?P<id>\d+)/'
diff --git a/src/applications/dashboard/controller/PhabricatorDashboardController.php b/src/applications/dashboard/controller/PhabricatorDashboardController.php
--- a/src/applications/dashboard/controller/PhabricatorDashboardController.php
+++ b/src/applications/dashboard/controller/PhabricatorDashboardController.php
@@ -1,3 +1,83 @@
<?php
-abstract class PhabricatorDashboardController extends PhabricatorController {}
+abstract class PhabricatorDashboardController extends PhabricatorController {
+
+ private $dashboard;
+ private $profileMenu;
+ private $profilePanelEngine;
+
+ protected function setDashboard(PhabricatorDashboard $dashboard) {
+ $this->dashboard = $dashboard;
+ return $this;
+ }
+
+ protected function getDashboard() {
+ return $this->dashboard;
+ }
+
+ protected function loadDashboard() {
+ $viewer = $this->getViewer();
+ $request = $this->getRequest();
+
+ $id = $request->getURIData('dashboardID');
+
+ $dashboard = id(new PhabricatorDashboardQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($id))
+ ->executeOne();
+
+ if (!$dashboard) {
+ return new Aphront404Response();
+ }
+
+ $this->setDashboard($dashboard);
+
+ return null;
+ }
+
+ public function buildApplicationMenu() {
+ $menu = $this->newApplicationMenu();
+
+ $profile_menu = $this->getProfileMenu();
+ if ($profile_menu) {
+ $menu->setProfileMenu($profile_menu);
+ }
+
+ $menu->setSearchEngine(new PhabricatorDashboardSearchEngine());
+
+ return $menu;
+ }
+
+ protected function getProfileMenu() {
+ if (!$this->profileMenu) {
+ $engine = $this->getProfilePanelEngine();
+ if ($engine) {
+ $this->profileMenu = $engine->buildNavigation();
+ }
+ }
+
+ return $this->profileMenu;
+ }
+
+ protected function getProfilePanelEngine() {
+ if (!$this->profilePanelEngine) {
+ $viewer = $this->getViewer();
+ $dashboard = $this->getDashboard();
+ if ($dashboard) {
+ $engine = id(new PhabricatorDashboardPanelEngine())
+ ->setViewer($viewer)
+ ->setController($this)
+ ->setProfileObject($dashboard);
+ $this->profilePanelEngine = $engine;
+ }
+ }
+ return $this->profilePanelEngine;
+ }
+
+ protected function setProfilePanelEngine(
+ PhabricatorDashboardPanelEngine $engine) {
+ $this->profilePanelEngine = $engine;
+ return $this;
+ }
+
+}
diff --git a/src/applications/dashboard/controller/PhabricatorDashboardManageController.php b/src/applications/dashboard/controller/PhabricatorDashboardManageController.php
--- a/src/applications/dashboard/controller/PhabricatorDashboardManageController.php
+++ b/src/applications/dashboard/controller/PhabricatorDashboardManageController.php
@@ -156,6 +156,14 @@
->setHref($this->getApplicationURI("copy/{$id}/"))
->setWorkflow(true));
+ $curtain->addAction(
+ id(new PhabricatorActionView())
+ ->setName(pht('Edit Menu'))
+ ->setIcon('fa-th-list')
+ ->setHref($this->getApplicationURI("{$id}/panel/configure/"))
+ ->setDisabled(!$can_edit)
+ ->setWorkflow(!$can_edit));
+
$installed_dashboard = id(new PhabricatorDashboardInstall())
->loadOneWhere(
'objectPHID = %s AND applicationClass = %s',
diff --git a/src/applications/dashboard/controller/PhabricatorDashboardPanelEngineController.php b/src/applications/dashboard/controller/PhabricatorDashboardPanelEngineController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/dashboard/controller/PhabricatorDashboardPanelEngineController.php
@@ -0,0 +1,24 @@
+<?php
+
+final class PhabricatorDashboardPanelEngineController
+ extends PhabricatorDashboardController {
+
+ public function handleRequest(AphrontRequest $request) {
+ $response = $this->loadDashboard();
+ if ($response) {
+ return $response;
+ }
+
+ $viewer = $this->getViewer();
+ $dashboard = $this->getDashboard();
+
+ $engine = id(new PhabricatorDashboardPanelEngine())
+ ->setProfileObject($dashboard)
+ ->setController($this);
+
+ $this->setProfilePanelEngine($engine);
+
+ return $engine->buildResponse();
+ }
+
+}
diff --git a/src/applications/dashboard/engine/PhabricatorDashboardPanelEngine.php b/src/applications/dashboard/engine/PhabricatorDashboardPanelEngine.php
new file mode 100644
--- /dev/null
+++ b/src/applications/dashboard/engine/PhabricatorDashboardPanelEngine.php
@@ -0,0 +1,26 @@
+<?php
+
+final class PhabricatorDashboardPanelEngine
+ extends PhabricatorProfilePanelEngine {
+
+ protected function isPanelEngineConfigurable() {
+ return true;
+ }
+
+ protected function getPanelURI($path) {
+ $project = $this->getProfileObject();
+ $id = $project->getID();
+ return "/dashboard/{$id}/panel/{$path}";
+ }
+
+ protected function getBuiltinProfilePanels($object) {
+ $panels = array();
+
+ $panels[] = $this->newPanel()
+ ->setBuiltinKey(PhabricatorDashboard::PANEL_MANAGE)
+ ->setPanelKey(PhabricatorDashboardManagePanel::PANELKEY);
+
+ return $panels;
+ }
+
+}
diff --git a/src/applications/dashboard/profilepanel/PhabricatorDashboardManagePanel.php b/src/applications/dashboard/profilepanel/PhabricatorDashboardManagePanel.php
new file mode 100644
--- /dev/null
+++ b/src/applications/dashboard/profilepanel/PhabricatorDashboardManagePanel.php
@@ -0,0 +1,64 @@
+<?php
+
+final class PhabricatorDashboardManagePanel
+ extends PhabricatorProfilePanel {
+
+ const PANELKEY = 'dashboard.manage';
+
+ public function getPanelTypeName() {
+ return pht('Manage Dashboard');
+ }
+
+ private function getDefaultName() {
+ return pht('Manage');
+ }
+
+ public function canHidePanel(
+ PhabricatorProfilePanelConfiguration $config) {
+ return false;
+ }
+
+ public function getDisplayName(
+ PhabricatorProfilePanelConfiguration $config) {
+ $name = $config->getPanelProperty('name');
+
+ if (strlen($name)) {
+ return $name;
+ }
+
+ return $this->getDefaultName();
+ }
+
+ public function buildEditEngineFields(
+ PhabricatorProfilePanelConfiguration $config) {
+ return array(
+ id(new PhabricatorTextEditField())
+ ->setKey('name')
+ ->setLabel(pht('Name'))
+ ->setPlaceholder($this->getDefaultName())
+ ->setValue($config->getPanelProperty('name')),
+ );
+ }
+
+ protected function newNavigationMenuItems(
+ PhabricatorProfilePanelConfiguration $config) {
+
+ $dashboard = $config->getProfileObject();
+
+ $id = $dashboard->getID();
+
+ $name = $this->getDisplayName($config);
+ $icon = 'fa-gears';
+ $href = "/dashboard/manage/{$id}/";
+
+ $item = $this->newItem()
+ ->setHref($href)
+ ->setName($name)
+ ->setIcon($icon);
+
+ return array(
+ $item,
+ );
+ }
+
+}
diff --git a/src/applications/dashboard/storage/PhabricatorDashboard.php b/src/applications/dashboard/storage/PhabricatorDashboard.php
--- a/src/applications/dashboard/storage/PhabricatorDashboard.php
+++ b/src/applications/dashboard/storage/PhabricatorDashboard.php
@@ -24,6 +24,7 @@
private $panels = self::ATTACHABLE;
private $edgeProjectPHIDs = self::ATTACHABLE;
+ const PANEL_MANAGE = 'dashboard.manage';
public static function initializeNewDashboard(PhabricatorUser $actor) {
return id(new PhabricatorDashboard())
diff --git a/src/applications/search/profilepanel/PhabricatorApplicationProfilePanel.php b/src/applications/search/profilepanel/PhabricatorApplicationProfilePanel.php
new file mode 100644
--- /dev/null
+++ b/src/applications/search/profilepanel/PhabricatorApplicationProfilePanel.php
@@ -0,0 +1,72 @@
+<?php
+
+final class PhabricatorApplicationProfilePanel
+ extends PhabricatorProfilePanel {
+
+ const PANELKEY = 'application';
+
+ public function getPanelTypeIcon() {
+ return 'fa-globe';
+ }
+
+ public function getPanelTypeName() {
+ return pht('Application');
+ }
+
+ public function canAddToObject($object) {
+ return true;
+ }
+
+ public function getDisplayName(
+ PhabricatorProfilePanelConfiguration $config) {
+ $app = $this->getApplication($config);
+ return $app->getName();
+ }
+
+ public function buildEditEngineFields(
+ PhabricatorProfilePanelConfiguration $config) {
+ return array(
+ id(new PhabricatorDatasourceEditField())
+ ->setKey('application')
+ ->setLabel(pht('Application'))
+ ->setDatasource(new PhabricatorApplicationDatasource())
+ ->setSingleValue($config->getPanelProperty('application')),
+ );
+ }
+
+ private function getApplication(
+ PhabricatorProfilePanelConfiguration $config) {
+ $applications = PhabricatorApplication::getAllInstalledApplications();
+ $selected = $config->getPanelProperty('application');
+ foreach ($applications as $app) {
+ if ($app->getPHID() == $selected) {
+ $selected_app = $app;
+ break;
+ }
+ }
+ return $selected_app;
+ }
+
+ protected function newNavigationMenuItems(
+ PhabricatorProfilePanelConfiguration $config) {
+ $viewer = $this->getViewer();
+ $app = $this->getApplication($config);
+
+ $is_installed = PhabricatorApplication::isClassInstalledForViewer(
+ get_class($app),
+ $viewer);
+ if (!$is_installed) {
+ return null;
+ }
+
+ $item = $this->newItem()
+ ->setHref($app->getApplicationURI())
+ ->setName($app->getName())
+ ->setIcon($app->getIcon());
+
+ return array(
+ $item,
+ );
+ }
+
+}

File Metadata

Mime Type
text/plain
Expires
Sun, Mar 9, 10:22 AM (1 w, 2 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7388241
Default Alt Text
D17003.id40911.diff (14 KB)

Event Timeline