Page MenuHomePhabricator

D12051.id29008.diff
No OneTemporary

D12051.id29008.diff

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

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)

Event Timeline