Rewrite the client-side and server-side implementation of admin UI widgets.
Review Request #10756 — Created Oct. 16, 2019 and submitted — Latest diff uploaded
The old design for widgets wasn't very generally useful. The server-side
design ofWidget
was really only geared toward the use cases we
initially came up with, but wasn't optimal or future-proof. The
client-side was worse -- there was none. Widgets just dumped HTML with
<script>
tags into the page, and just tried hard-coding DOM element
IDs as needed, using them to try to look up widgets and populate them.This change completely redoes the design, while striving to maintain
some backwards-compatibility (until Review Board 5.0).Server-side, widget support is now provided through a
BaseAdminWidget
class, which provides:
- Basic class attributes for customizing the widget's ID, name, CSS
classes, and a template name - An optional custom template, which would subclass a base
admin_widget.html
(instead of being embedded within the base
template) and provide content and header/footer actions - A method for subclasses to provide context data for the template
- Methods for specifying attributes and options for the JavaScript model
class, and options for the view class - A method for rendering the template to a string
It doesn't manage caches anymore, as that's not always necessary or even
worth doing. It also doesn't have a concept of primary/secondary
widgets or hard-coded list of action URLs. The legacy Widget
class
still provides all this, but is deprecated and will be removed in 5.0.
Widgets are now managed by a registry, rather than being stored in
separate primary/secondary lists of classes.
Client-side, RB.Admin.WidgetView
handles all widget rendering and
interactions, with state stored in RB.Admin.Widget
. The default
implementations do effectively nothing, but can be subclassed for custom
widget behavior.
Legacy widgets still work, and will continue to in 4.0, but we emit
warnings in Widget.__init__()
, AdminWidgetHook
, and the legacy
register_admin_widget()
and unregister_admin_widget()
functions to
encourage anyone actually writing custom widgets to upgrade.
Upcoming changes will port all existing widgets to the new classes.
Tested with a mixture of legacy widgets and some partially-ported
widgets (server-side and client-side). Everything registered and
rendered correctly.Unit tests pass.