Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15273171
D12051.id29008.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
20 KB
Referenced Files
None
Subscribers
None
D12051.id29008.diff
View Options
diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -8,7 +8,7 @@
return array(
'names' => array(
'core.pkg.css' => '70320e8a',
- 'core.pkg.js' => '28ef0e70',
+ 'core.pkg.js' => '5f50c01b',
'darkconsole.pkg.js' => '8ab24e01',
'differential.pkg.css' => '1940be3f',
'differential.pkg.js' => '53c1ccc2',
@@ -44,7 +44,7 @@
'rsrc/css/application/config/config-welcome.css' => '6abd79be',
'rsrc/css/application/config/setup-issue.css' => '22270af2',
'rsrc/css/application/config/unhandled-exception.css' => '37d4f9a2',
- 'rsrc/css/application/conpherence/durable-column.css' => '9207426d',
+ 'rsrc/css/application/conpherence/durable-column.css' => '7abcc3f2',
'rsrc/css/application/conpherence/menu.css' => 'c6ac5299',
'rsrc/css/application/conpherence/message-pane.css' => '5930260a',
'rsrc/css/application/conpherence/notification.css' => '04a6e10a',
@@ -353,7 +353,7 @@
'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18',
'rsrc/js/application/config/behavior-reorder-fields.js' => '14a827de',
'rsrc/js/application/conpherence/ConpherenceThreadManager.js' => 'efef202b',
- 'rsrc/js/application/conpherence/behavior-durable-column.js' => '1eef9f26',
+ 'rsrc/js/application/conpherence/behavior-durable-column.js' => 'aa3b6c22',
'rsrc/js/application/conpherence/behavior-menu.js' => 'e476c952',
'rsrc/js/application/conpherence/behavior-pontificate.js' => '21ba5861',
'rsrc/js/application/conpherence/behavior-quicksand-blacklist.js' => '7927a7d3',
@@ -514,7 +514,7 @@
'changeset-view-manager' => '88be0133',
'config-options-css' => '7fedf08b',
'config-welcome-css' => '6abd79be',
- 'conpherence-durable-column-view' => '9207426d',
+ 'conpherence-durable-column-view' => '7abcc3f2',
'conpherence-menu-css' => 'c6ac5299',
'conpherence-message-pane-css' => '5930260a',
'conpherence-notification-css' => '04a6e10a',
@@ -585,7 +585,7 @@
'javelin-behavior-diffusion-locate-file' => '6d3e1947',
'javelin-behavior-diffusion-pull-lastmodified' => '2b228192',
'javelin-behavior-doorkeeper-tag' => 'e5822781',
- 'javelin-behavior-durable-column' => '1eef9f26',
+ 'javelin-behavior-durable-column' => 'aa3b6c22',
'javelin-behavior-error-log' => '6882e80a',
'javelin-behavior-fancy-datepicker' => 'c51ae228',
'javelin-behavior-global-drag-and-drop' => '07f199d8',
@@ -954,15 +954,6 @@
'javelin-dom',
'javelin-reactor-dom',
),
- '1eef9f26' => array(
- 'javelin-behavior',
- 'javelin-dom',
- 'javelin-stratcom',
- 'javelin-scrollbar',
- 'javelin-quicksand',
- 'phabricator-keyboard-shortcut',
- 'conpherence-thread-manager',
- ),
'1feea462' => array(
'javelin-install',
'javelin-dom',
@@ -1206,10 +1197,6 @@
'javelin-vector',
'javelin-dom',
),
- '5bc2cb21' => array(
- 'javelin-behavior',
- 'javelin-stratcom',
- ),
'5c1c758c' => array(
'javelin-install',
),
@@ -1664,6 +1651,15 @@
'javelin-util',
'phabricator-prefab',
),
+ 'aa3b6c22' => array(
+ 'javelin-behavior',
+ 'javelin-dom',
+ 'javelin-stratcom',
+ 'javelin-scrollbar',
+ 'javelin-quicksand',
+ 'phabricator-keyboard-shortcut',
+ 'conpherence-thread-manager',
+ ),
'b1f0ccee' => array(
'javelin-install',
'javelin-dom',
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
@@ -1269,11 +1269,12 @@
'PhabricatorApplication' => 'applications/base/PhabricatorApplication.php',
'PhabricatorApplicationApplicationPHIDType' => 'applications/meta/phid/PhabricatorApplicationApplicationPHIDType.php',
'PhabricatorApplicationConfigOptions' => 'applications/config/option/PhabricatorApplicationConfigOptions.php',
+ 'PhabricatorApplicationConfigurationPanel' => 'applications/meta/panel/PhabricatorApplicationConfigurationPanel.php',
'PhabricatorApplicationDatasource' => 'applications/meta/typeahead/PhabricatorApplicationDatasource.php',
'PhabricatorApplicationDetailViewController' => 'applications/meta/controller/PhabricatorApplicationDetailViewController.php',
'PhabricatorApplicationEditController' => 'applications/meta/controller/PhabricatorApplicationEditController.php',
- 'PhabricatorApplicationEditEmailController' => 'applications/meta/controller/PhabricatorApplicationEditEmailController.php',
'PhabricatorApplicationLaunchView' => 'applications/meta/view/PhabricatorApplicationLaunchView.php',
+ 'PhabricatorApplicationPanelController' => 'applications/meta/controller/PhabricatorApplicationPanelController.php',
'PhabricatorApplicationQuery' => 'applications/meta/query/PhabricatorApplicationQuery.php',
'PhabricatorApplicationSearchController' => 'applications/search/controller/PhabricatorApplicationSearchController.php',
'PhabricatorApplicationSearchEngine' => 'applications/search/engine/PhabricatorApplicationSearchEngine.php',
@@ -1988,6 +1989,7 @@
'PhabricatorMetaMTAApplicationEmail' => 'applications/metamta/storage/PhabricatorMetaMTAApplicationEmail.php',
'PhabricatorMetaMTAApplicationEmailDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAApplicationEmailDatasource.php',
'PhabricatorMetaMTAApplicationEmailPHIDType' => 'applications/phid/PhabricatorMetaMTAApplicationEmailPHIDType.php',
+ 'PhabricatorMetaMTAApplicationEmailPanel' => 'applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php',
'PhabricatorMetaMTAApplicationEmailQuery' => 'applications/metamta/query/PhabricatorMetaMTAApplicationEmailQuery.php',
'PhabricatorMetaMTAAttachment' => 'applications/metamta/storage/PhabricatorMetaMTAAttachment.php',
'PhabricatorMetaMTAConfigOptions' => 'applications/config/option/PhabricatorMetaMTAConfigOptions.php',
@@ -4510,11 +4512,12 @@
'PhabricatorApplication' => 'PhabricatorPolicyInterface',
'PhabricatorApplicationApplicationPHIDType' => 'PhabricatorPHIDType',
'PhabricatorApplicationConfigOptions' => 'Phobject',
+ 'PhabricatorApplicationConfigurationPanel' => 'Phobject',
'PhabricatorApplicationDatasource' => 'PhabricatorTypeaheadDatasource',
'PhabricatorApplicationDetailViewController' => 'PhabricatorApplicationsController',
'PhabricatorApplicationEditController' => 'PhabricatorApplicationsController',
- 'PhabricatorApplicationEditEmailController' => 'PhabricatorApplicationsController',
'PhabricatorApplicationLaunchView' => 'AphrontTagView',
+ 'PhabricatorApplicationPanelController' => 'PhabricatorApplicationsController',
'PhabricatorApplicationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorApplicationSearchController' => 'PhabricatorSearchBaseController',
'PhabricatorApplicationStatusView' => 'AphrontView',
@@ -5272,6 +5275,7 @@
),
'PhabricatorMetaMTAApplicationEmailDatasource' => 'PhabricatorTypeaheadDatasource',
'PhabricatorMetaMTAApplicationEmailPHIDType' => 'PhabricatorPHIDType',
+ 'PhabricatorMetaMTAApplicationEmailPanel' => 'PhabricatorApplicationConfigurationPanel',
'PhabricatorMetaMTAApplicationEmailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorMetaMTAConfigOptions' => 'PhabricatorApplicationConfigOptions',
'PhabricatorMetaMTAController' => 'PhabricatorController',
diff --git a/src/applications/meta/application/PhabricatorApplicationsApplication.php b/src/applications/meta/application/PhabricatorApplicationsApplication.php
--- a/src/applications/meta/application/PhabricatorApplicationsApplication.php
+++ b/src/applications/meta/application/PhabricatorApplicationsApplication.php
@@ -41,10 +41,10 @@
=> 'PhabricatorApplicationDetailViewController',
'edit/(?P<application>\w+)/'
=> 'PhabricatorApplicationEditController',
- 'editemail/(?P<application>\w+)/'
- => 'PhabricatorApplicationEditEmailController',
'(?P<application>\w+)/(?P<action>install|uninstall)/'
=> 'PhabricatorApplicationUninstallController',
+ 'panel/(?P<application>\w+)/(?P<panel>\w+)/(?P<path>.*)'
+ => 'PhabricatorApplicationPanelController',
),
);
}
diff --git a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
--- a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
@@ -9,11 +9,11 @@
}
public function handleRequest(AphrontRequest $request) {
- $user = $request->getUser();
+ $viewer = $this->getViewer();
$application = $request->getURIData('application');
$selected = id(new PhabricatorApplicationQuery())
- ->setViewer($user)
+ ->setViewer($viewer)
->withClasses(array($application))
->executeOne();
if (!$selected) {
@@ -27,7 +27,7 @@
$header = id(new PHUIHeaderView())
->setHeader($title)
- ->setUser($user)
+ ->setUser($viewer)
->setPolicyObject($selected);
if ($selected->isInstalled()) {
@@ -36,17 +36,30 @@
$header->setStatus('fa-ban', 'dark', pht('Uninstalled'));
}
- $actions = $this->buildActionView($user, $selected);
+ $actions = $this->buildActionView($viewer, $selected);
$properties = $this->buildPropertyView($selected, $actions);
$object_box = id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
+ $configs =
+ PhabricatorApplicationConfigurationPanel::loadAllPanelsForApplication(
+ $selected);
+
+ $panels = array();
+ foreach ($configs as $config) {
+ $config->setViewer($viewer);
+ $config->setApplication($selected);
+
+ $panels[] = $config->buildConfigurationPagePanel();
+ }
+
return $this->buildApplicationPage(
array(
$crumbs,
$object_box,
+ $panels,
),
array(
'title' => $title,
@@ -114,26 +127,6 @@
idx($descriptions, $capability));
}
- if ($application->supportsEmailIntegration()) {
- $properties->addSectionHeader(pht('Application Emails'));
- $properties->addTextContent($application->getAppEmailBlurb());
- $email_addresses = id(new PhabricatorMetaMTAApplicationEmailQuery())
- ->setViewer($viewer)
- ->withApplicationPHIDs(array($application->getPHID()))
- ->execute();
- if (empty($email_addresses)) {
- $properties->addProperty(
- null,
- pht('No email addresses configured.'));
- } else {
- foreach ($email_addresses as $email_address) {
- $properties->addProperty(
- null,
- $email_address->getAddress());
- }
- }
- }
-
return $properties;
}
@@ -168,18 +161,6 @@
->setWorkflow(!$can_edit)
->setHref($edit_uri));
- if ($selected->supportsEmailIntegration()) {
- $edit_email_uri = $this->getApplicationURI(
- 'editemail/'.get_class($selected).'/');
- $view->addAction(
- id(new PhabricatorActionView())
- ->setName(pht('Edit Application Emails'))
- ->setIcon('fa-envelope')
- ->setDisabled(!$can_edit)
- ->setWorkflow(!$can_edit)
- ->setHref($edit_email_uri));
- }
-
if ($selected->canUninstall()) {
if ($selected->isInstalled()) {
$view->addAction(
diff --git a/src/applications/meta/controller/PhabricatorApplicationPanelController.php b/src/applications/meta/controller/PhabricatorApplicationPanelController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/meta/controller/PhabricatorApplicationPanelController.php
@@ -0,0 +1,67 @@
+<?php
+
+final class PhabricatorApplicationPanelController
+ extends PhabricatorApplicationsController {
+
+ private $application;
+
+ public function handleRequest(AphrontRequest $request) {
+ $viewer = $this->getViewer();
+
+ $application = $request->getURIData('application');
+ $panel_key = $request->getURIData('panel');
+
+ $selected = id(new PhabricatorApplicationQuery())
+ ->setViewer($viewer)
+ ->withClasses(array($application))
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ ))
+ ->executeOne();
+ if (!$selected) {
+ return new Aphront404Response();
+ }
+
+ $panels =
+ PhabricatorApplicationConfigurationPanel::loadAllPanelsForApplication(
+ $selected);
+ if (empty($panels[$panel_key])) {
+ return new Aphront404Response();
+ }
+
+ $panel = $panels[$panel_key];
+
+ if (!$panel->shouldShowForApplication($selected)) {
+ return new Aphront404Response();
+ }
+
+ $panel->setViewer($viewer);
+ $panel->setApplication($selected);
+
+ $this->application = $selected;
+
+ return $panel->handlePanelRequest($request, $this);
+ }
+
+ public function buildPanelCrumbs(
+ PhabricatorApplicationConfigurationPanel $panel) {
+ $application = $this->application;
+
+ $crumbs = $this->buildApplicationCrumbs();
+
+ $view_uri = '/applications/view/'.get_class($application).'/';
+ $crumbs->addTextCrumb($application->getName(), $view_uri);
+
+ return $crumbs;
+ }
+
+ public function buildPanelPage(
+ PhabricatorApplicationConfigurationPanel $panel,
+ $content,
+ array $options) {
+ return $this->buildApplicationPage($content, $options);
+ }
+
+}
diff --git a/src/applications/meta/panel/PhabricatorApplicationConfigurationPanel.php b/src/applications/meta/panel/PhabricatorApplicationConfigurationPanel.php
new file mode 100644
--- /dev/null
+++ b/src/applications/meta/panel/PhabricatorApplicationConfigurationPanel.php
@@ -0,0 +1,88 @@
+<?php
+
+abstract class PhabricatorApplicationConfigurationPanel
+ extends Phobject {
+
+ private $viewer;
+ private $application;
+
+ public function setViewer(PhabricatorUser $viewer) {
+ $this->viewer = $viewer;
+ return $this;
+ }
+
+ public function getViewer() {
+ return $this->viewer;
+ }
+
+ public function setApplication(PhabricatorApplication $application) {
+ $this->application = $application;
+ return $this;
+ }
+
+ public function getApplication() {
+ return $this->application;
+ }
+
+ public function getPanelURI($path = null) {
+ $app_key = get_class($this->getApplication());
+ $panel_key = $this->getPanelKey();
+ $base = "/applications/panel/{$app_key}/{$panel_key}/";
+ return $base.ltrim($path, '/');
+ }
+
+ /**
+ * Return a short, unique string key which identifies this panel.
+ *
+ * This key is used in URIs. Good values might be "email" or "files".
+ */
+ abstract public function getPanelKey();
+
+ abstract public function shouldShowForApplication(
+ PhabricatorApplication $application);
+
+ abstract public function buildConfigurationPagePanel();
+ abstract public function handlePanelRequest(
+ AphrontRequest $request,
+ PhabricatorController $controller);
+
+ public static function loadAllPanels() {
+ $objects = id(new PhutilSymbolLoader())
+ ->setAncestorClass(__CLASS__)
+ ->loadObjects();
+
+ $panels = array();
+ foreach ($objects as $object) {
+ $key = $object->getPanelKey();
+ if (empty($panels[$key])) {
+ $panels[$key] = $object;
+ } else {
+ throw new Exception(
+ pht(
+ 'Application configuration panels "%s" and "%s" have the same '.
+ 'panel key, "%s". Each panel must have a unique key.',
+ get_class($object),
+ get_class($panels[$key]),
+ $key));
+ }
+ }
+
+ return $panels;
+ }
+
+ public static function loadAllPanelsForApplication(
+ PhabricatorApplication $application) {
+ $panels = self::loadAllPanels();
+
+ $application_panels = array();
+ foreach ($panels as $key => $panel) {
+ if (!$panel->shouldShowForApplication($application)) {
+ continue;
+ }
+ $application_panels[$key] = $panel;
+ }
+
+ return $application_panels;
+ }
+
+}
diff --git a/src/applications/meta/controller/PhabricatorApplicationEditEmailController.php b/src/applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php
rename from src/applications/meta/controller/PhabricatorApplicationEditEmailController.php
rename to src/applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php
--- a/src/applications/meta/controller/PhabricatorApplicationEditEmailController.php
+++ b/src/applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php
@@ -1,27 +1,77 @@
<?php
-final class PhabricatorApplicationEditEmailController
- extends PhabricatorApplicationsController {
+final class PhabricatorMetaMTAApplicationEmailPanel
+ extends PhabricatorApplicationConfigurationPanel {
- public function handleRequest(AphrontRequest $request) {
- $viewer = $request->getUser();
- $application = $request->getURIData('application');
+ public function getPanelKey() {
+ return 'email';
+ }
+
+ public function shouldShowForApplication(
+ PhabricatorApplication $application) {
+ return $application->supportsEmailIntegration();
+ }
- $application = id(new PhabricatorApplicationQuery())
+ public function buildConfigurationPagePanel() {
+ $viewer = $this->getViewer();
+ $application = $this->getApplication();
+
+ $addresses = id(new PhabricatorMetaMTAApplicationEmailQuery())
->setViewer($viewer)
- ->withClasses(array($application))
- ->requireCapabilities(
+ ->withApplicationPHIDs(array($application->getPHID()))
+ ->execute();
+
+ $rows = array();
+ foreach ($addresses as $address) {
+ $rows[] = array(
+ $address->getAddress(),
+ );
+ }
+
+ $table = id(new AphrontTableView($rows))
+ ->setNoDataString(pht('No email addresses configured.'))
+ ->setHeaders(
array(
- PhabricatorPolicyCapability::CAN_VIEW,
- PhabricatorPolicyCapability::CAN_EDIT,
- ))
- ->executeOne();
- if (!$application) {
+ pht('Address'),
+ ));
+
+ $can_edit = PhabricatorPolicyFilter::hasCapability(
+ $viewer,
+ $application,
+ PhabricatorPolicyCapability::CAN_EDIT);
+
+ $header = id(new PHUIHeaderView())
+ ->setHeader(pht('Application Emails'))
+ ->addActionLink(
+ id(new PHUIButtonView())
+ ->setTag('a')
+ ->setText(pht('Edit Application Emails'))
+ ->setIcon(
+ id(new PHUIIconView())
+ ->setIconFont('fa-pencil'))
+ ->setHref($this->getPanelURI())
+ ->setDisabled(!$can_edit)
+ ->setWorkflow(!$can_edit));
+
+
+ $box = id(new PHUIObjectBoxView())
+ ->setHeader($header)
+ ->appendChild($table);
+
+ return $box;
+ }
+
+ public function handlePanelRequest(
+ AphrontRequest $request,
+ PhabricatorController $controller) {
+ $viewer = $request->getViewer();
+ $application = $this->getApplication();
+
+ $path = $request->getURIData('path');
+ if (strlen($path)) {
return new Aphront404Response();
}
- $title = $application->getName();
-
$uri = $request->getRequestURI();
$uri->setQueryParams(array());
@@ -106,13 +156,12 @@
$form = id(new AphrontFormView())
->setUser($viewer);
- $view_uri = $this->getApplicationURI('view/'.get_class($application).'/');
- $crumbs = $this->buildApplicationCrumbs();
- $crumbs->addTextCrumb($application->getName(), $view_uri);
+ $crumbs = $controller->buildPanelCrumbs($this);
$crumbs->addTextCrumb(pht('Edit Application Emails'));
$header = id(new PHUIHeaderView())
- ->setHeader(pht('Edit Application Emails: %s', $application->getName()));
+ ->setHeader(pht('Edit Application Emails: %s', $application->getName()))
+ ->setSubheader($application->getAppEmailBlurb());
$icon = id(new PHUIIconView())
->setIconFont('fa-plus');
@@ -126,13 +175,12 @@
$object_box = id(new PHUIObjectBoxView())
->setHeader($header)
- ->appendChild($table)
- ->appendChild(
- id(new PHUIBoxView())
- ->appendChild($application->getAppEmailBlurb())
- ->addPadding(PHUI::PADDING_MEDIUM));
+ ->appendChild($table);
+
+ $title = $application->getName();
- return $this->buildApplicationPage(
+ return $controller->buildPanelPage(
+ $this,
array(
$crumbs,
$object_box,
@@ -253,7 +301,10 @@
$default_user = $email_object->getConfigValue($default_user_key);
if ($default_user) {
- $default_user_handle = $this->loadViewerHandles(array($default_user));
+ $default_user_handle = id(new PhabricatorHandleQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(array($default_user))
+ ->execute();
} else {
$default_user_handle = array();
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 1, 12:23 PM (19 h, 12 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7215507
Default Alt Text
D12051.id29008.diff (20 KB)
Attached To
Mode
D12051: Modularize application configuration panels
Attached
Detach File
Event Timeline
Log In to Comment