Page MenuHomePhabricator

D21827.diff
No OneTemporary

D21827.diff

diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -13,7 +13,7 @@
'core.pkg.js' => 'd2de90d9',
'dark-console.pkg.js' => '187792c2',
'differential.pkg.css' => 'ffb69e3d',
- 'differential.pkg.js' => '8deec4cd',
+ 'differential.pkg.js' => 'e31329dc',
'diffusion.pkg.css' => '42c75c37',
'diffusion.pkg.js' => '78c9885d',
'maniphest.pkg.css' => '35995d6d',
@@ -473,7 +473,7 @@
'rsrc/js/core/behavior-copy.js' => 'cf32921f',
'rsrc/js/core/behavior-detect-timezone.js' => '78bc5d94',
'rsrc/js/core/behavior-device.js' => 'ac2b1e01',
- 'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '7ad020a5',
+ 'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '7df68a45',
'rsrc/js/core/behavior-fancy-datepicker.js' => '36821f8d',
'rsrc/js/core/behavior-form.js' => '55d7b788',
'rsrc/js/core/behavior-gesture.js' => 'b58d1a2a',
@@ -589,7 +589,7 @@
'javelin-behavior-aphlict-listen' => '4e61fa88',
'javelin-behavior-aphlict-status' => 'c3703a16',
'javelin-behavior-aphront-basic-tokenizer' => '3b4899b0',
- 'javelin-behavior-aphront-drag-and-drop-textarea' => '7ad020a5',
+ 'javelin-behavior-aphront-drag-and-drop-textarea' => '7df68a45',
'javelin-behavior-aphront-form-disable-on-submit' => '55d7b788',
'javelin-behavior-aphront-more' => '506aa3f4',
'javelin-behavior-audio-source' => '3dc5ad43',
@@ -1604,12 +1604,6 @@
'javelin-install',
'javelin-dom',
),
- '7ad020a5' => array(
- 'javelin-behavior',
- 'javelin-dom',
- 'phabricator-drag-and-drop-file-upload',
- 'phabricator-textareautils',
- ),
'7b139193' => array(
'javelin-behavior',
'javelin-stratcom',
@@ -1620,6 +1614,13 @@
'javelin-install',
'javelin-dom',
),
+ '7df68a45' => array(
+ 'javelin-behavior',
+ 'javelin-dom',
+ 'javelin-json',
+ 'phabricator-drag-and-drop-file-upload',
+ 'phabricator-textareautils',
+ ),
'80bff3af' => array(
'javelin-install',
'javelin-typeahead-source',
diff --git a/src/view/form/control/PhabricatorRemarkupControl.php b/src/view/form/control/PhabricatorRemarkupControl.php
--- a/src/view/form/control/PhabricatorRemarkupControl.php
+++ b/src/view/form/control/PhabricatorRemarkupControl.php
@@ -6,6 +6,7 @@
private $disableFullScreen = false;
private $canPin;
private $sendOnEnter = false;
+ private $remarkupMetadata = array();
public function setDisableMacros($disable) {
$this->disableMacro = $disable;
@@ -35,6 +36,15 @@
return $this->sendOnEnter;
}
+ public function setRemarkupMetadata(array $value) {
+ $this->remarkupMetadata = $value;
+ return $this;
+ }
+
+ public function getRemarkupMetadata() {
+ return $this->remarkupMetadata;
+ }
+
protected function renderInput() {
$id = $this->getID();
if (!$id) {
@@ -47,6 +57,25 @@
throw new PhutilInvalidStateException('setUser');
}
+ // NOTE: Metadata is passed to Javascript in a structured way, and also
+ // dumped directly into the form as an encoded string. This makes it less
+ // likely that we'll lose server-provided metadata (for example, from a
+ // saved draft) if there is a client-side error.
+
+ $metadata_name = $this->getName().'_metadata';
+ $metadata_value = (object)$this->getRemarkupMetadata();
+ $metadata_string = phutil_json_encode($metadata_value);
+
+ $metadata_id = celerity_generate_unique_node_id();
+ $metadata_input = phutil_tag(
+ 'input',
+ array(
+ 'type' => 'hidden',
+ 'id' => $metadata_id,
+ 'name' => $metadata_name,
+ 'value' => $metadata_string,
+ ));
+
// We need to have this if previews render images, since Ajax can not
// currently ship JS or CSS.
require_celerity_resource('phui-lightbox-css');
@@ -56,6 +85,8 @@
'aphront-drag-and-drop-textarea',
array(
'target' => $id,
+ 'remarkupMetadataID' => $metadata_id,
+ 'remarkupMetadataValue' => $metadata_value,
'activatedClass' => 'aphront-textarea-drag-and-drop',
'uri' => '/file/dropupload/',
'chunkThreshold' => PhabricatorFileStorageEngine::getChunkThreshold(),
@@ -353,6 +384,7 @@
array(
$buttons,
parent::renderInput(),
+ $metadata_input,
));
}
diff --git a/webroot/rsrc/js/core/behavior-drag-and-drop-textarea.js b/webroot/rsrc/js/core/behavior-drag-and-drop-textarea.js
--- a/webroot/rsrc/js/core/behavior-drag-and-drop-textarea.js
+++ b/webroot/rsrc/js/core/behavior-drag-and-drop-textarea.js
@@ -2,6 +2,7 @@
* @provides javelin-behavior-aphront-drag-and-drop-textarea
* @requires javelin-behavior
* javelin-dom
+ * javelin-json
* phabricator-drag-and-drop-file-upload
* phabricator-textareautils
*/
@@ -10,6 +11,21 @@
var target = JX.$(config.target);
+ var metadata_node = JX.$(config.remarkupMetadataID);
+ var metadata_value = config.remarkupMetadataValue;
+
+ function set_metadata(key, value) {
+ metadata_value[key] = value;
+ metadata_node.value = JX.JSON.stringify(metadata_value);
+ }
+
+ function get_metadata(key, default_value) {
+ if (metadata_value.hasOwnProperty(key)) {
+ return metadata_value[key];
+ }
+ return default_value;
+ }
+
if (JX.PhabricatorDragAndDropFileUpload.isSupported()) {
var drop = new JX.PhabricatorDragAndDropFileUpload(target)
.setURI(config.uri)

File Metadata

Mime Type
text/plain
Expires
Thu, May 9, 9:08 PM (3 w, 1 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6277587
Default Alt Text
D21827.diff (5 KB)

Event Timeline