Skip to content

Commit 33a0731

Browse files
author
epriestley
committedMay 19, 2022
Give "RemarkupControl" support for tracking metadata
Summary: Ref T13603. This will support explicit handling of attached files. Test Plan: Adjusted new input to have "text" input type, used it alongside additional upcoming changes, saw sensible metadata behavior. Maniphest Tasks: T13603 Differential Revision: https://secure.phabricator.com/D21827
1 parent 147b48b commit 33a0731

File tree

3 files changed

+58
-9
lines changed

3 files changed

+58
-9
lines changed
 

‎resources/celerity/map.php

+10-9
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
'core.pkg.js' => 'd2de90d9',
1414
'dark-console.pkg.js' => '187792c2',
1515
'differential.pkg.css' => 'ffb69e3d',
16-
'differential.pkg.js' => '8deec4cd',
16+
'differential.pkg.js' => 'e31329dc',
1717
'diffusion.pkg.css' => '42c75c37',
1818
'diffusion.pkg.js' => '78c9885d',
1919
'maniphest.pkg.css' => '35995d6d',
@@ -473,7 +473,7 @@
473473
'rsrc/js/core/behavior-copy.js' => 'cf32921f',
474474
'rsrc/js/core/behavior-detect-timezone.js' => '78bc5d94',
475475
'rsrc/js/core/behavior-device.js' => 'ac2b1e01',
476-
'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '7ad020a5',
476+
'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '7df68a45',
477477
'rsrc/js/core/behavior-fancy-datepicker.js' => '36821f8d',
478478
'rsrc/js/core/behavior-form.js' => '55d7b788',
479479
'rsrc/js/core/behavior-gesture.js' => 'b58d1a2a',
@@ -589,7 +589,7 @@
589589
'javelin-behavior-aphlict-listen' => '4e61fa88',
590590
'javelin-behavior-aphlict-status' => 'c3703a16',
591591
'javelin-behavior-aphront-basic-tokenizer' => '3b4899b0',
592-
'javelin-behavior-aphront-drag-and-drop-textarea' => '7ad020a5',
592+
'javelin-behavior-aphront-drag-and-drop-textarea' => '7df68a45',
593593
'javelin-behavior-aphront-form-disable-on-submit' => '55d7b788',
594594
'javelin-behavior-aphront-more' => '506aa3f4',
595595
'javelin-behavior-audio-source' => '3dc5ad43',
@@ -1604,12 +1604,6 @@
16041604
'javelin-install',
16051605
'javelin-dom',
16061606
),
1607-
'7ad020a5' => array(
1608-
'javelin-behavior',
1609-
'javelin-dom',
1610-
'phabricator-drag-and-drop-file-upload',
1611-
'phabricator-textareautils',
1612-
),
16131607
'7b139193' => array(
16141608
'javelin-behavior',
16151609
'javelin-stratcom',
@@ -1620,6 +1614,13 @@
16201614
'javelin-install',
16211615
'javelin-dom',
16221616
),
1617+
'7df68a45' => array(
1618+
'javelin-behavior',
1619+
'javelin-dom',
1620+
'javelin-json',
1621+
'phabricator-drag-and-drop-file-upload',
1622+
'phabricator-textareautils',
1623+
),
16231624
'80bff3af' => array(
16241625
'javelin-install',
16251626
'javelin-typeahead-source',

‎src/view/form/control/PhabricatorRemarkupControl.php

+32
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ final class PhabricatorRemarkupControl extends AphrontFormTextAreaControl {
66
private $disableFullScreen = false;
77
private $canPin;
88
private $sendOnEnter = false;
9+
private $remarkupMetadata = array();
910

1011
public function setDisableMacros($disable) {
1112
$this->disableMacro = $disable;
@@ -35,6 +36,15 @@ public function getSendOnEnter() {
3536
return $this->sendOnEnter;
3637
}
3738

39+
public function setRemarkupMetadata(array $value) {
40+
$this->remarkupMetadata = $value;
41+
return $this;
42+
}
43+
44+
public function getRemarkupMetadata() {
45+
return $this->remarkupMetadata;
46+
}
47+
3848
protected function renderInput() {
3949
$id = $this->getID();
4050
if (!$id) {
@@ -47,6 +57,25 @@ protected function renderInput() {
4757
throw new PhutilInvalidStateException('setUser');
4858
}
4959

60+
// NOTE: Metadata is passed to Javascript in a structured way, and also
61+
// dumped directly into the form as an encoded string. This makes it less
62+
// likely that we'll lose server-provided metadata (for example, from a
63+
// saved draft) if there is a client-side error.
64+
65+
$metadata_name = $this->getName().'_metadata';
66+
$metadata_value = (object)$this->getRemarkupMetadata();
67+
$metadata_string = phutil_json_encode($metadata_value);
68+
69+
$metadata_id = celerity_generate_unique_node_id();
70+
$metadata_input = phutil_tag(
71+
'input',
72+
array(
73+
'type' => 'hidden',
74+
'id' => $metadata_id,
75+
'name' => $metadata_name,
76+
'value' => $metadata_string,
77+
));
78+
5079
// We need to have this if previews render images, since Ajax can not
5180
// currently ship JS or CSS.
5281
require_celerity_resource('phui-lightbox-css');
@@ -56,6 +85,8 @@ protected function renderInput() {
5685
'aphront-drag-and-drop-textarea',
5786
array(
5887
'target' => $id,
88+
'remarkupMetadataID' => $metadata_id,
89+
'remarkupMetadataValue' => $metadata_value,
5990
'activatedClass' => 'aphront-textarea-drag-and-drop',
6091
'uri' => '/file/dropupload/',
6192
'chunkThreshold' => PhabricatorFileStorageEngine::getChunkThreshold(),
@@ -353,6 +384,7 @@ protected function renderInput() {
353384
array(
354385
$buttons,
355386
parent::renderInput(),
387+
$metadata_input,
356388
));
357389
}
358390

‎webroot/rsrc/js/core/behavior-drag-and-drop-textarea.js

+16
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* @provides javelin-behavior-aphront-drag-and-drop-textarea
33
* @requires javelin-behavior
44
* javelin-dom
5+
* javelin-json
56
* phabricator-drag-and-drop-file-upload
67
* phabricator-textareautils
78
*/
@@ -10,6 +11,21 @@ JX.behavior('aphront-drag-and-drop-textarea', function(config) {
1011

1112
var target = JX.$(config.target);
1213

14+
var metadata_node = JX.$(config.remarkupMetadataID);
15+
var metadata_value = config.remarkupMetadataValue;
16+
17+
function set_metadata(key, value) {
18+
metadata_value[key] = value;
19+
metadata_node.value = JX.JSON.stringify(metadata_value);
20+
}
21+
22+
function get_metadata(key, default_value) {
23+
if (metadata_value.hasOwnProperty(key)) {
24+
return metadata_value[key];
25+
}
26+
return default_value;
27+
}
28+
1329
if (JX.PhabricatorDragAndDropFileUpload.isSupported()) {
1430
var drop = new JX.PhabricatorDragAndDropFileUpload(target)
1531
.setURI(config.uri)

0 commit comments

Comments
 (0)
Failed to load comments.