Select the types of activity you want to include in your feed.
@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
···979979980980 $cursor = $this->loadCursorObject($task_id);
981981 if (!$cursor) {
982982- return null;
982982+ // We may loop if we have a cursor and don't build a paging clause; fail
983983+ // instead.
984984+ throw new PhabricatorEmptyQueryException();
983985 }
984986985987 $columns = array();
+17-11
webroot/rsrc/externals/javelin/lib/Workflow.js
···29293030 statics : {
3131 _stack : [],
3232- newFromForm : function(form, data) {
3232+ newFromForm : function(form, data, keep_enabled) {
3333 var pairs = JX.DOM.convertFormToListOfPairs(form);
3434 for (var k in data) {
3535 pairs.push([k, data[k]]);
3636 }
37373838- // Disable form elements during the request
3939- var inputs = [].concat(
4040- JX.DOM.scry(form, 'input'),
4141- JX.DOM.scry(form, 'button'),
4242- JX.DOM.scry(form, 'textarea'));
4343- for (var ii = 0; ii < inputs.length; ii++) {
4444- if (inputs[ii].disabled) {
4545- delete inputs[ii];
4646- } else {
4747- inputs[ii].disabled = true;
3838+ var inputs;
3939+ if (keep_enabled) {
4040+ inputs = [];
4141+ } else {
4242+ // Disable form elements during the request
4343+ inputs = [].concat(
4444+ JX.DOM.scry(form, 'input'),
4545+ JX.DOM.scry(form, 'button'),
4646+ JX.DOM.scry(form, 'textarea'));
4747+ for (var ii = 0; ii < inputs.length; ii++) {
4848+ if (inputs[ii].disabled) {
4949+ delete inputs[ii];
5050+ } else {
5151+ inputs[ii].disabled = true;
5252+ }
4853 }
4954 }
5055···5762 inputs[ii] && (inputs[ii].disabled = false);
5863 }
5964 });
6565+6066 return workflow;
6167 },
6268 newFromLink : function(link) {
···102102 JX.DOM.appendContent(messages, JX.$H(r.transactions));
103103 scrollbar.scrollTo(messages.scrollHeight);
104104 });
105105+105106 threadManager.setWillSendMessageCallback(function() {
106106- _markLoading(true);
107107+ // Wipe the textarea immediately so the user can start typing more text.
108108+ var textarea = _getColumnTextareaNode();
109109+ textarea.value = '';
110110+ _focusColumnTextareaNode();
107111 });
112112+108113 threadManager.setDidSendMessageCallback(function(r) {
109114 var messages = _getColumnMessagesNode();
110115 JX.DOM.appendContent(messages, JX.$H(r.transactions));
111116 scrollbar.scrollTo(messages.scrollHeight);
117117+ });
112118113113- var textarea = _getColumnTextareaNode();
114114- textarea.value = '';
115115-116116- _markLoading(false);
117117-118118- _focusColumnTextareaNode();
119119- });
120119 threadManager.setWillUpdateWorkflowCallback(function() {
121120 JX.Stratcom.invoke('notification-panel-close');
122121 });
···289288 if (e.getSpecialKey() != 'return') {
290289 return;
291290 }
291291+292292 var raw = e.getRawEvent();
293293 if (raw.shiftKey) {
294294+ // If the shift key is pressed, let the browser write a newline into
295295+ // the textarea.
294296 return;
295297 }
298298+299299+ var textarea = _getColumnTextareaNode();
300300+ if (!textarea.value.length) {
301301+ // If there's no text, don't try to submit the form.
302302+ return;
303303+ }
304304+296305 _sendMessage(e);
297306 });
298307···301310 'conpherence-durable-column-textarea',
302311 function (e) {
303312 threadManager.handleDraftKeydown(e);
313313+ });
314314+315315+ // HTML5 placeholders are rendered as long as the input is empty, even if the
316316+ // input is currently focused. This is undesirable for the chat input,
317317+ // especially immediately after sending a message. Hide the placeholder while
318318+ // the input is focused.
319319+ JX.Stratcom.listen(
320320+ ['focus', 'blur'],
321321+ 'conpherence-durable-column-textarea',
322322+ function (e) {
323323+ var node = e.getTarget();
324324+ if (e.getType() == 'focus') {
325325+ if (node.placeholder) {
326326+ node.placeholderStorage = node.placeholder;
327327+ node.placeholder = '';
328328+ }
329329+ } else {
330330+ if (node.placeholderStorage) {
331331+ node.placeholder = node.placeholderStorage;
332332+ node.placeholderStorage = '';
333333+ }
334334+ }
304335 });
305336306337 if (config.visible) {