@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+58 -9
+10 -9
resources/celerity/map.php
··· 13 13 'core.pkg.js' => 'd2de90d9', 14 14 'dark-console.pkg.js' => '187792c2', 15 15 'differential.pkg.css' => 'ffb69e3d', 16 - 'differential.pkg.js' => '8deec4cd', 16 + 'differential.pkg.js' => 'e31329dc', 17 17 'diffusion.pkg.css' => '42c75c37', 18 18 'diffusion.pkg.js' => '78c9885d', 19 19 'maniphest.pkg.css' => '35995d6d', ··· 473 473 'rsrc/js/core/behavior-copy.js' => 'cf32921f', 474 474 'rsrc/js/core/behavior-detect-timezone.js' => '78bc5d94', 475 475 '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', 477 477 'rsrc/js/core/behavior-fancy-datepicker.js' => '36821f8d', 478 478 'rsrc/js/core/behavior-form.js' => '55d7b788', 479 479 'rsrc/js/core/behavior-gesture.js' => 'b58d1a2a', ··· 589 589 'javelin-behavior-aphlict-listen' => '4e61fa88', 590 590 'javelin-behavior-aphlict-status' => 'c3703a16', 591 591 'javelin-behavior-aphront-basic-tokenizer' => '3b4899b0', 592 - 'javelin-behavior-aphront-drag-and-drop-textarea' => '7ad020a5', 592 + 'javelin-behavior-aphront-drag-and-drop-textarea' => '7df68a45', 593 593 'javelin-behavior-aphront-form-disable-on-submit' => '55d7b788', 594 594 'javelin-behavior-aphront-more' => '506aa3f4', 595 595 'javelin-behavior-audio-source' => '3dc5ad43', ··· 1604 1604 'javelin-install', 1605 1605 'javelin-dom', 1606 1606 ), 1607 - '7ad020a5' => array( 1608 - 'javelin-behavior', 1609 - 'javelin-dom', 1610 - 'phabricator-drag-and-drop-file-upload', 1611 - 'phabricator-textareautils', 1612 - ), 1613 1607 '7b139193' => array( 1614 1608 'javelin-behavior', 1615 1609 'javelin-stratcom', ··· 1619 1613 '7c4d8998' => array( 1620 1614 'javelin-install', 1621 1615 'javelin-dom', 1616 + ), 1617 + '7df68a45' => array( 1618 + 'javelin-behavior', 1619 + 'javelin-dom', 1620 + 'javelin-json', 1621 + 'phabricator-drag-and-drop-file-upload', 1622 + 'phabricator-textareautils', 1622 1623 ), 1623 1624 '80bff3af' => array( 1624 1625 'javelin-install',
+32
src/view/form/control/PhabricatorRemarkupControl.php
··· 6 6 private $disableFullScreen = false; 7 7 private $canPin; 8 8 private $sendOnEnter = false; 9 + private $remarkupMetadata = array(); 9 10 10 11 public function setDisableMacros($disable) { 11 12 $this->disableMacro = $disable; ··· 35 36 return $this->sendOnEnter; 36 37 } 37 38 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 + 38 48 protected function renderInput() { 39 49 $id = $this->getID(); 40 50 if (!$id) { ··· 47 57 throw new PhutilInvalidStateException('setUser'); 48 58 } 49 59 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 + 50 79 // We need to have this if previews render images, since Ajax can not 51 80 // currently ship JS or CSS. 52 81 require_celerity_resource('phui-lightbox-css'); ··· 56 85 'aphront-drag-and-drop-textarea', 57 86 array( 58 87 'target' => $id, 88 + 'remarkupMetadataID' => $metadata_id, 89 + 'remarkupMetadataValue' => $metadata_value, 59 90 'activatedClass' => 'aphront-textarea-drag-and-drop', 60 91 'uri' => '/file/dropupload/', 61 92 'chunkThreshold' => PhabricatorFileStorageEngine::getChunkThreshold(), ··· 353 384 array( 354 385 $buttons, 355 386 parent::renderInput(), 387 + $metadata_input, 356 388 )); 357 389 } 358 390
+16
webroot/rsrc/js/core/behavior-drag-and-drop-textarea.js
··· 2 2 * @provides javelin-behavior-aphront-drag-and-drop-textarea 3 3 * @requires javelin-behavior 4 4 * javelin-dom 5 + * javelin-json 5 6 * phabricator-drag-and-drop-file-upload 6 7 * phabricator-textareautils 7 8 */ ··· 9 10 JX.behavior('aphront-drag-and-drop-textarea', function(config) { 10 11 11 12 var target = JX.$(config.target); 13 + 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 + } 12 28 13 29 if (JX.PhabricatorDragAndDropFileUpload.isSupported()) { 14 30 var drop = new JX.PhabricatorDragAndDropFileUpload(target)