1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-10 00:42:41 +01:00
phorge-phorge/webroot/rsrc/js/application
epriestley b48a22bf50 Make "editing" state persistent for inline comments
Summary:
Ref T13513. This is mostly an infrastructure cleanup change.

In a perfect world, this would be a series of several changes, but they're tightly interconnected and don't have an obvious clean, nontrivial partition (or, at least, I don't see one). Followup changes will exercise this code repeatedly and all of these individual mutations are "obviously good", so I'm not too worried about the breadth of this change.

---

Inline comments are stored as transaction comments in the `PhabricatorAuditTransactionComment` and `DifferentialTransactionComment` classes.

On top of these two storage classes sit `PhabricatorAuditInlineComment` and `DifferentialInlineComment`. Historically, these were an indirection layer over significantly different storage classes, but nowadays both storage classes look pretty similar and most of the logic is actually the same. Prior to this change, these two classes were about 80% copy/pastes of one another.

Part of the reason they're so copy/pastey is that they implement a parent `Interface`. They are the only classes which implement this interface, and the interface does not provide any correctness guarantees (the storage objects are not actually constrained by it).

To simplify this:

  - Make `PhabricatorInlineCommentInterface` an abstract base class instead.
  - Lift as much code out of the `Audit` and `Differential` subclasses as possible.
  - Delete methods which no longer have callers, or have only trivial callers.

---

Inline comments have two `View` rendering classes, `DetailView` and `EditView`. They share very little code.

Partly, this is because `EditView` does not take an `$inline` object. Historically, it needed to be able to operate on inlines that did not have an ID yet, and even further back in history this was probably just an outgrowth of a simple `<form />`.

These classes can be significantly simplified by passing an `$inline` to the `EditView`, instead of individually setting all the properties on the `View` itself. This allows the `DetailView` and `EditView` classes to share a lot of code.

The `EditView` can not fully render its content. Move the content rendering code into the view.

---

Prior to this change, some operations need to work on inlines that don't have an inline ID yet (we assign an ID the first time you "Save" a comment). Since "editing" comments will now be saved, we can instead create a row immediately.

This means that all the inline code can always rely on having a valid ID to work with, even if that ID corresponds to an empty, draft, "isEditing" comment. This simplifies more code in `EditView` and allows the "create" and "reply" code to be merged in `PhabricatorInlineCommentController`.

---

Client-side inline events are currently handled through a mixture of `ChangesetList` listeners (good) and ad-hoc row-level listeners (less good). In particular, the "save", "cancel", and "undo" events are row-level. All other events are list-level.

Move all events to list-level. This is supported by all inlines now having an ID at all stages of their lifecycle.

This allows some of the client behavior to be simplified. It currently depends on binding complex ad-hoc dictionaries into event handlers in `_drawRows()`, but it seems like almost all of this code can be removed. In fact, no more than one row ever seems to be drawn, so this code can probably be simplified further.

---

Finally, save an "isEditing" state. When we rebuild a revision on the client, click the "edit" button if it's in this state. This is a little hacky, but simpler to get into a stable state, since the row layout of an inline depends on a "view row" followed by an "edit row".

Test Plan:
  - Created comments on either side of a diff.
  - Edited a comment, reloaded, saw edit stick.
  - Saved comments, reloaded, saw save stick.
  - Edited a comment, typed text, cancelled, "unedited" to get state back.
  - Created a comment, typed text, cancelled, "unedited" to get state back.
  - Deleted a comment, "undeleted" to get state back.

Weirdness / known issues:

  - Drafts don't autosave yet.
  - Fixed in D21187:
    - When you create an empty comment then reload, you get an empty editor. This is a bit silly.
    - "Cancel" does not save state, but should, once drafts autosave.
  - Mostly fixed in D21188:
    - "Editing" comments aren't handled specially by the overall submission flow.
    - "Editing" comments submitted in that state try to edit themselves again on load, which doesn't work.

Subscribers: jmeador

Maniphest Tasks: T13513

Differential Revision: https://secure.phabricator.com/D21186
2020-05-04 13:10:30 -07:00
..
aphlict Correct the behavior of "Desktop Only" in Notifications preferences 2018-03-16 15:17:49 -07:00
calendar Remove obsolete Calendar event date storage fields 2016-11-02 09:49:08 -07:00
config Fix custom field selector control in cases where the user doesn't edit anything 2015-05-25 05:34:23 -07:00
conpherence Fix spelling 2017-10-09 10:48:04 -07:00
countdown Define JavaScript functions before they are used 2014-12-30 02:53:32 -08:00
daemon Execute Maniphest batch edits in the background with a web UI progress bar 2015-06-23 13:36:16 -07:00
dashboard Reduce drag-and-drop jank on dashboards 2019-04-17 12:20:44 -07:00
diff Make "editing" state persistent for inline comments 2020-05-04 13:10:30 -07:00
differential Glue the new FormationView on top of the older Filetree view in Differential 2020-04-22 08:29:04 -07:00
diffusion When drawing a very wide graph line diagram, smush it together a bit 2019-03-28 21:18:52 -07:00
doorkeeper Allow Doorkeeper references to have multiple display variations (full, short, etc.) 2018-03-13 11:29:52 -07:00
drydock Show a more reasonable status element for pull requests 2015-10-21 11:28:26 -07:00
fact Make various UX improvements to charts so they're closer to making visual sense 2019-09-17 09:43:21 -07:00
files Add a view option to disable blame in Diffusion and fix some view transition bugs 2018-04-30 15:32:23 -07:00
harbormaster Fix an issue in the new Harbormaster build log view where clicking the "^" icon doesn't work right 2018-04-27 11:51:59 -07:00
herald Don't present users with Herald fields/actions for uninstalled applications, unless the rule already uses them 2019-09-12 14:33:28 -07:00
maniphest Remove the legacy chart behavior from Maniphest 2019-05-22 04:48:24 -07:00
owners Use a tokenizer, not a gigantic poorly-ordered "<select />", to choose repositories in Owners 2018-03-07 20:57:24 -08:00
passphrase Rename Passphrase credential control JS 2015-03-02 13:01:00 -08:00
pholio Fix spelling 2017-10-09 10:48:04 -07:00
phortune Don't try to access the Stripe object until the user submits the credit card form 2017-02-10 08:40:14 -08:00
policy De-garbage the horrible garbage project section of the policy selection control 2016-02-05 09:50:06 -08:00
projects When a task card is edited, emit update events for old boards and parent boards 2019-07-30 13:16:33 -07:00
releeph Make scrolling happen relative to the main content frame 2015-01-25 08:42:40 -08:00
repository Trim and URI encode symbol names before building URIs from them 2019-10-29 09:48:42 -07:00
search Allow profile menu items to be reordered 2016-01-13 11:45:57 -08:00
transactions Make the "Keyboard Shortcuts" dialog in Differential less hideous 2020-04-19 09:01:07 -07:00
trigger Improve trigger editor behavior when switching to/from tokenizers 2019-04-17 12:24:23 -07:00
typeahead Implement viewer() and members(project) typeahead functions 2015-04-17 11:06:58 -07:00
uiexample Remove some old UIExamples 2017-05-30 18:00:28 -07:00