Integrate Review Board Actions with the new Ink.MenuView component.

Review Request #13753 — Created April 19, 2024 and submitted — Latest diff uploaded

Information

Review Board
release-7.x

Reviewers

Review Board 6 introduced a formal foundation for actions, used in the
page top bar and the review request actions bar. When this was
implemented, there wasn't really a solid formal way of managing most
elements of a menu item, or managing state around menu items, so the
actions needed to do a lot of custom rendering.

This is no longer the case, as we have a fairly fleshed-out menu
implementation in Ink.MenuView. This came too late to influence the
action design, though.

This change works to bridge the gap. More information on actions are now
provided in the model data. MenuActionView then uses this to better
construct menu items with the correct properties. This helps ensure that
icons in, for example, the Follow menu are in the right place, and that
links vs. onClick handlers work correctly.

We do still need to render some custom menu items, notably in the Review
menu, so we still need a mechanism for custom rendering. This is being
done by introducing an is_custom_rendered() method in the Python
action code. By default, this checks if the action uses a custom
Django template, but subclasses can explicitly implement this to return
a value. If we're in this path, we ignore the menu icon, label, and URL
for the menu item, and leave it entirely up to the view.

Some actions received updates to better work with this. In particular,
the archive/mute actions no longer reach into the internals of the
element to change the label, but rather set an attribute on the
MenuItem model, causing a render change in Ink.

Going forward, we'll want to work more toward giving the components
managing an action more control over the rendering, rather than giving
the action control itself. This isn't applicable to our code at this
time, but more something to consider as we evolve and document actions.

One additional note is that this partially reverts a change recently
made to BaseVisibilityActionView. I had addressed a TypeScript
compilation error where the abstract class could not be used with
@spina. This is still true, but the fix was wrong. By making a class
abstract in the middle of a Spina object hierarchy, we don't get any of
Spina's property management (such as static-to-prototype). Until we have
a method for making decorators and abstract classes place nice, abstract
classes in Spina hierarchies are not safe to use in our codebase.

Tested every action we provide, making sure they worked as expected.

Python and JavaScript unit tests pass (except for ones that were already
failing).


Commits

Files

    Loading...