diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index 83f42b1e8f..ec56888e31 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -330,6 +330,17 @@ celerity_register_resource_map(array( ), 'disk' => '/rsrc/js/javelin/lib/behavior.js', ), + 0 => + array( + 'uri' => '/res/b6096fdd/rsrc/js/javelin/lib/__tests__/URI.js', + 'type' => 'js', + 'requires' => + array( + 0 => 'javelin-uri', + 1 => 'javelin-php-serializer', + ), + 'disk' => '/rsrc/js/javelin/lib/__tests__/URI.js', + ), 'javelin-behavior-aphront-basic-tokenizer' => array( 'uri' => '/res/9be30797/rsrc/js/application/core/behavior-tokenizer.js', @@ -461,7 +472,7 @@ celerity_register_resource_map(array( ), 'javelin-behavior-differential-dropdown-menus' => array( - 'uri' => '/res/7bfb2fdb/rsrc/js/application/differential/behavior-dropdown-menus.js', + 'uri' => '/res/4bb3ae9a/rsrc/js/application/differential/behavior-dropdown-menus.js', 'type' => 'js', 'requires' => array( @@ -616,6 +627,19 @@ celerity_register_resource_map(array( ), 'disk' => '/rsrc/js/application/herald/herald-rule-editor.js', ), + 'javelin-behavior-maniphest-description-preview' => + array( + 'uri' => '/res/8acd6f07/rsrc/js/application/maniphest/behavior-task-preview.js', + 'type' => 'js', + 'requires' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-dom', + 2 => 'javelin-util', + 3 => 'phabricator-shaped-request', + ), + 'disk' => '/rsrc/js/application/maniphest/behavior-task-preview.js', + ), 'javelin-behavior-maniphest-project-create' => array( 'uri' => '/res/85a0eaf9/rsrc/js/application/maniphest/behavior-project-create.js', @@ -1228,6 +1252,15 @@ celerity_register_resource_map(array( ), 'disk' => '/rsrc/css/application/maniphest/task-detail.css', ), + 'maniphest-task-edit-css' => + array( + 'uri' => '/res/68c7863e/rsrc/css/application/maniphest/task-edit.css', + 'type' => 'css', + 'requires' => + array( + ), + 'disk' => '/rsrc/css/application/maniphest/task-edit.css', + ), 'maniphest-task-summary-css' => array( 'uri' => '/res/14cb4b5d/rsrc/css/application/maniphest/task-summary.css', @@ -1427,6 +1460,18 @@ celerity_register_resource_map(array( ), 'disk' => '/rsrc/css/application/objectselector/object-selector.css', ), + 'phabricator-prefab' => + array( + 'uri' => '/res/5784a112/rsrc/js/application/core/Prefab.js', + 'type' => 'js', + 'requires' => + array( + 0 => 'javelin-install', + 1 => 'javelin-util', + 2 => 'javelin-dom', + ), + 'disk' => '/rsrc/js/application/core/Prefab.js', + ), 'phabricator-profile-css' => array( 'uri' => '/res/9869d10b/rsrc/css/application/profile/profile-view.css', @@ -1445,29 +1490,6 @@ celerity_register_resource_map(array( ), 'disk' => '/rsrc/css/application/profile/profile-header-view.css', ), - 0 => - array( - 'uri' => '/res/b6096fdd/rsrc/js/javelin/lib/__tests__/URI.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-uri', - 1 => 'javelin-php-serializer', - ), - 'disk' => '/rsrc/js/javelin/lib/__tests__/URI.js', - ), - 'phabricator-prefab' => - array( - 'uri' => '/res/5784a112/rsrc/js/application/core/Prefab.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/application/core/Prefab.js', - ), 'phabricator-remarkup-css' => array( 'uri' => '/res/39f358b8/rsrc/css/core/remarkup.css', diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 548dbfc977..9f68af8a2c 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -387,6 +387,7 @@ phutil_register_library_map(array( 'ManiphestTask' => 'applications/maniphest/storage/task', 'ManiphestTaskAuxiliaryStorage' => 'applications/maniphest/storage/auxiliary', 'ManiphestTaskDescriptionChangeController' => 'applications/maniphest/controller/descriptionchange', + 'ManiphestTaskDescriptionPreviewController' => 'applications/maniphest/controller/descriptionpreview', 'ManiphestTaskDetailController' => 'applications/maniphest/controller/taskdetail', 'ManiphestTaskEditController' => 'applications/maniphest/controller/taskedit', 'ManiphestTaskExtensions' => 'applications/maniphest/extensions/base', @@ -1113,6 +1114,7 @@ phutil_register_library_map(array( 'ManiphestTask' => 'ManiphestDAO', 'ManiphestTaskAuxiliaryStorage' => 'ManiphestDAO', 'ManiphestTaskDescriptionChangeController' => 'ManiphestController', + 'ManiphestTaskDescriptionPreviewController' => 'ManiphestController', 'ManiphestTaskDetailController' => 'ManiphestController', 'ManiphestTaskEditController' => 'ManiphestController', 'ManiphestTaskListController' => 'ManiphestController', diff --git a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php index 6636fc274d..79f3a88461 100644 --- a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php +++ b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php @@ -167,6 +167,8 @@ class AphrontDefaultApplicationConfiguration 'edit/(?P\d+)/$' => 'ManiphestTaskEditController', 'descriptionchange/(?P\d+)/$' => 'ManiphestTaskDescriptionChangeController', + 'descriptionpreview/$' => + 'ManiphestTaskDescriptionPreviewController', ), 'transaction/' => array( 'save/' => 'ManiphestTransactionSaveController', diff --git a/src/applications/maniphest/controller/descriptionpreview/ManiphestTaskDescriptionPreviewController.php b/src/applications/maniphest/controller/descriptionpreview/ManiphestTaskDescriptionPreviewController.php new file mode 100644 index 0000000000..5d1f2b8ad3 --- /dev/null +++ b/src/applications/maniphest/controller/descriptionpreview/ManiphestTaskDescriptionPreviewController.php @@ -0,0 +1,41 @@ +getRequest(); + $description = $request->getStr('description'); + + $engine = PhabricatorMarkupEngine::newManiphestMarkupEngine(); + + $content = + '
'. + '
'. + $engine->markupText($description). + '
'. + '
'; + + return id(new AphrontAjaxResponse()) + ->setContent($content); + } +} diff --git a/src/applications/maniphest/controller/descriptionpreview/__init__.php b/src/applications/maniphest/controller/descriptionpreview/__init__.php new file mode 100644 index 0000000000..b8c055d996 --- /dev/null +++ b/src/applications/maniphest/controller/descriptionpreview/__init__.php @@ -0,0 +1,16 @@ +setLabel('Description') ->setName('description') + ->setID('description-textarea') ->setCaption($email_hint) ->setValue($task->getDescription())); @@ -503,13 +506,34 @@ class ManiphestTaskEditController extends ManiphestController { $panel->setID($panel_id); $panel->appendChild($form); + $description_preview_panel = + '
+
+ Description Preview +
+
+
+ Loading preview... +
+
+
'; + + Javelin::initBehavior( + 'maniphest-description-preview', + array( + 'preview' => 'description-preview', + 'textarea' => 'description-textarea', + 'uri' => '/maniphest/task/descriptionpreview/', + )); + return $this->buildStandardPageResponse( array( $error_view, $panel, + $description_preview_panel ), array( - 'title' => 'Create Task', + 'title' => $header_name, )); } } diff --git a/webroot/rsrc/css/application/maniphest/task-edit.css b/webroot/rsrc/css/application/maniphest/task-edit.css new file mode 100644 index 0000000000..7e25c1698e --- /dev/null +++ b/webroot/rsrc/css/application/maniphest/task-edit.css @@ -0,0 +1,9 @@ +/** + * @provides maniphest-task-edit-css + */ + +.maniphest-description-preview-header { + color: #666; + margin-bottom: 1em; + font-size: 11px; +} diff --git a/webroot/rsrc/js/application/maniphest/behavior-task-preview.js b/webroot/rsrc/js/application/maniphest/behavior-task-preview.js new file mode 100644 index 0000000000..c9293f1235 --- /dev/null +++ b/webroot/rsrc/js/application/maniphest/behavior-task-preview.js @@ -0,0 +1,29 @@ +/** + * @provides javelin-behavior-maniphest-description-preview + * @requires javelin-behavior + * javelin-dom + * javelin-util + * phabricator-shaped-request + */ + +JX.behavior('maniphest-description-preview', function(config) { + + var preview = JX.$(config.preview); + var textarea = JX.$(config.textarea); + + var callback = function(r) { + JX.DOM.setContent(JX.$(config.preview), JX.$H(r)); + }; + + var getdata = function() { + return { + description : textarea.value + }; + } + + var request = new JX.PhabricatorShapedRequest(config.uri, callback, getdata); + var trigger = JX.bind(request, request.trigger); + + JX.DOM.listen(textarea, 'keydown', null, trigger); + request.start(); +});