Adding Volto capabilities to a classic Plone add-on

Hoping I can get some pointers in the right direction.
I have a classic Plone add-on that I'd like to enhance with Volto (or make "Volto-compatible").

I'm trying to sort out in my head how best to "re-implement" this system in Volto. Perhaps it would be more of an update to the interface and user experience rather than a "re-implementation".

Brief description of current system

The system is for managing the governance of committees. It has committee chairs and vice-chairs and permissions that vary by role. It relies heavily on Plone's infrastructure: custom content-types, custom roles, permissions, behaviors and browser views.

General objective - keep the benefits of Plone, add the benefits of Volto

I expect to continue benefitting from the custom roles, permissions and workflow while providing a custom Volto interface on top of the system.

Based on my objective, these are the questions I'm pondering at the moment:

  • Is it enough to focus on defining custom Volto views? I'm looking at the patterns used in the Volto Hands-on training guide 13. Content types Views – Volto Hands-On — Plone Training 2021 documentation
  • Other than implementing Volto views for custom content-types, what else should be on my checklist? I really don't know what I don't know here :man_shrugging:t6:
  • Do event hooks that perform actions when something happens behave the same - I figure the answer is yes, since any interaction with the API would trigger the same kinds of events as interacting with classic Plone
  • Some of our functionality is provided by portlets, what's the best way to reimplement that with Volto? The best bet seems to be Volto slots, need to learn a bit about them

Is it enough to focus on defining custom Volto views?

Yes, in principle it should be enough.

Other than implementing Volto views for custom content-types, what else should be on my checklist?

Check your requirements for richtext editing. (IMHO) Volto's default richtext editor for dexterity schema fields is quite weak (no image insertion, no table capabilities, etc) and volto-slate doesn't really improve this part. There could be some hybrid solutions like collective.volto.blocksfield, though I have never tested it (but I think it's a great idea).

Along these lines, in case you'll use relationships between content, pbauer reports that Volto's implementation has several bugs. You'll have to push priority for those (or see if you can get them fixed).

I imagine that, in case you'll need additional backend logic information that's not provided by just simple dexterity fields, you'll have to write serializers for the content (you could use it to add aditional "fake" fields or component expands, which could be read from the Volto views).

Do event hooks that perform actions when something happens behave the same

Yes, everything Plone stays Plone. I'll mention some limitations in Volto, in the broad spectrum of "event handling": there's no UI to manage content rules in Volto. AFAIK broken link redirection is not working right now (although internal links produced by rich text editing in volto blocks is stored using resolveuid, so it's fine, partially).

Some of our functionality is provided by portlets, what's the best way to reimplement that with Volto?

I need to get the slots PRs in final shape. I estimate that'll happen somewhere around beginning of next year. The Volto in production list is getting huge and with the exception of one, none of them have slots. So it's definitively doable, Volto site with no portlet-like system.

How we use portlets now:

  • List of participants (based on those subscribed to the committee)
  • Navigation on each committee view, specific to the given committee
  • Sign up portlet for joining the committee

I suppose this could be replaced with a custom view that includes all those components out of the box

Yes, they could be part of the view component for the Committee content type.

I suppose that we could also push for the non-persistent slots sooner, as those are not that complex and would allow you to register content sidebars with them, from Volto code.