@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.

Add and use new RemarkupMetadata class

Summary:
Add a new RemarkupMetadata class and use with upload button as well as drag and drop pathways.

With this change, files are now attached automatically to the object. This this could solve
several issues, for example when a person uploads a file but only that author is able to see it.

Ref T15106

Test Plan:
- Drag and drop file, upload file with button. Check that both files are attached with "attachedFilePHIDs" values.
- drop file in a Task description (now works)
- drop file in a Task comment (now works)
- drop file in an edited Task comment (still not supported)
- This was already tested in Wikimedia Foundation: https://phabricator.wikimedia.org/D1203

Reviewers: O1 Blessed Committers, avivey, Matthew

Reviewed By: O1 Blessed Committers, avivey, Matthew

Subscribers: MCPCN, avivey, speck, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Tags: #remarkup

Maniphest Tasks: T15106

Differential Revision: https://we.phorge.it/D25052

Dylan F 90f9da64 7ed35123

+95 -48
+32 -24
resources/celerity/map.php
··· 10 10 'conpherence.pkg.css' => '0e3cf785', 11 11 'conpherence.pkg.js' => '020aebcf', 12 12 'core.pkg.css' => '2ba11212', 13 - 'core.pkg.js' => '66c49ca1', 13 + 'core.pkg.js' => '2eeda9e0', 14 14 'dark-console.pkg.js' => '187792c2', 15 15 'differential.pkg.css' => '609e63d4', 16 - 'differential.pkg.js' => 'c60bec1b', 16 + 'differential.pkg.js' => 'f68ea9d1', 17 17 'diffusion.pkg.css' => '42c75c37', 18 18 'diffusion.pkg.js' => '78c9885d', 19 19 'maniphest.pkg.css' => '35995d6d', ··· 461 461 'rsrc/js/core/MultirowRowManager.js' => '5b54c823', 462 462 'rsrc/js/core/Notification.js' => 'a9b91e3f', 463 463 'rsrc/js/core/Prefab.js' => '5793d835', 464 + 'rsrc/js/core/RemarkupMetadata.js' => 'e40c4991', 464 465 'rsrc/js/core/ShapedRequest.js' => '995f5102', 465 466 'rsrc/js/core/TextAreaUtils.js' => 'f340a484', 466 467 'rsrc/js/core/Title.js' => '43bc9360', ··· 473 474 'rsrc/js/core/behavior-copy.js' => 'cf32921f', 474 475 'rsrc/js/core/behavior-detect-timezone.js' => '78bc5d94', 475 476 'rsrc/js/core/behavior-device.js' => 'ac2b1e01', 476 - 'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '3277c62d', 477 + 'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '29e221f6', 477 478 'rsrc/js/core/behavior-fancy-datepicker.js' => 'b545d0a0', 478 479 'rsrc/js/core/behavior-form.js' => '55d7b788', 479 480 'rsrc/js/core/behavior-gesture.js' => 'b58d1a2a', ··· 489 490 'rsrc/js/core/behavior-more.js' => '506aa3f4', 490 491 'rsrc/js/core/behavior-object-selector.js' => '98ef467f', 491 492 'rsrc/js/core/behavior-oncopy.js' => 'da8f5259', 492 - 'rsrc/js/core/behavior-phabricator-remarkup-assist.js' => '54262396', 493 + 'rsrc/js/core/behavior-phabricator-remarkup-assist.js' => '6d347847', 493 494 'rsrc/js/core/behavior-read-only-warning.js' => 'b9109f8f', 494 495 'rsrc/js/core/behavior-redirect.js' => '407ee861', 495 496 'rsrc/js/core/behavior-refresh-csrf.js' => '46116c01', ··· 589 590 'javelin-behavior-aphlict-listen' => '4e61fa88', 590 591 'javelin-behavior-aphlict-status' => 'c3703a16', 591 592 'javelin-behavior-aphront-basic-tokenizer' => '3b4899b0', 592 - 'javelin-behavior-aphront-drag-and-drop-textarea' => '3277c62d', 593 + 'javelin-behavior-aphront-drag-and-drop-textarea' => '29e221f6', 593 594 'javelin-behavior-aphront-form-disable-on-submit' => '55d7b788', 594 595 'javelin-behavior-aphront-more' => '506aa3f4', 595 596 'javelin-behavior-audio-source' => '3dc5ad43', ··· 653 654 'javelin-behavior-phabricator-notification-example' => '29819b75', 654 655 'javelin-behavior-phabricator-object-selector' => '98ef467f', 655 656 'javelin-behavior-phabricator-oncopy' => 'da8f5259', 656 - 'javelin-behavior-phabricator-remarkup-assist' => '54262396', 657 + 'javelin-behavior-phabricator-remarkup-assist' => '6d347847', 657 658 'javelin-behavior-phabricator-reveal-content' => 'b105a3a6', 658 659 'javelin-behavior-phabricator-search-typeahead' => '1cb7d027', 659 660 'javelin-behavior-phabricator-show-older-transactions' => '8b5c7d65', ··· 800 801 'phabricator-phtize' => '2f1db1ed', 801 802 'phabricator-prefab' => '5793d835', 802 803 'phabricator-remarkup-css' => '5baa3bd9', 804 + 'phabricator-remarkup-metadata' => 'e40c4991', 803 805 'phabricator-search-results-css' => '9ea70ace', 804 806 'phabricator-shaped-request' => '995f5102', 805 807 'phabricator-slowvote-css' => '1694baed', ··· 1163 1165 'javelin-stratcom', 1164 1166 'javelin-behavior', 1165 1167 ), 1168 + '29e221f6' => array( 1169 + 'javelin-behavior', 1170 + 'javelin-dom', 1171 + 'phabricator-drag-and-drop-file-upload', 1172 + 'phabricator-textareautils', 1173 + 'phabricator-remarkup-metadata', 1174 + ), 1166 1175 '2a8b62d9' => array( 1167 1176 'multirow-row-manager', 1168 1177 'javelin-install', ··· 1200 1209 '32755edb' => array( 1201 1210 'javelin-install', 1202 1211 'javelin-util', 1203 - ), 1204 - '3277c62d' => array( 1205 - 'javelin-behavior', 1206 - 'javelin-dom', 1207 - 'javelin-json', 1208 - 'phabricator-drag-and-drop-file-upload', 1209 - 'phabricator-textareautils', 1210 1212 ), 1211 1213 '32db8374' => array( 1212 1214 'javelin-behavior', ··· 1424 1426 '541f81c3' => array( 1425 1427 'javelin-install', 1426 1428 ), 1427 - 54262396 => array( 1428 - 'javelin-behavior', 1429 - 'javelin-stratcom', 1430 - 'javelin-dom', 1431 - 'phabricator-phtize', 1432 - 'phabricator-textareautils', 1433 - 'javelin-workflow', 1434 - 'javelin-vector', 1435 - 'phuix-autocomplete', 1436 - 'javelin-mask', 1437 - ), 1438 1429 '548567f6' => array( 1439 1430 'syntax-default-css', 1440 1431 ), ··· 1574 1565 'javelin-reactornode', 1575 1566 'javelin-install', 1576 1567 'javelin-util', 1568 + ), 1569 + '6d347847' => array( 1570 + 'javelin-behavior', 1571 + 'javelin-stratcom', 1572 + 'javelin-dom', 1573 + 'phabricator-phtize', 1574 + 'phabricator-textareautils', 1575 + 'phabricator-remarkup-metadata', 1576 + 'javelin-workflow', 1577 + 'javelin-vector', 1578 + 'phuix-autocomplete', 1579 + 'javelin-mask', 1577 1580 ), 1578 1581 70245195 => array( 1579 1582 'javelin-behavior', ··· 2125 2128 'javelin-stratcom', 2126 2129 'javelin-dom', 2127 2130 'phuix-dropdown-menu', 2131 + ), 2132 + 'e40c4991' => array( 2133 + 'javelin-install', 2134 + 'javelin-dom', 2135 + 'javelin-json', 2128 2136 ), 2129 2137 'e4c7622a' => array( 2130 2138 'javelin-magical-init',
+2
src/view/form/control/PhabricatorRemarkupControl.php
··· 128 128 'disabled' => $this->getDisabled(), 129 129 'sendOnEnter' => $this->getSendOnEnter(), 130 130 'rootID' => $root_id, 131 + 'remarkupMetadataID' => $metadata_id, 132 + 'remarkupMetadataValue' => $metadata_value, 131 133 'autocompleteMap' => (object)array( 132 134 64 => array( // "@" 133 135 'datasourceURI' => $user_datasource->getDatasourceURI(),
+49
webroot/rsrc/js/core/RemarkupMetadata.js
··· 1 + /** 2 + * @requires javelin-install 3 + * javelin-dom 4 + * javelin-json 5 + * @provides phabricator-remarkup-metadata 6 + * @javelin 7 + */ 8 + 9 + JX.install('RemarkupMetadata', { 10 + 11 + construct: function(metadataValue, metadataID) { 12 + if (JX.RemarkupMetadata._metadataValue == null) { 13 + JX.RemarkupMetadata._metadataValue = {}; 14 + } 15 + if (!JX.RemarkupMetadata._metadataValue.hasOwnProperty(metadataID)) { 16 + JX.RemarkupMetadata._metadataValue[metadataID] = metadataValue; 17 + } 18 + this._metadataNode = JX.$(metadataID); 19 + this._metadataID = metadataID; 20 + }, 21 + 22 + statics: { 23 + _metadataValue: null 24 + }, 25 + 26 + members: { 27 + _metadataNode: null, 28 + _metadataID: null, 29 + 30 + _writeMetadata: function() { 31 + this._metadataNode.value = JX.JSON.stringify( 32 + JX.RemarkupMetadata._metadataValue[this._metadataID]); 33 + }, 34 + 35 + getMetadata: function(key, default_value) { 36 + if (JX.RemarkupMetadata._metadataValue[this._metadataID] 37 + .hasOwnProperty(key)) { 38 + return JX.RemarkupMetadata._metadataValue[this._metadataID][key]; 39 + } 40 + return default_value; 41 + }, 42 + 43 + setMetadata: function(key, value) { 44 + JX.RemarkupMetadata._metadataValue[this._metadataID][key] = value; 45 + this._writeMetadata(); 46 + } 47 + } 48 + 49 + });
+5 -24
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 6 5 * phabricator-drag-and-drop-file-upload 7 6 * phabricator-textareautils 7 + * phabricator-remarkup-metadata 8 8 */ 9 9 10 10 JX.behavior('aphront-drag-and-drop-textarea', function(config) { 11 11 12 12 var target = JX.$(config.target); 13 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 - write_metadata(); 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 - 29 - function write_metadata() { 30 - metadata_node.value = JX.JSON.stringify(metadata_value); 31 - } 32 - 33 - write_metadata(); 34 - 35 14 if (JX.PhabricatorDragAndDropFileUpload.isSupported()) { 36 15 var drop = new JX.PhabricatorDragAndDropFileUpload(target) 37 16 .setURI(config.uri) ··· 48 27 drop.listen('didUpload', function(file) { 49 28 JX.TextAreaUtils.insertFileReference(target, file); 50 29 51 - var phids = get_metadata('attachedFilePHIDs', []); 30 + var metadata = new JX.RemarkupMetadata(config.remarkupMetadataValue, 31 + config.remarkupMetadataID); 32 + var phids = metadata.getMetadata('attachedFilePHIDs', []); 52 33 phids.push(file.getPHID()); 53 - set_metadata('attachedFilePHIDs', phids); 34 + metadata.setMetadata('attachedFilePHIDs', phids); 54 35 }); 55 36 56 37 drop.start();
+7
webroot/rsrc/js/core/behavior-phabricator-remarkup-assist.js
··· 5 5 * javelin-dom 6 6 * phabricator-phtize 7 7 * phabricator-textareautils 8 + * phabricator-remarkup-metadata 8 9 * javelin-workflow 9 10 * javelin-vector 10 11 * phuix-autocomplete ··· 255 256 .setURI(file.uri); 256 257 257 258 JX.TextAreaUtils.insertFileReference(area, upload); 259 + 260 + var metadata = new JX.RemarkupMetadata( 261 + config.remarkupMetadataValue, config.remarkupMetadataID); 262 + var phids = metadata.getMetadata('attachedFilePHIDs', []); 263 + phids.push(file.phid); 264 + metadata.setMetadata('attachedFilePHIDs', phids); 258 265 } 259 266 }) 260 267 .start();