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
···275275 pht('Hide or show the current file.'),
276276 'You must select a file to hide or show.' =>
277277 pht('You must select a file to hide or show.'),
278278+279279+ 'Unsaved' => pht('Unsaved'),
280280+ 'Unsubmitted' => pht('Unsubmitted'),
281281+ 'Comments' => pht('Comments'),
278282 ),
279283 ));
280284
···403403 block.items.push(rows[ii]);
404404 }
405405406406+ var last_inline = null;
407407+ var last_inline_item = null;
406408 for (ii = 0; ii < blocks.length; ii++) {
407409 block = blocks[ii];
408410···422424 for (var jj = 0; jj < block.items.length; jj++) {
423425 var inline = this.getInlineForRow(block.items[jj]);
424426425425- items.push({
427427+ // When comments are being edited, they have a hidden row with
428428+ // the actual comment and then a visible row with the editor.
429429+430430+ // In this case, we only want to generate one item, but it should
431431+ // use the editor as a scroll target. To accomplish this, check if
432432+ // this row has the same inline as the previous row. If so, update
433433+ // the last item to use this row's nodes.
434434+435435+ if (inline === last_inline) {
436436+ last_inline_item.nodes.begin = block.items[jj];
437437+ last_inline_item.nodes.end = block.items[jj];
438438+ continue;
439439+ } else {
440440+ last_inline = inline;
441441+ }
442442+443443+ last_inline_item = {
426444 type: block.type,
427445 changeset: this,
428446 target: inline,
429447 hidden: inline.isHidden(),
448448+ deleted: !inline.getID() && !inline.isEditing(),
430449 nodes: {
431450 begin: block.items[jj],
432451 end: block.items[jj]
452452+ },
453453+ attributes: {
454454+ unsaved: inline.isEditing()
433455 }
434434- });
456456+ };
457457+458458+ items.push(last_inline_item);
435459 }
436460 }
437461 }