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

Merge branch 'master' of ssh://secure.phabricator.com/diffusion/P

+102 -60
+38 -38
resources/celerity/map.php
··· 8 8 return array( 9 9 'names' => array( 10 10 'core.pkg.css' => 'a7f3dc55', 11 - 'core.pkg.js' => '31bc6546', 11 + 'core.pkg.js' => '69f7e542', 12 12 'darkconsole.pkg.js' => '8ab24e01', 13 13 'differential.pkg.css' => '1940be3f', 14 14 'differential.pkg.js' => 'be1e5f9b', ··· 212 212 'rsrc/externals/javelin/lib/URI.js' => '6eff08aa', 213 213 'rsrc/externals/javelin/lib/Vector.js' => '2caa8fb8', 214 214 'rsrc/externals/javelin/lib/WebSocket.js' => 'e292eaf4', 215 - 'rsrc/externals/javelin/lib/Workflow.js' => '84d6aea0', 215 + 'rsrc/externals/javelin/lib/Workflow.js' => '5b2e3e2b', 216 216 'rsrc/externals/javelin/lib/__tests__/Cookie.js' => '5ed109e8', 217 217 'rsrc/externals/javelin/lib/__tests__/DOM.js' => 'c984504b', 218 218 'rsrc/externals/javelin/lib/__tests__/JSON.js' => '837a7d68', ··· 352 352 'rsrc/js/application/aphlict/behavior-aphlict-status.js' => 'ea681761', 353 353 'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18', 354 354 'rsrc/js/application/config/behavior-reorder-fields.js' => '14a827de', 355 - 'rsrc/js/application/conpherence/ConpherenceThreadManager.js' => '0324970d', 356 - 'rsrc/js/application/conpherence/behavior-durable-column.js' => '217c5ea5', 355 + 'rsrc/js/application/conpherence/ConpherenceThreadManager.js' => 'cff1902b', 356 + 'rsrc/js/application/conpherence/behavior-durable-column.js' => '332ac18d', 357 357 'rsrc/js/application/conpherence/behavior-menu.js' => 'c4151295', 358 358 'rsrc/js/application/conpherence/behavior-pontificate.js' => '21ba5861', 359 359 'rsrc/js/application/conpherence/behavior-quicksand-blacklist.js' => '7927a7d3', ··· 517 517 'conpherence-menu-css' => 'c6ac5299', 518 518 'conpherence-message-pane-css' => '2526107d', 519 519 'conpherence-notification-css' => '04a6e10a', 520 - 'conpherence-thread-manager' => '0324970d', 520 + 'conpherence-thread-manager' => 'cff1902b', 521 521 'conpherence-update-css' => '1099a660', 522 522 'conpherence-widget-pane-css' => '3d575438', 523 523 'differential-changeset-view-css' => '6a8b172a', ··· 583 583 'javelin-behavior-diffusion-locate-file' => '6d3e1947', 584 584 'javelin-behavior-diffusion-pull-lastmodified' => '2b228192', 585 585 'javelin-behavior-doorkeeper-tag' => 'e5822781', 586 - 'javelin-behavior-durable-column' => '217c5ea5', 586 + 'javelin-behavior-durable-column' => '332ac18d', 587 587 'javelin-behavior-error-log' => '6882e80a', 588 588 'javelin-behavior-fancy-datepicker' => 'c51ae228', 589 589 'javelin-behavior-global-drag-and-drop' => 'bbdf75ca', ··· 697 697 'javelin-view-renderer' => '6c2b09a2', 698 698 'javelin-view-visitor' => 'efe49472', 699 699 'javelin-websocket' => 'e292eaf4', 700 - 'javelin-workflow' => '84d6aea0', 700 + 'javelin-workflow' => '5b2e3e2b', 701 701 'lightbox-attachment-css' => '7acac05d', 702 702 'maniphest-batch-editor' => '8f380ebc', 703 703 'maniphest-report-css' => 'f6931fdf', ··· 843 843 '029a133d' => array( 844 844 'aphront-dialog-view-css', 845 845 ), 846 - '0324970d' => array( 847 - 'javelin-dom', 848 - 'javelin-util', 849 - 'javelin-stratcom', 850 - 'javelin-install', 851 - 'javelin-workflow', 852 - 'javelin-router', 853 - 'javelin-behavior-device', 854 - 'javelin-vector', 855 - ), 856 846 '03d6ed07' => array( 857 847 'javelin-behavior', 858 848 'javelin-stratcom', ··· 973 963 'phabricator-phtize', 974 964 'changeset-view-manager', 975 965 ), 976 - '217c5ea5' => array( 977 - 'javelin-behavior', 978 - 'javelin-dom', 979 - 'javelin-stratcom', 980 - 'javelin-behavior-device', 981 - 'javelin-scrollbar', 982 - 'javelin-quicksand', 983 - 'phabricator-keyboard-shortcut', 984 - 'conpherence-thread-manager', 985 - ), 986 966 '21ba5861' => array( 987 967 'javelin-behavior', 988 968 'javelin-dom', ··· 1074 1054 '331b1611' => array( 1075 1055 'javelin-install', 1076 1056 ), 1057 + '332ac18d' => array( 1058 + 'javelin-behavior', 1059 + 'javelin-dom', 1060 + 'javelin-stratcom', 1061 + 'javelin-behavior-device', 1062 + 'javelin-scrollbar', 1063 + 'javelin-quicksand', 1064 + 'phabricator-keyboard-shortcut', 1065 + 'conpherence-thread-manager', 1066 + ), 1077 1067 '3ab51e2c' => array( 1078 1068 'javelin-behavior', 1079 1069 'javelin-behavior-device', ··· 1215 1205 'javelin-stratcom', 1216 1206 'javelin-vector', 1217 1207 'javelin-dom', 1208 + ), 1209 + '5b2e3e2b' => array( 1210 + 'javelin-stratcom', 1211 + 'javelin-request', 1212 + 'javelin-dom', 1213 + 'javelin-vector', 1214 + 'javelin-install', 1215 + 'javelin-util', 1216 + 'javelin-mask', 1217 + 'javelin-uri', 1218 + 'javelin-routable', 1218 1219 ), 1219 1220 '5c1c758c' => array( 1220 1221 'javelin-install', ··· 1454 1455 'javelin-workflow', 1455 1456 'phabricator-draggable-list', 1456 1457 ), 1457 - '84d6aea0' => array( 1458 - 'javelin-stratcom', 1459 - 'javelin-request', 1460 - 'javelin-dom', 1461 - 'javelin-vector', 1462 - 'javelin-install', 1463 - 'javelin-util', 1464 - 'javelin-mask', 1465 - 'javelin-uri', 1466 - 'javelin-routable', 1467 - ), 1468 1458 '85ea0626' => array( 1469 1459 'javelin-install', 1470 1460 ), ··· 1775 1765 'javelin-dom', 1776 1766 'javelin-stratcom', 1777 1767 'phabricator-phtize', 1768 + ), 1769 + 'cff1902b' => array( 1770 + 'javelin-dom', 1771 + 'javelin-util', 1772 + 'javelin-stratcom', 1773 + 'javelin-install', 1774 + 'javelin-workflow', 1775 + 'javelin-router', 1776 + 'javelin-behavior-device', 1777 + 'javelin-vector', 1778 1778 ), 1779 1779 'd19198c8' => array( 1780 1780 'javelin-install',
+3 -1
src/applications/maniphest/query/ManiphestTaskQuery.php
··· 979 979 980 980 $cursor = $this->loadCursorObject($task_id); 981 981 if (!$cursor) { 982 - return null; 982 + // We may loop if we have a cursor and don't build a paging clause; fail 983 + // instead. 984 + throw new PhabricatorEmptyQueryException(); 983 985 } 984 986 985 987 $columns = array();
+17 -11
webroot/rsrc/externals/javelin/lib/Workflow.js
··· 29 29 30 30 statics : { 31 31 _stack : [], 32 - newFromForm : function(form, data) { 32 + newFromForm : function(form, data, keep_enabled) { 33 33 var pairs = JX.DOM.convertFormToListOfPairs(form); 34 34 for (var k in data) { 35 35 pairs.push([k, data[k]]); 36 36 } 37 37 38 - // Disable form elements during the request 39 - var inputs = [].concat( 40 - JX.DOM.scry(form, 'input'), 41 - JX.DOM.scry(form, 'button'), 42 - JX.DOM.scry(form, 'textarea')); 43 - for (var ii = 0; ii < inputs.length; ii++) { 44 - if (inputs[ii].disabled) { 45 - delete inputs[ii]; 46 - } else { 47 - inputs[ii].disabled = true; 38 + var inputs; 39 + if (keep_enabled) { 40 + inputs = []; 41 + } else { 42 + // Disable form elements during the request 43 + inputs = [].concat( 44 + JX.DOM.scry(form, 'input'), 45 + JX.DOM.scry(form, 'button'), 46 + JX.DOM.scry(form, 'textarea')); 47 + for (var ii = 0; ii < inputs.length; ii++) { 48 + if (inputs[ii].disabled) { 49 + delete inputs[ii]; 50 + } else { 51 + inputs[ii].disabled = true; 52 + } 48 53 } 49 54 } 50 55 ··· 57 62 inputs[ii] && (inputs[ii].disabled = false); 58 63 } 59 64 }); 65 + 60 66 return workflow; 61 67 }, 62 68 newFromLink : function(link) {
+5 -2
webroot/rsrc/js/application/conpherence/ConpherenceThreadManager.js
··· 245 245 sendMessage: function(form, params) { 246 246 params = this._getParams(params); 247 247 248 - this._willSendMessageCallback(); 249 - var workflow = JX.Workflow.newFromForm(form, params) 248 + var keep_enabled = true; 249 + 250 + var workflow = JX.Workflow.newFromForm(form, params, keep_enabled) 250 251 .setHandler(JX.bind(this, function(r) { 251 252 this._latestTransactionID = r.latest_transaction_id; 252 253 this._didSendMessageCallback(r); 253 254 })); 254 255 this.syncWorkflow(workflow, 'finally'); 256 + 257 + this._willSendMessageCallback(); 255 258 }, 256 259 257 260 handleDraftKeydown: function(e) {
+39 -8
webroot/rsrc/js/application/conpherence/behavior-durable-column.js
··· 102 102 JX.DOM.appendContent(messages, JX.$H(r.transactions)); 103 103 scrollbar.scrollTo(messages.scrollHeight); 104 104 }); 105 + 105 106 threadManager.setWillSendMessageCallback(function() { 106 - _markLoading(true); 107 + // Wipe the textarea immediately so the user can start typing more text. 108 + var textarea = _getColumnTextareaNode(); 109 + textarea.value = ''; 110 + _focusColumnTextareaNode(); 107 111 }); 112 + 108 113 threadManager.setDidSendMessageCallback(function(r) { 109 114 var messages = _getColumnMessagesNode(); 110 115 JX.DOM.appendContent(messages, JX.$H(r.transactions)); 111 116 scrollbar.scrollTo(messages.scrollHeight); 117 + }); 112 118 113 - var textarea = _getColumnTextareaNode(); 114 - textarea.value = ''; 115 - 116 - _markLoading(false); 117 - 118 - _focusColumnTextareaNode(); 119 - }); 120 119 threadManager.setWillUpdateWorkflowCallback(function() { 121 120 JX.Stratcom.invoke('notification-panel-close'); 122 121 }); ··· 289 288 if (e.getSpecialKey() != 'return') { 290 289 return; 291 290 } 291 + 292 292 var raw = e.getRawEvent(); 293 293 if (raw.shiftKey) { 294 + // If the shift key is pressed, let the browser write a newline into 295 + // the textarea. 294 296 return; 295 297 } 298 + 299 + var textarea = _getColumnTextareaNode(); 300 + if (!textarea.value.length) { 301 + // If there's no text, don't try to submit the form. 302 + return; 303 + } 304 + 296 305 _sendMessage(e); 297 306 }); 298 307 ··· 301 310 'conpherence-durable-column-textarea', 302 311 function (e) { 303 312 threadManager.handleDraftKeydown(e); 313 + }); 314 + 315 + // HTML5 placeholders are rendered as long as the input is empty, even if the 316 + // input is currently focused. This is undesirable for the chat input, 317 + // especially immediately after sending a message. Hide the placeholder while 318 + // the input is focused. 319 + JX.Stratcom.listen( 320 + ['focus', 'blur'], 321 + 'conpherence-durable-column-textarea', 322 + function (e) { 323 + var node = e.getTarget(); 324 + if (e.getType() == 'focus') { 325 + if (node.placeholder) { 326 + node.placeholderStorage = node.placeholder; 327 + node.placeholder = ''; 328 + } 329 + } else { 330 + if (node.placeholderStorage) { 331 + node.placeholder = node.placeholderStorage; 332 + node.placeholderStorage = ''; 333 + } 334 + } 304 335 }); 305 336 306 337 if (config.visible) {