Index: resources/celerity/map.php =================================================================== --- resources/celerity/map.php +++ resources/celerity/map.php @@ -344,7 +344,7 @@ 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => '845731b8', 'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18', 'rsrc/js/application/config/behavior-reorder-fields.js' => '69bb5094', - 'rsrc/js/application/conpherence/behavior-menu.js' => '872bc8ff', + 'rsrc/js/application/conpherence/behavior-menu.js' => '7ff0b011', 'rsrc/js/application/conpherence/behavior-pontificate.js' => '53f6f2dd', 'rsrc/js/application/conpherence/behavior-widget-pane.js' => 'd8ef8659', 'rsrc/js/application/countdown/timer.js' => '8454ce4f', @@ -531,7 +531,7 @@ 'javelin-behavior-audit-preview' => 'be81801d', 'javelin-behavior-balanced-payment-form' => '3b3e1664', 'javelin-behavior-config-reorder-fields' => '69bb5094', - 'javelin-behavior-conpherence-menu' => '872bc8ff', + 'javelin-behavior-conpherence-menu' => '7ff0b011', 'javelin-behavior-conpherence-pontificate' => '53f6f2dd', 'javelin-behavior-conpherence-widget-pane' => 'd8ef8659', 'javelin-behavior-countdown-timer' => '8454ce4f', @@ -1291,6 +1291,18 @@ 0 => 'javelin-behavior', 1 => 'javelin-history', ), + '7ff0b011' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-dom', + 2 => 'javelin-util', + 3 => 'javelin-stratcom', + 4 => 'javelin-workflow', + 5 => 'javelin-behavior-device', + 6 => 'javelin-history', + 7 => 'javelin-vector', + 8 => 'phabricator-shaped-request', + ), '828a2eed' => array( 0 => 'javelin-behavior', @@ -1348,17 +1360,6 @@ 1 => 'javelin-dom', 2 => 'javelin-stratcom', ), - '872bc8ff' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-stratcom', - 4 => 'javelin-workflow', - 5 => 'javelin-behavior-device', - 6 => 'javelin-history', - 7 => 'javelin-vector', - ), '89889fe7' => array( 0 => 'javelin-install', Index: src/applications/conpherence/constants/ConpherenceUpdateActions.php =================================================================== --- src/applications/conpherence/constants/ConpherenceUpdateActions.php +++ src/applications/conpherence/constants/ConpherenceUpdateActions.php @@ -4,6 +4,7 @@ const METADATA = 'metadata'; const MESSAGE = 'message'; + const DRAFT = 'draft'; const ADD_PERSON = 'add_person'; const REMOVE_PERSON = 'remove_person'; const NOTIFICATIONS = 'notifications'; Index: src/applications/conpherence/controller/ConpherenceUpdateController.php =================================================================== --- src/applications/conpherence/controller/ConpherenceUpdateController.php +++ src/applications/conpherence/controller/ConpherenceUpdateController.php @@ -1,8 +1,5 @@ <?php -/** - * @group conpherence - */ final class ConpherenceUpdateController extends ConpherenceController { @@ -39,6 +36,7 @@ $error_view = null; $e_file = array(); $errors = array(); + $delete_draft = false; if ($request->isFormPost()) { $editor = id(new ConpherenceEditor()) ->setContinueOnNoEffect($request->isContinueRequest()) @@ -46,11 +44,19 @@ ->setActor($user); switch ($action) { + case ConpherenceUpdateActions::DRAFT: + $draft = PhabricatorDraft::newFromUserAndKey( + $user, + $conpherence->getPHID()); + $draft->setDraft($request->getStr('text')); + $draft->replaceOrDelete(); + break; case ConpherenceUpdateActions::MESSAGE: $message = $request->getStr('text'); $xactions = $editor->generateTransactionsFromText( $conpherence, $message); + $delete_draft = true; break; case ConpherenceUpdateActions::ADD_PERSON: $xactions = array(); @@ -116,6 +122,12 @@ if ($xactions) { try { $xactions = $editor->applyTransactions($conpherence, $xactions); + if ($delete_draft) { + $draft = PhabricatorDraft::newFromUserAndKey( + $user, + $conpherence->getPHID()); + $draft->delete(); + } } catch (PhabricatorApplicationTransactionNoEffectException $ex) { return id(new PhabricatorApplicationTransactionNoEffectResponse()) ->setCancelURI($this->getApplicationURI($conpherence_id.'/')) Index: src/applications/conpherence/controller/ConpherenceViewController.php =================================================================== --- src/applications/conpherence/controller/ConpherenceViewController.php +++ src/applications/conpherence/controller/ConpherenceViewController.php @@ -1,8 +1,5 @@ <?php -/** - * @group conpherence - */ final class ConpherenceViewController extends ConpherenceController { @@ -130,9 +127,12 @@ $conpherence = $this->getConpherence(); $user = $this->getRequest()->getUser(); + $draft = PhabricatorDraft::newFromUserAndKey( + $user, + $conpherence->getPHID()); $update_uri = $this->getApplicationURI('update/'.$conpherence->getID().'/'); - Javelin::initBehavior('conpherence-pontificate'); + $this->initBehavior('conpherence-pontificate'); $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business'); $form = @@ -145,7 +145,8 @@ ->appendChild( id(new PhabricatorRemarkupControl()) ->setUser($user) - ->setName('text')) + ->setName('text') + ->setValue($draft->getDraft())) ->appendChild( id(new AphrontFormSubmitControl()) ->setValue( Index: src/applications/conpherence/view/ConpherenceLayoutView.php =================================================================== --- src/applications/conpherence/view/ConpherenceLayoutView.php +++ src/applications/conpherence/view/ConpherenceLayoutView.php @@ -62,7 +62,7 @@ $selected_id = $this->thread->getPHID() . '-nav-item'; $selected_thread_id = $this->thread->getID(); } - Javelin::initBehavior('conpherence-menu', + $this->initBehavior('conpherence-menu', array( 'baseURI' => $this->baseURI, 'layoutID' => $layout_id, @@ -74,7 +74,7 @@ 'hasWidgets' => false, )); - Javelin::initBehavior( + $this->initBehavior( 'conpherence-widget-pane', array( 'widgetBaseUpdateURI' => $this->baseURI . 'update/', Index: webroot/rsrc/js/application/conpherence/behavior-menu.js =================================================================== --- webroot/rsrc/js/application/conpherence/behavior-menu.js +++ webroot/rsrc/js/application/conpherence/behavior-menu.js @@ -8,6 +8,7 @@ * javelin-behavior-device * javelin-history * javelin-vector + * phabricator-shaped-request */ JX.behavior('conpherence-menu', function(config) { @@ -527,4 +528,23 @@ handleThreadScrollers ); + var onkeydownDraft = function (e) { + var form = e.getNode('tag:form'); + var uri = config.baseURI + 'update/' + _thread.selected + '/'; + var draftRequest = new JX.PhabricatorShapedRequest( + uri, + JX.bag, + function () { + var data = JX.DOM.convertFormToDictionary(form); + data.action = 'draft'; + return data; + }); + draftRequest.start(); + }; + + JX.Stratcom.listen( + ['keydown'], + 'conpherence-pontificate', + onkeydownDraft); + });