diff --git a/src/applications/differential/application/PhabricatorDifferentialApplication.php b/src/applications/differential/application/PhabricatorDifferentialApplication.php --- a/src/applications/differential/application/PhabricatorDifferentialApplication.php +++ b/src/applications/differential/application/PhabricatorDifferentialApplication.php @@ -195,7 +195,11 @@ return array( 'revision' => array( 'name' => pht('Email Commands: Revisions'), + 'header' => pht('Interacting with Differential Revisions'), 'object' => new DifferentialRevision(), + 'summary' => pht( + 'This page documents the commands you can use to interact with '. + 'revisions in Differential.'), ), ); } diff --git a/src/applications/maniphest/application/PhabricatorManiphestApplication.php b/src/applications/maniphest/application/PhabricatorManiphestApplication.php --- a/src/applications/maniphest/application/PhabricatorManiphestApplication.php +++ b/src/applications/maniphest/application/PhabricatorManiphestApplication.php @@ -147,7 +147,12 @@ return array( 'task' => array( 'name' => pht('Email Commands: Tasks'), + 'header' => pht('Interacting with Maniphest Tasks'), 'object' => new ManiphestTask(), + 'summary' => pht( + 'This page documents the commands you can use to interact with '. + 'tasks in Maniphest. These commands work when creating new tasks '. + 'via email and when replying to existing tasks.'), ), ); } diff --git a/src/applications/meta/controller/PhabricatorApplicationEmailCommandsController.php b/src/applications/meta/controller/PhabricatorApplicationEmailCommandsController.php --- a/src/applications/meta/controller/PhabricatorApplicationEmailCommandsController.php +++ b/src/applications/meta/controller/PhabricatorApplicationEmailCommandsController.php @@ -33,7 +33,54 @@ $content = array(); + $content[] = '= '.pht('Mail Commands Overview'); + $content[] = pht( + 'After configuring Phabricator to process inbound mail, you can '. + 'interact with objects (like tasks and revisions) over email. For '. + 'information on configuring Phabricator, see '. + '**[[ %s | Configuring Inbound Email ]]**.'. + "\n\n". + 'In most cases, you can reply to email you receive from Phabricator '. + 'to leave comments. You can also use **mail commands** to take a '. + 'greater range of actions (like claming a task or requesting changes '. + 'to a revision) without needing to log in to the web UI.'. + "\n\n". + 'Mail commands are keywords which start with an exclamation point, '. + 'like `!claim`. Some commands may take parameters, like '. + '`!assign alincoln`.'. + "\n\n". + 'To use mail commands, write one command per line at the beginning '. + 'or end of your mail message. For example, you could write this in a '. + 'reply to task email to claim the task:'. + "\n\n". + + "```\n". + "!claim\n". + "\n". + "I'll take care of this.\n". + "```\n". + + "\n\n". + "When Phabricator receives your mail, it will process any commands ". + "first, then post the remaining message body as a comment. You can ". + "execute multiple commands at once:". + "\n\n". + + "```\n". + "!assign alincoln\n". + "!close\n". + "\n". + "I just talked to @alincoln, and he showed me that he fixed this.\n". + "```\n", + PhabricatorEnv::getDoclink('Configuring Inbound Email')); + + $content[] = '= '.$spec['header']; + $content[] = $spec['summary']; + $content[] = '= '.pht('Quick Reference'); + $content[] = pht( + 'This table summarizes the available mail commands. For details on a '. + 'specific command, see the command section below.'); $table = array(); $table[] = '| '.pht('Command').' | '.pht('Summary').' |'; $table[] = '|---|---|'; @@ -84,22 +131,34 @@ $this->addApplicationCrumb($crumbs, $selected); $crumbs->addTextCrumb($title); - $content_box = id(new PHUIBoxView()) - ->addMargin(PHUI::MARGIN_LARGE) - ->appendChild( - PhabricatorMarkupEngine::renderOneObject( - id(new PhabricatorMarkupOneOff())->setContent($content), - 'default', - $viewer)); + $content_box = PhabricatorMarkupEngine::renderOneObject( + id(new PhabricatorMarkupOneOff())->setContent($content), + 'default', + $viewer); + + $info_view = null; + if (!PhabricatorEnv::getEnvConfig('metamta.reply-handler-domain')) { + $error = pht( + "Phabricator is not currently configured to accept inbound mail. ". + "You won't be able to interact with objects over email until ". + "inbound mail is set up."); + $info_view = id(new PHUIInfoView()) + ->setErrors(array($error)); + } + + $header = id(new PHUIHeaderView()) + ->setHeader($title); - $box = id(new PHUIObjectBoxView()) - ->setHeaderText($title) + $document = id(new PHUIDocumentView()) + ->setHeader($header) + ->setFontKit(PHUIDocumentView::FONT_SOURCE_SANS) + ->appendChild($info_view) ->appendChild($content_box); return $this->buildApplicationPage( array( $crumbs, - $box, + $document, ), array( 'title' => $title,